Создание AI-агента для RAG с Milvus и LlamaIndex
В 2023 году произошёл массовый взрыв популярности больших языковых моделей (LLMs) и, как следствие, LLM-приложений. Два самых популярных типа LLM-приложений, вышедших на передний план, — это retrieval augmented generation (RAG) и AI agents. RAG — это использование векторной базы данных, такой как Milvus, для добавления контекстных данных. AI Agents — это использование LLM для работы с другими инструментами. Вы можете найти ноутбук на GitHub.
OpenAI не нуждается в представлении. Для доступа к сервисам OpenAI необходимо добавить openai api key, особенно для таких функций, как embeddings и использование ChatGPT.
В этой статье мы собираемся объединить эти два подхода. Мы рассмотрим:
Технологический стек: Milvus и LlamaIndex
Milvus Lite
Milvus on Docker Compose
LlamaIndex
Создание AI Agent для RAG
Запуск Milvus
Загрузка данных в Milvus через LlamaIndex
Создание Query Engine Tools для AI Agent
Создание AI Agent для RAG
Резюме по созданию AI Agent для RAG с Milvus и LlamaIndex
Введение в Milvus и LlamaIndex для RAG
Milvus и LlamaIndex — два мощных инструмента, которые можно использовать вместе для создания системы Retrieval-Augmented Generation (RAG). Milvus — это векторная база данных, которая позволяет эффективно хранить и запрашивать большие объёмы данных, тогда как LlamaIndex — это библиотека, предоставляющая простой и гибкий способ взаимодействия с Milvus и другими векторными базами данных. Объединив эти два инструмента, разработчики могут создавать RAG-системы, которые способны эффективно извлекать и генерировать текст на основе заданного запроса.
Milvus отлично справляется с обработкой крупномасштабных векторных данных, что делает его идеальным для приложений, которым требуется высокопроизводительный поиск по сходству. С другой стороны, LlamaIndex упрощает процесс индексирования и запросов к этим данным, предоставляя разработчикам бесшовный интерфейс. Вместе они формируют прочную основу для RAG-систем, обеспечивая извлечение релевантной информации и генерацию контекстно точных ответов.
Технологический стек: Milvus Vector Store и LlamaIndex
Для этого AI Agent, который выполняет RAG, мы фактически используем три технологии: Milvus, LlamaIndex и OpenAI. OpenAI не нуждается в представлении. Вы также можете использовать OctoAI или HuggingFace LLM как drop-in-замену. Возможно, позже мы обновим это версией с использованием одного из них.
Есть много способов использовать Milvus. Milvus Lite, который мы можем запустить напрямую в нашем Jupyter notebook, и Milvus через Docker. Milvus lite можно установить через PyPi с помощью pip install milvus. milvus vector store позволяет загружать данные и включать возможности поиска на основе query vectors. Затем его можно запустить, использовать и остановить напрямую в вашем notebook.
Milvus — это распределённая система, поэтому, естественно, имеет смысл запускать Milvus with Docker Compose. Файл docker compose доступен на странице и в Milvus GitHub. Когда вы запускаете Milvus с Docker Compose, вы увидите три контейнера и по умолчанию будете подключаться к Milvus через порт 19530.
LlamaIndex
LlamaIndex — один из самых популярных фреймворков для создания LLM-приложений. Это один из трёх популярных проектов — LlamaIndex, LangChain и Haystack. Основной фокус LlamaIndex — предоставить фреймворк, специализированный для задач извлечения. Кроме того, он предоставляет инструменты для создания AI Agents.
Существует множество способов создавать RAG и AI Agents. Этот пример основан на моем оригинальном руководстве по RAG AI Agent. Основное различие между этими двумя примерами заключается в том, что в этом используется Milvus как persistent vector store with LlamaIndex. Импорты LlamaIndex остаются теми же — три импорта, которые мы получаем из основной части LlamaIndex, — это считыватель директорий, индекс векторного хранилища и контекст хранения.
Мы также берем инструмент инженера запросов и объект метаданных инструмента, чтобы создать и описать наш инструмент для RAG. По сравнению с прошлой версией дополнительный импорт, который мы здесь делаем, нужен для получения объекта MilvusVectorStore для LlamaIndex. Чтобы получить всё это, вам нужно выполнить pip install -U llama-index llama-index-vector-stores-milvus pymilvus llama-index-llms-openai llama-index-readers-file.
from llama_index.core import (
SimpleDirectoryReader,
VectorStoreIndex,
StorageContext
)
from llama_index.core.tools import QueryEngineTool, ToolMetadata
from llama_index.vector_stores.milvus import MilvusVectorStore
Критически важный шаг при выполнении RAG с бэкендом векторной базы данных — запустить нашу векторную базу данных. Milvus — единственная распределенная векторная база данных на рынке, и она запускается двумя способами. Во-первых, мы можем напрямую импортировать default_server и запустить его с помощью start(). Во-вторых, мы можем запустить её через Docker Compose. Код для обоих вариантов показан ниже.
from milvus import default_server
default_server.start()
Или выполните docker compose up -d в терминале в той же директории, где находится ваш файл docker-compose.yml.
Единственное различие между нашими экземплярами Milvus, которые хранят данные, — это имя коллекции. Важно установить уровень согласованности, чтобы обеспечить целостность данных во время операций; настройка по умолчанию — 'Strong'.
Загрузка данных документов в Milvus через LlamaIndex
Первый шаг к созданию приложения RAG — загрузка ваших данных в вашу векторную базу данных. Для этого руководства мы делаем это через LlamaIndex. Мы используем их простой считыватель директорий для чтения входных файлов. В этом случае мы рассматриваем финансовые документы Lyft и Uber. Процесс создания коллекции включает настройку базы данных, в которой данные структурируются и индексируются, что обеспечивает эффективное управление данными и их извлечение.
# load data
lyft_docs = SimpleDirectoryReader(
input_files=["./data/10k/lyft_2021.pdf"]
).load_data()
uber_docs = SimpleDirectoryReader(
input_files=["./data/10k/uber_2021.pdf"]
).load_data()
После загрузки данных нам нужно создать объект MilvusVectorStore в LlamaIndex, чтобы хранить их. В этом примере мы используем OpenAI как для модели эмбеддингов, так и для LLM, поэтому передаем размерность 1536. Единственное различие между нашими экземплярами Milvus, которые хранят данные, — это имя коллекции. При необходимости также можно перезаписать существующую коллекцию с тем же именем.
Если вы используете Milvus Lite вместо Milvus через Docker Compose, вам также следует передать host и port, чтобы убедиться, что вы подключаетесь к правильному порту. Мы должны получить порт от сервера по умолчанию через параметр listen_port.
# build index
vector_store_lyft = MilvusVectorStore(dim=1536, collection_name="lyft", overwrite=True)
vector_store_uber = MilvusVectorStore(dim=1536, collection_name="uber", overwrite=True)
# for milvus lite users
if milvuslite:
vector_store_lyft = MilvusVectorStore(host="localhost", port=default_server.listen_port, dim=1536, collection_name="lyft", overwrite=True)
vector_store_uber = MilvusVectorStore(host="localhost", port=default_server.listen_port, dim=1536, collection_name="uber", overwrite=True)
Мы должны иметь возможность передавать данные, а не просто загружать их. LlamaIndex обрабатывает эту абстракцию, предоставляя объект StorageContext. Мы передаем векторное хранилище в контекст хранения как для Lyft, так и для Uber, чтобы иметь возможность передавать эти данные. Затем мы создаем индексы для этих векторных хранилищ. Последние две строки в этом блоке сохраняют эти векторные хранилища на вашем локальном диске, чтобы вы могли получить их из хранилища в следующий раз.
storage_context_lyft = StorageContext.from_defaults(vector_store=vector_store_lyft)
storage_context_uber = StorageContext.from_defaults(vector_store=vector_store_uber)
lyft_index = VectorStoreIndex.from_documents(lyft_docs, storage_context=storage_context_lyft)
uber_index = VectorStoreIndex.from_documents(uber_docs, storage_context=storage_context_uber)
# persist index
lyft_index.storage_context.persist(persist_dir="./storage/lyft")
uber_index.storage_context.persist(persist_dir="./storage/uber")
Создание инструментов Query Engine для AI Agent
Чтобы AI Agent мог выполнять RAG, ему необходимо иметь возможность использовать инструменты для выполнения запросов к векторным базам данных. В следующем блоке мы превращаем созданные нами векторные индексы в query engines, которые извлекают 3 самых похожих результата.
lyft_engine = lyft_index.as_query_engine(similarity_top_k=3)
uber_engine = uber_index.as_query_engine(similarity_top_k=3)
Затем мы превращаем query engines в инструменты. Агент ReAct для LlamaIndex (импортированный в следующем разделе) принимает список инструментов как часть своего ввода. Поэтому в этом разделе мы создаем этот список инструментов. Нам нужно создать только два инструмента, оба с почти идентичными структурами. Query Engine Tool требует query engine и метаданные. Метаданные используются, чтобы назвать инструмент и сообщить LLM, что он делает и как его использовать.
query_engine_tools = [
QueryEngineTool(
query_engine=lyft_engine,
metadata=ToolMetadata(
name="lyft_10k",
description=(
"Provides information about Lyft financials for year 2021. "
"Use a detailed plain text question as input to the tool."
),
),
),
QueryEngineTool(
query_engine=uber_engine,
metadata=ToolMetadata(
name="uber_10k",
description=(
"Provides information about Uber financials for year 2021. "
"Use a detailed plain text question as input to the tool."
),
),
),
]
Все подготовлено для последней части — сборки частей агента воедино. Здесь мы импортируем инструмент ReAct Agent и OpenAI из LlamaIndex. Мы определяем LLM как GPT-3.5, хотя на самом деле вы можете использовать любую LLM, которую захотите. Для агента мы передаем наш список инструментов, созданный ранее, LLM и в этом конкретном примере — “verbose”, чтобы увидеть его “мысли”.
from llama_index.core.agent import ReActAgent
from llama_index.llms.openai import OpenAI
llm = OpenAI(model="gpt-3.5-turbo-0613")
agent = ReActAgent.from_tools(
query_engine_tools,
llm=llm,
verbose=True
)
response = agent.chat("What was Lyft's revenue growth in 2021?")
print(str(response))
Когда задается вопрос о том, каким был рост выручки Lyft в 2021 году, мы ожидаем ответ, похожий на приведенный ниже.
Запросы и извлечение данных с помощью Milvus и LlamaIndex
Чтобы выполнять запросы и извлекать данные с помощью Milvus и LlamaIndex, необходимо создать коллекцию Milvus и проиндексировать ее с помощью LlamaIndex. Коллекция Milvus — это контейнер, который хранит набор векторов, а индекс — это структура данных, позволяющая эффективно выполнять запросы к векторам. После того как вы создали коллекцию и проиндексировали ее, вы можете использовать LlamaIndex для запроса к коллекции и извлечения релевантных векторов.
Чтобы выполнить запрос к коллекции Milvus с помощью LlamaIndex, необходимо предоставить вектор запроса и метрику сходства. Вектор запроса представляет промпт или запрос, для которого вы хотите извлечь данные, а метрика сходства измеряет, насколько похожи два вектора. LlamaIndex использует метрику сходства для ранжирования векторов в коллекции и возвращает векторы с наивысшим рейтингом.
Например, если вы хотите извлечь документы, похожие на заданный документ, вы можете создать вектор запроса, представляющий этот документ, и использовать LlamaIndex для запроса к коллекции. LlamaIndex вернет список документов, похожих на документ запроса, вместе с их оценками сходства. Этот процесс гарантирует извлечение наиболее релевантных документов, обеспечивая прочную основу для дальнейшего анализа или генерации текста.
Создание и интеграция AI Agent
Чтобы создать и интегрировать AI Agent с Milvus и LlamaIndex, необходимо создать базу знаний, в которой будут храниться данные, используемые агентом для генерации текста. Базой знаний может быть коллекция Milvus, хранящая набор векторов, каждый из которых представляет фрагмент текста.
Чтобы интегрировать AI Agent с Milvus и LlamaIndex, необходимо использовать LlamaIndex для запросов к базе знаний и извлечения релевантных векторов. Затем AI Agent может использовать эти векторы для генерации текста на основе заданного промпта.
Например, если вы хотите создать AI Agent, который может отвечать на вопросы по определенной теме, вы можете создать базу знаний, хранящую набор векторов, представляющих документы, связанные с этой темой. Когда агент получает вопрос, он может использовать LlamaIndex для запроса к базе знаний и извлечения релевантных векторов. Затем агент может использовать эти векторы для генерации ответа на вопрос.
В целом Milvus и LlamaIndex предоставляют мощную комбинацию инструментов для создания RAG-систем и AI Agent. Используя эти инструменты совместно, разработчики могут создавать системы, которые эффективно извлекают и генерируют текст на основе заданного промпта, что делает их бесценными для приложений в различных областях — от поддержки клиентов до генерации контента.
Краткое описание создания AI Agent для Retrieval Augmented Generation с Milvus и LlamaIndex
В этой статье мы создали AI Agent для RAG с использованием Milvus, LlamaIndex и GPT 3.5. RAG — это архитектура приложения на основе LLM, которая использует векторные базы данных для добавления ваших данных в LLM в качестве контекста . AI Agent — это приложение на основе LLM, которое может использовать другие инструменты. Чтобы выполнять RAG с AI Agent, мы предоставляем ему инструменты, необходимые для выполнения запросов к векторной базе данных.
В этом руководстве мы показали, как построить эту архитектуру с использованием примерных данных Lyft и Uber. Сначала мы загрузили данные в Milvus, чтобы можно было выполнять RAG. Затем мы превратили наши коллекции Milvus в движки запросов, а движки запросов — в пригодные для использования инструменты. Наконец, мы передали эти инструменты AI Agent и использовали их для выполнения RAG на наших документах.
Читать далее

My Wife Wanted Dior. I Spent $600 on Claude Code to Vibe-Code a 2M-Line Database Instead.
Write tests, not code reviews. How a test-first workflow with 6 parallel Claude Code sessions turns a 2M-line C++ codebase into a daily shipping pipeline.

Why and How to Migrate from Self-Hosted Milvus to Zilliz Cloud
A simple, step-by-step guide to migrating from Milvus to Zilliz Cloud. Learn both endpoint and backup methods for a smooth, scalable vector database migration.

Zilliz Cloud Delivers Better Performance and Lower Costs with Arm Neoverse-based AWS Graviton
Zilliz Cloud adopts Arm-based AWS Graviton3 CPUs to cut costs, speed up AI vector search, and power billion-scale RAG and semantic search workloads.



