Creare un agente AI per RAG con Milvus e LlamaIndex
Nel 2023 c'è stata un'enorme esplosione della popolarità dei grandi modelli linguistici (LLM) e, di conseguenza, delle applicazioni LLM. I due tipi più popolari di applicazioni LLM emersi in primo piano sono la retrieval augmented generation (RAG) e gli agenti AI. La RAG consiste nell'utilizzare un database vettoriale come Milvus per iniettare dati contestuali. Gli agenti AI consistono nell'utilizzare gli LLM per usare altri strumenti. Puoi trovare il notebook su GitHub.
OpenAI non ha bisogno di presentazioni. Per accedere ai servizi OpenAI, è necessario aggiungere la chiave API openai, soprattutto per funzionalità come gli embedding e l'utilizzo di ChatGPT.
In questo articolo, combineremo i due. Tratteremo:
Lo stack tecnologico: Milvus e LlamaIndex
Milvus Lite
Milvus su Docker Compose
LlamaIndex
Creare un agente AI per RAG
Avviare Milvus
Caricare i dati in Milvus tramite LlamaIndex
Creare gli strumenti del motore di query per l'agente AI
Creare l'agente AI per RAG
Riepilogo della creazione di un agente AI per RAG con Milvus e LlamaIndex
Introduzione a Milvus e LlamaIndex per RAG
Milvus e LlamaIndex sono due potenti strumenti che possono essere utilizzati insieme per creare un sistema Retrieval-Augmented Generation (RAG). Milvus è un database vettoriale che consente l'archiviazione e l'interrogazione efficienti di grandi quantità di dati, mentre LlamaIndex è una libreria che fornisce un modo semplice e flessibile per interagire con Milvus e altri database vettoriali. Combinando questi due strumenti, gli sviluppatori possono creare sistemi RAG in grado di recuperare e generare testo in modo efficiente sulla base di un dato prompt.
Milvus eccelle nella gestione di dati vettoriali su larga scala, il che lo rende ideale per applicazioni che richiedono una ricerca di similarità ad alte prestazioni. D'altra parte, LlamaIndex semplifica il processo di indicizzazione e interrogazione di questi dati, fornendo un'interfaccia fluida per gli sviluppatori. Insieme, formano una base solida per i sistemi RAG, consentendo il recupero di informazioni pertinenti e la generazione di risposte contestualmente accurate.
Lo stack tecnologico: Milvus Vector Store e LlamaIndex
Per questo agente AI che esegue RAG, in realtà utilizziamo tre tecnologie: Milvus, LlamaIndex e OpenAI. OpenAI non ha bisogno di presentazioni. Puoi anche usare OctoAI o un LLM HuggingFace come sostituto immediato. Potremmo aggiornare questo contenuto con una versione che utilizzi uno dei due in seguito.
Ci sono molti modi in cui possiamo usare Milvus. Milvus Lite, che possiamo avviare direttamente nel nostro notebook Jupyter, e Milvus tramite Docker. Milvus lite può essere installato tramite PyPi usando pip install milvus. Il vector store milvus consente di caricare dati e abilitare capacità di ricerca basate sui vettori di query. Poi può essere avviato, utilizzato e arrestato direttamente nel tuo notebook.
Milvus è un sistema distribuito, quindi naturalmente ha senso avviare Milvus con Docker Compose. Il file docker compose è disponibile sulla pagina e su GitHub di Milvus. Quando avvii Milvus con Docker Compose, vedrai tre container e ti connetterai a Milvus tramite la porta 19530 per impostazione predefinita.
LlamaIndex
LlamaIndex è uno dei framework più popolari per creare app LLM. È uno dei tre progetti popolari - LlamaIndex, LangChain e Haystack. L'obiettivo principale di LlamaIndex è fornire un framework specializzato per attività di retrieval. Inoltre, fornisce strumenti per creare agenti AI.
Esistono molti modi per creare RAG e AI Agent. Questo esempio si basa sul mio tutorial originale su un RAG AI Agent. La differenza principale tra questi due esempi è che questo usa Milvus come persistent vector store con LlamaIndex. Gli import di LlamaIndex rimangono gli stessi: i tre import che otteniamo dal componente core di LlamaIndex sono il directory reader, il vector store index e lo storage context.
Prendiamo anche il query engineer tool e l’oggetto tool metadata per creare e descrivere il nostro tool per RAG. Rispetto alla versione precedente, l’import aggiuntivo che facciamo qui è per ottenere l’oggetto MilvusVectorStore per LlamaIndex. Per ottenere tutto questo, devi eseguire 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 passaggio critico nel fare RAG con un backend di database vettoriale è avviare il nostro database vettoriale. Milvus è l’unico database vettoriale distribuito sul mercato e si avvia in due modi. Primo, possiamo importare direttamente il default_server e fare start(). Secondo, possiamo avviarlo tramite Docker Compose. Il codice per entrambi è mostrato qui sotto.
from milvus import default_server
default_server.start()
Oppure esegui docker compose up -d nel terminale nella stessa directory in cui si trova il tuo file docker-compose.yml.
L’unica differenza tra le nostre istanze Milvus che contengono i dati è il nome della collection. È importante impostare il livello di consistenza per garantire l’integrità dei dati durante le operazioni, con l’impostazione predefinita che è 'Strong'.
Caricamento dei dati dei documenti in Milvus tramite LlamaIndex
Il primo passo per creare un’app RAG è caricare i tuoi dati nel tuo database vettoriale. Per questo tutorial, lo facciamo tramite LlamaIndex. Usiamo il loro simple directory reader per leggere i file di input. In questo caso, stiamo esaminando i documenti finanziari di Lyft e Uber. Il processo di creazione della collection comporta la configurazione di un database in cui i dati sono strutturati e indicizzati, garantendo una gestione e un recupero efficaci dei dati.
# 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 volta caricati i dati, dobbiamo creare un oggetto MilvusVectorStore in LlamaIndex per contenerli. In questo esempio usiamo OpenAI sia per il modello di embedding sia per l’LLM, quindi passiamo una dimensione di 1536. L’unica differenza tra le nostre istanze Milvus che contengono i dati è il nome della collection. È anche possibile sovrascrivere una collection esistente con lo stesso nome, se necessario.
Se usi Milvus Lite invece di Milvus tramite Docker Compose, dovresti anche passare host e porta per assicurarti di connetterti alla porta corretta. Dobbiamo ottenere la porta dal server predefinito tramite l’opzione 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)
Dobbiamo essere in grado di passare i dati in giro, non solo caricarli. LlamaIndex gestisce questa astrazione fornendo un oggetto StorageContext. Passiamo il vector store nel contesto di storage sia per Lyft sia per Uber per poter passare quei dati in giro. Poi, creiamo indici su quei vector store. Le ultime due righe in questo blocco persistono quei vector store sul tuo disco locale, così puoi recuperarli dallo storage la prossima volta.
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")
Creazione dei Query Engine Tools per l'AI Agent
Perché un AI Agent possa fare RAG, deve essere in grado di usare strumenti per eseguire query su database vettoriali. In questo blocco successivo, trasformiamo gli indici vettoriali che abbiamo creato in query engine che recuperano i primi 3 risultati più simili.
lyft_engine = lyft_index.as_query_engine(similarity_top_k=3)
uber_engine = uber_index.as_query_engine(similarity_top_k=3)
Poi trasformiamo i query engine in strumenti. L'agente ReAct per LlamaIndex (importato nella sezione successiva) prende un elenco di strumenti come parte del suo input. Quindi, in questa sezione, creiamo quell'elenco di strumenti. Dobbiamo creare solo due strumenti, entrambi con strutture quasi identiche. Il Query Engine Tool richiede un query engine e metadati. I metadati vengono usati per dare un nome allo strumento e dire all'LLM cosa fa e come usarlo.
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."
),
),
),
]
Tutto è pronto per l'ultimo pezzo: mettere insieme i componenti dell'agente. Qui, importiamo lo strumento ReAct Agent e OpenAI da LlamaIndex. Definiamo l'LLM come GPT-3.5, anche se in realtà puoi usare qualsiasi LLM tu voglia. Per l'agente, gli passiamo il nostro elenco di strumenti di prima, l'LLM e, in questo esempio specifico, “verbose” per vedere i suoi “pensieri”.
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))
Quando viene chiesto quale fosse la crescita dei ricavi di Lyft nel 2021, ci aspettiamo una risposta come quella qui sotto.
Query e recupero dei dati con Milvus e LlamaIndex
Per interrogare e recuperare dati con Milvus e LlamaIndex, devi creare una collection Milvus e indicizzarla usando LlamaIndex. Una collection Milvus è un contenitore che archivia un insieme di vettori, e un indice è una struttura dati che consente query efficienti sui vettori. Una volta creata una collection e indicizzata, puoi usare LlamaIndex per interrogare la collection e recuperare i vettori pertinenti.
Per interrogare una collection Milvus usando LlamaIndex, devi fornire un vettore di query e una metrica di similarità. Il vettore di query rappresenta il prompt o la query per cui vuoi recuperare i dati, e la metrica di similarità misura quanto due vettori siano simili. LlamaIndex usa la metrica di similarità per classificare i vettori nella collection e restituire i vettori con il ranking più alto.
Ad esempio, se vuoi recuperare documenti simili a un determinato documento, puoi creare un vettore di query che rappresenti il documento e usare LlamaIndex per interrogare la collection. LlamaIndex restituirà un elenco di documenti simili al documento di query, insieme ai loro punteggi di similarità. Questo processo garantisce che vengano recuperati i documenti più pertinenti, fornendo una solida base per ulteriori analisi o per la generazione di testo.
Creazione e integrazione dell'agente AI
Per creare e integrare un agente AI con Milvus e LlamaIndex, devi creare una knowledge base che memorizzi i dati che l'agente userà per generare testo. La knowledge base può essere una collection Milvus che memorizza un insieme di vettori, ognuno dei quali rappresenta un frammento di testo.
Per integrare l'agente AI con Milvus e LlamaIndex, devi usare LlamaIndex per interrogare la knowledge base e recuperare i vettori pertinenti. L'agente AI può quindi usare questi vettori per generare testo in base a un determinato prompt.
Ad esempio, se vuoi creare un agente AI in grado di rispondere a domande su un particolare argomento, puoi creare una knowledge base che memorizzi un insieme di vettori che rappresentano documenti relativi all'argomento. Quando l'agente riceve una domanda, può usare LlamaIndex per interrogare la knowledge base e recuperare i vettori pertinenti. L'agente può quindi usare questi vettori per generare una risposta alla domanda.
Nel complesso, Milvus e LlamaIndex offrono una potente combinazione di strumenti per creare sistemi RAG e agenti AI. Usando questi strumenti insieme, gli sviluppatori possono creare sistemi in grado di recuperare e generare testo in modo efficiente in base a un determinato prompt, rendendoli preziosi per applicazioni in vari ambiti, dall'assistenza clienti alla generazione di contenuti.
Riepilogo della creazione di un agente AI per la Retrieval Augmented Generation con Milvus e LlamaIndex
In questo articolo, abbiamo creato un agente AI per RAG usando Milvus, LlamaIndex e GPT 3.5. RAG è un'architettura di app basata su LLM che usa database vettoriali per inserire i tuoi dati in un LLM come contesto . Un agente AI è un'applicazione basata su LLM che può usare altri strumenti. Per eseguire RAG con un agente AI, gli forniamo gli strumenti necessari per eseguire query su un database vettoriale.
In questo tutorial, abbiamo mostrato come creare questa architettura usando dati di esempio di Lyft e Uber. Per prima cosa abbiamo inserito i dati in Milvus in modo da poter eseguire RAG. Poi, abbiamo trasformato le nostre collection Milvus in motori di query e i motori di query in strumenti utilizzabili. Infine, abbiamo fornito questi strumenti a un agente AI e li abbiamo usati per eseguire RAG sui nostri documenti.
Continua a leggere

How to Choose the Best Embedding Model for RAG in 2026: 10 Models Benchmarked
We benchmarked 10 embedding models on cross-modal, cross-lingual, long-document, and dimension compression tasks. See which one fits your RAG pipeline.

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.

How Zilliz Saw the Future of Vector Databases—and Built for Production
An inside look at how Zilliz built vector databases for real-world use, focusing on scalability, stability, and running them reliably at scale.



