Erstellen eines KI-Agenten für RAG mit Milvus und LlamaIndex
Im Jahr 2023 gab es eine massive Explosion in der Popularität großer Sprachmodelle (LLMs) und infolgedessen von LLM-Anwendungen. Die zwei beliebtesten Arten von LLM-Anwendungen, die in den Vordergrund getreten sind, sind Retrieval Augmented Generation (RAG) und KI-Agenten. Bei RAG geht es darum, eine Vektordatenbank wie Milvus zu verwenden, um Kontextdaten einzuspeisen. Bei KI-Agenten geht es darum, LLMs zu verwenden, um andere Tools zu nutzen. Sie finden das Notebook auf GitHub.
OpenAI braucht keine Vorstellung. Um auf OpenAI-Dienste zuzugreifen, ist es notwendig, den openai api key hinzuzufügen, insbesondere für Funktionalitäten wie Embeddings und die Verwendung von ChatGPT.
In diesem Artikel werden wir die beiden kombinieren. Wir behandeln:
Der Tech-Stack: Milvus und LlamaIndex
Milvus Lite
Milvus auf Docker Compose
LlamaIndex
Aufbau eines KI-Agenten für RAG
Milvus hochfahren
Laden der Daten in Milvus über LlamaIndex
Erstellen der Query Engine Tools für den KI-Agenten
Erstellen des KI-Agenten für RAG
Zusammenfassung des Aufbaus eines KI-Agenten für RAG mit Milvus und LlamaIndex
Einführung in Milvus und LlamaIndex für RAG
Milvus und LlamaIndex sind zwei leistungsstarke Tools, die gemeinsam verwendet werden können, um ein Retrieval-Augmented Generation (RAG)-System zu erstellen. Milvus ist eine Vektordatenbank, die eine effiziente Speicherung und Abfrage großer Datenmengen ermöglicht, während LlamaIndex eine Bibliothek ist, die eine einfache und flexible Möglichkeit bietet, mit Milvus und anderen Vektordatenbanken zu interagieren. Durch die Kombination dieser beiden Tools können Entwickler RAG-Systeme erstellen, die Text auf Grundlage eines gegebenen Prompts effizient abrufen und generieren können.
Milvus zeichnet sich durch die Verarbeitung großskaliger Vektordaten aus und ist damit ideal für Anwendungen, die eine leistungsstarke Ähnlichkeitssuche erfordern. Andererseits vereinfacht LlamaIndex den Prozess der Indexierung und Abfrage dieser Daten und bietet Entwicklern eine nahtlose Schnittstelle. Zusammen bilden sie eine robuste Grundlage für RAG-Systeme, die das Abrufen relevanter Informationen und die Generierung kontextuell genauer Antworten ermöglichen.
Der Tech-Stack: Milvus Vector Store und LlamaIndex
Für diesen KI-Agenten, der RAG durchführt, verwenden wir tatsächlich drei Technologien: Milvus, LlamaIndex und OpenAI. OpenAI braucht keine Vorstellung. Sie können auch OctoAI oder ein HuggingFace LLM als Drop-in verwenden. Wir könnten dies später mit einer Version aktualisieren, die eine dieser Optionen verwendet.
Es gibt viele Möglichkeiten, Milvus zu verwenden. Milvus Lite, das wir direkt in unserem Jupyter-Notebook hochfahren können, und Milvus über Docker. Milvus lite kann über PyPi mit pip install milvus installiert werden. Der milvus vector store ermöglicht das Laden von Daten und die Aktivierung von Suchfunktionen auf Grundlage von Abfragevektoren. Anschließend kann er direkt in Ihrem Notebook hochgefahren, verwendet und heruntergefahren werden.
Milvus ist ein verteiltes System, daher ist es natürlich sinnvoll, Milvus mit Docker Compose hochzufahren. Die docker compose-Datei ist auf der Seite und auf Milvus GitHub verfügbar. Wenn Sie Milvus mit Docker Compose hochfahren, sehen Sie drei Container und stellen standardmäßig über Port 19530 eine Verbindung zu Milvus her.
LlamaIndex
LlamaIndex ist eines der beliebtesten Frameworks zum Erstellen von LLM-Apps. Es ist eines von drei beliebten Projekten - LlamaIndex, LangChain und Haystack. Der Hauptfokus von LlamaIndex liegt darauf, ein Framework bereitzustellen, das auf Retrieval-Aufgaben spezialisiert ist. Darüber hinaus bietet es Tools zum Erstellen von KI-Agenten.
Es gibt viele Möglichkeiten, RAG und AI Agents zu erstellen. Dieses Beispiel baut auf meinem ursprünglichen Tutorial zu einem RAG AI Agent auf. Der Hauptunterschied zwischen diesen beiden Beispielen besteht darin, dass dieses Milvus als persistenten Vektorspeicher mit LlamaIndex verwendet. Die LlamaIndex-Importe bleiben gleich - die drei Importe, die wir aus dem Kernbereich von LlamaIndex erhalten, sind der Directory Reader, der Vector Store Index und der Storage Context.
Wir holen uns außerdem das Query-Engineer-Tool und das Tool-Metadata-Objekt, um unser Tool für RAG zu erstellen und zu beschreiben. Im Vergleich zur letzten Version besteht der zusätzliche Import, den wir hier vornehmen, darin, das MilvusVectorStore-Objekt für LlamaIndex zu erhalten. Um all dies zu bekommen, müssen Sie pip install -U llama-index llama-index-vector-stores-milvus pymilvus llama-index-llms-openai llama-index-readers-file ausführen.
from llama_index.core import (
SimpleDirectoryReader,
VectorStoreIndex,
StorageContext
)
from llama_index.core.tools import QueryEngineTool, ToolMetadata
from llama_index.vector_stores.milvus import MilvusVectorStore
Ein entscheidender Schritt bei der Durchführung von RAG mit einem Vektordatenbank-Backend ist das Hochfahren unserer Vektordatenbank. Milvus ist die einzige verteilte Vektordatenbank auf dem Markt, und sie lässt sich auf zwei Arten hochfahren. Erstens können wir den default_server direkt importieren und ihn start()en. Zweitens können wir sie über Docker Compose hochfahren. Der Code für beide Varianten ist unten dargestellt.
from milvus import default_server
default_server.start()
Oder führen Sie docker compose up -d im Terminal in demselben Verzeichnis aus, in dem sich Ihre docker-compose.yml-Datei befindet.
Der einzige Unterschied zwischen unseren Milvus-Instanzen, die die Daten enthalten, ist der Collection-Name. Es ist wichtig, das Konsistenzniveau festzulegen, um die Datenintegrität während der Vorgänge sicherzustellen, wobei die Standardeinstellung 'Strong' ist.
Laden der Dokumentdaten über LlamaIndex in Milvus
Der erste Schritt beim Erstellen einer RAG-App besteht darin, Ihre Daten in Ihre Vektordatenbank zu laden. Für dieses Tutorial tun wir dies über LlamaIndex. Wir verwenden deren einfachen Directory Reader, um die Eingabedateien zu lesen. In diesem Fall betrachten wir die Finanzdokumente von Lyft und Uber. Der Prozess der Collection-Erstellung umfasst das Einrichten einer Datenbank, in der Daten strukturiert und indiziert werden, um eine effektive Datenverwaltung und -abfrage sicherzustellen.
# 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()
Sobald die Daten geladen sind, müssen wir in LlamaIndex ein MilvusVectorStore-Objekt erstellen, um sie zu speichern. Wir verwenden in diesem Beispiel OpenAI sowohl für das Embedding-Modell als auch für das LLM, daher übergeben wir eine Dimension von 1536. Der einzige Unterschied zwischen unseren Milvus-Instanzen, die die Daten enthalten, ist der Collection-Name. Es ist außerdem möglich, bei Bedarf eine bestehende Collection mit demselben Namen zu überschreiben.
Wenn Sie Milvus Lite anstelle von Milvus über Docker Compose verwenden, sollten Sie auch den Host und den Port übergeben, um sicherzustellen, dass Sie sich mit dem richtigen Port verbinden. Wir müssen den Port vom default server über die Option listen_port abrufen.
# 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)
Wir müssen in der Lage sein, die Daten weiterzugeben, nicht nur sie zu laden. LlamaIndex handhabt diese Abstraktion, indem es ein StorageContext-Objekt bereitstellt. Wir übergeben den Vektorspeicher für sowohl Lyft als auch Uber an den Storage Context, um diese Daten weitergeben zu können. Anschließend erstellen wir Indizes auf diesen Vektorspeichern. Die letzten beiden Zeilen in diesem Block persistieren diese Vektorspeicher auf deiner lokalen Festplatte, damit du sie beim nächsten Mal aus dem Speicher abrufen kannst.
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")
Erstellen der Query Engine Tools für den AI Agent
Damit ein AI Agent RAG durchführen kann, muss er Tools verwenden können, um Abfragen auf Vektordatenbanken auszuführen. Im nächsten Block wandeln wir die von uns erstellten Vektorindizes in Query Engines um, die die 3 ähnlichsten Ergebnisse abrufen.
lyft_engine = lyft_index.as_query_engine(similarity_top_k=3)
uber_engine = uber_index.as_query_engine(similarity_top_k=3)
Anschließend wandeln wir die Query Engines in Tools um. Der ReAct Agent für LlamaIndex (im nächsten Abschnitt importiert) nimmt eine Liste von Tools als Teil seiner Eingabe entgegen. Daher erstellen wir in diesem Abschnitt diese Liste von Tools. Wir müssen nur zwei Tools erstellen, beide mit nahezu identischen Strukturen. Das Query Engine Tool benötigt eine Query Engine und Metadaten. Die Metadaten werden verwendet, um das Tool zu benennen und dem LLM mitzuteilen, was es tut und wie es verwendet wird.
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."
),
),
),
]
Alles ist für das letzte Stück vorbereitet – das Zusammensetzen der Teile des Agenten. Hier importieren wir das ReAct Agent Tool und OpenAI aus LlamaIndex. Wir definieren das LLM als GPT-3.5, obwohl du tatsächlich jedes beliebige LLM verwenden kannst. Für den Agenten übergeben wir ihm unsere Liste von Tools von zuvor, das LLM und in diesem speziellen Beispiel „verbose“, um seine „Gedanken“ zu sehen.
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))
Wenn gefragt wird, wie hoch das Umsatzwachstum von Lyft im Jahr 2021 war, erwarten wir eine Antwort wie die untenstehende.
Abfragen und Abrufen von Daten mit Milvus und LlamaIndex
Um Daten mit Milvus und LlamaIndex abzufragen und abzurufen, musst du eine Milvus-Collection erstellen und sie mithilfe von LlamaIndex indizieren. Eine Milvus-Collection ist ein Container, der eine Reihe von Vektoren speichert, und ein Index ist eine Datenstruktur, die effiziente Abfragen der Vektoren ermöglicht. Sobald du eine Collection erstellt und indiziert hast, kannst du LlamaIndex verwenden, um die Collection abzufragen und die relevanten Vektoren abzurufen.
Um eine Milvus-Collection mit LlamaIndex abzufragen, müssen Sie einen Abfragevektor und eine Ähnlichkeitsmetrik bereitstellen. Der Abfragevektor repräsentiert den Prompt oder die Abfrage, für die Sie Daten abrufen möchten, und die Ähnlichkeitsmetrik misst, wie ähnlich zwei Vektoren sind. LlamaIndex verwendet die Ähnlichkeitsmetrik, um die Vektoren in der Collection zu ordnen und die am höchsten bewerteten Vektoren zurückzugeben.
Wenn Sie beispielsweise Dokumente abrufen möchten, die einem bestimmten Dokument ähnlich sind, können Sie einen Abfragevektor erstellen, der das Dokument repräsentiert, und LlamaIndex verwenden, um die Collection abzufragen. LlamaIndex gibt eine Liste von Dokumenten zurück, die dem Abfragedokument ähnlich sind, zusammen mit ihren Ähnlichkeitswerten. Dieser Prozess stellt sicher, dass die relevantesten Dokumente abgerufen werden, und bietet eine solide Grundlage für weitere Analysen oder Textgenerierung.
Aufbau und Integration des KI-Agenten
Um einen KI-Agenten mit Milvus und LlamaIndex aufzubauen und zu integrieren, müssen Sie eine Wissensdatenbank erstellen, die die Daten speichert, die der Agent zur Textgenerierung verwenden wird. Die Wissensdatenbank kann eine Milvus-Collection sein, die eine Reihe von Vektoren speichert, von denen jeder ein Textstück repräsentiert.
Um den KI-Agenten mit Milvus und LlamaIndex zu integrieren, müssen Sie LlamaIndex verwenden, um die Wissensdatenbank abzufragen und die relevanten Vektoren abzurufen. Der KI-Agent kann diese Vektoren dann verwenden, um basierend auf einem gegebenen Prompt Text zu generieren.
Wenn Sie beispielsweise einen KI-Agenten erstellen möchten, der Fragen zu einem bestimmten Thema beantworten kann, können Sie eine Wissensdatenbank erstellen, die eine Reihe von Vektoren speichert, die Dokumente zu diesem Thema repräsentieren. Wenn der Agent eine Frage erhält, kann er LlamaIndex verwenden, um die Wissensdatenbank abzufragen und die relevanten Vektoren abzurufen. Der Agent kann diese Vektoren dann verwenden, um eine Antwort auf die Frage zu generieren.
Insgesamt bieten Milvus und LlamaIndex eine leistungsstarke Kombination von Tools zum Aufbau von RAG-Systemen und KI-Agenten. Durch die gemeinsame Nutzung dieser Tools können Entwickler Systeme erstellen, die Text basierend auf einem gegebenen Prompt effizient abrufen und generieren können, wodurch sie für Anwendungen in verschiedenen Bereichen, vom Kundensupport bis zur Inhaltserstellung, von unschätzbarem Wert sind.
Zusammenfassung des Aufbaus eines KI-Agenten für Retrieval Augmented Generation mit Milvus und LlamaIndex
In diesem Artikel haben wir einen KI-Agenten für RAG mit Milvus, LlamaIndex und GPT 3.5 erstellt. RAG ist eine LLM-basierte App-Architektur, die Vektordatenbanken verwendet, um Ihre Daten als Kontext in ein LLM einzubinden. Ein KI-Agent ist eine LLM-basierte Anwendung, die andere Tools verwenden kann. Um RAG mit einem KI-Agenten durchzuführen, stellen wir ihm die Tools bereit, die für Abfragen auf einer Vektordatenbank erforderlich sind.
In diesem Tutorial haben wir gezeigt, wie man diese Architektur mit Beispieldaten von Lyft und Uber aufbaut. Zunächst haben wir die Daten in Milvus eingebunden, damit wir RAG durchführen konnten. Dann haben wir unsere Milvus-Collections in Abfrage-Engines und die Abfrage-Engines in verwendbare Tools umgewandelt. Schließlich haben wir diese Tools einem KI-Agenten übergeben und sie verwendet, um RAG auf unseren Dokumenten durchzuführen.
Weiterlesen

Zilliz Cloud Introduces Advanced BYOC-I Solution for Ultimate Enterprise Data Sovereignty
Explore Zilliz Cloud BYOC-I, the solution that balances AI innovation with data control, enabling secure deployments in finance, healthcare, and education sectors.

Vector Databases vs. Graph Databases
Use a vector database for AI-powered similarity search; use a graph database for complex relationship-based queries and network analysis.

DeepRAG: Thinking to Retrieval Step by Step for Large Language Models
Discover DeepRAG, an advanced retrieval-augmented generation (RAG) model that improves LLM accuracy by retrieving only essential data through step-by-step reasoning.



