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-v2 padrã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 seu uri. O token predefinido é root:Milvus.
    • Se pretender utilizar o Zilliz Cloud, o serviço de nuvem totalmente gerido para o Milvus, ajuste uri e token, que correspondem ao Ponto de extremidade público e à chave da API no Zilliz Cloud.

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

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

Esta página foi útil?