Construire RAG avec Llama Stack avec Milvus
Llama Stack est une approche orientée service, API-first, pour la création d'applications d'IA de production. Elle fournit une pile universelle qui permet aux développeurs de développer n'importe où, de déployer n'importe où et d'utiliser des blocs de construction prêts pour la production avec une véritable indépendance vis-à-vis des fournisseurs. La pile Llama se concentre sur les modèles Llama de Meta, la composabilité, l'aptitude à la production et un écosystème de partenaires.
Dans ce tutoriel, nous allons vous présenter comment construire un serveur Llama Stack configuré avec Milvus, vous permettant d'importer vos données privées pour servir de base de connaissances. Nous effectuerons ensuite des requêtes sur le serveur, créant ainsi une application RAG complète.
Préparation de l'environnement
Il y a plusieurs façons de démarrer le serveur Llama Stack, comme une bibliothèque, en construisant une distribution, etc. Pour chaque composant de la pile Llama, différents fournisseurs peuvent également être choisis. Il existe donc de nombreuses façons de lancer le serveur Llama Stack.
Ce tutoriel utilise la configuration suivante comme exemple pour démarrer le service. Si vous souhaitez le démarrer d'une autre manière, veuillez vous référer à Démarrer un serveur Llama Stack.
- Nous utilisons Conda pour construire une distribution personnalisée avec la configuration Milvus.
- Nous utilisons Together AI comme fournisseur LLM.
- Nous utilisons le modèle par défaut
all-MiniLM-L6-v2comme modèle d'intégration.
Ce tutoriel se réfère principalement au guide d'installation officiel de la documentation Llama Stack. Si vous trouvez des parties obsolètes dans ce tutoriel, vous pouvez suivre en priorité le guide officiel et créer un problème pour nous.
Démarrer le serveur Llama Stack
Préparer l'environnement
Comme nous devons utiliser Together AI comme service LLM, nous devons d'abord nous connecter au site web officiel pour demander une clé API et définir la clé API TOGETHER_API_KEY comme variable d'environnement.
Cloner le code source de Llama Stack
$ git clone https://github.com/meta-llama/llama-stack.git
$ cd llama-stack
Créer un environnement conda et installer les dépendances
$ conda create -n stack python=3.10
$ conda activate stack
$ pip install -e .
Modifiez le contenu de llama_stack/llama_stack/template/together/run.yaml, en remplaçant la section vector_io par la configuration Milvus appropriée. Par exemple, ajouter :
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
Dans Llama Stack, Milvus peut être configuré de deux manières : la configuration locale, qui est inline::milvus, et la configuration à distance, qui est remote::milvus.
La méthode la plus simple est la configuration locale, qui nécessite de définir
db_path, un chemin pour le stockage local des fichiers Milvus-Lite.La configuration à distance est adaptée au stockage de grandes quantités de données.
- Si vous disposez d'une grande quantité de données, vous pouvez configurer un serveur Milvus performant sur Docker ou Kubernetes. Dans cette configuration, veuillez utiliser l'URI du serveur, par exemple
http://localhost:19530, comme votreuri. L'adressetokenpar défaut estroot:Milvus. - Si vous souhaitez utiliser Zilliz Cloud, le service cloud entièrement géré pour Milvus, ajustez les adresses
uriettoken, qui correspondent au point de terminaison public et à la clé API dans Zilliz Cloud.
- Si vous disposez d'une grande quantité de données, vous pouvez configurer un serveur Milvus performant sur Docker ou Kubernetes. Dans cette configuration, veuillez utiliser l'URI du serveur, par exemple
Construire la distribution à partir du modèle
Exécutez la commande suivante pour créer la distribution :
$ llama stack build --template together --image-type conda
Un fichier sera généré à l'adresse ~/.llama/distributions/together/together-run.yaml. Ensuite, exécutez cette commande pour démarrer le serveur :
$ llama stack run --image-type conda ~/.llama/distributions/together/together-run.yaml
Si tout se passe bien, vous devriez voir le serveur Llama Stack s'exécuter avec succès sur le port 8321.
Exécuter le RAG à partir du client
Une fois que vous avez démarré le serveur, vous pouvez écrire le code client pour y accéder. Voici un exemple de code :
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)
Exécutez ce code pour effectuer la requête RAG. Si tout fonctionne correctement, la sortie devrait ressembler à ceci :
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