Azure OpenAI Yardımcıları dosya arama aracı (Önizleme)
Dosya Arama, Yardımcı'yı üzerinde mülkiyet hakları bulunan ürün bilgileri veya kullanıcılarınız tarafından sağlanan belgeler gibi kendi modeli dışından bilgilerle genişletir. OpenAI, belgelerinizi otomatik olarak ayrıştırıp öbeklere ayırır, eklemeleri oluşturup depolar ve kullanıcı sorgularını cevaplamak üzere ilgili içeriği almak için hem vektör hem de anahtar sözcük aramasını kullanır.
Önemli
- Dosya aramada, Azure OpenAI kullanımı için alınan belirteç tabanlı ücretlerin ötesinde ek ücretler söz konusudur.
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 derecelendirme ve sorguyu 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, öbeklere ayrılır, eklenir ve aramaya hazır hale getirilir. Vektör depolarının birden fazla yardımcı ve iş parçacığı arasında kullanılabilmesi, 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 |
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 |
Dosya aramasını etkinleştirme
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"}],
)
Dosya arama için dosyaları karşıya yükleme
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şkilendirilmiş 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ıp, öbekler, eklemeler ve depolamak için 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, daha önce oluşturulmuş olan 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, aşağıdaki yollardan biri izlenerek, bu dosyalar bir vektör deposundan kaldırılabilir:
- Vektör deposu dosya nesnesini silme veya
- Altta yatan dosya nesnesini silme (dosyayı kuruluşunuzdaki tüm yardımcılarda ve iş parçacıklarında bulunan tüm vector_store ve code_interpreter yapılandırmalarından kaldırır)
Maksimum dosya boyutu 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_resources
ile 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 çalıştırma 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]
)