Créer un agent IA pour le RAG avec Milvus et LlamaIndex
En 2023, il y a eu une explosion massive de la popularité des grands modèles de langage (LLM), et des applications LLM en conséquence. Les deux types d’applications LLM les plus populaires qui se sont imposés sont la génération augmentée par récupération (RAG) et les agents IA. La RAG consiste à utiliser une base de données vectorielle comme Milvus pour injecter des données contextuelles. Les agents IA consistent à utiliser les LLM pour utiliser d’autres outils. Vous pouvez trouver le notebook sur GitHub.
OpenAI n’a pas besoin d’introduction. Pour accéder aux services OpenAI, il est nécessaire d’ajouter la clé d’API openai, en particulier pour des fonctionnalités comme les embeddings et l’utilisation de ChatGPT.
Dans cet article, nous allons combiner les deux. Nous abordons :
La stack technique : Milvus et LlamaIndex
Milvus Lite
Milvus sur Docker Compose
LlamaIndex
Construire un agent IA pour la RAG
Lancer Milvus
Charger les données dans Milvus via LlamaIndex
Créer les outils de moteur de requête pour l’agent IA
Créer l’agent IA pour la RAG
Résumé de la création d’un agent IA pour la RAG avec Milvus et LlamaIndex
Introduction à Milvus et LlamaIndex pour la RAG
Milvus et LlamaIndex sont deux outils puissants qui peuvent être utilisés ensemble pour construire un système de génération augmentée par récupération (RAG). Milvus est une base de données vectorielle qui permet le stockage et l’interrogation efficaces de grandes quantités de données, tandis que LlamaIndex est une bibliothèque qui offre un moyen simple et flexible d’interagir avec Milvus et d’autres bases de données vectorielles. En combinant ces deux outils, les développeurs peuvent créer des systèmes RAG capables de récupérer et de générer efficacement du texte à partir d’un prompt donné.
Milvus excelle dans la gestion de données vectorielles à grande échelle, ce qui le rend idéal pour les applications qui nécessitent une recherche de similarité haute performance. D’autre part, LlamaIndex simplifie le processus d’indexation et d’interrogation de ces données, en fournissant une interface transparente aux développeurs. Ensemble, ils forment une base robuste pour les systèmes RAG, permettant la récupération d’informations pertinentes et la génération de réponses contextuellement précises.
La stack technique : Milvus Vector Store et LlamaIndex
Pour cet agent IA qui réalise la RAG, nous utilisons en réalité trois technologies : Milvus, LlamaIndex et OpenAI. OpenAI n’a pas besoin d’introduction. Vous pouvez également utiliser OctoAI ou un LLM HuggingFace comme remplacement direct. Nous pourrions mettre cela à jour ultérieurement avec une version utilisant l’un ou l’autre.
Il existe de nombreuses façons d’utiliser Milvus. Milvus Lite, que nous pouvons lancer directement dans notre notebook Jupyter, et Milvus via Docker. Milvus lite peut être installé via PyPi en utilisant pip install milvus. Le milvus vector store permet de charger des données et d’activer des capacités de recherche basées sur des vecteurs de requête. Ensuite, il peut être lancé, utilisé et arrêté directement dans votre notebook.
Milvus est un système distribué, il est donc naturel qu’il soit logique de lancer Milvus avec Docker Compose. Le fichier docker compose est disponible sur la page et sur le GitHub de Milvus. Lorsque vous lancez Milvus avec Docker Compose, vous verrez trois conteneurs et vous vous connecterez à Milvus via le port 19530 par défaut.
LlamaIndex
LlamaIndex est l’un des frameworks les plus populaires pour créer des applications LLM. C’est l’un des trois projets populaires - LlamaIndex, LangChain et Haystack. L’objectif principal de LlamaIndex est de fournir un framework spécialisé pour les tâches de récupération. De plus, il fournit des outils pour créer des agents IA.
Il existe de nombreuses façons de créer des RAG et des agents IA. Cet exemple s’appuie sur mon tutoriel original sur un agent IA RAG. La principale différence entre ces deux exemples est que celui-ci utilise Milvus comme magasin vectoriel persistant avec LlamaIndex. Les imports LlamaIndex restent les mêmes : les trois imports que nous obtenons depuis le cœur de LlamaIndex sont le lecteur de répertoire, l’index de magasin vectoriel et le contexte de stockage.
Nous récupérons également l’outil d’ingénierie de requête et l’objet de métadonnées d’outil pour créer et décrire notre outil pour RAG. Par rapport à la version précédente, l’import supplémentaire que nous effectuons ici consiste à obtenir l’objet MilvusVectorStore pour LlamaIndex. Pour obtenir tout cela, vous devez exécuter 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
Une étape critique dans la mise en œuvre de RAG avec un backend de base de données vectorielle consiste à démarrer notre base de données vectorielle. Milvus est la seule base de données vectorielle distribuée du marché, et elle se lance de deux façons. Premièrement, nous pouvons importer directement le default_server et le start(). Deuxièmement, nous pouvons la lancer via Docker Compose. Le code pour les deux est présenté ci-dessous.
from milvus import default_server
default_server.start()
Ou exécutez docker compose up -d dans le terminal, dans le même répertoire que votre fichier docker-compose.yml.
La seule différence entre nos instances Milvus qui contiennent les données est le nom de la collection. Il est important de définir le niveau de cohérence afin de garantir l’intégrité des données pendant les opérations, le paramètre par défaut étant « Strong ».
Chargement des données de document dans Milvus via LlamaIndex
La première étape pour créer une application RAG consiste à charger vos données dans votre base de données vectorielle. Pour ce tutoriel, nous le faisons via LlamaIndex. Nous utilisons leur lecteur de répertoire simple pour lire les fichiers d’entrée. Dans ce cas, nous examinons les documents financiers de Lyft et Uber. Le processus de création de collection implique la mise en place d’une base de données dans laquelle les données sont structurées et indexées, garantissant une gestion et une récupération efficaces des données.
# 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()
Une fois les données chargées, nous devons créer un objet MilvusVectorStore dans LlamaIndex pour les contenir. Nous utilisons OpenAI à la fois pour le modèle d’embedding et le LLM dans cet exemple, nous passons donc une dimension de 1536. La seule différence entre nos instances Milvus qui contiennent les données est le nom de la collection. Il est également possible de remplacer une collection existante portant le même nom si nécessaire.
Si vous utilisez Milvus Lite au lieu de Milvus via Docker Compose, vous devez également transmettre l’hôte et le port afin de vous assurer que vous vous connectez au bon port. Nous devons obtenir le port depuis le serveur par défaut via l’option 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)
Nous devons pouvoir faire circuler les données, pas seulement les charger. LlamaIndex gère cette abstraction en fournissant un objet StorageContext. Nous transmettons le vector store au contexte de stockage pour Lyft et Uber afin de pouvoir faire circuler ces données. Ensuite, nous créons des index sur ces vector stores. Les deux dernières lignes de ce bloc persistent ces vector stores sur votre disque local afin que vous puissiez les récupérer depuis le stockage la prochaine fois.
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")
Création des outils de moteur de requête pour l’agent IA
Pour qu’un agent IA fasse du RAG, il doit pouvoir utiliser des outils pour effectuer des requêtes sur des bases de données vectorielles. Dans ce bloc suivant, nous transformons les index vectoriels que nous avons créés en moteurs de requête qui récupèrent les 3 résultats les plus similaires.
lyft_engine = lyft_index.as_query_engine(similarity_top_k=3)
uber_engine = uber_index.as_query_engine(similarity_top_k=3)
Nous transformons ensuite les moteurs de requête en outils. L’agent ReAct pour LlamaIndex (importé dans la section suivante) prend une liste d’outils dans son entrée. Ainsi, dans cette section, nous créons cette liste d’outils. Nous n’avons besoin de créer que deux outils, tous deux avec des structures presque identiques. Le Query Engine Tool nécessite un moteur de requête et des métadonnées. Les métadonnées servent à nommer l’outil et à indiquer au LLM ce qu’il fait et comment l’utiliser.
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."
),
),
),
]
Tout est prêt pour la dernière étape : assembler les éléments de l’agent. Ici, nous importons l’outil ReAct Agent et OpenAI depuis LlamaIndex. Nous définissons le LLM comme GPT-3.5, bien que vous puissiez en réalité utiliser n’importe quel LLM de votre choix. Pour l’agent, nous lui transmettons notre liste d’outils définie précédemment, le LLM, et, dans cet exemple particulier, “verbose” afin de voir ses “pensées”.
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))
Lorsqu’on lui demande quelle a été la croissance du chiffre d’affaires de Lyft en 2021, nous nous attendons à une réponse comme celle ci-dessous.
Interrogation et récupération de données avec Milvus et LlamaIndex
Pour interroger et récupérer des données avec Milvus et LlamaIndex, vous devez créer une collection Milvus et l’indexer à l’aide de LlamaIndex. Une collection Milvus est un conteneur qui stocke un ensemble de vecteurs, et un index est une structure de données qui permet d’interroger efficacement les vecteurs. Une fois que vous avez créé une collection et l’avez indexée, vous pouvez utiliser LlamaIndex pour interroger la collection et récupérer les vecteurs pertinents.
Pour interroger une collection Milvus à l’aide de LlamaIndex, vous devez fournir un vecteur de requête et une métrique de similarité. Le vecteur de requête représente le prompt ou la requête pour laquelle vous souhaitez récupérer des données, et la métrique de similarité mesure à quel point deux vecteurs sont similaires. LlamaIndex utilise la métrique de similarité pour classer les vecteurs de la collection et renvoyer les vecteurs les mieux classés.
Par exemple, si vous souhaitez récupérer des documents similaires à un document donné, vous pouvez créer un vecteur de requête qui représente le document et utiliser LlamaIndex pour interroger la collection. LlamaIndex renverra une liste de documents similaires au document de requête, avec leurs scores de similarité. Ce processus garantit que les documents les plus pertinents sont récupérés, fournissant une base solide pour une analyse ou une génération de texte ultérieure.
Création et intégration de l’agent IA
Pour créer et intégrer un agent IA avec Milvus et LlamaIndex, vous devez créer une base de connaissances qui stocke les données que l’agent utilisera pour générer du texte. La base de connaissances peut être une collection Milvus qui stocke un ensemble de vecteurs, chacun représentant un morceau de texte.
Pour intégrer l’agent IA avec Milvus et LlamaIndex, vous devez utiliser LlamaIndex pour interroger la base de connaissances et récupérer les vecteurs pertinents. L’agent IA peut ensuite utiliser ces vecteurs pour générer du texte à partir d’un prompt donné.
Par exemple, si vous souhaitez créer un agent IA capable de répondre à des questions sur un sujet particulier, vous pouvez créer une base de connaissances qui stocke un ensemble de vecteurs représentant des documents liés au sujet. Lorsque l’agent reçoit une question, il peut utiliser LlamaIndex pour interroger la base de connaissances et récupérer les vecteurs pertinents. L’agent peut ensuite utiliser ces vecteurs pour générer une réponse à la question.
Dans l’ensemble, Milvus et LlamaIndex offrent une puissante combinaison d’outils pour créer des systèmes RAG et des agents IA. En utilisant ces outils ensemble, les développeurs peuvent créer des systèmes capables de récupérer et de générer efficacement du texte à partir d’un prompt donné, ce qui les rend inestimables pour des applications dans divers domaines, du support client à la génération de contenu.
Résumé de la création d’un agent IA pour la génération augmentée par récupération avec Milvus et LlamaIndex
Dans cet article, nous avons créé un agent IA pour le RAG en utilisant Milvus, LlamaIndex et GPT 3.5. Le RAG est une architecture d’application basée sur un LLM qui utilise des bases de données vectorielles pour injecter vos données dans un LLM comme contexte . Un agent IA est une application basée sur un LLM qui peut utiliser d’autres outils. Pour faire du RAG avec un agent IA, nous lui fournissons les outils nécessaires pour effectuer des requêtes sur une base de données vectorielle.
Dans ce tutoriel, nous avons montré comment construire cette architecture à l’aide de données d’exemple de Lyft et Uber. Nous avons d’abord injecté les données dans Milvus afin de pouvoir faire du RAG. Ensuite, nous avons transformé nos collections Milvus en moteurs de requête, puis les moteurs de requête en outils utilisables. Enfin, nous avons donné ces outils à un agent IA et les avons utilisés pour effectuer du RAG sur nos documents.
Continuer à lire

Zilliz Cloud Now Available in Azure North Europe: Bringing AI-Powered Vector Search Closer to European Customers
The addition of the Azure North Europe (Ireland) region further expands our global footprint to better serve our European customers.

Context Engineering Strategies for AI Agents: A Developer’s Guide
Learn practical context engineering strategies for AI agents. Explore frameworks, tools, and techniques to improve reliability, efficiency, and cost.

Demystifying the Milvus Sizing Tool
Explore how to use the Sizing Tool to select the optimal configuration for your Milvus deployment.



