Создайте RAG на основе Llama Stack с помощью Milvus
Llama Stack - это сервис-ориентированный, API-ориентированный подход к созданию производственных приложений искусственного интеллекта. Он представляет собой универсальный стек, который позволяет разработчикам разрабатывать в любом месте, развертывать в любом месте и использовать готовые к производству строительные блоки с подлинной независимостью от поставщика. Стек Llama Stack фокусируется на моделях Meta Llama, композитности, готовности к производству и партнерской экосистеме.
В этом учебном пособии мы расскажем, как создать сервер Llama Stack Server, сконфигурированный с Milvus, что позволит вам импортировать свои частные данные в качестве базы знаний. Затем мы выполним запросы на сервере, создав полноценное RAG-приложение.
Подготовка среды
Существует множество способов запустить сервер Llama Stack, например в виде библиотеки, сборки дистрибутива и т. д. Для каждого компонента Llama Stack также можно выбрать различных провайдеров. Таким образом, существует множество способов запустить сервер Llama Stack.
В этом руководстве в качестве примера используется следующая конфигурация для запуска службы. Если вы хотите запустить его другим способом, обратитесь к разделу "Запуск сервера Llama Stack".
- Мы используем Conda для создания пользовательского дистрибутива с конфигурацией Milvus.
- В качестве провайдера LLM мы используем Together AI.
- В качестве модели встраивания мы используем стандартный
all-MiniLM-L6-v2.
Это руководство в основном ссылается на официальное руководство по установке в документации Llama Stack. Если вы найдете в этом руководстве устаревшие части, вы можете отдать предпочтение официальному руководству и создать для нас проблему.
Запуск сервера Llama Stack
Подготовьте среду
Поскольку нам нужно использовать Together AI в качестве LLM-сервиса, мы должны сначала войти на официальный сайт, чтобы подать заявку на получение API-ключа, и установить API-ключ TOGETHER_API_KEY в качестве переменной окружения.
Клонирование исходного кода Llama Stack
$ git clone https://github.com/meta-llama/llama-stack.git
$ cd llama-stack
Создайте окружение conda и установите зависимости
$ conda create -n stack python=3.10
$ conda activate stack
$ pip install -e .
Измените содержимое llama_stack/llama_stack/template/together/run.yaml, изменив секцию vector_io на соответствующую конфигурацию Milvus. Например, добавьте:
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
В Llama Stack Milvus может быть настроен двумя способами: локальная конфигурация, которая находится на inline::milvus, и удаленная конфигурация, которая находится на remote::milvus.
Самый простой способ - локальная конфигурация, которая требует установки
db_path, пути для локального хранения файлов Milvus-Lite.Удаленная конфигурация подходит для хранения большого объема данных.
- Если у вас большой объем данных, вы можете создать производительный сервер Milvus на Docker или Kubernetes. При такой настройке используйте URI сервера, например,
http://localhost:19530, в качествеuri. По умолчаниюtoken- этоroot:Milvus. - Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, измените
uriиtoken, которые соответствуют публичной конечной точке и ключу API в Zilliz Cloud.
- Если у вас большой объем данных, вы можете создать производительный сервер Milvus на Docker или Kubernetes. При такой настройке используйте URI сервера, например,
Сборка дистрибутива из шаблона
Выполните следующую команду для сборки дистрибутива:
$ llama stack build --template together --image-type conda
Будет создан файл по адресу ~/.llama/distributions/together/together-run.yaml. Затем выполните эту команду, чтобы запустить сервер:
$ llama stack run --image-type conda ~/.llama/distributions/together/together-run.yaml
Если все прошло гладко, вы должны увидеть, что сервер Llama Stack успешно запущен на порту 8321.
Выполнение RAG с клиента
После запуска сервера можно написать код клиента для доступа к нему. Вот пример кода:
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)
Запустите этот код для выполнения запроса RAG. Если все работает правильно, вывод должен выглядеть следующим образом:
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