Megosztás a következőn keresztül:


Azure OpenAI Assistants fájlkereső eszköz (előzetes verzió)

A fájlkeresés a modellen kívülről származó ismeretekkel bővíti a segédet, mint például az Ön felhasználói által biztosított termékinformációk vagy dokumentumok. Az OpenAI automatikusan elemzi és darabolja az Ön dokumentumait, létrehozza és tárolja a beágyazásokat, valamint vektoros és kulcsszókereséssel is lekéri a releváns tartalmakat a felhasználói lekérdezések megválaszolása érdekében.

Fontos

  • A fájlkeresés az Azure OpenAI használatának tokenalapú díjain túl további díjakkal is jár.

Feljegyzés

  • A fájlkeresés asszisztensenként akár 10 000 fájlt is betölthet – 500-szor több, mint korábban. Gyors, többszálas keresésekkel támogatja a párhuzamos lekérdezéseket, és továbbfejlesztett újrarangsorolást és lekérdezés-újraírást is kínál.
    • A vektortároló egy új objektum az API-ban. Miután hozzáadnak egy fájlt egy vektortárolóhoz, a rendszer automatikusan elemzi, darabolja és beágyazza azt, és készen áll a keresésre. A vektortárolók segédeken és szálakon átnyúlóan is használhatók, így egyszerűbbé téve a fájlkezelést és a számlázást.
  • Hozzáadtuk a tool_choice paraméter támogatását, amely egy adott eszköz (például fájlkeresés, kódértelmező vagy függvény) egy adott futtatáshoz való kényszerítésére használható.

Fájlkeresés támogatása

Támogatott régiók

A fájlkeresés az Asszisztenseket támogató régiókban érhető el.

API-verzió

  • 2024-05-01-preview

Támogatott fájltípusok

Feljegyzés

Szöveg- és MIME-típusok esetén a kódolásnak utf-8, utf-16 vagy ASCII típusúnak kell lennie.

Fájlformátum MIME-típus
c. szöveg/x-c
.cs text/x-csharp
.Cpp szöveg/x-c++
.doc application/msword
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.html szöveg/html
.java text/x-java
.json application/json
.md szöveg/markdown
.pdf alkalmazás/pdf
.php text/x-php
.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation
.py szöveg/x-python
.py text/x-script.python
.rb szöveg/x-ruby
.Tex szöveg/x-tex
.txt text/plain
.Css szöveg/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"}],
)

A fájlok eléréséhez a fájlkereső eszköz a vektortároló objektumot használja. Töltse fel a fájlokat, és hozzon létre egy vektortárolót, amely tartalmazza őket. A vektortároló létrehozása után le kell kérdeznie annak állapotát, amíg az összes fájl nincs állapotban in_progress , hogy az összes tartalom feldolgozása befejeződött- e. Az SDK segítséget nyújt a feltöltéshez és a lekérdezéshez.

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)

Az asszisztens frissítése az új vektortároló használatára

Ha elérhetővé szeretné tenni a fájlokat az asszisztens számára, frissítse az asszisztens azonosítóját tool_resources az új vector_store azonosítóval.

assistant = client.beta.assistants.update(
  assistant_id=assistant.id,
  tool_resources={"file_search": {"vector_store_ids": [vector_store.id]}},
)

Szál létrehozása

A szálakon üzenetmellékletként is csatolhat fájlokat. Ezzel egy másik vector_store , a szálhoz társított fájlt hoz létre, vagy ha már van ehhez a szálhoz egy vektortároló, csatolja az új fájlokat a meglévő szálvektortárolóhoz. Amikor létrehoz egy Futtatás ezen a szálon, a fájlkereső eszköz lekérdezi az vector_store asszisztenstől és a vector_store szálról is.

# 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)

A vektortárolók olyan üzenetmellékletek használatával jönnek létre, amelyek az utolsó aktív állapotuktól számított hét napos alapértelmezett lejárati szabályzattal rendelkeznek (a vektortároló utolsó futtatásakor). Ez az alapértelmezett beállítás segít a vektoros tárolási költségek kezelésében. Ezeket a lejárati szabályzatokat bármikor felülbírálhatja.

Futtatás létrehozása és a kimenet ellenőrzése

Hozzon létre egy futtatási lehetőséget, és figyelje meg, hogy a modell a fájlkereső eszközzel választ ad a felhasználó kérdésére.

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()

Hogyan működik?

A fájlkereső eszköz számos beolvasási ajánlott eljárást implementál a dobozból, hogy segítsen kinyerni a megfelelő adatokat a fájlokból, és kiegészíteni a modell válaszait. Az file_search eszköz:

  • Átírja a felhasználói lekérdezéseket, hogy optimalizálja őket a kereséshez.
  • Az összetett felhasználói lekérdezéseket több, párhuzamosan futtatható keresésre bontja.
  • A kulcsszó- és szemantikai kereséseket egyaránt futtatja az asszisztens és a szálvektor-tárolók között.
  • A keresési eredményeket újraküldi, hogy a végső válasz létrehozása előtt a legrelevánsabbakat válassza ki.
  • Alapértelmezés szerint a fájlkereső eszköz a következő beállításokat használja:
    • Adattömb mérete: 800 token
    • Adattömb átfedése: 400 token
    • Beágyazási modell: text-embedding-3-large 256 dimenzióban
    • A környezethez hozzáadott adattömbök maximális száma: 20

Vektortárolók

A vektortároló-objektumok lehetővé teszik a fájlkereső eszköz számára a fájlok keresését. A fájl vektortárolóhoz való hozzáadása automatikusan elemzi, darabolja, beágyazza és tárolja a fájlt egy vektoradatbázisban, amely képes a kulcsszó- és szemantikai keresésre is. Minden vektortároló legfeljebb 10 000 fájlt tartalmazhat. A vektortárolók az Asszisztensekhez és a Szálakhoz is csatolhatók. Jelenleg legfeljebb egy vektortárolót csatolhat egy asszisztenshez, és legfeljebb egy vektortárolót egy szálhoz.

Vektortárolók létrehozása és fájlok hozzáadása

Létrehozhat egy vektortárolót, és fájlokat adhat hozzá egyetlen API-hívásban:

vector_store = client.beta.vector_stores.create(
  name="Product Documentation",
  file_ids=['file_1', 'file_2', 'file_3', 'file_4', 'file_5']
)

A fájlok vektortárolókhoz való hozzáadása aszinkron művelet. A művelet befejezésének biztosítása érdekében javasoljuk, hogy használja a "létrehozás és szavazás" segítőit a hivatalos SDK-kban. Ha nem használja az SDK-kat, lekérheti az vector_store objektumot, és figyelheti annak tulajdonságát file_counts , hogy lássa a fájlbetöltési művelet eredményét.

A vektortárolókba azok létrehozása után is felvehet fájlokat vektortároló fájlok létrehozásával.

file = client.beta.vector_stores.files.create_and_poll(
  vector_store_id="vs_abc123",
  file_id="file-abc123"
)

Másik lehetőségként több fájlt is hozzáadhat egy vektortárolóhoz akár 500 fájlból álló kötegek létrehozásával.

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']
)

Hasonlóképpen, ezek a fájlok eltávolíthatók egy vektortárolóból a következő módok egyikével:

  • A vektortároló fájl objektumának törlése vagy
  • A mögöttes fájlobjektum törlésével (amely eltávolítja a fájlt az összes vector_store és code_interpreter konfigurációból a szervezet összes segédjében és szálában)

A maximális fájlméret 512 MB. Minden fájl fájlonként legfeljebb 5 000 000 tokent tartalmazhat (a fájl csatolásakor automatikusan kiszámítva).

Vektortárolók csatolása

A tool_resources paraméterrel vektortárolókat csatolhat az asszisztenshez vagy a szálhoz.

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"]
    }
  }
)

A létrehozásuk után vektortárolót is csatolhat a szálakhoz vagy az asszisztensekhez a megfelelő tool_resourcesfrissítéssel.

A vektortár felkészültségének biztosítása futtatások létrehozása előtt

Javasoljuk, hogy a futtatás létrehozása előtt győződjön meg arról, hogy a vector_store összes fájlja teljesen fel van dolgozva. Ez biztosítja, hogy a vektortároló összes adata kereshető legyen. A vektortárolók felkészültségét az SDK-k lekérdezési segédjeivel, vagy az vector_store objektum manuális lekérdezésével ellenőrizheti, hogy az állapot befejeződött-e.

Tartalékként 60 másodperces maximális várakozási idő áll rendelkezésre a futtatási objektumban, ha a szál vektortárolója még feldolgozás alatt álló fájlokat tartalmaz. Ennek célja, hogy a felhasználók által feltöltött fájlok teljes mértékben kereshetőek legyenek a futtatás előtt. Ez a tartalék várakozás nem vonatkozik az asszisztens vektortárolójára.

Költségek kezelése lejárati szabályzatokkal

Az file_search eszköz az vector_stores objektumot használja erőforrásként, és a létrehozott vector_store objektumok mérete alapján kell fizetnie. A vektortároló objektum mérete a fájlokból és azok megfelelő beágyazásaiból származó összes elemzési adattömb összege.

A vector_store objektumokhoz kapcsolódó költségek kezelése érdekében támogattuk az vector_store objektum lejárati szabályzatait. Ezeket a szabályzatokat az vector_store objektum létrehozásakor vagy frissítésekor állíthatja be.

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
  }
)

A szálvektor-tárolók alapértelmezett lejárati szabályzatokkal rendelkeznek

A szálsegítők használatával létrehozott vektortárolók (például tool_resources.file_search.vector_stores a szálakban vagy message.attachments az Üzenetekben) az utolsó aktív állapotuktól számított hét napos alapértelmezett lejárati szabályzattal rendelkeznek (a vektortároló utolsó futtatásakor).

Ha egy vektortároló lejár, az adott szál futtatása sikertelen lesz. A probléma megoldásához újra létrehozhat egy új vector_store ugyanazokkal a fájlokkal, és újrakontingathatja a szálhoz.

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]
    )