RAG mit Llama Stack mit Milvus aufbauen
Llama Stack ist ein serviceorientierter, API-basierter Ansatz für den Aufbau produktiver KI-Anwendungen. Er bietet einen universellen Stack, der es Entwicklern ermöglicht, überall zu entwickeln, überall einzusetzen und produktionsreife Bausteine mit echter Anbieterunabhängigkeit zu nutzen. Der Llama-Stack konzentriert sich auf Metas Llama-Modelle, Kompositionsfähigkeit, Produktionsreife und ein Partner-Ökosystem.
In diesem Tutorial werden wir Ihnen zeigen, wie Sie einen mit Milvus konfigurierten Llama Stack Server aufbauen, der es Ihnen ermöglicht, Ihre privaten Daten zu importieren und als Wissensbasis zu nutzen. Anschließend werden wir Abfragen auf dem Server durchführen und eine vollständige RAG-Anwendung erstellen.
Vorbereiten der Umgebung
Es gibt viele Möglichkeiten, den Llama Stack Server zu starten, z.B. als Bibliothek, als Distribution, usw. Für jede Komponente des Llama Stack können auch verschiedene Provider gewählt werden. Daher gibt es zahlreiche Möglichkeiten, den Llama Stack-Server zu starten.
Dieses Tutorial verwendet die folgende Konfiguration als Beispiel für den Start des Dienstes. Wenn Sie ihn auf eine andere Weise starten möchten, lesen Sie bitte Start eines Llama Stack Servers.
- Wir verwenden Conda, um eine eigene Distribution mit Milvus-Konfiguration zu erstellen.
- Wir verwenden Together AI als LLM-Anbieter.
- Als Einbettungsmodell wird das Standardmodell
all-MiniLM-L6-v2verwendet.
Dieses Tutorial bezieht sich hauptsächlich auf die offizielle Installationsanleitung der Llama Stack Dokumentation. Wenn Sie veraltete Teile in diesem Tutorial finden, können Sie sich vorrangig an der offiziellen Anleitung orientieren und ein Issue für uns erstellen.
Llama Stack Server starten
Vorbereiten der Umgebung
Da wir Together AI als LLM-Dienst verwenden müssen, müssen wir uns zunächst auf der offiziellen Website anmelden, um einen API-Schlüssel zu beantragen und den API-Schlüssel TOGETHER_API_KEY als Umgebungsvariable zu setzen.
Klonen Sie den Quellcode von Llama Stack
$ git clone https://github.com/meta-llama/llama-stack.git
$ cd llama-stack
Erstellen Sie eine conda-Umgebung und installieren Sie die Abhängigkeiten
$ conda create -n stack python=3.10
$ conda activate stack
$ pip install -e .
Ändern Sie den Inhalt von llama_stack/llama_stack/template/together/run.yaml, indem Sie den Abschnitt vector_io durch die entsprechende Milvus-Konfiguration ersetzen. Zum Beispiel, fügen Sie hinzu:
vector_io:
- provider_id: milvus
provider_type: inline::milvus
config:
db_path: ~/.llama/distributions/together/milvus_store.db
# - provider_id: milvus
# provider_type: remote::milvus
# config:
# uri: http://localhost:19530
# token: root:Milvus
In Llama Stack kann Milvus auf zwei Arten konfiguriert werden: die lokale Konfiguration, inline::milvus, und die Remote-Konfiguration, remote::milvus.
Die einfachste Methode ist die lokale Konfiguration, bei der Sie
db_pathals Pfad für die lokale Speicherung von Milvus-Lite-Dateien angeben müssen.Die Fernkonfiguration ist für große Datenmengen geeignet.
- Wenn Sie eine große Datenmenge haben, können Sie einen performanten Milvus-Server auf Docker oder Kubernetes einrichten. Bei dieser Einrichtung verwenden Sie bitte die Server-URI, z. B.
http://localhost:19530, alsuri. Der Standardtokenistroot:Milvus. - Wenn Sie Zilliz Cloud, den vollständig verwalteten Cloud-Dienst für Milvus, verwenden möchten, passen Sie
uriundtokenan, die dem öffentlichen Endpunkt und dem API-Schlüssel in Zilliz Cloud entsprechen.
- Wenn Sie eine große Datenmenge haben, können Sie einen performanten Milvus-Server auf Docker oder Kubernetes einrichten. Bei dieser Einrichtung verwenden Sie bitte die Server-URI, z. B.
Erstellen der Distribution aus der Vorlage
Führen Sie den folgenden Befehl aus, um die Distribution zu erstellen:
$ llama stack build --template together --image-type conda
Es wird eine Datei unter ~/.llama/distributions/together/together-run.yaml erstellt. Führen Sie dann diesen Befehl aus, um den Server zu starten:
$ llama stack run --image-type conda ~/.llama/distributions/together/together-run.yaml
Wenn alles glatt läuft, sollten Sie sehen, dass der Llama Stack Server erfolgreich auf Port 8321 läuft.
RAG vom Client aus ausführen
Sobald Sie den Server gestartet haben, können Sie den Client-Code für den Zugriff auf den Server schreiben. Hier ist ein Beispielcode:
import uuid
from llama_stack_client.types import Document
from llama_stack_client.lib.agents.agent import Agent
from llama_stack_client.types.agent_create_params import AgentConfig
# See https://www.together.ai/models for all available models
INFERENCE_MODEL = "meta-llama/Llama-3.3-70B-Instruct-Turbo"
LLAMA_STACK_PORT = 8321
def create_http_client():
from llama_stack_client import LlamaStackClient
return LlamaStackClient(
base_url=f"http://localhost:{LLAMA_STACK_PORT}" # Your Llama Stack Server URL
)
client = create_http_client()
# Documents to be used for RAG
urls = ["chat.rst", "llama3.rst", "memory_optimizations.rst", "lora_finetune.rst"]
documents = [
Document(
document_id=f"num-{i}",
content=f"https://raw.githubusercontent.com/pytorch/torchtune/main/docs/source/tutorials/{url}",
mime_type="text/plain",
metadata={},
)
for i, url in enumerate(urls)
]
# Register a vector database
vector_db_id = f"test-vector-db-{uuid.uuid4().hex}"
client.vector_dbs.register(
vector_db_id=vector_db_id,
embedding_model="all-MiniLM-L6-v2",
embedding_dimension=384,
provider_id="milvus",
)
print("inserting...")
# Insert the documents into the vector database
client.tool_runtime.rag_tool.insert(
documents=documents, vector_db_id=vector_db_id, chunk_size_in_tokens=1024,
)
agent_config = AgentConfig(
model=INFERENCE_MODEL,
# Define instructions for the agent ( aka system prompt)
instructions="You are a helpful assistant",
enable_session_persistence=False,
# Define tools available to the agent
toolgroups=[{"name": "builtin::rag", "args": {"vector_db_ids": [vector_db_id]}}],
)
rag_agent = Agent(client, agent_config)
session_id = rag_agent.create_session("test-session")
print("finish init agent...")
user_prompt = (
"What are the top 5 topics that were explained? Only list succinct bullet points."
)
# Get the final answer from the agent
response = rag_agent.create_turn(
messages=[{"role": "user", "content": user_prompt}],
session_id=session_id,
stream=False,
)
print(f"Response: ")
print(response.output_message.content)
Führen Sie diesen Code aus, um die RAG-Abfrage durchzuführen. Wenn alles richtig funktioniert, sollte die Ausgabe wie folgt aussehen:
inserting...
finish init agent...
Response:
* Fine-Tuning Llama3 with Chat Data
* Evaluating fine-tuned Llama3-8B models with EleutherAI's Eval Harness
* Generating text with our fine-tuned Llama3 model
* Faster generation via quantization
* Fine-tuning on a custom chat dataset