Criar RAG com Llama Stack com Milvus
O Llama Stack é uma abordagem orientada a serviços e que prioriza a API para criar aplicativos de IA de produção. Ele fornece uma pilha universal que permite que os desenvolvedores desenvolvam em qualquer lugar, implantem em qualquer lugar e aproveitem blocos de construção prontos para produção com verdadeira independência de provedor. O Llama Stack se concentra nos modelos Llama do Meta, na capacidade de composição, na prontidão para produção e em um ecossistema de parceria.
Neste tutorial, vamos apresentar como construir um servidor Llama Stack configurado com Milvus, permitindo-lhe importar os seus dados privados para servir como base de conhecimento. Em seguida, realizaremos consultas no servidor, criando uma aplicação RAG completa.
Preparar o ambiente
Há muitas maneiras de iniciar o servidor Llama Stack, como uma biblioteca, construindo uma distribuição, etc. Para cada componente do Llama Stack, também podem ser escolhidos vários fornecedores. Portanto, há várias maneiras de iniciar o servidor Llama Stack.
Este tutorial usa a seguinte configuração como exemplo para iniciar o serviço. Se desejar iniciá-lo de outra forma, consulte Iniciando um servidor Llama Stack.
- Usamos o Conda para criar uma distribuição personalizada com a configuração do Milvus.
- Usamos o Together AI como o provedor LLM.
- Usamos o
all-MiniLM-L6-v2padrão como modelo de incorporação.
Este tutorial refere-se principalmente ao guia de instalação oficial da documentação do Llama Stack. Se encontrar alguma parte desatualizada neste tutorial, pode dar prioridade a seguir o guia oficial e criar um problema para nós.
Iniciar o servidor Llama Stack
Preparar o ambiente
Como precisamos usar o Together AI como o serviço LLM, devemos primeiro fazer login no site oficial para solicitar uma chave de API e definir a chave de API TOGETHER_API_KEY como uma variável de ambiente.
Clonar o código-fonte do Llama Stack
$ git clone https://github.com/meta-llama/llama-stack.git
$ cd llama-stack
Criar um ambiente conda e instalar as dependências
$ conda create -n stack python=3.10
$ conda activate stack
$ pip install -e .
Modificar o conteúdo em llama_stack/llama_stack/template/together/run.yaml, alterando a secção vector_io para a configuração Milvus relevante. Por exemplo, adicione:
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
No Llama Stack, o Milvus pode ser configurado de duas formas: configuração local, que é inline::milvus, e configuração remota, que é remote::milvus.
O método mais simples é a configuração local, que requer a definição de
db_path, um caminho para armazenar localmente os ficheiros Milvus-Lite.A configuração remota é adequada para o armazenamento de grandes quantidades de dados.
- Se tiver uma grande quantidade de dados, pode configurar um servidor Milvus de alto desempenho no Docker ou Kubernetes. Nesta configuração, utilize o URI do servidor, por exemplo,
http://localhost:19530, como o seuuri. Otokenpredefinido éroot:Milvus. - Se pretender utilizar o Zilliz Cloud, o serviço de nuvem totalmente gerido para o Milvus, ajuste
urietoken, que correspondem ao Ponto de extremidade público e à chave da API no Zilliz Cloud.
- Se tiver uma grande quantidade de dados, pode configurar um servidor Milvus de alto desempenho no Docker ou Kubernetes. Nesta configuração, utilize o URI do servidor, por exemplo,
Criar a distribuição a partir do modelo
Execute o seguinte comando para construir a distribuição:
$ llama stack build --template together --image-type conda
Será gerado um ficheiro em ~/.llama/distributions/together/together-run.yaml. De seguida, execute este comando para iniciar o servidor:
$ llama stack run --image-type conda ~/.llama/distributions/together/together-run.yaml
Se tudo correr bem, deverá ver o servidor Llama Stack a ser executado com êxito na porta 8321.
Executar o RAG a partir do cliente
Depois de ter iniciado o servidor, pode escrever o código do cliente para aceder ao mesmo. Aqui está um exemplo de código:
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)
Execute este código para realizar a consulta RAG. Se tudo estiver a funcionar corretamente, o resultado deverá ser semelhante a este:
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