GraphRAG от Microsoft (34K звезд на GitHub) — это open-source система, которая превращает набор документов в knowledge graph и отвечает на вопросы, используя не просто ближайшие чанки, а цепочки связанных сущностей. В отличие от обычного RAG, который ищет «похожие куски текста», GraphRAG строит граф связей между людьми, компаниями, датами и событиями — и отвечает на сложные вопросы вроде «Какие три стратегии роста упоминаются в этих 50 отчётах?»

34.2Kзвёзд GitHub
3.6Kфорков
3.7xточнее обычного RAG
MITлицензия
~500строк для старта
2024год релиза

Что такое GraphRAG

GraphRAG — это система retrieval-augmented generation, построенная на knowledge graph вместо плоского векторного поиска.

Обычный RAG (Naive RAG) работает просто: разбить документы на куски по 512 токенов, превратить каждый в вектор, найти K ближайших по косинусной близости к запросу, скормить LLM. Этого хватает, когда вопрос звучит как «Что написано в договоре про форс-мажор?». Но если спросить «Какие общие темы прослеживаются в годовых отчётах всех трёх дивизионов за последние два года?» — Naive RAG провалится: ни один чанк не содержит целостного ответа.

Бенчмарки 2025–2026 показывают: GraphRAG даёт +30–70% точности на задачах multi-source synthesis — там, где ответ надо собрать из нескольких разрозненных документов. Исследование Microsoft (июль 2024) на наборе из 1M текстов показало, что GraphRAG нашёл на 42% больше правильных ответов в тесте MultiHopQA, чем стандартный RAG с тем же LLM.

Как это работает

GraphRAG состоит из двух больших фаз, и понимать обе важно, потому что основная сложность — в первой.

Фаза индексации — самая затратная часть. GraphRAG берёт каждый документ, разбивает на блоки (по умолчанию 300 токенов) и для каждого блока выполняет LLM-запрос с примерно таким промптом: «Извлеки все сущности (люди, организации, локации, даты, события) и связи между ними из этого текста». LLM возвращает структурированные триплеты: (Entity-A, relation, Entity-B).

Из этих триплетов строится взвешенный граф. Дальше — самое интересное: алгоритм community detection (Leiden clustering) разбивает граф на сообщества — группы тесно связанных сущностей. Для каждого сообщества LLM пишет текстовую сводку. Эти сводки — ключ к быстрым ответам. Когда приходит глобальный вопрос («о чём вообще эти документы?»), GraphRAG не перебирает миллион ребер — он пробегается по сводкам сообществ.

На этапе запроса GraphRAG поддерживает два режима. Local search — обычный RAG-поход: ищет ближайшие к запросу сущности, их соседей, присоединяет исходные чанки документов, коктейль скормить LLM. Global search — проходит по сводкам сообществ, собирает из них ответ на обобщающий запрос. Начиная с версии 1.3 появился DRIFT search (Dynamic Retrieval of Information via Focused Traversal) — итеративный обход графа, который стартует с одной сущности и расширяется по мере запросов к LLM. DRIFT отлично справляется с вопросами, где ответ «спрятан» на глубине двух-трёх шагов от исходной точки.

На практике: local search — для вопросов по конкретному документу («Какой бюджет заложен на IT в 2026 году?»), global search — для междокументных («Где в этих отчётах упоминается риск-менеджмент и какие меры предлагаются?»), DRIFT — для исследовательских сценариев («Расскажи про цепочку поставок между Азией и Европой на основе этих данных»).

Установка GraphRAG

GraphRAG ставится как Python-пакет. Минимальные требования: Python 3.10–3.12, 4 CPU, 8 GB RAM для небольших наборов (до 100 документов). Для тысяч документов понадобится 16+ GB и GPU для эмбеддингов.

# 1. Создать окружение
python3 -m venv graphrag-env
source graphrag-env/bin/activate

# 2. Установить graphrag
pip install graphrag

# 3. Инициализировать проект
graphrag init --root ./myproject

# 4. Настроить .env
#    GRAPHRAG_API_KEY=*** ключ OpenAI или Azure>
#    GRAPHRAG_API_BASE=https://api.openai.com/v1

# 5. Поместить документы (txt, pdf, csv) в ./myproject/input/
cp ~/documents/*.txt ./myproject/input/

Параметр --root создаёт структуру директорий: input/ (исходные документы), output/ (индекс), settings.yaml и .env. По умолчанию GraphRAG использует OpenAI GPT-4o-mini для извлечения сущностей и text-embedding-3-small для эмбеддингов.

Настройка под локальные модели

GraphRAG можно переключить на любую OpenAI-совместимую API, включая локальные запуски Ollama или vLLM. В settings.yaml:

llm:
  model: qwen2.5:32b
  api_base: http://localhost:11434/v1
  api_key: ollama
  max_tokens: 4000

embeddings:
  model: nomic-embed-text-v1.5
  api_base: http://localhost:11434/v1
  api_key: ollama

В документации Microsoft описаны все поддерживаемые провайдеры: Azure OpenAI, OpenAI, Ollama, Azure ML, LlamaCPP и кастомные эндпоинты.

ПараметрПо умолчаниюДля продакшнаЗачем менять
CHUNK_SIZE300600–1200Большие чанки = меньше LLM-запросов, но грубее граф
CHUNK_OVERLAP100100–200Перекрытие важно для связности сущностей на стыках
MAX_CLUSTER_SIZE105–15Размер сообществ Leiden — влияет на granularity сводок
COMMUNITY_LEVEL21–3Уровень агрегации: 0 = детальные, 2 = обобщённые

Индексация данных

После настройки запуск индексации — одна команда:

graphrag index --root ./myproject

На 50 документов по 2–3 KB каждый процесс занимает примерно 10–20 минут в зависимости от модели. Что происходит под капотом:

Сначала чанкинг — документы режутся на блоки по CHUNK_SIZE токенов. Затем Entity Extraction: LLM-запрос к каждому блоку на извлечение сущностей и связей. Потом Summarization: LLM генерирует краткие описания каждой сущности. После этого Graph Construction: построение взвешенного графа (NetworkX), вычисление centrality. Затем Community Detection: Leiden clustering — сообщества разных уровней. Финальный этап — Community Summaries: LLM пишет сводку для каждого найденного сообщества. Результаты сохраняются в паракеты в output/.

Каждый этап можно перезапустить отдельно, если упал на середине — индексатор идемпотентен. При повторном запуске он пропускает уже обработанные документы. Это удобно, когда вы добавили 5 новых файлов в коллекцию из 200 — GraphRAG обработает только новые.

Визуализация графа

После индексации в output/artifacts/ лежат паркеты со списком сущностей, связей и сообществ. Их можно загрузить в Neo4j или NetworkX для визуализации:

import pandas as pd
import networkx as nx

entities = pd.read_parquet(
    "output/artifacts/create_final_nodes.parquet"
)
G = nx.Graph()
for _, row in entities.iterrows():
    G.add_node(row["title"],
               type=row.get("type"),
               description=row.get("description"))
print(f"Граф: {G.number_of_nodes()} узлов")

Типы запросов: Local, Global, DRIFT

У GraphRAG три режима запросов. Разница не в API, а в том, какие данные идут в контекст LLM.

Local search — режим по умолчанию. Берёт сущности, ближайшие к запросу по косинусной близости эмбеддингов, их соседей по графу (1–2 шага), когерентные чанки исходных документов и сводки сообществ, в которые входят эти сущности. Итоговый контекст — смесь «сырых» данных из документов и уже обобщённых сводок. python -m graphrag query --root ./myproject --method local "Какой бюджет заложен на R&D в 2026?"

Global search — строится не на сущностях, а на сводках сообществ верхнего уровня. Берёт все сводки, сортирует по релевантности, составляет из них карту ответа, на которой LLM пишет финальный ответ. python -m graphrag query --root ./myproject --method global "Какие стратегические инициативы упоминаются в документах?"

DRIFT search — гибридный итеративный режим. Сначала ищет одну сущность по эмбеддингам, затем «распутывает» окрестности: оценивает, какие соседние сущности релевантны, расширяет контекст, задаёт follow-up вопросы LLM для поиска следующей порции данных. python -m graphrag query --root ./myproject --method drift "Проследи цепочку принятия решений в этом наборе контрактов"

На практике: local — 98% задач, global — аналитические обзоры и executive summaries, DRIFT — исследовательские и аудиторские сценарии. В официальном репозитории есть примеры для каждого режима.

LightRAG vs GraphRAG: что выбрать

LightRAG (37.4K звезд на GitHub, EMNLP 2025) от HKU — прямой конкурент GraphRAG. Обе системы строят граф из текста, но с разной философией.

LightRAG легче: ставится одной строкой pip install lightrag-hku, индексация на 50 документов занимает 2–3 минуты против 10–20 у GraphRAG. Вместо community detection и четырёхуровневого summarization LightRAG строит плоский граф и использует гибридный поиск (entity-level + chunk-level + graph traversal).

GraphRAG мощнее на глобальных аналитических запросах: его community summaries дают +30–70% точности на multi-source synthesis. LightRAG выигрывает на фактологических вопросах к конкретным документам и на операционной скорости.

КритерийGraphRAGLightRAG
GitHub звёзд34.2K37.4K
Время индексации (50 доков)10–20 мин2–3 мин
Глобальные аналитические запросыОтлично (+30–70%)Умеренно
Локальные фактологические вопросыХорошоОтлично
Community summarizationЕсть (4 уровня)Нет
LLM-расходы на индексациюВысокие (10–100 запросов на документ)Низкие (1–2 запроса на документ)
Production readinessПараллельные пайплайны, идемпотентностьБазовый API, меньше опций деплоя

Практический совет: Если у вас 50–200 документов и главное — фактологическая точность, берите LightRAG. Если документов тысячи и нужны аналитические обобщения — GraphRAG. Оптимальная связка 2026 года: LightRAG для оперативных ответов + GraphRAG для периодических аналитических обзоров.

Продакшен-развёртывание

GraphRAG можно развернуть через REST API. Встроенного сервера нет, но community собрала несколько обёрток.

GraphRAG-Server (community, ~1K звезд) — FastAPI-приложение с эндпоинтами /query/local, /query/global, /query/drift. Запускается через docker compose up, монтирует директорию с индексом.

Nano-GraphRAG (3.9K звезд, gusye1234/nano-graphrag) — минимальная реализация GraphRAG в 500 строках кода. Без паркетов, без сложного пайплайна, без Azure-зависимостей. Идеально, если надо понять, как работает графовый RAG, или встроить его в существующий Python-проект без установки гигантского фреймворка.

Для большого объёма данных — Microsoft рекомендует Apache Spark для распределённой индексации и параллельной обработки. Конфиг settings.yaml поддерживает encoding_model: claude-3-haiku, gpt-4o-mini или любую другую модель через OpenAI API.

# Развёртывание через Docker
git clone https://github.com/Azure-Samples/graphrag-accelerator
cd graphrag-accelerator
docker compose up -d

# API будет доступен на порту 8080
curl -X POST http://localhost:8080/query \
  -H "Content-Type: application/json" \
  -d '{"query": "Какие риски упоминаются в контрактах?",
       "mode": "global"}'

Azure AI Foundry включает GraphRAG как managed service — предварительно просмотренные шаблоны, обновление знаний по расписанию, мониторинг через Azure Monitor. Для продакшна на Azure это самый простой путь.

Коротко

GraphRAG — это не очередная библиотека для RAG. Это другой подход к извлечению знаний: не «похожий текст», а «связанные сущности». На сложных аналитических запросах он даёт +30–70% к точности, но платить за это приходится временем и LLM-токенами на индексацию.

Главное, что надо запомнить: GraphRAG не заменяет классический RAG — он расширяет его. Для фактологических вопросов из одного документа достаточно обычного векторного поиска. Для вопросов, ответ на которые размазан по сотне документов и требует синтеза, — нужен граф.

Nano-GraphRAG (3.9K звезд) — лучшая точка входа, если вы хотите попробовать подход за вечер. Полный Microsoft GraphRAG — если вам нужен production-grade пайплайн на тысячах документов.

Что ещё важно знать

GraphRAG работает только с английским?

Нет. GraphRAG использует LLM для извлечения сущностей — если ваша модель понимает русский, граф будет строиться по-русски. Эмбеддинги должны быть мультиязычными (nomic-embed-text-v1.5, intfloat/multilingual-e5-large).

Сколько стоит индексация 1000 документов через OpenAI?

Оценка на GPT-4o-mini: примерно 500–2000 токенов на документ в одну сторону (извлечение сущностей + сводки). На 1000 документов примерно $5–20. Global search по 1000 документам — ещё примерно $1–2 за запрос, так как надо обработать сотни community summaries. На локальных моделях затраты нулевые.

Как добавить новые документы в уже проиндексированную коллекцию?

Положить файлы в input/ и запустить graphrag index --root ./myproject. Индексатор идемпотентен — переиндексирует только новые файлы. Потом можно перезапустить community detection на полном графе.

GraphRAG подходит для RAG-чата с поддержкой?

Избыточен. Для support-бота хватает классического RAG с reranking. GraphRAG оправдан, когда надо анализировать сотни документов и находить неочевидные связи — например, аудит контрактов, due diligence, анализ патентов.

Какой LLM лучше всего использовать с GraphRAG?

Для извлечения сущностей — GPT-4o-mini или Claude 3 Haiku (достаточно умны, чтобы точно выделять сущности, и недороги). Для community summarization — GPT-4o или Claude 3.5 Sonnet (нужна лучшая генерализация). Для запросов — любая современная модель; Microsoft рекомендует GPT-4o.