Creación de un agente de IA para RAG con Milvus y LlamaIndex
En 2023, hubo una explosión masiva en la popularidad de los modelos de lenguaje grandes (LLMs) y, como resultado, de las aplicaciones LLM. Los dos tipos más populares de aplicaciones LLM que han pasado a primer plano son la generación aumentada por recuperación (RAG) y los agentes de IA. RAG consiste en usar una base de datos vectorial como Milvus para inyectar datos contextuales. Los agentes de IA consisten en usar LLMs para utilizar otras herramientas. Puedes encontrar el notebook en GitHub.
OpenAI no necesita presentación. Para acceder a los servicios de OpenAI, es necesario añadir la clave api de openai, especialmente para funcionalidades como embeddings y el uso de ChatGPT.
En este artículo, vamos a combinar ambos. Cubrimos:
El stack tecnológico: Milvus y LlamaIndex
Milvus Lite
Milvus en Docker Compose
LlamaIndex
Creación de un agente de IA para RAG
Puesta en marcha de Milvus
Carga de los datos en Milvus mediante LlamaIndex
Creación de las herramientas del motor de consultas para el agente de IA
Creación del agente de IA para RAG
Resumen de la creación de un agente de IA para RAG con Milvus y LlamaIndex
Introducción a Milvus y LlamaIndex para RAG
Milvus y LlamaIndex son dos herramientas potentes que pueden usarse juntas para crear un sistema de generación aumentada por recuperación (RAG). Milvus es una base de datos vectorial que permite el almacenamiento y la consulta eficientes de grandes cantidades de datos, mientras que LlamaIndex es una biblioteca que proporciona una forma sencilla y flexible de interactuar con Milvus y otras bases de datos vectoriales. Al combinar estas dos herramientas, los desarrolladores pueden crear sistemas RAG que pueden recuperar y generar texto de manera eficiente basándose en un prompt dado.
Milvus destaca en el manejo de datos vectoriales a gran escala, lo que lo hace ideal para aplicaciones que requieren búsqueda de similitud de alto rendimiento. Por otro lado, LlamaIndex simplifica el proceso de indexar y consultar estos datos, proporcionando una interfaz fluida para los desarrolladores. Juntos, forman una base robusta para sistemas RAG, permitiendo la recuperación de información relevante y la generación de respuestas contextualmente precisas.
El stack tecnológico: Milvus Vector Store y LlamaIndex
Para este agente de IA que realiza RAG, en realidad usamos tres tecnologías: Milvus, LlamaIndex y OpenAI. OpenAI no necesita presentación. También puedes usar OctoAI o un HuggingFace LLM como reemplazo directo. Es posible que actualicemos esto más adelante con una versión usando cualquiera de ellos.
Hay muchas formas en las que podemos usar Milvus. Milvus Lite, que podemos poner en marcha directamente en nuestro notebook de Jupyter, y Milvus mediante Docker. Milvus lite puede instalarse a través de PyPi usando pip install milvus. El milvus vector store permite cargar datos y habilitar capacidades de búsqueda basadas en vectores de consulta. Luego, puede ponerse en marcha, usarse y detenerse directamente en tu notebook.
Milvus es un sistema distribuido, así que, naturalmente, tiene sentido poner en marcha Milvus con Docker Compose. El archivo docker compose está disponible en la página y en el GitHub de Milvus. Cuando pones en marcha Milvus con Docker Compose, verás tres contenedores y te conectarás a Milvus a través del puerto 19530 de forma predeterminada.
LlamaIndex
LlamaIndex es uno de los frameworks más populares para crear aplicaciones LLM. Es uno de tres proyectos populares: LlamaIndex, LangChain y Haystack. El enfoque principal de LlamaIndex es proporcionar un framework especializado para tareas de recuperación. Además, proporciona herramientas para crear agentes de IA.
Hay muchas formas de crear RAG y agentes de IA. Este ejemplo se basa en mi tutorial original sobre un agente de IA RAG. La principal diferencia entre estos dos ejemplos es que este usa Milvus como un almacén vectorial persistente con LlamaIndex. Las importaciones de LlamaIndex siguen siendo las mismas: las tres importaciones que obtenemos del componente core de LlamaIndex son el lector de directorios, el índice de almacén vectorial y el contexto de almacenamiento.
También obtenemos la herramienta de ingeniería de consultas y el objeto de metadatos de la herramienta para crear y describir nuestra herramienta para RAG. En comparación con la versión anterior, la importación adicional que hacemos aquí es para obtener el objeto MilvusVectorStore para LlamaIndex. Para obtener todo esto, necesitas ejecutar pip install -U llama-index llama-index-vector-stores-milvus pymilvus llama-index-llms-openai llama-index-readers-file.
from llama_index.core import (
SimpleDirectoryReader,
VectorStoreIndex,
StorageContext
)
from llama_index.core.tools import QueryEngineTool, ToolMetadata
from llama_index.vector_stores.milvus import MilvusVectorStore
Un paso crítico al hacer RAG con un backend de base de datos vectorial es poner en marcha nuestra base de datos vectorial. Milvus es la única base de datos vectorial distribuida del mercado y se pone en marcha de dos maneras. Primero, podemos importar directamente default_server e iniciarlo con start(). Segundo, podemos ponerlo en marcha mediante Docker Compose. El código para ambos se muestra a continuación.
from milvus import default_server
default_server.start()
O ejecuta docker compose up -d en la terminal en el mismo directorio donde está tu archivo docker-compose.yml.
La única diferencia entre nuestras instancias de Milvus que contienen los datos es el nombre de la colección. Es importante establecer el nivel de consistencia para garantizar la integridad de los datos durante las operaciones, siendo la configuración predeterminada 'Strong'.
Cargar los datos del documento en Milvus mediante LlamaIndex
El primer paso para crear una app RAG es cargar tus datos en tu base de datos vectorial. Para este tutorial, hacemos esto mediante LlamaIndex. Usamos su lector de directorios simple para leer los archivos de entrada. En este caso, estamos analizando los documentos financieros de Lyft y Uber. El proceso de creación de colecciones implica configurar una base de datos donde los datos se estructuran e indexan, garantizando una gestión y recuperación de datos efectivas.
# load data
lyft_docs = SimpleDirectoryReader(
input_files=["./data/10k/lyft_2021.pdf"]
).load_data()
uber_docs = SimpleDirectoryReader(
input_files=["./data/10k/uber_2021.pdf"]
).load_data()
Una vez cargados los datos, necesitamos crear un objeto MilvusVectorStore en LlamaIndex para contenerlos. Usamos OpenAI tanto para el modelo de embeddings como para el LLM en este ejemplo, por lo que pasamos una dimensión de 1536. La única diferencia entre nuestras instancias de Milvus que contienen los datos es el nombre de la colección. También es posible sobrescribir una colección existente con el mismo nombre si es necesario.
Si usas Milvus Lite en lugar de Milvus mediante Docker Compose, también deberías pasar el host y el puerto para asegurarte de conectarte al puerto correcto. Debemos obtener el puerto del servidor predeterminado mediante la opción listen_port.
# build index
vector_store_lyft = MilvusVectorStore(dim=1536, collection_name="lyft", overwrite=True)
vector_store_uber = MilvusVectorStore(dim=1536, collection_name="uber", overwrite=True)
# for milvus lite users
if milvuslite:
vector_store_lyft = MilvusVectorStore(host="localhost", port=default_server.listen_port, dim=1536, collection_name="lyft", overwrite=True)
vector_store_uber = MilvusVectorStore(host="localhost", port=default_server.listen_port, dim=1536, collection_name="uber", overwrite=True)
Tenemos que poder pasar los datos de un lado a otro, no solo cargarlos. LlamaIndex maneja esta abstracción proporcionando un objeto StorageContext. Pasamos el almacén vectorial al contexto de almacenamiento tanto para Lyft como para Uber para poder pasar esos datos de un lado a otro. Luego, creamos índices en esos almacenes vectoriales. Las dos últimas líneas de este bloque persisten esos almacenes vectoriales en tu disco local para que puedas recuperarlos del almacenamiento la próxima vez.
storage_context_lyft = StorageContext.from_defaults(vector_store=vector_store_lyft)
storage_context_uber = StorageContext.from_defaults(vector_store=vector_store_uber)
lyft_index = VectorStoreIndex.from_documents(lyft_docs, storage_context=storage_context_lyft)
uber_index = VectorStoreIndex.from_documents(uber_docs, storage_context=storage_context_uber)
# persist index
lyft_index.storage_context.persist(persist_dir="./storage/lyft")
uber_index.storage_context.persist(persist_dir="./storage/uber")
Creación de las herramientas del motor de consultas para el agente de IA
Para que un agente de IA haga RAG, necesita poder usar herramientas para realizar consultas en bases de datos vectoriales. En este siguiente bloque, convertimos los índices vectoriales que creamos en motores de consulta que recuperan los 3 resultados más similares.
lyft_engine = lyft_index.as_query_engine(similarity_top_k=3)
uber_engine = uber_index.as_query_engine(similarity_top_k=3)
Luego convertimos los motores de consulta en herramientas. El agente ReAct para LlamaIndex (importado en la siguiente sección) toma una lista de herramientas como parte de su entrada. Entonces, en esta sección, creamos esa lista de herramientas. Solo necesitamos crear dos herramientas, ambas con estructuras casi idénticas. La Query Engine Tool requiere un motor de consulta y metadatos. Los metadatos se usan para nombrar la herramienta y decirle al LLM qué hace y cómo usarla.
query_engine_tools = [
QueryEngineTool(
query_engine=lyft_engine,
metadata=ToolMetadata(
name="lyft_10k",
description=(
"Provides information about Lyft financials for year 2021. "
"Use a detailed plain text question as input to the tool."
),
),
),
QueryEngineTool(
query_engine=uber_engine,
metadata=ToolMetadata(
name="uber_10k",
description=(
"Provides information about Uber financials for year 2021. "
"Use a detailed plain text question as input to the tool."
),
),
),
]
Todo está preparado para la última parte: unir las piezas del agente. Aquí, importamos la herramienta ReAct Agent y OpenAI desde LlamaIndex. Definimos el LLM como GPT-3.5, aunque en realidad puedes usar cualquier LLM que quieras. Para el agente, le pasamos nuestra lista de herramientas de antes, el LLM y, en este ejemplo en particular, “verbose” para ver sus “pensamientos”.
from llama_index.core.agent import ReActAgent
from llama_index.llms.openai import OpenAI
llm = OpenAI(model="gpt-3.5-turbo-0613")
agent = ReActAgent.from_tools(
query_engine_tools,
llm=llm,
verbose=True
)
response = agent.chat("What was Lyft's revenue growth in 2021?")
print(str(response))
Cuando se le pregunta cuál fue el crecimiento de los ingresos de Lyft en 2021, esperamos una respuesta como la siguiente.
Consulta y recuperación de datos con Milvus y LlamaIndex
Para consultar y recuperar datos con Milvus y LlamaIndex, necesitas crear una colección de Milvus e indexarla usando LlamaIndex. Una colección de Milvus es un contenedor que almacena un conjunto de vectores, y un índice es una estructura de datos que permite consultar los vectores de manera eficiente. Una vez que hayas creado una colección y la hayas indexado, puedes usar LlamaIndex para consultar la colección y recuperar los vectores relevantes.
Para consultar una colección de Milvus usando LlamaIndex, necesitas proporcionar un vector de consulta y una métrica de similitud. El vector de consulta representa el prompt o la consulta para la que quieres recuperar datos, y la métrica de similitud mide qué tan similares son dos vectores. LlamaIndex utiliza la métrica de similitud para clasificar los vectores de la colección y devolver los vectores mejor clasificados.
Por ejemplo, si quieres recuperar documentos que sean similares a un documento determinado, puedes crear un vector de consulta que represente el documento y usar LlamaIndex para consultar la colección. LlamaIndex devolverá una lista de documentos que son similares al documento de consulta, junto con sus puntuaciones de similitud. Este proceso garantiza que se recuperen los documentos más relevantes, proporcionando una base sólida para análisis posteriores o generación de texto.
Construcción e integración del agente de IA
Para construir e integrar un agente de IA con Milvus y LlamaIndex, necesitas crear una base de conocimientos que almacene los datos que el agente utilizará para generar texto. La base de conocimientos puede ser una colección de Milvus que almacene un conjunto de vectores, cada uno de los cuales representa un fragmento de texto.
Para integrar el agente de IA con Milvus y LlamaIndex, necesitas usar LlamaIndex para consultar la base de conocimientos y recuperar los vectores relevantes. El agente de IA puede luego usar estos vectores para generar texto basado en un prompt dado.
Por ejemplo, si quieres construir un agente de IA que pueda responder preguntas sobre un tema en particular, puedes crear una base de conocimientos que almacene un conjunto de vectores que representen documentos relacionados con el tema. Cuando el agente recibe una pregunta, puede usar LlamaIndex para consultar la base de conocimientos y recuperar los vectores relevantes. El agente puede luego usar estos vectores para generar una respuesta a la pregunta.
En general, Milvus y LlamaIndex proporcionan una potente combinación de herramientas para construir sistemas RAG y agentes de IA. Al usar estas herramientas juntas, los desarrolladores pueden construir sistemas que pueden recuperar y generar texto de manera eficiente basándose en un prompt dado, lo que los hace invaluables para aplicaciones en diversos dominios, desde atención al cliente hasta generación de contenido.
Resumen de la construcción de un agente de IA para generación aumentada por recuperación con Milvus y LlamaIndex
En este artículo, construimos un agente de IA para RAG usando Milvus, LlamaIndex y GPT 3.5. RAG es una arquitectura de aplicación basada en LLM que usa bases de datos vectoriales para inyectar tus datos en un LLM como contexto . Un agente de IA es una aplicación basada en LLM que puede usar otras herramientas. Para hacer RAG con un agente de IA, le proporcionamos las herramientas necesarias para realizar consultas en una base de datos vectorial.
En este tutorial, mostramos cómo construir esta arquitectura usando datos de muestra de Lyft y Uber. Primero inyectamos los datos en Milvus para poder hacer RAG. Luego, convertimos nuestras colecciones de Milvus en motores de consulta y los motores de consulta en herramientas utilizables. Finalmente, le dimos esas herramientas a un agente de IA y las usamos para realizar RAG en nuestros documentos.
Sigue leyendo

How to Install and Run OpenClaw (Previously Clawdbot/Moltbot) on Mac
Turn your Mac into an AI gateway for WhatsApp, Telegram, Discord, iMessage, and more — in under 5 minutes.

Zilliz Cloud Now Available in AWS Europe (Ireland)
Zilliz Cloud launches in AWS eu-west-1 (Ireland) — bringing low-latency vector search, EU data residency, and full GDPR-ready infrastructure to European AI teams. Now live across 30 regions on five cloud providers.

Expanding Our Global Reach: Zilliz Cloud Launches in Azure Central India
Zilliz Cloud expands to Azure Central India. This new region helps customers meet compliance, reduce latency, and optimize cloud costs when building AI applications.



