GraphRAG

GraphRAG — вариант RAG, где вместо изолированных чанков строится граф знаний: сущности и связи между ними. Незаменим для multi-hop / global вопросов («какие основные темы во всём архиве?», «как связаны X и Y из разных документов?»), где обычный векторный поиск бессилен.

Суть

Обычный RAG ищет похожие фрагменты независимо — он не «видит» связи между фактами из разных документов. GraphRAG извлекает из документов сущности и отношения, строит граф, и отвечает, проходя по связям (multi-hop).

Зачем это нужно

Векторный поиск отвечает на локальные вопросы («что сказано про вклад X»), но проваливает глобальные и составные: чтобы связать факт из документа A с фактом из документа D, нужен явный граф связей, а не топ-K похожих чанков.

Как работает

  • Индексация: LLM извлекает сущности + связи → строится Knowledge Graph (отдельная структура поверх/вместо векторного индекса).
  • Запрос: обход графа по связям вместо поиска ближайших соседей; Comprehensiveness на global-вопросах +72-83%.
  • Цена: граф — это отдельная база поверх векторной, формируется дополнительно → стоимость памяти/индексации примерно ×2. Поэтому только для multi-hop / global, не для простых запросов.
  • Семейство графовых/иерархических техник:
    • NodeRAG (HF Papers 2025) — гетерогенный граф, превосходит GraphRAG и LightRAG по скорости индексации, времени запроса и качеству multi-hop QA.
    • RAPTOR — иерархическая кластеризация + суммаризация документов для вопросов верхнего уровня (долгая обработка, плохо масштабируется).
    • TreeRAG (ACL 2025, RAGFlow) — двухуровневый Search (точный recall) + Retrieve (сборка контекста через дерево).
  • Коробочно доступен в RAGFlow и Dify без ручной реализации.

Пример

Ключевой шаг индексации, отличающий GraphRAG от векторного RAG: LLM извлекает из текста сущности и связи, из которых строится граф знаний (здесь — упрощённо, для полного GraphRAG нужен Neo4j).

def extract_entities(text, title):
    prompt = f'''Извлеки сущности и их связи. Формат JSON:
[{{"entity": "название", "type": "тип", "relations": ["связанная_сущность"]}}]
Текст ({title}): {text[:400]}
JSON:'''
    raw = llm.invoke(prompt).content.strip()
    return json.loads(raw)                      # -> узлы и рёбра графа знаний

Связано с

  • RAG — GraphRAG = архитектура retrieval для связанных данных
  • Chunking — альтернатива «нарезке на чанки» для глобальных вопросов
  • Agentic RAG — обе техники из «Enterprise»-фазы дорожной карты RAG

Открытые вопросы

  • окупается ли ×2 стоимость графа на реальном корпусе среднего размера
  • GraphRAG vs NodeRAG на практике (скорость индексации / качество)