Costruire RAG con Llama Stack con Milvus

Llama Stack è un approccio orientato ai servizi e alle API per la creazione di applicazioni AI di produzione. Fornisce uno stack universale che consente agli sviluppatori di sviluppare ovunque, distribuire ovunque e utilizzare blocchi di costruzione pronti per la produzione con una vera indipendenza dal fornitore. Lo stack Llama si concentra sui modelli Llama di Meta, sulla componibilità, sulla prontezza di produzione e su un ecosistema di partner.

In questo tutorial, vi presenteremo come costruire un server Llama Stack configurato con Milvus, che vi permetterà di importare i vostri dati privati come base di conoscenza. Eseguiremo quindi delle query sul server, creando un'applicazione RAG completa.

Preparazione dell'ambiente

Ci sono molti modi per avviare il server Llama Stack, ad esempio come libreria, compilando una distribuzione, ecc. Per ogni componente di Llama Stack si possono scegliere anche diversi provider. Pertanto, esistono numerosi modi per avviare il server Llama Stack.

Questo tutorial utilizza la seguente configurazione come esempio per avviare il servizio. Se si desidera avviarlo in un altro modo, consultare Avvio di un server Llama Stack.

  • Usiamo Conda per costruire una distribuzione personalizzata con la configurazione di Milvus.
  • Utilizziamo Together AI come provider LLM.
  • Utilizziamo il modello predefinito all-MiniLM-L6-v2 come modello di incorporamento.

Questo tutorial fa riferimento principalmente alla guida ufficiale all'installazione della documentazione di Llama Stack. Se trovate parti non aggiornate in questo tutorial, potete seguire prioritariamente la guida ufficiale e creare un problema per noi.

Avviare il server Llama Stack

Preparare l'ambiente

Poiché dobbiamo usare Together AI come servizio LLM, dobbiamo prima accedere al sito ufficiale per richiedere una chiave API e impostare la chiave API TOGETHER_API_KEY come variabile d'ambiente.

Clonare il codice sorgente di Llama Stack

$ git clone https://github.com/meta-llama/llama-stack.git
$ cd llama-stack

Creare un ambiente conda e installare le dipendenze

$ conda create -n stack python=3.10
$ conda activate stack

$ pip install -e .

Modificare il contenuto di llama_stack/llama_stack/template/together/run.yaml, cambiando la sezione vector_io con la configurazione Milvus pertinente. Ad esempio, aggiungere:

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, Milvus può essere configurato in due modi: configurazione locale, che è inline::milvus, e configurazione remota, che è remote::milvus.

  • Il metodo più semplice è la configurazione locale, che richiede l'impostazione di db_path, un percorso per la memorizzazione locale dei file di Milvus-Lite.

  • La configurazione remota è adatta per l'archiviazione di grandi quantità di dati.

    • Se si dispone di una grande quantità di dati, è possibile configurare un server Milvus performante su Docker o Kubernetes. In questa configurazione, utilizzare l'URI del server, ad esempio http://localhost:19530, come uri. L'indirizzo predefinito token è root:Milvus.
    • Se si desidera utilizzare Zilliz Cloud, il servizio cloud completamente gestito per Milvus, regolare uri e token, che corrispondono all'endpoint pubblico e alla chiave API di Zilliz Cloud.

Creare la distribuzione dal modello

Eseguire il seguente comando per creare la distribuzione:

$ llama stack build --template together --image-type conda

Verrà generato un file all'indirizzo ~/.llama/distributions/together/together-run.yaml. Quindi, eseguire questo comando per avviare il server:

$ llama stack run --image-type conda ~/.llama/distributions/together/together-run.yaml

Se tutto va bene, si dovrebbe vedere il server Llama Stack in esecuzione sulla porta 8321.

Eseguire la RAG dal client

Una volta avviato il server, è possibile scrivere il codice client per accedervi. Ecco un esempio di codice:

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)

Eseguire questo codice per eseguire la query RAG. Se tutto funziona correttamente, l'output dovrebbe essere simile a questo:

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

Questa pagina è stata utile?