Construir RAG con Llama Stack con Milvus
Llama Sta ck es un enfoque orientado a los servicios que da prioridad a las API para crear aplicaciones de IA de producción. Proporciona una pila universal que permite a los desarrolladores desarrollar en cualquier lugar, desplegar en todas partes y aprovechar los bloques de construcción listos para la producción con verdadera independencia del proveedor. La pila Llama se centra en los modelos Llama de Meta, la componibilidad, la preparación para la producción y un ecosistema de socios.
En este tutorial, presentaremos cómo construir un Servidor Llama Stack configurado con Milvus, permitiéndole importar sus datos privados para que sirvan como base de conocimiento. A continuación, realizaremos consultas en el servidor, creando una aplicación RAG completa.
Preparación del entorno
Hay muchas maneras de iniciar el servidor Llama Stack, como una biblioteca, construyendo una distribución, etc. Para cada componente de Llama Stack, también se pueden elegir varios proveedores. Por lo tanto, existen numerosas formas de iniciar el servidor Llama Stack.
Este tutorial utiliza la siguiente configuración como ejemplo para iniciar el servicio. Si desea iniciarlo de otra forma, consulte Iniciar un servidor Llama Stack.
- Usamos Conda para construir una distribución personalizada con configuración Milvus.
- Utilizamos Together AI como proveedor LLM.
- Utilizamos
all-MiniLM-L6-v2por defecto como modelo de incrustación.
Este tutorial se refiere principalmente a la guía de instalación oficial de la documentación de Llama Stack. Si encuentra alguna parte obsoleta en este tutorial, puede dar prioridad a seguir la guía oficial y crear una incidencia para nosotros.
Iniciar el servidor Llama Stack
Preparar el entorno
Dado que necesitamos utilizar Together AI como el servicio LLM, primero debemos iniciar sesión en el sitio web oficial para solicitar una clave API y establecer la clave API TOGETHER_API_KEY como una variable de entorno.
Clonar el código fuente de Llama Stack
$ git clone https://github.com/meta-llama/llama-stack.git
$ cd llama-stack
Crea un entorno conda e instala las dependencias
$ conda create -n stack python=3.10
$ conda activate stack
$ pip install -e .
Modifica el contenido en llama_stack/llama_stack/template/together/run.yaml, cambiando la sección vector_io a la configuración Milvus relevante. Por ejemplo, añada:
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
En Llama Stack, Milvus puede configurarse de dos maneras: configuración local, que es inline::milvus, y configuración remota, que es remote::milvus.
El método más sencillo es la configuración local, que requiere establecer
db_path, una ruta para almacenar localmente los archivos de Milvus-Lite.La configuración remota es adecuada para el almacenamiento de grandes cantidades de datos.
- Si tiene una gran cantidad de datos, puede configurar un servidor Milvus de alto rendimiento en Docker o Kubernetes. En esta configuración, utilice el URI del servidor, por ejemplo,
http://localhost:19530, como suuri. Eltokenpor defecto esroot:Milvus. - Si desea utilizar Zilliz Cloud, el servicio en la nube totalmente gestionado para Milvus, ajuste los
uriytoken, que corresponden al Public Endpoint y a la clave API en Zilliz Cloud.
- Si tiene una gran cantidad de datos, puede configurar un servidor Milvus de alto rendimiento en Docker o Kubernetes. En esta configuración, utilice el URI del servidor, por ejemplo,
Construir la distribución a partir de la plantilla
Ejecute el siguiente comando para construir la distribución:
$ llama stack build --template together --image-type conda
Se generará un archivo en ~/.llama/distributions/together/together-run.yaml. A continuación, ejecute este comando para iniciar el servidor:
$ llama stack run --image-type conda ~/.llama/distributions/together/together-run.yaml
Si todo va bien, deberías ver el servidor Llama Stack ejecutándose correctamente en el puerto 8321.
Ejecutar la RAG desde el cliente
Una vez que hayas iniciado el servidor, puedes escribir el código cliente para acceder a él. Aquí tienes un código de ejemplo:
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)
Ejecuta este código para realizar la consulta RAG. Si todo funciona correctamente, la salida debería tener este aspecto:
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