¿Todavía necesitamos bases de datos vectoriales para RAG con el lanzamiento de la recuperación integrada de OpenAI?
OpenAI volvió a acaparar titulares con una serie de lanzamientos durante su DevDay, presentando el modelo GPT-4 Turbo, la nueva API de Assistants y una variedad de mejoras. La API de Assistants surge como una potente herramienta que ayuda a los desarrolladores a crear aplicaciones de IA a medida que responden a necesidades específicas. También les permite aprovechar conocimiento adicional, una mayor longitud de prompt y herramientas para diversas tareas.
Aunque OpenAI Assistants cuenta con una función de recuperación integrada, no es perfecta: pensemos en las restricciones sobre la escala de datos y la falta de capacidad de personalización. Aquí es precisamente donde entra en juego un recuperador personalizado para ayudar. Al aprovechar las capacidades de llamada a funciones de OpenAI, los desarrolladores pueden integrar sin problemas un recuperador personalizado, elevando la escala del conocimiento adicional y adaptándose mejor a diversos casos de uso. En esta entrada de blog, profundizaremos en las limitaciones de la recuperación integrada de OpenAI y te guiaremos en la creación de un recuperador personalizado utilizando la base de datos vectorial Milvus.
Limitaciones de la recuperación de OpenAI en Assistants y el papel de las soluciones de recuperación personalizadas
La función Retrieval integrada de OpenAI representa un salto más allá del conocimiento inherente del modelo, permitiendo a los usuarios aumentarlo con datos adicionales como información de productos propietarios o documentos proporcionados por el usuario. Sin embargo, se enfrenta a limitaciones notables.
Restricción de escalabilidad
OpenAI Retrieval impone restricciones de archivos y almacenamiento total que podrían quedarse cortas para repositorios de documentos extensos:
Un máximo de 20 archivos por assistant
Un límite de 512MB por archivo
Una limitación oculta de 2 millones de tokens por archivo, descubierta durante nuestras pruebas
Un límite de tamaño total inferior a 100GB por organización
Para organizaciones con repositorios de datos extensos, estas limitaciones plantean desafíos. Se vuelve imprescindible una solución escalable que crezca sin problemas sin alcanzar techos de almacenamiento. Integrar un recuperador personalizado impulsado por una base de datos vectorial como Milvus o Zilliz Cloud (el Milvus gestionado) ofrece una alternativa para las limitaciones de archivos inherentes a la Retrieval integrada de OpenAI.
Falta de personalización
Aunque Retrieval de OpenAI ofrece una solución práctica lista para usar, no puede alinearse de manera consistente con las necesidades específicas de cada aplicación, especialmente en lo que respecta a la latencia y la personalización del algoritmo de búsqueda. Utilizar una base de datos vectorial de terceros otorga a los desarrolladores la flexibilidad para optimizar y configurar el proceso de recuperación, atendiendo las necesidades de producción y mejorando la eficiencia general.
Falta de multi-tenancy
Retrieval es una función integrada en OpenAI Assistants que solo admite el uso de usuarios individuales. Sin embargo, si eres un desarrollador que busca atender a millones de usuarios con documentos compartidos e información privada de los usuarios, la función de recuperación integrada no puede ayudar. Replicar documentos compartidos en el Assistant de cada usuario incrementa los costos de almacenamiento, mientras que hacer que todos los usuarios compartan el mismo Assistant plantea desafíos para admitir documentos privados específicos de cada usuario.
El siguiente gráfico muestra que almacenar documentos en OpenAI Assistants es caro ($6 por GB al mes; como referencia, AWS S3 cobra $0.023), lo que hace que almacenar documentos duplicados en OpenAI sea increíblemente derrochador.
Precios de la API de Assistants de https://openai.com/pricing
Para organizaciones que albergan conjuntos de datos extensos, es imprescindible un recuperador escalable, eficiente y rentable que se alinee con demandas operativas específicas. Afortunadamente, con la flexible capacidad de llamada a funciones de OpenAI, los desarrolladores pueden integrar sin problemas un recuperador personalizado con OpenAI Assistants. Esta solución garantiza que las empresas puedan aprovechar las mejores capacidades de IA impulsadas por OpenAI mientras mantienen la escalabilidad y flexibilidad para sus necesidades únicas.
Aprovechar Milvus para la recuperación personalizada de OpenAI
Milvus es una base de datos vectorial de código abierto que puede almacenar y recuperar miles de millones de vectores en milisegundos. También es altamente escalable para satisfacer las necesidades empresariales de los usuarios, que crecen rápidamente. Con escalado rápido y latencia ultrabaja, la base de datos vectorial Milvus se encuentra entre las principales opciones para crear un recuperador altamente escalable y más eficiente para tu asistente de OpenAI.
Cómo funciona un recuperador personalizado de OpenAI
Crear un recuperador personalizado con llamadas a funciones de OpenAI y la base de datos vectorial Milvus
Empecemos a crear el recuperador personalizado e integrarlo con OpenAI siguiendo la guía paso a paso.
- Configura el entorno.
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
- Crea un recuperador personalizado con una base de datos vectorial. Esta guía usa Milvus como base de datos vectorial y LangChain como envoltorio.
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
- Ingiere documentos adicionales en Milvus. Los documentos se analizarán, se dividirán en fragmentos y luego se transformarán en embeddings antes de ser ingeridos en la base de datos vectorial. Los desarrolladores pueden personalizar cada paso para mejorar la calidad de la recuperación.
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])
Ahora, has creado correctamente un recuperador personalizado capaz de realizar búsqueda semántica basada en tus datos privados o propietarios. A continuación, debes integrar este recuperador con OpenAI Assistants para habilitar la generación de contenido.
- Crea un Assistant con la función Function Calling de OpenAI. Se indica al Assistant que use una herramienta de función llamada
CustomRetrieveral responder a consultas.
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
)
- El Assistant realiza tareas de preguntas y respuestas de forma asíncrona.
Runes una invocación de un Assistant durante un Thread. Durante la operación de ejecución, el Assistant decide si una función necesita llamar aCustomRetrievery espera el resultado de la llamada a la función.
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
- Ahora, el Assistant está esperando el resultado de la llamada a la función. Realiza una búsqueda vectorial para la consulta y envía el resultado.
# 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
)
- Extrae y analiza la conversación completa con 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')
¡Listo! Has chateado correctamente con tu OpenAI Assistant sobre el conocimiento proporcionado aprovechando un recuperador personalizado impulsado por Milvus.
Conclusión
Aunque la herramienta de recuperación integrada de OpenAI Assistants es impresionante, lidia con limitaciones como restricciones de almacenamiento, problemas de escalabilidad y falta de personalización para diversas necesidades de los usuarios. Atiende solo a usuarios individuales, lo que plantea desafíos para aplicaciones con millones de usuarios y documentos tanto compartidos como privados.
Crear un recuperador personalizado usando una base de datos vectorial robusta como Milvus o Zilliz Cloud (la versión totalmente gestionada de Milvus) resulta útil para superar los desafíos anteriores. Este enfoque ofrece mayor flexibilidad y control de gestión de archivos mediante la integración con la API de OpenAI Assistant.
En nuestras próximas publicaciones, compararemos el rendimiento, el costo y las capacidades de OpenAI Retrieval y de un recuperador personalizado. También revelaremos resultados de benchmarks y proporcionaremos información valiosa para desarrolladores que buscan soluciones óptimas para mejorar la calidad de la recuperación. ¡Mantente atento!
Sigue leyendo

Introducing Zilliz CLI and Agent Skills for Zilliz Cloud
Manage your vector database from your terminal or AI coding agent. Zilliz CLI and Agent Skills work with Claude Code, Cursor, Codex, and Copilot.

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.

Why Deepseek is Waking up AI Giants Like OpenAI And Why You Should Care
Discover how DeepSeek R1's open-source AI model with superior reasoning capabilities and lower costs is disrupting the AI landscape and challenging tech giants like OpenAI.



