Aracılığıyla paylaş


Azure OpenAI Yardımcıları dosya arama aracı (Önizleme)

Dosya Arama, Yardımcı'yı modeli dışından, özel ürün bilgileri veya kullanıcılarınız tarafından sağlanan belgeler gibi bilgilerle genişleter. OpenAI, belgelerinizi otomatik olarak ayrıştırıp öbekler, eklemeleri oluşturup depolar ve kullanıcı sorgularını yanıtlamak üzere ilgili içeriği almak için hem vektör hem de anahtar sözcük aramasını kullanır.

Not

Dosya arama şu anda faturalandırılmıyor.

Not

  • Dosya arama , yardımcı başına 10.000'e kadar dosya alabilir - öncekinden 500 kat daha fazla. Hızlıdır, çok iş parçacıklı aramalar aracılığıyla paralel sorguları destekler ve gelişmiş yeniden boyutlandırma ve sorgu yeniden yazma özellikleri sunar.
    • Vektör deposu API'de yeni bir nesnedir. Bir dosya bir vektör deposuna eklendikten sonra otomatik olarak ayrıştırılır, öbeklenip eklenir ve aranmaya hazır hale getirilir. Vektör depoları yardımcılar ve iş parçacıkları arasında kullanılabilir ve bu da dosya yönetimini ve faturalamayı basitleştirir.
  • Belirli bir çalıştırmada tool_choice belirli bir aracın (dosya arama, kod yorumlayıcı veya işlev gibi) kullanılmasını zorlamak için kullanılabilecek parametre desteği ekledik.

Dosya arama desteği

Desteklenen bölgeler

Dosya arama, Yardımcıları destekleyen bölgelerde kullanılabilir.

API Sürümü

  • 2024-05-01-önizleme

Desteklenen dosya türleri

Not

Metin/MIME türleri için kodlama utf-8, utf-16 veya ASCII olmalıdır.

Dosya biçimi MIME Türü
c. metin/x-c
.cs text/x-csharp
.Cpp text/x-c++
.doc application/msword
.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document
.html text/html
.java text/x-java
.Json application/json
.md text/markdown
.pdf uygulama/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 metin/x-tex
.txt text/plain
.Css metin/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"}],
)

Dosyalarınıza erişmek için dosya arama aracı vektör deposu nesnesini kullanır. Dosyalarınızı karşıya yükleyin ve bunları içerecek bir vektör deposu oluşturun. Vektör deposu oluşturulduktan sonra, tüm içeriğin işlenmesinin tamamlandığından in_progress emin olmak için tüm dosyalar durum dışına çıkana kadar durumunu yoklamanız gerekir. SDK, karşıya yükleme ve yoklama için yardımcılar sağlar.

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)

Yardımcıyı yeni vektör depoyu kullanacak şekilde güncelleştirme

Dosyaların yardımcınız tarafından erişilebilir olmasını sağlamak için yardımcının tool_resources kimliğini yeni vector_store kimlikle güncelleştirin.

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

İş parçacığı oluşturma

Dosyaları iş parçacığınıza İleti eki olarak da ekleyebilirsiniz. Bunu yaptığınızda, iş parçacığıyla ilişkili başka bir vector_store öğe oluşturulur veya bu iş parçacığına eklenmiş bir vektör deposu varsa, yeni dosyaları mevcut iş parçacığı vektör deposuna ekleyin. Bu iş parçacığında çalıştır oluşturduğunuzda, dosya arama aracı hem yardımcınızdan hem de vector_store iş parçacığındaki öğesini vector_store sorgular.

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

Vektör depoları, en son etkin olduktan sonraki yedi günlük varsayılan süre sonu ilkesine sahip ileti ekleri kullanılarak oluşturulur (vektör deposunun bir çalıştırmanın parçası olduğu son zaman olarak tanımlanır). Vektör depolama maliyetlerinizi yönetmenize yardımcı olması için bu varsayılan değer vardır. Bu süre sonu ilkelerini istediğiniz zaman geçersiz kılabilirsiniz.

Çalıştırma oluşturma ve çıkışı denetleme

Bir Çalıştırma oluşturun ve modelin kullanıcının sorusuna yanıt sağlamak için dosya arama aracını kullandığını gözlemleyin.

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

Nasıl çalışır?

Dosya arama aracı, dosyalarınızdan doğru verileri ayıklamanıza ve modelin yanıtlarını artırmanıza yardımcı olmak için kutudan çeşitli en iyi alma yöntemlerini uygular. file_search aracı:

  • Arama için en iyi duruma getirmek için kullanıcı sorgularını yeniden yazar.
  • Karmaşık kullanıcı sorgularını paralel olarak çalıştırabileceği birden çok aramaya ayırır.
  • Hem yardımcı hem de iş parçacığı vektör depolarında hem anahtar sözcük hem de anlamsal aramalar çalıştırır.
  • Son yanıtı oluşturmadan önce en uygun sonuçları seçmek için arama sonuçlarını yeniden düzenler.
  • Varsayılan olarak, dosya arama aracı aşağıdaki ayarları kullanır:
    • Öbek boyutu: 800 belirteç
    • Öbek çakışması: 400 belirteç
    • Ekleme modeli: 256 boyutta metin ekleme-3-büyük
    • Bağlama eklenen öbek sayısı üst sınırı: 20

Vektör depoları

Vektör deposu nesneleri, dosya arama aracına dosyalarınızda arama yapma olanağı verir. Vektör deposuna dosya eklemek, dosyayı otomatik olarak ayrıştırıyor, öbekler, katıştırıyor ve hem anahtar sözcük hem de anlamsal arama yapabilen bir vektör veritabanında depolar. Her vektör deposu en fazla 10.000 dosya barındırabilir. Vektör depoları hem Yardımcılara hem de İş Parçacıklarına eklenebilir. Şu anda bir yardımcıya en fazla bir vektör deposu ve bir iş parçacığına en fazla bir vektör deposu ekleyebilirsiniz.

Vektör depoları oluşturma ve dosya ekleme

Tek bir API çağrısında bir vektör deposu oluşturabilir ve bu depoya dosya ekleyebilirsiniz:

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

Vektör depolarına dosya eklemek zaman uyumsuz bir işlemdir. İşlemin tamamlandığından emin olmak için resmi SDK'larımızda 'oluştur ve yokla' yardımcılarını kullanmanızı öneririz. SDK'ları kullanmıyorsanız, dosya alma işleminin vector_store sonucunu görmek için nesnesini alabilir ve özelliğini izleyebilirsiniz file_counts .

Dosyalar, vektör deposu dosyaları oluşturularak oluşturulduktan sonra bir vektör deposuna da eklenebilir.

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

Alternatif olarak, en fazla 500 dosyadan oluşan toplu işlemler oluşturarak vektör deposuna birkaç dosya ekleyebilirsiniz.

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

Benzer şekilde, bu dosyalar bir vektör deposundan aşağıdakilerden biri tarafından kaldırılabilir:

  • Vektör deposu dosya nesnesini silme veya
  • Temel dosya nesnesini silerek (dosyayı kuruluşunuzdaki tüm yardımcılar ve iş parçacıklarında tüm vector_store ve code_interpreter yapılandırmalarından kaldırır)

Dosya boyutu üst sınırı 512 MB'tır. Her dosya, dosya başına en fazla 5.000.000 belirteç içermelidir (dosya eklediğinizde otomatik olarak hesaplanır).

Vektör depoları ekleme

tool_resources parametresini kullanarak Yardımcınıza veya İş Parçacığınıza vektör depoları ekleyebilirsiniz.

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

Ayrıca, oluşturulduktan sonra doğru tool_resourcesile güncelleştirerek İş Parçacıklarına veya Yardımcılara bir vektör deposu ekleyebilirsiniz.

Çalıştırma oluşturmadan önce vektör deposu hazırlığını sağlama

Çalıştırma oluşturmadan önce vector_store tüm dosyaların tam olarak işlenmiş olduğundan emin olmanız kesinlikle önerilir. Bu, vektör deponuzdaki tüm verilerin aranabilir olmasını sağlar. SDK'lardaki yoklama yardımcılarını kullanarak veya durumun tamamlandığından emin olmak için nesneyi el ile yoklayarak vector_store vektör deposu hazır olup olmadığını de kontrol edebilirsiniz.

Geri dönüş olarak, iş parçacığının vektör deposu hala işlenen dosyalar içerdiğinde Run nesnesinde en fazla 60 saniyelik bir bekleme olur. Bu, çalıştırma devam etmeden önce kullanıcılarınızın iş parçacığında karşıya yüklediği tüm dosyaların tamamen aranabilir olmasını sağlamaktır. Bu geri dönüş beklemesi yardımcının vektör deposu için geçerli değildir.

Süre sonu ilkeleriyle maliyetleri yönetme

Araç file_search , nesneyi kaynağı olarak kullanır vector_stores ve oluşturulan vector_store nesnelerin boyutuna göre faturalandırılırsınız. Vektör deposu nesnesinin boyutu, dosyalarınızdaki tüm ayrıştırılan öbeklerin ve buna karşılık gelen eklemelerin toplamıdır.

Bu vector_store nesneleriyle ilişkili maliyetleri yönetmenize yardımcı olmak için nesneye vector_store süre sonu ilkeleri desteği ekledik. Nesneyi oluştururken veya güncelleştirirken vector_store bu ilkeleri ayarlayabilirsiniz.

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

İş parçacığı vektör depolarının varsayılan süre sonu ilkeleri vardır

İş parçacığı yardımcıları kullanılarak oluşturulan vektör depoları (İş Parçacıklarında veya message.attachments İletilerde olduğu gibitool_resources.file_search.vector_stores) en son etkin olduktan sonraki yedi günlük varsayılan süre sonu ilkesine sahiptir (vektör deposunun bir çalıştırmanın son parçası olduğu zaman olarak tanımlanır).

Vektör deposu süresi dolduğunda, bu iş parçacığında çalıştırılırsa başarısız olur. Bunu düzeltmek için, aynı dosyalarla yeni bir vector_store yeniden oluşturabilir ve iş parçacığına yeniden ekleyebilirsiniz.

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