Нужны ли нам всё ещё векторные базы данных для RAG после выпуска OpenAI встроенного поиска?
OpenAI вновь попала в заголовки новостей благодаря целому ряду релизов во время DevDay, представив модель GPT-4 Turbo, новый Assistants API и множество улучшений. Assistants API становится мощным инструментом, помогающим разработчикам создавать специализированные AI-приложения под конкретные потребности. Он также позволяет им использовать дополнительные знания, более длинные промпты и инструменты для различных задач.
Хотя OpenAI Assistants имеют встроенную функцию retrieval, она не идеальна — например, есть ограничения по масштабу данных и недостаток возможностей настройки. Именно здесь на помощь приходит пользовательский retriever. Используя возможности function calling от OpenAI, разработчики могут бесшовно интегрировать настраиваемый retriever, увеличивая масштаб дополнительных знаний и лучше адаптируясь к разнообразным сценариям использования. В этой статье блога мы подробно рассмотрим ограничения встроенного retrieval в OpenAI и проведем вас через создание настраиваемого retriever с использованием векторной базы данных Milvus.
Ограничения retrieval в OpenAI Assistants и роль пользовательских retrieval-решений
Встроенная функция Retrieval от OpenAI представляет собой шаг вперед по сравнению с внутренними знаниями модели, позволяя пользователям дополнять их дополнительными данными, такими как проприетарная информация о продуктах или предоставленные пользователями документы. Однако она сталкивается с заметными ограничениями.
Ограничение масштабируемости
OpenAI Retrieval накладывает ограничения на файлы и общий объем хранилища, которых может не хватить для обширных репозиториев документов:
Максимум 20 файлов на одного assistant
Ограничение 512MB на файл
Скрытое ограничение в 2 миллиона токенов на файл, обнаруженное в ходе нашего тестирования
Общий лимит размера менее 100GB на организацию
Для организаций с обширными репозиториями данных эти ограничения создают трудности. Масштабируемое решение, которое бесшовно растет, не упираясь в потолки хранилища, становится необходимым. Интеграция пользовательского retriever на базе векторной базы данных, такой как Milvus или Zilliz Cloud (управляемый Milvus), предлагает обходной путь для файловых ограничений, присущих встроенному Retrieval от OpenAI.
Недостаток настройки
Хотя Retrieval от OpenAI предлагает удобное готовое решение, оно не всегда может соответствовать конкретным потребностям каждого приложения, особенно в отношении задержки и настройки алгоритма поиска. Использование сторонней векторной базы данных дает разработчикам гибкость для оптимизации и настройки процесса retrieval, удовлетворяя производственные требования и повышая общую эффективность.
Недостаток multi-tenancy
Retrieval — это встроенная функция в OpenAI Assistants, которая поддерживает только использование отдельными пользователями. Однако если вы разработчик, стремящийся обслуживать миллионы пользователей как с общими документами, так и с приватной информацией пользователей, встроенная функция retrieval не поможет. Репликация общих документов в Assistant каждого пользователя увеличивает затраты на хранилище, а использование одного и того же Assistant всеми пользователями создает трудности в поддержке пользовательских приватных документов.
Следующий график показывает, что хранение документов в OpenAI Assistants обходится дорого ($6 за GB в месяц; для справки, AWS S3 взимает $0.023), что делает хранение дублирующихся документов в OpenAI чрезвычайно расточительным.
Цены Assistants API с https://openai.com/pricing
Для организаций, располагающих обширными наборами данных, необходим масштабируемый, эффективный и экономичный retriever, соответствующий конкретным операционным требованиям. К счастью, благодаря гибкой возможности function calling от OpenAI разработчики могут бесшовно интегрировать пользовательский retriever с OpenAI Assistants. Это решение гарантирует, что компании смогут использовать лучшие возможности AI на базе OpenAI, сохраняя при этом масштабируемость и гибкость для своих уникальных потребностей.
Использование Milvus для настраиваемого поиска OpenAI
Milvus — это векторная база данных с открытым исходным кодом, которая может хранить и извлекать миллиарды векторов за миллисекунды. Она также обладает высокой масштабируемостью, чтобы удовлетворять быстро растущие бизнес-потребности пользователей. Благодаря быстрому масштабированию и сверхнизкой задержке векторная база данных Milvus входит в число лучших вариантов для создания высокомасштабируемого и более эффективного ретривера для вашего ассистента OpenAI.
Как работает пользовательский ретривер OpenAI
Создание пользовательского ретривера с помощью вызова функций OpenAI и векторной базы данных Milvus
Давайте начнем создавать пользовательский ретривер и интегрировать его с OpenAI, следуя пошаговому руководству.
- Настройте среду.
pip install openai==1.2.0
pip install langchain==0.0.333
pip install pymilvus
export OPENAI_API_KEY=xxxx # Enter your OpenAI API key here
- Создайте пользовательский ретривер с векторной базой данных. В этом руководстве Milvus используется как векторная база данных, а LangChain — как обертка.
from langchain.vectorstores import Milvus
from langchain.embeddings import OpenAIEmbeddings
# Prepare retriever
vector_db = Milvus(
embedding_function=OpenAIEmbeddings(),
connection_args = {'host': 'localhost', 'port': '19530'}
)
retriever = vector_db.as_retriever(search_kwargs={'k': 5}) # change top_k here
- Загрузите дополнительные документы в Milvus. Документы будут разобраны, разделены на фрагменты, а затем преобразованы в embeddings перед загрузкой в векторную базу данных. Разработчики могут настраивать каждый шаг, чтобы улучшить качество поиска.
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Parsing and chunking the document.
filepath = 'path/to/your/file'
doc_data = TextLoader(filepath).load_and_split(
RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
)
# Embedding and insert chunks into the vector database.
vector_db.add_texts([doc.page_content for doc in doc_data])
Теперь вы успешно создали пользовательский ретривер, способный выполнять семантический поиск на основе ваших частных или проприетарных данных. Далее необходимо интегрировать этот ретривер с OpenAI Assistants, чтобы обеспечить генерацию контента.
- Создайте Assistant с функцией Function Calling от OpenAI. Assistant получает инструкцию использовать функциональный инструмент под названием
CustomRetrieverпри ответе на запросы.
import os
from openai import OpenAI
# Setup OpenAI client.
client = OpenAI(api_key=os.getenv('OPENAI_API_KEY'))
# Create an Assistant.
my_assistant = client.beta.assistants.create(
name='Chat with a custom retriever',
instructions='You will search for relevant information via retriever and answer questions based on retrieved information.',
tools=[
{
'type': 'function',
'function': {
'name': 'CustomRetriever',
'description': 'Retrieve relevant information from provided documents.',
'parameters': {
'type': 'object',
'properties': {'query': {'type': 'string', 'description': 'The user query'}},
'required': ['query']
},
}
}
],
model='gpt-4-1106-preview', # Switch OpenAI model here
)
- Assistant выполняет задачи вопросов и ответов асинхронно.
Run— это вызов Assistant в рамках Thread. Во время операции запуска Assistant решает, нужно ли функции вызватьCustomRetriever, и ожидает результата вызова функции.
QUERY = 'ENTER YOUR QUESTION HERE'
# Create a thread.
my_thread = client.beta.threads.create(
messages=[
{
'role': 'user',
'content': QUERY,
}
]
)
# Invoke a run of my_assistant on my_thread.
my_run = client.beta.threads.runs.create(
thread_id=my_thread.id,
assistant_id=my_assistant.id
)
# Wait until my_thread halts.
while True:
my_run = client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=my_run.id)
if my_run.status != 'queued':
break
- Теперь Assistant ожидает результат вызова функции. Выполните векторный поиск по запросу и отправьте результат.
# Conduct vector search and parse results when OpenAI Run ready for the next action
if my_run.status == 'requires_action':
tool_outputs = []
for tool_call in my_run.required_action.submit_tool_outputs.tool_calls:
if tool_call.function.name == 'Custom Retriever':
search_res = retriever.get_relevant_documents(QUERY)
tool_outputs.append({
'tool_call_id': tool_call.id,
'output': ('\n\n').join([res.page_content for res in search_res])
})
# Send retrieval results to your Run service
client.beta.threads.runs.submit_tool_outputs(
thread_id=my_thread.id,
run_id=my_run.id,
tool_outputs=tool_outputs
)
- Извлеките и разберите полный разговор с OpenAI.
messages = client.beta.threads.messages.list(
thread_id=my_thread.id
)
for m in messages:
print(f'{m.role}: {m.content[0].text.value}\n')
Вот и всё! Вы успешно пообщались со своим OpenAI Assistant о предоставленных знаниях, используя пользовательский retriever на базе Milvus.
Заключение
Хотя встроенный инструмент retrieval в OpenAI Assistants впечатляет, он сталкивается с ограничениями, такими как ограничения хранилища, проблемы масштабируемости и недостаток кастомизации для разнообразных потребностей пользователей. Он рассчитан только на отдельных пользователей, что создает трудности для приложений с миллионами пользователей и как общими, так и приватными документами.
Создание пользовательского retriever с использованием надежной векторной базы данных, такой как Milvus или Zilliz Cloud (полностью управляемая версия Milvus), помогает преодолеть вышеуказанные проблемы. Такой подход обеспечивает повышенную гибкость и контроль управления файлами через интеграцию с OpenAI Assistant API.
В наших следующих публикациях мы сравним производительность, стоимость и возможности OpenAI Retrieval и пользовательского retriever. Мы также раскроем результаты бенчмарков и предоставим ценные выводы для разработчиков, ищущих оптимальные решения для повышения качества retrieval. Следите за обновлениями!
Читать далее

The AWS Outage Was a Wake-Up Call for Vector Database Cross-Region Disaster Recovery
Zilliz Cloud Had the Answer Before the Crisis. Zilliz Cloud is the world's first vector database with native cross-region disaster recovery.

Introducing Zilliz MCP Server: Natural Language Access to Your Vector Database
Developers can easily manage and query vector databases with natural language via Zilliz MCP Server in AI-native environments.

What Exactly Are AI Agents? Why OpenAI and LangChain Are Fighting Over Their Definition?
AI agents are software programs powered by AI that can perceive their environment, make decisions, and take actions to achieve a goal—often autonomously.



