Объяснение GraphRAG: улучшение RAG с помощью графов знаний
Введение в RAG и его сложности
Retrieval Augmented Generation (RAG) — это метод, который подключает внешние источники данных для улучшения результатов работы больших языковых моделей (LLM). Этот метод идеально подходит для того, чтобы LLM могли получать доступ к приватным или предметно-специфическим данным и решать проблемы галлюцинаций. Поэтому RAG широко используется для обеспечения работы многих приложений GenAI, таких как ИИ-чатботы и рекомендательные системы.
Базовый RAG обычно объединяет векторную базу данных и LLM, где векторная база данных хранит и извлекает контекстную информацию для пользовательских запросов, а LLM генерирует ответы на основе извлеченного контекста. Хотя этот подход хорошо работает во многих случаях, он испытывает трудности со сложными задачами, такими как многошаговое рассуждение или ответы на вопросы, требующие связывания разрозненных фрагментов информации.
Например, рассмотрим такой вопрос: “Какое имя было дано сыну человека, победившего узурпатора Аллекта?”
Базовый RAG, как правило, выполнил бы следующие шаги, чтобы ответить на этот вопрос:
Определить человека: Установить, кто победил Аллекта.
Изучить сына этого человека: Найти информацию о семье этого человека, в частности о его сыне.
Найти имя: Определить имя сына.
Проблема обычно возникает на первом шаге, потому что базовый RAG извлекает текст на основе семантического сходства, а не напрямую отвечает на сложные запросы, где конкретные детали могут быть явно не упомянуты в наборе данных. Это ограничение затрудняет поиск точной необходимой информации, часто требуя дорогих и непрактичных решений, таких как ручное создание пар вопросов и ответов для частых запросов.
Чтобы решить такие проблемы, Microsoft Research представила GraphRAG — совершенно новый метод, который дополняет извлечение и генерацию RAG графами знаний. В следующих разделах мы объясним, как GraphRAG работает внутри и как запустить его с векторной базой данных Milvus .
Что такое GraphRAG и как он работает?
В отличие от базового RAG, который использует векторную базу данных для извлечения семантически схожего текста, GraphRAG улучшает RAG, включая графы знаний (KG). Графы знаний — это структуры данных, которые хранят и связывают связанные или несвязанные данные на основе их отношений.
Конвейер GraphRAG обычно состоит из двух фундаментальных процессов: индексирования и выполнения запросов.
Конвейер GraphRAG
Конвейер GraphRAG (Источник изображения: статья GraphRAG)
Индексирование
Процесс индексирования включает четыре ключевых шага:
Сегментация текстовых единиц: Весь входной корпус делится на несколько текстовых единиц (текстовых фрагментов). Эти фрагменты являются наименьшими анализируемыми единицами и могут быть абзацами, предложениями или другими логическими единицами. Сегментируя длинные документы на более мелкие фрагменты, мы можем извлекать и сохранять более подробную информацию об этих входных данных.
Извлечение сущностей, отношений и утверждений: GraphRAG использует LLM для выявления и извлечения всех сущностей (имен людей, мест, организаций и т. д.), отношений между ними и ключевых утверждений, выраженных в тексте каждой текстовой единицы. Мы будем использовать эту извлеченную информацию для построения исходного графа знаний.
Иерархическая кластеризация: GraphRAG использует метод Leiden для выполнения иерархической кластеризации исходных графов знаний. Leiden — это алгоритм обнаружения сообществ, который может эффективно выявлять структуры сообществ внутри графа. Сущности в каждом кластере распределяются по разным сообществам для более глубокого анализа.
Примечание: Сообщество — это группа узлов внутри графа, которые плотно связаны друг с другом, но слабо связаны с другими плотными группами в сети.
- Генерация сводок сообществ: GraphRAG генерирует сводки для каждого сообщества и его участников, используя восходящий подход. Эти сводки включают основные сущности внутри сообщества, их отношения и ключевые утверждения. Этот шаг дает обзор всего набора данных и предоставляет полезную контекстную информацию для последующих запросов.
Рисунок 1- Граф знаний, сгенерированный LLM и построенный с использованием GPT-4 Turbo.
Рисунок 1: Граф знаний, сгенерированный LLM и построенный с использованием GPT-4 Turbo.
(Источник изображения: Microsoft Research)
Запросы
GraphRAG имеет два разных рабочих процесса запросов, адаптированных для разных запросов.
Глобальный поиск для рассуждений о целостных вопросах, связанных со всем корпусом данных, с использованием сводок сообществ.
Локальный поиск для рассуждений о конкретных сущностях путем расширения к их соседям и связанным понятиям.
Этот рабочий процесс глобального поиска включает следующие фазы.
Рисунок 2- Поток данных глобального поиска
Рисунок 2: Поток данных глобального поиска (Источник изображения: Microsoft Research)
Пользовательский запрос и история разговора: Система принимает пользовательский запрос и историю разговора в качестве начального ввода.
Пакеты отчетов сообщества: Система использует отчеты о сообществах узлов, сгенерированные LLM с заданного уровня иерархии сообществ, в качестве контекстных данных. Эти отчеты о сообществах перемешиваются и делятся на несколько пакетов (Перемешанный пакет отчетов сообщества 1, Пакет 2... Пакет N).
RIR (Rated Intermediate Responses): Каждый пакет отчетов сообщества дополнительно делится на текстовые фрагменты заранее заданного размера. Каждый текстовый фрагмент используется для генерации промежуточного ответа. Ответ содержит список информационных элементов, называемых пунктами. Каждый пункт имеет числовую оценку, указывающую на его важность. Эти сгенерированные промежуточные ответы являются Rated Intermediate Responses (Rated Intermediate Response 1, Response 2... Response N).
Ранжирование и фильтрация: Система ранжирует и фильтрует эти промежуточные ответы, выбирая наиболее важные пункты. Выбранные важные пункты формируют агрегированные промежуточные ответы.
Финальный ответ: Агрегированные промежуточные ответы используются в качестве контекста для генерации финального ответа.
Когда пользователи задают вопросы о конкретных сущностях (таких как имена людей, места, организации и т. д.), мы рекомендуем использовать рабочий процесс локального поиска. Этот процесс включает следующие шаги:
Рисунок 3- Поток данных локального поиска
Рисунок 3: Поток данных локального поиска (Источник изображения: Microsoft Research)
Пользовательский запрос: Сначала система получает пользовательский запрос, который может быть простым вопросом или более сложным запросом.
Поиск похожих сущностей: Система определяет набор сущностей из графа знаний, которые семантически связаны с пользовательским вводом. Эти сущности служат точками входа в граф знаний. На этом шаге используется векторная база данных, такая как Milvus, для выполнения поиска текстового сходства.
Сопоставление сущностей с текстовыми единицами: Извлеченные текстовые единицы сопоставляются с соответствующими сущностями, удаляя исходную текстовую информацию.
Извлечение сущностей и связей: На этом шаге извлекается конкретная информация о сущностях и соответствующих им связях.
Сопоставление сущностей с ковариатами: На этом шаге сущности сопоставляются с их ковариатами, которые могут включать статистические данные или другие релевантные атрибуты.
Сопоставление сущностей с отчетами сообществ: Отчеты сообществ интегрируются в результаты поиска, включая некоторую глобальную информацию.
Использование истории разговора: Если она предоставлена, система использует историю разговора, чтобы лучше понять намерение и контекст пользователя.
Генерация ответа: Наконец, система формирует ответ на пользовательский запрос на основе отфильтрованных и отсортированных данных, полученных на предыдущих шагах.
Baseline RAG vs. GraphRAG в качестве вывода
Чтобы продемонстрировать эффективность GraphRAG, его создатели сравнивают качество вывода baseline RAG и GraphRAG в своем анонсе в блоге. Здесь я приведу простой пример для иллюстрации.
Использованный набор данных
Создатели GraphRAG использовали набор данных Violent Incident Information from News Articles (VIINA) для своих экспериментов.
Примечание: Этот набор данных содержит чувствительные темы. Он был выбран исключительно из-за своей сложности и наличия различных мнений и частичной информации. Это неупорядоченный тестовый пример из реального мира, достаточно недавний, чтобы не быть включенным в обучение базовой модели LLM.
Обзор эксперимента
И Baseline RAG, и GraphRAG задали один и тот же вопрос, который требует агрегирования информации по всему набору данных для составления ответа.
В: Какие 5 главных тем в наборе данных?
Ответы показаны на изображении ниже. Результаты Baseline RAG были нерелевантны темам войны, поскольку векторный поиск извлек несвязанный текст, что привело к неточной оценке. В отличие от этого, GraphRAG предоставил четкий и релевантный ответ, определив основные темы и подтверждающие детали. Результаты соответствовали набору данных, со ссылками на исходный материал.
Рисунок 4- BaselineRAG vs. GraphRAG при ответах на сложные вопросы суммаризации
Рисунок 4: BaselineRAG vs. GraphRAG при ответах на сложные вопросы суммаризации
Дальнейшие эксперименты в статье “From Local to Global: A Graph RAG Approach to Query-Focused Summarization.” демонстрируют, что GraphRAG значительно улучшает многошаговое рассуждение и сложную суммаризацию информации. Исследование показывает, что GraphRAG превосходит Baseline RAG как по полноте, так и по разнообразию:
Полнота: Степень, в которой ответ охватывает все аспекты вопроса.
Разнообразие: Разнообразие и богатство точек зрения и инсайтов, которые предоставляет ответ.
Мы рекомендуем вам прочитать оригинальную статью о GraphRAG для получения более подробной информации об этих экспериментах.
Как реализовать GraphRAG с векторной базой данных Milvus
GraphRAG улучшает RAG-приложения с помощью графов знаний, а также полагается на векторную базу данных для извлечения релевантных сущностей. В этом разделе показано, как реализовать GraphRAG, создать индекс GraphRAG и выполнять запросы к нему с использованием векторной базы данных Milvus.
Предварительные требования
Перед запуском кода из этого блога убедитесь, что вы установили следующие зависимости:
pip install --upgrade pymilvus
pip install git+https://github.com/zc277584121/graphrag.git
Примечание: Мы установили GraphRAG из форкнутого репозитория, потому что функция хранения Milvus на момент написания всё ещё ожидает официального слияния.
Начнём с рабочего процесса индексирования.
Подготовка данных
Скачайте небольшой текстовый файл примерно с тысячей строк из Project Gutenberg и используйте его для индексирования GraphRAG.
Этот набор данных посвящён истории Леонардо да Винчи. Мы используем GraphRAG для построения графового индекса всех отношений, связанных с да Винчи, и векторную базу данных Milvus для поиска релевантных знаний, чтобы отвечать на вопросы.
import nest_asyncio
nest_asyncio.apply()
import os
import urllib.request
index_root = os.path.join(os.getcwd(), 'graphrag_index')
os.makedirs(os.path.join(index_root, 'input'), exist_ok=True)
url = "https://www.gutenberg.org/cache/epub/7785/pg7785.txt"
file_path = os.path.join(index_root, 'input', 'davinci.txt')
urllib.request.urlretrieve(url, file_path)
with open(file_path, 'r+', encoding='utf-8') as file:
# We use the first 934 lines of the text file, because the later lines are not relevant for this example.
# If you want to save api key cost, you can truncate the text file to a smaller size.
lines = file.readlines()
file.seek(0)
file.writelines(lines[:934]) # Decrease this number if you want to save api key cost.
file.truncate()
Инициализация рабочей области
Теперь используем GraphRAG для индексирования текстового файла. Чтобы инициализировать рабочую область, сначала выполним команду graphrag.index --init.
python -m graphrag.index --init --root ./graphrag_index
Настройка файла env и параметров
Вы найдёте файл .env в корневом каталоге индекса. Чтобы использовать его, добавьте свой API-ключ OpenAI в файл .env.
Важные примечания: __
В этом примере мы будем использовать модели OpenAI; убедитесь, что у вас готов API-ключ.
Индексирование GraphRAG затратно, поскольку оно обрабатывает весь текстовый корпус с помощью LLM. Запуск этой демонстрации может стоить несколько долларов. Чтобы сэкономить, рассмотрите возможность усечения текстового файла до меньшего размера.
Запуск конвейера индексирования
Процесс индексирования займёт некоторое время. После завершения вы найдёте новую папку по пути ./graphrag_index/output/<timestamp>/artifacts, содержащую серию parquet-файлов.
python -m graphrag.index --root ./graphrag_index
Запросы с использованием векторной базы данных Milvus
На этапе выполнения запросов мы используем Milvus для хранения эмбеддингов описаний сущностей для локального поиска GraphRAG. Этот метод объединяет структурированные данные из графа знаний с неструктурированными данными из входных документов, расширяя контекст LLM релевантной информацией о сущностях для более точных ответов.
import os
import pandas as pd
import tiktoken
from graphrag.query.context_builder.entity_extraction import EntityVectorStoreKey
from graphrag.query.indexer_adapters import (
# read_indexer_covariates,
read_indexer_entities,
read_indexer_relationships,
read_indexer_reports,
read_indexer_text_units,
)
from graphrag.query.input.loaders.dfs import (
store_entity_semantic_embeddings,
)
from graphrag.query.llm.oai.chat_openai import ChatOpenAI
from graphrag.query.llm.oai.embedding import OpenAIEmbedding
from graphrag.query.llm.oai.typing import OpenaiApiType
from graphrag.query.question_gen.local_gen import LocalQuestionGen
from graphrag.query.structured_search.local_search.mixed_context import (
LocalSearchMixedContext,
)
from graphrag.query.structured_search.local_search.search import LocalSearch
from graphrag.vector_stores import MilvusVectorStore
output_dir = os.path.join(index_root, "output")
subdirs = [os.path.join(output_dir, d) for d in os.listdir(output_dir)]
latest_subdir = max(subdirs, key=os.path.getmtime) # Получить последний выходной каталог
INPUT_DIR = os.path.join(latest_subdir, "artifacts")
COMMUNITY_REPORT_TABLE = "create_final_community_reports"
ENTITY_TABLE = "create_final_nodes"
ENTITY_EMBEDDING_TABLE = "create_final_entities"
RELATIONSHIP_TABLE = "create_final_relationships"
COVARIATE_TABLE = "create_final_covariates"
TEXT_UNIT_TABLE = "create_final_text_units"
COMMUNITY_LEVEL = 2
Загрузка данных из процесса индексирования
Во время процесса индексирования будет сгенерировано несколько parquet-файлов. Мы загружаем их в память и сохраняем информацию с описанием сущностей в векторной базе данных Milvus.
Чтение сущностей:
# чтение таблицы узлов для получения данных о сообществе и степени
entity_df = pd.read_parquet(f"{INPUT_DIR}/{ENTITY_TABLE}.parquet")
entity_embedding_df = pd.read_parquet(f"{INPUT_DIR}/{ENTITY_EMBEDDING_TABLE}.parquet")
entities = read_indexer_entities(entity_df, entity_embedding_df, COMMUNITY_LEVEL)
description_embedding_store = MilvusVectorStore(
collection_name="entity_description_embeddings",
)
# description_embedding_store.connect(uri="http://localhost:19530") # Для docker-сервиса Milvus
description_embedding_store.connect(uri="./milvus.db") # Для Milvus Lite
entity_description_embeddings = store_entity_semantic_embeddings(
entities=entities, vectorstore=description_embedding_store
)
print(f"Количество сущностей: {len(entity_df)}")
entity_df.head()
Количество сущностей: 651
Рисунок 5: скриншот сущностей
Рисунок 5: скриншот сущностей
Чтение отношений
relationship_df = pd.read_parquet(f"{INPUT_DIR}/{RELATIONSHIP_TABLE}.parquet")
relationships = read_indexer_relationships(relationship_df)
print(f"Количество отношений: {len(relationship_df)}")
relationship_df.head()
Количество отношений: 290
Рисунок 6- скриншот отношений
Рисунок 6: скриншот отношений
Чтение отчетов сообществ
report_df = pd.read_parquet(f"{INPUT_DIR}/{COMMUNITY_REPORT_TABLE}.parquet")
reports = read_indexer_reports(report_df, entity_df, COMMUNITY_LEVEL)
print(f"Записей отчетов: {len(report_df)}")
report_df.head()
Записей отчетов: 45
Рисунок 7- скриншот записей отчетов
Рисунок 7: скриншот записей отчетов
Чтение текстовых единиц
text_unit_df = pd.read_parquet(f"{INPUT_DIR}/{TEXT_UNIT_TABLE}.parquet")
text_units = read_indexer_text_units(text_unit_df)
print(f"Записей текстовых единиц: {len(text_unit_df)}")
text_unit_df.head()
Записей текстовых единиц: 51
Рисунок 8- скриншот записей текстовых единиц
Рисунок 8: скриншот записей текстовых единиц
Создание локальной поисковой системы
Мы подготовили необходимые данные для локальной поисковой системы. Теперь мы можем создать экземпляр LocalSearch с ними, LLM и моделью эмбеддингов.
Мы подготовили необходимые данные для локальной поисковой системы. Теперь мы можем создать экземпляр LocalSearch с ними, LLM и моделью эмбеддингов.
api_key = os.environ["OPENAI_API_KEY"] # Ваш ключ API OpenAI
llm_model = "gpt-4o" # Или gpt-4-turbo-preview
embedding_model = "text-embedding-3-small"
llm = ChatOpenAI(
api_key=api_key,
model=llm_model,
api_type=OpenaiApiType.OpenAI,
max_retries=20,
)
token_encoder = tiktoken.get_encoding("cl100k_base")
text_embedder = OpenAIEmbedding(
api_key=api_key,
api_base=None,
api_type=OpenaiApiType.OpenAI,
model=embedding_model,
deployment_name=embedding_model,
max_retries=20,
)
context_builder = LocalSearchMixedContext(
community_reports=reports,
text_units=text_units,
entities=entities,
relationships=relationships,
covariates=None, #covariates,#todo
entity_text_embeddings=description_embedding_store,
embedding_vectorstore_key=EntityVectorStoreKey.ID, # если vectorstore использует название сущности в качестве ids, установите это значение на EntityVectorStoreKey.TITLE
text_embedder=text_embedder,
token_encoder=token_encoder,
)
local_context_params = {
"text_unit_prop": 0.5,
"community_prop": 0.1,
"conversation_history_max_turns": 5,
"conversation_history_user_turns_only": True,
"top_k_mapped_entities": 10,
"top_k_relationships": 10,
"include_entity_rank": True,
"include_relationship_weight": True,
"include_community_rank": False,
"return_candidate_context": False,
"embedding_vectorstore_key": EntityVectorStoreKey.ID, # установите это значение на EntityVectorStoreKey.TITLE, если vectorstore использует название сущности в качестве ids
"max_tokens": 12_000, # измените это в зависимости от лимита токенов вашей модели (если вы используете модель с лимитом 8k, хорошей настройкой может быть 5000)
}
llm_params = {
"max_tokens": 2_000, # измените это в зависимости от лимита токенов вашей модели (если вы используете модель с лимитом 8k, хорошей настройкой может быть 1000=1500)
"temperature": 0.0,
}
search_engine = LocalSearch(
llm=llm,
context_builder=context_builder,
token_encoder=token_encoder,
llm_params=llm_params,
context_builder_params=local_context_params,
response_type="несколько абзацев", # свободный текст, описывающий тип и формат ответа, может быть любым, например приоритетный список, один абзац, несколько абзацев, многостраничный отчет
)
Сделайте запрос.
result = await search_engine.asearch("Расскажи мне о Leonardo Da Vinci")
print(result.response)
# Леонардо да Винчи
Леонардо да Винчи, родившийся в 1452 году в городке Винчи близ Флоренции, широко прославлен как один из самых разносторонних гениев итальянского Возрождения. Его полное имя было Леонардо ди сер Пьеро д'Антонио ди сер Пьеро ди сер Гвидо да Винчи, и он был внебрачным и первородным сыном сера Пьеро, сельского нотариуса [Data: Entities (0)]. Вклад Леонардо охватывал различные области, включая искусство, науку, инженерию и философию, что принесло ему звание самого универсального гения христианских времен [Data: Entities (8)].
## Ранняя жизнь и обучение
Ранний талант Леонардо был замечен его отцом, который отнес некоторые его рисунки Андреа дель Верроккьо, знаменитому художнику и скульптору. Впечатленный талантом Леонардо, Верроккьо принял его в свою мастерскую примерно в 1469-1470 годах. Здесь Леонардо познакомился с другими известными художниками, включая Боттичелли и Лоренцо ди Креди [Data: Sources (6, 7)]. К 1472 году Леонардо был принят в Гильдию флорентийских живописцев, что ознаменовало начало его профессиональной карьеры [Data: Sources (7)].
## Художественные шедевры
Леонардо, пожалуй, наиболее известен своими культовыми картинами, такими как "Мона Лиза" и "Тайная вечеря." "Мона Лиза," прославленная своим тонким выражением лица и детально проработанным фоном, хранится в Лувре и остается одним из самых известных произведений искусства в мире [Data: Relationships (0, 45)]. "Тайная вечеря," фреска, изображающая момент, когда Иисус объявил, что один из его учеников предаст его, находится в трапезной Санта-Мария-делле-Грацие в Милане [Data: Sources (2)]. Среди других значительных работ — "Мадонна в скалах" и "Трактат о живописи," который он начал примерно в 1489-1490 годах [Data: Relationships (7, 12)].
## Научный и инженерный вклад
Гений Леонардо простирался за пределы искусства, охватывая различные научные и инженерные начинания. Он сделал важные наблюдения в анатомии, оптике и гидравлике, а его записные книжки наполнены эскизами и идеями, предвосхитившими многие современные изобретения. Например, он предвосхитил теорию Коперника о движении Земли и классификацию животных Ламарка [Data: Relationships (38, 39)]. Его работа над законами света и тени и мастерское владение кьяроскуро оказали глубокое влияние как на искусство, так и на науку [Data: Sources (45)].
## Покровительство и профессиональные отношения
Карьера Леонардо значительно зависела от его покровителей. Лодовико Сфорца, герцог Миланский, нанял Леонардо в качестве придворного художника и универсального мастера, заказывая различные работы и даже подарив ему виноградник в 1499 году [Data: Relationships (9, 19, 84)]. В последние годы жизни Леонардо переехал во Францию под покровительство короля Франциска I, который обеспечил ему княжеский доход и относился к нему с большим уважением [Data: Relationships (114, 37)]. Последние годы Леонардо провел в усадьбе Клу близ Амбуаза, где его часто посещал король и где его поддерживал близкий друг и помощник Франческо Мельци [Data: Relationships (28, 122)].
## Наследие и влияние
Влияние Леонардо да Винчи простиралось далеко за пределы его жизни. Он основал школу живописи в Милане, а его приемы и учения были продолжены его учениками и последователями, такими как Джованни Амброджо да Предис и Франческо Мельци [Data: Relationships (6, 15, 28)]. Его работы продолжают восхищать и изучать, закрепляя его наследие как одного из величайших мастеров Возрождения. Способность Леонардо сочетать искусство и науку оставила неизгладимый след в обеих областях, вдохновляя бесчисленные поколения художников и ученых [Data: Entities (148, 86); Relationships (27, 12)].
В заключение, непревзойденный вклад Леонардо да Винчи в искусство, науку и инженерию, в сочетании с его новаторским мышлением и глубоким влиянием на современников и будущие поколения, делает его выдающейся фигурой в истории человеческих достижений. Его наследие продолжает вызывать восхищение и становиться предметом изучения, подчеркивая непреходящую актуальность его гения.
Результаты GraphRAG являются конкретными, с четко обозначенными цитируемыми источниками данных.
Генерация вопросов
GraphRAG также может генерировать вопросы на основе исторических запросов, что полезно для создания рекомендуемых вопросов в диалоге чат-бота. Этот метод объединяет структурированные данные из графа знаний с неструктурированными данными из входных документов для создания вопросов-кандидатов, связанных с конкретными сущностями.
question_generator = LocalQuestionGen(
llm=llm,
context_builder=context_builder,
token_encoder=token_encoder,
llm_params=llm_params,
context_builder_params=local_context_params,
)
question_history = [
"Tell me about Leonardo Da Vinci",
"Leonardo's early works",
]
Генерация вопросов на основе истории.
candidate_questions = await question_generator.agenerate(
question_history=question_history, context_data=None, question_count=5
)
candidate_questions.response
["- What were some of Leonardo da Vinci's early works and where are they housed?",
"- How did Leonardo da Vinci's relationship with Andrea del Verrocchio influence his early works?",
'- What notable projects did Leonardo da Vinci undertake during his time in Milan?',
"- How did Leonardo da Vinci's engineering skills contribute to his projects?",
"- What was the significance of Leonardo da Vinci's relationship with Francis I of France?"]
Вы можете удалить корневой каталог индекса, если хотите удалить индекс для экономии места.
# import shutil
#
# shutil.rmtree(index_root)
Резюме
В этом блоге мы рассмотрели GraphRAG, инновационный метод, который улучшает технологию RAG за счет интеграции графов знаний. GraphRAG идеально подходит для решения сложных задач, таких как многошаговое рассуждение и ответы на комплексные вопросы, требующие связывания разрозненных фрагментов информации.
В сочетании с векторной базой данных Milvus GraphRAG может ориентироваться в сложных семантических связях внутри больших наборов данных, предоставляя более точные и содержательные результаты. Это мощное сочетание делает GraphRAG ценным ресурсом для различных практических приложений GenAI, предоставляя надежное решение для понимания и обработки сложной информации.
Дополнительные ресурсы
Статья о GraphRAG: From Local to Global: A Graph RAG Approach to Query-Focused Summarization
GitHub GraphRAG: https://github.com/microsoft/graphrag
Другие методы улучшения RAG:
Читать далее

Vector Lakebase: End the AI Data Silo
Learn how Vector Lakebase unifies vector search, data lakes, and AI data operations so teams can serve RAG and agents without copy-and-sync pipelines.

Bringing AI to Legal Tech: The Role of Vector Databases in Enhancing LLM Guardrails
Discover how vector databases enhance AI reliability in legal tech, ensuring accurate, compliant, and trustworthy AI-powered legal solutions.

Vector Databases vs. Key-Value Databases
Use a vector database for AI-powered similarity search; use a key-value database for high-throughput, low-latency simple data lookups.



