Bagikan melalui


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.

Catatan

Pencarian file saat ini tidak ditagih.

Catatan

  • Pencarian file dapat menyerap hingga 10.000 file per asisten - 500 kali lebih banyak dari sebelumnya. Ini cepat, mendukung kueri paralel melalui pencarian multi-utas, dan fitur reranking 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
.pdf 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
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"}],
)

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 512 MB. 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 akan 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 Jalankan saat 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]
    )