Создайте RAG с помощью Milvus и Cognee
Cognee - это платформа, ориентированная на разработчиков, которая упрощает разработку приложений искусственного интеллекта с помощью масштабируемых модульных конвейеров ECL (Extract, Cognify, Load). Благодаря бесшовной интеграции с Milvus, Cognee обеспечивает эффективное подключение и извлечение разговоров, документов и транскрипций, сокращая количество галлюцинаций и оптимизируя операционные расходы.
Благодаря поддержке таких векторных хранилищ, как Milvus, баз данных графов и LLM, Cognee предоставляет гибкую и настраиваемую основу для создания систем с расширенным поиском (RAG). Его готовая к производству архитектура обеспечивает повышенную точность и эффективность приложений, основанных на искусственном интеллекте.
В этом руководстве мы покажем вам, как построить конвейер RAG (Retrieval-Augmented Generation) с помощью Milvus и Cognee.
$ pip install pymilvus git+https://github.com/topoteretes/cognee.git
Если вы используете Google Colab, то для включения только что установленных зависимостей вам может потребоваться перезапустить среду выполнения (нажмите на меню "Runtime" в верхней части экрана и выберите "Restart session" из выпадающего меню).
По умолчанию в этом примере в качестве LLM используется OpenAI. Вам необходимо подготовить api ключ и задать его в функции config set_llm_api_key()
.
Чтобы настроить Milvus в качестве базы данных векторов, установите VECTOR_DB_PROVIDER
на milvus
и укажите VECTOR_DB_URL
и VECTOR_DB_KEY
. Поскольку в этом демо мы используем Milvus Lite для хранения данных, необходимо указать только VECTOR_DB_URL
.
import os
import cognee
cognee.config.set_llm_api_key("YOUR_OPENAI_API_KEY")
os.environ["VECTOR_DB_PROVIDER"] = "milvus"
os.environ["VECTOR_DB_URL"] = "./milvus.db"
Что касается переменных окружения VECTOR_DB_URL
и VECTOR_DB_KEY
:
- Установка
VECTOR_DB_URL
в качестве локального файла, например./milvus.db
, является наиболее удобным методом, так как он автоматически использует Milvus Lite для хранения всех данных в этом файле. - Если у вас большой объем данных, вы можете настроить более производительный сервер Milvus на docker или kubernetes. В этом случае используйте ури сервера, например
http://localhost:19530
, в качествеVECTOR_DB_URL
. - Если вы хотите использовать Zilliz Cloud, полностью управляемый облачный сервис для Milvus, настройте
VECTOR_DB_URL
иVECTOR_DB_KEY
, которые соответствуют публичной конечной точке и ключу Api в Zilliz Cloud.
Подготовьте данные
Мы используем страницы FAQ из документации Milvus 2.4.x в качестве частных знаний в нашей RAG, которая является хорошим источником данных для простого RAG-конвейера.
Скачайте zip-файл и распакуйте документы в папку milvus_docs
.
$ wget https://github.com/milvus-io/milvus-docs/releases/download/v2.4.6-preview/milvus_docs_2.4.x_en.zip
$ unzip -q milvus_docs_2.4.x_en.zip -d milvus_docs
Мы загружаем все файлы разметки из папки milvus_docs/en/faq
. Для каждого документа мы просто используем "# " для разделения содержимого в файле, что позволяет примерно разделить содержимое каждой основной части файла разметки.
from glob import glob
text_lines = []
for file_path in glob("milvus_docs/en/faq/*.md", recursive=True):
with open(file_path, "r") as file:
file_text = file.read()
text_lines += file_text.split("# ")
Сборка RAG
Сброс данных Cognee
await cognee.prune.prune_data()
await cognee.prune.prune_system(metadata=True)
Теперь, когда все готово, мы можем добавить наш набор данных и обработать его в граф знаний.
Добавление данных и обработка Cognifying
await cognee.add(data=text_lines, dataset_name="milvus_faq")
await cognee.cognify()
# [DocumentChunk(id=UUID('6889e7ef-3670-555c-bb16-3eb50d1d30b0'), updated_at=datetime.datetime(2024, 12, 4, 6, 29, 46, 472907, tzinfo=datetime.timezone.utc), text='Does the query perform in memory? What are incremental data and historical data?\n\nYes. When ...
# ...
Метод add
загружает набор данных (Milvus FAQs) в Cognee, а метод cognify
обрабатывает данные для извлечения сущностей, связей и обобщений, создавая граф знаний.
Запрос сводок
Теперь, когда данные обработаны, давайте сделаем запрос к графу знаний.
from cognee.api.v1.search import SearchType
query_text = "How is data stored in milvus?"
search_results = await cognee.search(SearchType.SUMMARIES, query_text=query_text)
print(search_results[0])
{'id': 'de5c6713-e079-5d0b-b11d-e9bacd1e0d73', 'text': 'Milvus stores two data types: inserted data and metadata.'}
Этот запрос ищет в графе знаний резюме, связанное с текстом запроса, и выводит наиболее связанного кандидата.
Запрос по фрагментам
Сводки предлагают высокоуровневые сведения, но для получения более детальной информации мы можем запросить определенные фрагменты данных непосредственно из обработанного набора данных. Эти фрагменты получены из исходных данных, которые были добавлены и проанализированы во время создания графа знаний.
from cognee.api.v1.search import SearchType
query_text = "How is data stored in milvus?"
search_results = await cognee.search(SearchType.CHUNKS, query_text=query_text)
Давайте отформатируем и отобразим их для лучшей читабельности!
def format_and_print(data):
print("ID:", data["id"])
print("\nText:\n")
paragraphs = data["text"].split("\n\n")
for paragraph in paragraphs:
print(paragraph.strip())
print()
format_and_print(search_results[0])
ID: 4be01c4b-9ee5-541c-9b85-297883934ab3
Text:
Where does Milvus store data?
Milvus deals with two types of data, inserted data and metadata.
Inserted data, including vector data, scalar data, and collection-specific schema, are stored in persistent storage as incremental log. Milvus supports multiple object storage backends, including [MinIO](https://min.io/), [AWS S3](https://aws.amazon.com/s3/?nc1=h_ls), [Google Cloud Storage](https://cloud.google.com/storage?hl=en#object-storage-for-companies-of-all-sizes) (GCS), [Azure Blob Storage](https://azure.microsoft.com/en-us/products/storage/blobs), [Alibaba Cloud OSS](https://www.alibabacloud.com/product/object-storage-service), and [Tencent Cloud Object Storage](https://www.tencentcloud.com/products/cos) (COS).
Metadata are generated within Milvus. Each Milvus module has its own metadata that are stored in etcd.
###
На предыдущих этапах мы запрашивали набор данных Milvus FAQ для получения как сводок, так и конкретных фрагментов данных. Хотя это позволило получить подробные сведения и детализированную информацию, набор данных был большим, что затрудняло четкое отображение зависимостей в графе знаний.
Чтобы решить эту проблему, мы перезагрузим среду Cognee и будем работать с меньшим, более узким набором данных. Это позволит нам лучше продемонстрировать взаимосвязи и зависимости, выявленные в процессе познания. Упростив данные, мы сможем наглядно увидеть, как Cognee организует и структурирует информацию в графе знаний.
Перезагрузка Cognee
await cognee.prune.prune_data()
await cognee.prune.prune_system(metadata=True)
Добавление сфокусированного набора данных
Здесь добавляется и обрабатывается меньший набор данных, содержащий всего одну строку текста, чтобы обеспечить сфокусированный и легко интерпретируемый граф знаний.
# We only use one line of text as the dataset, which simplifies the output later
text = """
Natural language processing (NLP) is an interdisciplinary
subfield of computer science and information retrieval.
"""
await cognee.add(text)
await cognee.cognify()
Запрос для получения информации
Сосредоточившись на этом меньшем наборе данных, мы можем четко проанализировать взаимосвязи и структуру графа знаний.
query_text = "Tell me about NLP"
search_results = await cognee.search(SearchType.INSIGHTS, query_text=query_text)
for result_text in search_results:
print(result_text)
# Example output:
# ({'id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'natural language processing', 'description': 'An interdisciplinary subfield of computer science and information retrieval.'}, {'relationship_name': 'is_a_subfield_of', 'source_node_id': UUID('bc338a39-64d6-549a-acec-da60846dd90d'), 'target_node_id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 15, 473137, tzinfo=datetime.timezone.utc)}, {'id': UUID('6218dbab-eb6a-5759-a864-b3419755ffe0'), 'updated_at': datetime.datetime(2024, 11, 21, 12, 23, 1, 211808, tzinfo=datetime.timezone.utc), 'name': 'computer science', 'description': 'The study of computation and information processing.'})
# (...)
#
# It represents nodes and relationships in the knowledge graph:
# - The first element is the source node (e.g., 'natural language processing').
# - The second element is the relationship between nodes (e.g., 'is_a_subfield_of').
# - The third element is the target node (e.g., 'computer science').
Этот вывод представляет собой результаты запроса к графу знаний, показывая сущности (узлы) и их взаимосвязи (ребра), извлеченные из обработанного набора данных. Каждый кортеж включает исходную сущность, тип связи и целевую сущность, а также метаданные, такие как уникальные идентификаторы, описания и временные метки. Граф выделяет ключевые понятия и их семантические связи, обеспечивая структурированное понимание набора данных.
Поздравляем, вы узнали о базовом использовании cognee с Milvus. Если вы хотите узнать о более продвинутом использовании cognee, пожалуйста, обратитесь к его официальной странице.