Alat pencarian file Asisten Azure OpenAI (Pratinjau)
Pencarian File menambah Asisten dengan pengetahuan dari luar modelnya, seperti informasi produk kepemilikan atau dokumen yang disediakan oleh pengguna Anda. OpenAI secara otomatis mengurai dan memotong dokumen Anda, membuat dan menyimpan penyematan, dan menggunakan pencarian vektor dan kata kunci untuk mengambil konten yang relevan untuk menjawab kueri pengguna.
Penting
- Pencarian file memiliki biaya tambahan di luar biaya berbasis token untuk penggunaan Azure OpenAI.
Catatan
- Pencarian file dapat menyerap hingga 10.000 file per asisten - 500 kali lebih banyak dari sebelumnya. Solusi ini cepat, mendukung kueri paralel melalui pencarian multi-utas, dan fitur pemeringkatan ulang dan penulisan ulang kueri yang ditingkatkan.
- Penyimpanan vektor adalah objek baru di API. Setelah file ditambahkan ke penyimpanan vektor, file secara otomatis diurai, dipotong, dan disematkan, dibuat siap untuk dicari. Penyimpanan vektor dapat digunakan di seluruh asisten dan utas, menyederhanakan manajemen dan penagihan file.
- Kami telah menambahkan dukungan untuk
tool_choice
parameter yang dapat digunakan untuk memaksa penggunaan alat tertentu (seperti pencarian file, penerjemah kode, atau fungsi) dalam eksekusi tertentu.
Dukungan pencarian file
Wilayah yang didukung
Pencarian file tersedia di wilayah yang mendukung Asisten.
Versi API
- Pratinjau 05-01 2024
Jenis file yang didukung
Catatan
Untuk jenis teks/MIME, pengodean harus utf-8, utf-16, atau ASCII.
Format file | Jenis MIME |
---|---|
c. | text/x-c |
.cs | text/x-csharp |
.cpp | text/x-c++ |
.doc | application/msword |
.docx | application/vnd.openxmlformats-officedocument.wordprocessingml.documen |
.html | teks/html |
.java | text/x-java |
.json | application/json |
.md | teks/markdown |
aplikasi/pdf | |
.php | text/x-php |
.pptx | application/vnd.openxmlformats-officedocument.presentationml.presentation |
.Py | text/x-python |
.Py | text/x-script.python |
.Rb | text/x-ruby |
.Tex | text/x-tex |
.txt | text/plain |
.Css | text/css |
.Js | text/javascript |
.Sh | application/x-sh |
.ts | application/typescript |
Aktifkan pencarian file
from openai import AzureOpenAI
client = AzureOpenAI(
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-05-01-preview",
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)
assistant = client.beta.assistants.create(
name="Financial Analyst Assistant",
instructions="You are an expert financial analyst. Use your knowledge base to answer questions about audited financial statements.",
model="gpt-4-turbo",
tools=[{"type": "file_search"}],
)
Unggah file untuk pencarian file
Untuk mengakses file Anda, alat pencarian file menggunakan objek penyimpanan vektor. Unggah file Anda dan buat penyimpanan vektor untuk memuatnya. Setelah penyimpanan vektor dibuat, Anda harus melakukan polling statusnya sampai semua file berada di in_progress
luar status untuk memastikan bahwa semua konten telah selesai diproses. SDK menyediakan pembantu untuk mengunggah dan melakukan polling.
from openai import AzureOpenAI
client = AzureOpenAI(
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-05-01-preview",
azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT")
)
# Create a vector store called "Financial Statements"
vector_store = client.beta.vector_stores.create(name="Financial Statements")
# Ready the files for upload to OpenAI
file_paths = ["mydirectory/myfile1.pdf", "mydirectory/myfile2.txt"]
file_streams = [open(path, "rb") for path in file_paths]
# Use the upload and poll SDK helper to upload the files, add them to the vector store,
# and poll the status of the file batch for completion.
file_batch = client.beta.vector_stores.file_batches.upload_and_poll(
vector_store_id=vector_store.id, files=file_streams
)
# You can print the status and the file counts of the batch to see the result of this operation.
print(file_batch.status)
print(file_batch.file_counts)
Perbarui asisten untuk menggunakan penyimpanan vektor baru
Untuk membuat file dapat diakses oleh asisten Anda, perbarui asisten tool_resources
dengan ID baru vector_store
.
assistant = client.beta.assistants.update(
assistant_id=assistant.id,
tool_resources={"file_search": {"vector_store_ids": [vector_store.id]}},
)
Membuat utas
Anda juga dapat melampirkan file sebagai Lampiran pesan di utas Anda. Melakukannya akan membuat yang lain vector_store
yang terkait dengan utas, atau, jika sudah ada penyimpanan vektor yang terpasang pada utas ini, lampirkan file baru ke penyimpanan vektor utas yang ada. Saat Anda membuat Jalankan pada utas ini, alat pencarian file akan mengkueri vector_store
dari asisten Anda dan vector_store
di utas.
# Upload the user provided file to OpenAI
message_file = client.files.create(
file=open("mydirectory/myfile.pdf", "rb"), purpose="assistants"
)
# Create a thread and attach the file to the message
thread = client.beta.threads.create(
messages=[
{
"role": "user",
"content": "How many company shares were outstanding last quarter?",
# Attach the new file to the message.
"attachments": [
{ "file_id": message_file.id, "tools": [{"type": "file_search"}] }
],
}
]
)
# The thread now has a vector store with that file in its tool resources.
print(thread.tool_resources.file_search)
Penyimpanan vektor dibuat menggunakan lampiran pesan yang memiliki kebijakan kedaluwarsa default tujuh hari setelah terakhir kali aktif (didefinisikan sebagai terakhir kali penyimpanan vektor adalah bagian dari eksekusi). Default ini ada untuk membantu Anda mengelola biaya penyimpanan vektor Anda. Anda dapat mengambil alih kebijakan kedaluwarsa ini kapan saja.
Membuat eksekusi dan memeriksa output
Buat Jalankan dan amati bahwa model menggunakan alat pencarian file untuk memberikan respons terhadap pertanyaan pengguna.
from typing_extensions import override
from openai import AssistantEventHandler, OpenAI
client = OpenAI()
class EventHandler(AssistantEventHandler):
@override
def on_text_created(self, text) -> None:
print(f"\nassistant > ", end="", flush=True)
@override
def on_tool_call_created(self, tool_call):
print(f"\nassistant > {tool_call.type}\n", flush=True)
@override
def on_message_done(self, message) -> None:
# print a citation to the file searched
message_content = message.content[0].text
annotations = message_content.annotations
citations = []
for index, annotation in enumerate(annotations):
message_content.value = message_content.value.replace(
annotation.text, f"[{index}]"
)
if file_citation := getattr(annotation, "file_citation", None):
cited_file = client.files.retrieve(file_citation.file_id)
citations.append(f"[{index}] {cited_file.filename}")
print(message_content.value)
print("\n".join(citations))
# Then, we use the stream SDK helper
# with the EventHandler class to create the Run
# and stream the response.
with client.beta.threads.runs.stream(
thread_id=thread.id,
assistant_id=assistant.id,
instructions="Please address the user as Jane Doe. The user has a premium account.",
event_handler=EventHandler(),
) as stream:
stream.until_done()
Cara kerjanya
Alat pencarian file mengimplementasikan beberapa praktik terbaik pengambilan di luar kotak untuk membantu Anda mengekstrak data yang tepat dari file Anda dan menambah respons model. Alat file_search:
- Menulis ulang kueri pengguna untuk mengoptimalkannya untuk pencarian.
- Memecah kueri pengguna yang kompleks menjadi beberapa pencarian yang dapat dijalankan secara paralel.
- Menjalankan pencarian kata kunci dan semantik di seluruh penyimpanan vektor asisten dan utas.
- Reranks hasil pencarian untuk memilih yang paling relevan sebelum menghasilkan respons akhir.
- Secara default, alat pencarian file menggunakan pengaturan berikut:
- Ukuran gugus: 800 token
- Tumpang tindih gugus: 400 token
- Model penyematan: teks-penyematan-3-besar pada 256 dimensi
- Jumlah maksimum gugus yang ditambahkan ke konteks: 20
Penyimpanan vektor
Objek penyimpanan vektor memberi alat pencarian file kemampuan untuk mencari file Anda. Menambahkan file ke penyimpanan vektor secara otomatis mengurai, memotong, menyematkan, dan menyimpan file dalam database vektor yang mampu mengurai kata kunci dan pencarian semantik. Setiap penyimpanan vektor dapat menampung hingga 10.000 file. Penyimpanan vektor dapat dilampirkan ke Asisten dan Utas. Saat ini Anda dapat melampirkan paling banyak satu penyimpanan vektor ke asisten dan paling banyak satu penyimpanan vektor ke utas.
Membuat penyimpanan vektor dan menambahkan file
Anda dapat membuat penyimpanan vektor dan menambahkan file ke dalamnya dalam satu panggilan API:
vector_store = client.beta.vector_stores.create(
name="Product Documentation",
file_ids=['file_1', 'file_2', 'file_3', 'file_4', 'file_5']
)
Menambahkan file ke penyimpanan vektor adalah operasi asinkron. Untuk memastikan operasi selesai, kami sarankan Anda menggunakan pembantu 'buat dan jajak pendapat' di SDK resmi kami. Jika Anda tidak menggunakan SDK, Anda dapat mengambil vector_store
objek dan memantau propertinya file_counts
untuk melihat hasil operasi penyerapan file.
File juga dapat ditambahkan ke penyimpanan vektor setelah dibuat dengan membuat file penyimpanan vektor.
file = client.beta.vector_stores.files.create_and_poll(
vector_store_id="vs_abc123",
file_id="file-abc123"
)
Atau, Anda dapat menambahkan beberapa file ke penyimpanan vektor dengan membuat batch hingga 500 file.
batch = client.beta.vector_stores.file_batches.create_and_poll(
vector_store_id="vs_abc123",
file_ids=['file_1', 'file_2', 'file_3', 'file_4', 'file_5']
)
Demikian pula, file-file ini dapat dihapus dari penyimpanan vektor dengan:
- Menghapus objek file penyimpanan vektor atau,
- Dengan menghapus objek file yang mendasar (yang menghapus file dari semua konfigurasi vector_store dan code_interpreter di semua asisten dan utas di organisasi Anda)
Ukuran file maksimum adalah 512KB. Setiap file harus berisi tidak lebih dari 5.000.000 token per file (dihitung secara otomatis saat Anda melampirkan file).
Melampirkan penyimpanan vektor
Anda dapat melampirkan penyimpanan vektor ke Asisten atau Utas menggunakan parameter tool_resources.
assistant = client.beta.assistants.create(
instructions="You are a helpful product support assistant and you answer questions based on the files provided to you.",
model="gpt-4-turbo",
tools=[{"type": "file_search"}],
tool_resources={
"file_search": {
"vector_store_ids": ["vs_1"]
}
}
)
thread = client.beta.threads.create(
messages=[ { "role": "user", "content": "How do I cancel my subscription?"} ],
tool_resources={
"file_search": {
"vector_store_ids": ["vs_2"]
}
}
)
Anda juga dapat melampirkan penyimpanan vektor ke Thread atau Asisten setelah dibuat dengan memperbaruinya dengan di sebelah kanan tool_resources
.
Memastikan kesiapan penyimpanan vektor sebelum membuat eksekusi
Kami sangat menyarankan Anda memastikan semua file dalam vector_store sepenuhnya diproses sebelum Anda membuat eksekusi. Ini memastikan bahwa semua data di penyimpanan vektor Anda dapat dicari. Anda dapat memeriksa kesiapan penyimpanan vektor dengan menggunakan pembantu polling di SDK, atau dengan melakukan polling vector_store
objek secara manual untuk memastikan status selesai.
Sebagai fallback, ada penantian maksimum 60 detik di objek eksekusi ketika penyimpanan vektor utas berisi file yang masih diproses. Ini untuk memastikan bahwa setiap file yang diunggah pengguna Anda dalam utas yang dapat dicari sepenuhnya sebelum eksekusi dilanjutkan. Penantian fallback ini tidak berlaku untuk penyimpanan vektor asisten.
Mengelola biaya dengan kebijakan kedaluwarsa
Alat ini file_search
menggunakan vector_stores
objek sebagai sumber dayanya dan Anda akan ditagih berdasarkan ukuran objek vector_store yang dibuat. Ukuran objek penyimpanan vektor adalah jumlah semua gugus yang diurai dari file Anda dan penyematan yang sesuai.
Untuk membantu Anda mengelola biaya yang terkait dengan objek vector_store ini, kami telah menambahkan dukungan untuk kebijakan kedaluwarsa vector_store
dalam objek. Anda dapat mengatur kebijakan ini saat membuat atau memperbarui vector_store
objek.
vector_store = client.beta.vector_stores.create_and_poll(
name="Product Documentation",
file_ids=['file_1', 'file_2', 'file_3', 'file_4', 'file_5'],
expires_after={
"anchor": "last_active_at",
"days": 7
}
)
Penyimpanan vektor utas memiliki kebijakan kedaluwarsa default
Penyimpanan vektor yang dibuat menggunakan pembantu utas (seperti tool_resources.file_search.vector_stores
di Utas atau message.attachments
di Pesan) memiliki kebijakan kedaluwarsa default tujuh hari setelah terakhir kali aktif (didefinisikan sebagai terakhir kali penyimpanan vektor adalah bagian dari eksekusi).
Ketika penyimpanan vektor kedaluwarsa, eksekusi pada utas tersebut akan gagal. Untuk memperbaikinya, Anda dapat membuat ulang vector_store baru dengan file yang sama dan memasangnya kembali ke utas.
all_files = list(client.beta.vector_stores.files.list("vs_expired"))
vector_store = client.beta.vector_stores.create(name="rag-store")
client.beta.threads.update(
"thread_abc123",
tool_resources={"file_search": {"vector_store_ids": [vector_store.id]}},
)
for file_batch in chunked(all_files, 100):
client.beta.vector_stores.file_batches.create_and_poll(
vector_store_id=vector_store.id, file_ids=[file.id for file in file_batch]
)