Chico Notes
研究与调研

GraphRAG 什么时候有价值,什么时候只是复杂化系统

从查询类型、关系密度、更新频率、索引成本和可观测性出发,判断 GraphRAG 何时值得引入,并给出适配 MySQL + Elasticsearch 的渐进式生产架构。

持续修订的工程笔记

证据快照:本文复核时间为 2026-08-07。Microsoft GraphRAG 的最新正式 Release 仍是 v3.1.0(2026-05-28);main 分支的 CHANGELOG.md 已列出 3.1.1 patch,但这不等同于已发布版本。官方仓库同时明确提醒:项目代码是方法演示,不是正式支持的 Microsoft 产品,完整索引可能成本很高,应从小规模语料开始。生产部署必须锁定 Release 或 Commit,并保存配置、Prompt 与索引版本。[1][2]

GraphRAG 的渐进式检索管线:普通检索只在必要位置分叉为关系图,并权衡质量收益与系统复杂度

图 1:GraphRAG 不应替代整个检索系统。更稳妥的做法是保留 Hybrid Search 基线,只在关系结构能够提供增量证据时进入受控图扩展。

摘要

GraphRAG 的价值不在于“把向量库换成图数据库”,而在于为跨文档关系、多跳证据、实体调查和全局主题总结提供结构化检索入口。若主要问题都是局部事实问答,语料更新频繁、实体关系稀疏,或者团队还没有可靠的 Hybrid Search 与评测体系,GraphRAG 往往只会增加抽取、消歧、更新、权限和评测成本。更稳妥的路线是先建立 BM25 + 向量 + Reranker 基线,再按查询类型逐步加入关系投影、图扩展和社区摘要。

读者将学到什么

读完本文,你应该能回答:

  1. “GraphRAG”到底指 Microsoft GraphRAG、知识图谱问答,还是泛化的图增强检索。
  2. 哪些问题天然需要图,哪些问题 Hybrid Search 已经足够。
  3. GraphRAG 的索引成本、查询成本和维护复杂度来自哪里。
  4. 为什么 GraphRAG 不等于必须引入 Neo4j 或其他图数据库。
  5. 如何在 MySQL + Elasticsearch 架构里渐进增加关系检索,而不是推倒重来。
  6. 怎样评估图构建、图检索和最终回答,避免被漂亮的网络图误导。

研究更新:2026 年的证据不支持“有图就更强”

ICLR 2026 论文 When to use Graphs in RAG 的出发点很直接:已有 GraphRAG 方法在不少真实任务上会低于普通 RAG,因此不能把图结构当作默认升级路径。该工作将任务拆成事实检索、复杂推理、上下文总结和创意生成,并把评测贯穿图构建、知识检索与最终生成。[20]

这给生产系统一个比“是否采用 GraphRAG”更有用的决策式:

GraphRAG Value
=
Query Type
× Baseline Failure Stage
× Incremental Evidence Gain
× Business Value
- Index / Update / Governance Cost

其中任何一项没有被测量,结论都容易失真:

  • 事实问题上,普通 BM25 + Dense + Reranker 可能更直接;
  • 多跳与全局问题上,图可能提高证据覆盖;
  • 图扩展找到更多候选,不代表这些候选最终进入 Context;
  • Answer 提升若来自更大的 Token Budget,也不能全部归功于图;
  • 图质量、增量更新、ACL 和删除传播的成本必须进入总账。

另一个重要反例来自 ICLR 2026 的 LinearRAG。它认为显式关系抽取往往昂贵且不稳定,因此使用 Passage、Sentence、Entity 组成的 Relation-free Tri-Graph,通过轻量实体抽取和语义链接获得结构收益。[21]

这并不证明 LinearRAG 适合所有系统,而是说明:

图的价值来自可控的结构化访问路径,不一定来自大量由 LLM 自动命名的关系边。


1. 先给结论:图不是目标,跨证据推理才是目标

引入 GraphRAG 前,应该先问:

当前失败是否真的由“关系结构缺失”造成?

如果答案错误的主要原因是:

  • 文档没有进入索引;
  • 中文分词或字段权重不合理;
  • Embedding 不适合领域;
  • 权限过滤过严;
  • Reranker 把正确 Chunk 排掉;
  • Context Builder 截断关键证据;
  • 模型没有按引用回答;

那么增加图通常不会解决根因,只会在现有检索链路之外再增加一套失败链路。

GraphRAG 更适合下面几类问题:

答案分散在多个文档或多个 Chunk

这些证据通过实体、事件、时间、因果或业务关系相连

普通相似度检索很难一次找到完整证据集合

例如:

  • 某个角色的行为如何影响了后续三个事件;
  • 多份会议纪要中,某项决策经历了哪些人和哪些版本;
  • 一批新闻报道中有哪些主要主题、组织和关联事件;
  • 某个风险从供应商、产品、地区传播到客户的完整路径;
  • 一个技术方案在不同文档中被哪些组件依赖、替代或否决。

而下面这些问题通常不需要 GraphRAG:

  • “退款期限是多少天?”
  • “某个接口的请求字段是什么?”
  • “第 12 集某句台词是什么?”
  • “这个订单当前状态是什么?”
  • “文档中是否出现过关键词 X?”

它们的答案局部、明确,最适合 BM25、向量检索、结构化查询或直接读取权威数据库。


2. 三种不同的 GraphRAG 不要混为一谈

“GraphRAG”在工程讨论中至少指三类系统。

2.1 从非结构化文本自动抽图

代表是 Microsoft GraphRAG:

文档
→ Chunk / TextUnit
→ LLM 抽取实体与关系
→ 合并实体和关系
→ 社区发现
→ 社区摘要
→ Local / Global / DRIFT Query

它的核心贡献是把一批叙事文本组织成实体图和层次化社区摘要,尤其服务于:

  • 全局主题与趋势;
  • 跨文档实体关系;
  • 从高层社区逐步下钻到局部事实。

2.2 在已有权威知识图谱上做 RAG

例如企业已有:

商品 → 属于 → 品类
订单 → 由用户创建 → 用户
角色 → 出现在 → 场景
服务 → 依赖 → 数据库
法规 → 约束 → 业务动作

这些关系不是 LLM 猜出来的,而是来自业务表、代码分析、人工维护或标准数据源。此时图是业务事实的一部分,GraphRAG 主要负责:

  • 图路径检索;
  • 多跳扩展;
  • 将结构化路径转成模型上下文;
  • 与原始文本证据联合回答。

这类场景通常比“全自动从文本抽图”更可靠,因为关系有明确语义、版本和所有者。

2.3 图只是检索时的辅助结构

还可以不建设完整知识图谱,只做:

  • Chunk—Entity 二部图;
  • Chunk 相邻关系;
  • 文档引用关系;
  • 父子章节树;
  • 事件时间线;
  • 基于共现或链接构建的轻量图。

KG²RAG 的思路就是先用语义检索找到 Seed Chunks,再用知识图谱关系扩展并组织上下文;RAPTOR 则用递归聚类和摘要树解决不同抽象层级的检索问题。[10][11]

这类“图增强 Hybrid Search”往往是生产系统最合理的第一步。

2.4 Relation-free Graph:不可靠的关系可以不抽

当系统无法稳定回答“边的类型、方向和证据是什么”时,继续增加关系抽取 Prompt 往往只会放大噪声。LinearRAG 采用另一条路线:保留 Passage—Sentence—Entity 的包含与提及结构,不强制生成 CAUSESRELATED_TO 等显式语义关系,再用实体激活和全局重要性聚合检索 Passage。[21]

它适合提醒我们区分两类边:

可验证结构边
  CONTAINS / MENTIONS / CITES / NEXT / PARENT

模型推断语义边
  CAUSES / SUPPORTS / OPPOSES / INFLUENCES

前一类通常来自文档结构、业务数据或确定性解析;后一类需要更严格的 Evidence Span、置信度、版本和人工校验。生产系统可以先从前一类开始,而不是把“能抽关系”当作上线前提。


3. Microsoft GraphRAG 实际做了什么

Microsoft 官方文档把 GraphRAG 定义为一种结构化、层次化的 RAG 方法。默认索引链路包括:加载文档、分块、抽取实体和关系、可选抽取 Claim、生成 Embedding、运行 Leiden 社区发现并生成社区报告。[3][4]

3.1 默认输出不是一个图数据库

这是非常重要的工程事实。

Microsoft GraphRAG 当前默认把知识模型写成一组表,默认落盘格式是 Parquet,包括:

communities
community_reports
covariates
 documents
entities
relationships
text_units

relationships 表本身就是图的边表;entities 是节点表;communities 保存层次化社区。官方文档把知识模型定义为底层存储技术之上的抽象,并支持自定义 Storage、Vector Store 和工作流。[4][5]

因此:

使用 GraphRAG 不等于必须先部署图数据库。

对中小规模系统,可以先用:

  • MySQL / PostgreSQL 保存实体、关系和证据;
  • Elasticsearch 保存文本与向量检索投影;
  • 内存邻接表或离线 DataFrame 做图算法;
  • 只有当在线多跳遍历、图分析和高并发 Cypher 查询成为真实需求时,再引入专用图数据库。

3.2 四种查询模式解决不同问题

官方查询引擎目前提供:

模式主要上下文适合问题主要代价
BasicTop K 文本 Chunk局部事实、基线比较最低
Local实体、关系、相关 TextUnit特定实体与邻居中等
Global全部或筛选后的社区报告,Map-Reduce全局主题、趋势、整体理解
DRIFT社区 Primer + 迭代 Local Follow-up同时需要广度和细节较高且链路更复杂

Global Search 会从指定社区层级读取社区报告,先生成多个带评分的中间答案,再聚合为最终回答。社区层级越细,信息通常越充分,但参与 Map 阶段的报告更多,延迟和 Token 消耗也会增加。[6]

DRIFT 则先利用社区信息形成 Primer 和后续问题,再迭代运行局部搜索。Microsoft 的公开实验报告称,在其 5,000 多篇新闻文章和 50 个 Local Questions 上,DRIFT 相对 Local Search 在回答全面性与多样性上取得更高的 LLM-Judge 胜率;这些数字是特定数据、模型和评测方法下的结果,不应直接当成其他语料的 SLA。[7]


4. GraphRAG 真正有价值的五类场景

4.1 全局 Sensemaking:问题没有一个可直接命中的 Chunk

典型问题:

这批文档的主要主题是什么?
过去一年出现了哪些共同风险?
不同团队对同一技术路线的态度如何变化?
整个剧情里哪些关系推动了核心冲突?

这类问题不是“检索最相似段落”,而是 Query-Focused Summarization:答案需要覆盖语料的较大部分。

Microsoft GraphRAG 原始论文的主要实验价值就在这里。论文在两个约百万 Token 的语料上,用全局 Sensemaking 问题比较 GraphRAG 与传统 Vector RAG,报告了更高的全面性和多样性。[8]

注意它证明的是:

特定全局问题
+ 特定语料
+ 特定模型
+ 特定 LLM Judge 指标

而不是“所有问答都应该使用 GraphRAG”。

4.2 多跳问题:完整答案依赖多个关系边

例如:

角色 A 通过哪些事件间接影响角色 D?
某个故障如何从上游服务传导到最终用户?
哪个决策先改变了接口,再引发数据结构和成本变化?

Vector Search 能分别找到若干相似 Chunk,但不一定知道:

A --参与--> 事件 B
事件 B --导致--> 决策 C
决策 C --影响--> 系统 D

当路径本身就是答案的一部分时,图检索可以:

  1. 用实体或 Seed Chunk 锚定起点;
  2. 按允许的关系类型扩展 1–3 跳;
  3. 找到路径上的来源 Chunk;
  4. 对路径证据做 Rerank;
  5. 将路径和原文一起交给模型。

HippoRAG、GNN-RAG 和 KG²RAG 都展示了图结构在多跳问答中的潜力,但它们的图构建方式、数据集和推理机制不同,不能只比较论文中的最终百分比。[9][10][12]

4.3 实体调查:需要从一个对象扩展到邻居和事件

典型问题:

这个供应商和哪些事故、地区和产品有关?
这个人物与哪些组织、事件和争议相连?
这个服务依赖哪些组件,过去有哪些故障记录?

这类问题通常从一个实体出发,逐步扩展:

Entity
→ Direct Relations
→ Related Events
→ Supporting Chunks
→ Timeline / Summary

Local Search 或轻量图扩展比全局 Map-Reduce 更合适。

4.4 关系本身是业务资产

当关系由业务系统直接产生时,图的收益通常高于 LLM 自动抽取图。

例如你的知识与内容系统中,可以有:

Character --APPEARS_IN--> Scene
Scene --USES_ASSET--> Asset
Episode --CONTAINS--> Scene
Topic --DISCUSSED_IN--> DanmakuWindow
Knowledge --REVISION_OF--> Knowledge

如果这些关系已经由 MySQL、任务链路或人工编辑确认,那么它们可以成为稳定的 Graph Projection。此时图不仅服务于问答,也可以支持:

  • 影响分析;
  • 内容导航;
  • 数据校验;
  • 推荐;
  • 调试和治理。

4.5 查询会反复发生,索引成本可以摊销

完整 GraphRAG 在索引阶段需要多轮 LLM 调用:抽实体、抽关系、合并描述、生成社区报告和 Embedding。官方仓库直接提醒,GraphRAG Indexing 可能很昂贵,应从小规模开始。[1]

如果语料只会被问一次,直接 Long Context 或 Map-Reduce 可能更简单。

如果同一稳定语料会被持续查询数千次,预先构建社区摘要与关系索引才可能摊薄成本。

可以用一个简单判断:

总成本 = 初始索引成本
       + 增量维护成本
       + 查询成本 × 查询量
       + 评测与运维成本

不要只比较单次 Query Token。


5. 什么时候 GraphRAG 只是复杂化系统

5.1 主要是局部事实问答

如果绝大多数高价值问题都能由一个或两个 Chunk 回答,优先优化:

BM25
Dense Retrieval
RRF
Reranker
Metadata Filter
Parent Context
Citation

图扩展反而可能加入大量相关但不必要的邻居,降低 Context Precision。

5.2 语料规模不大,完整上下文仍然可控

对于少量文档、几十次对话或一个较短项目,Long Context、完整 Rerank 或树状摘要可能更简单。

RAPTOR 通过聚类与递归摘要构建树,不需要实体关系抽取;如果主要需求是“在长文档不同抽象层级上回答”,它可能比完整实体图更匹配。[11]

5.3 关系稀疏、模糊或很难定义

GraphRAG 需要有意义的节点和边。

如果文档中的关系主要是:

“提到过”
“可能相关”
“语义相似”

那么图很容易退化为一个昂贵的共现网络。

一个高质量图至少应该回答:

这条边是什么类型?
方向是什么?
来源在哪里?
何时有效?
置信度是多少?
是否可以撤销或覆盖?

5.4 语料更新极快,社区摘要很快过期

频繁变化会带来:

  • 实体描述需要重新合并;
  • 关系需要新增、删除和改写;
  • 社区结构可能改变;
  • 上层社区报告需要重新生成;
  • 旧引用需要失效;
  • 权限和删除必须传播到摘要。

Microsoft GraphRAG 已提供 updatestandard-updatefast-update 等增量入口,输出表中也保留 periodsize 等用于更新合并的字段。[5][13]

但“支持增量命令”不等于增量语义天然简单。社区合并、实体消歧和摘要失效仍然需要业务验证。

5.5 没有 Query Router,所有问题都走最贵路径

这是常见反模式:

用户问任何问题
→ Global Search
→ 所有社区报告 Map-Reduce

结果是简单事实也承担全局检索成本。

正确做法是按 Query 类型选择 Basic、Local、Global、DRIFT 或结构化查询。

5.6 没有图质量评测

如果团队只看最终回答,不测:

  • 实体抽取 Precision / Recall;
  • 实体合并错误;
  • 关系类型和方向;
  • Evidence Path Recall;
  • 社区摘要覆盖;
  • 图扩展带来的新增有效证据;

那么图的错误会被隐藏在生成答案里。

两类 GraphRAG Benchmark 都把评测拆到图构建、知识检索和答案生成等阶段,原因相同:最终答案分数无法说明问题出在哪一层,也无法判断图究竟增加了证据还是增加了噪声。[14][20]

5.7 团队把“有图”误当成“有因果”

LLM 从文本抽出的:

A --RELATED_TO--> B

不自动等于:

A 导致 B

共现、引用、时间邻近和因果关系必须分开。图只能表达被抽取和建模的关系,不能凭结构本身创造事实。


6. GraphRAG 的复杂度账单

6.1 索引成本

完整索引通常包含:

文档解析与分块
实体抽取
关系抽取
Claim 抽取(可选)
实体与关系描述合并
社区发现
社区报告生成
多类 Embedding
索引写入

其中最昂贵的部分通常不是 Leiden 聚类,而是遍历语料的 LLM 抽取和摘要。

但这笔成本不是所有“图增强检索”的必选项。若只构建文档结构边、Chunk—Entity 二部图或 Relation-free Graph,可以避免大规模 LLM 关系抽取和社区摘要;代价是系统不再拥有同样丰富的显式语义边,需要在 Query 时依靠实体激活、语义链接和原文证据完成推理。[21]

Microsoft 官方还建议按领域调优 Prompt。Auto-Tuning 可以从样本数据生成领域 Persona、实体类型和 Few-shot Prompt,但这依然需要端到端 Query 评测,不能用“抽出了更多节点”代替质量验证。[15]

6.2 查询成本

  • Basic Search 接近普通 Vector RAG;
  • Local Search 需要实体映射、关系扩展和多类上下文;
  • Global Search 需要多个 Map 调用和一次 Reduce;
  • DRIFT 还会生成 Follow-up 并迭代检索。

因此应分别记录:

query_route
community_reports_read
map_call_count
follow_up_count
graph_nodes_visited
graph_edges_visited
source_chunks_selected
input_tokens
output_tokens
latency_ms
estimated_cost

6.3 数据维护成本

需要处理:

  • Entity Resolution;
  • Alias 和同名实体;
  • 关系版本与有效期;
  • 删除传播;
  • 文档 Revision;
  • 社区重算;
  • 多租户 ACL;
  • 图与文本索引的一致性;
  • Prompt 和模型升级后的 Reindex。

6.4 组织成本

GraphRAG 往往要求搜索、数据、领域和应用团队共同定义:

什么是实体
什么是关系
哪些关系可信
哪些查询值得走图
哪些错误不可接受

没有领域所有者时,图 Schema 很容易变成由 Prompt 偶然决定的输出。


7. 推荐的生产架构:图是派生索引,不是唯一真相

对于你当前的 MySQL + Elasticsearch RAG 系统,更稳妥的架构是:

7.1 MySQL 保存稳定事实

推荐至少有:

entity
entity_alias
relation
relation_evidence
chunk_entity
community
community_member
community_report
projection_version

关系记录不要只保存自然语言描述:

CREATE TABLE relation (
    relation_id        VARCHAR(64) PRIMARY KEY,
    tenant_id          VARCHAR(64) NOT NULL,
    source_entity_id   VARCHAR(64) NOT NULL,
    relation_type      VARCHAR(64) NOT NULL,
    target_entity_id   VARCHAR(64) NOT NULL,
    direction          VARCHAR(16) NOT NULL,
    confidence         DECIMAL(5,4),
    valid_from         DATETIME(6),
    valid_to           DATETIME(6),
    status             VARCHAR(32) NOT NULL,
    source_kind        VARCHAR(32) NOT NULL,
    model_version      VARCHAR(128),
    prompt_version     VARCHAR(64),
    revision           BIGINT NOT NULL,
    created_at         DATETIME(6) NOT NULL,
    updated_at         DATETIME(6) NOT NULL,
    INDEX idx_source_type (tenant_id, source_entity_id, relation_type),
    INDEX idx_target_type (tenant_id, target_entity_id, relation_type)
);

证据单独保存:

CREATE TABLE relation_evidence (
    relation_id        VARCHAR(64) NOT NULL,
    chunk_id           VARCHAR(64) NOT NULL,
    document_revision  BIGINT NOT NULL,
    evidence_start     INT,
    evidence_end       INT,
    evidence_hash      CHAR(64) NOT NULL,
    PRIMARY KEY (relation_id, chunk_id, document_revision)
);

这样每条边都能回到原始 Chunk,而不是只剩一句 LLM 摘要。

7.2 Elasticsearch 继续承担第一阶段检索

ES 文档中可以保存稳定引用:

{
  "chunk_id": "chunk_0184",
  "document_id": "doc_42",
  "entity_ids": ["character:qixia", "event:echo_theory"],
  "relation_target_ids": [
    "character:qixia",
    "scene:scene_203",
    "concept:echo_theory"
  ],
  "relation_types": [
    "PROPOSED",
    "APPEARS_IN",
    "RELATED_TO"
  ]
}

这使你可以先做:

BM25 + kNN
→ Seed Chunks
→ Seed Entities
→ 受控图扩展
→ 扩展 Chunk 回查
→ Rerank

而不是让所有查询先进入图数据库。

7.3 Community Summary 作为派生内容

社区报告应保存:

community_id
community_version
member_entity_ids
source_chunk_ids
summary
findings
model_version
prompt_version
generated_at
stale_after

它不是业务事实,而是可重建的 LLM 派生物。删除底层文档或改变成员关系时,应标记为 Stale 并异步重建。


8. Query Router:决定是否值得走图

Router 不一定一开始就用 LLM。可以先用规则和轻量分类器:

Global Signals:
  “整体”“主要主题”“趋势”“共同模式”“所有文档”


Entity / Path Signals:
  “与谁相关”“如何影响”“通过什么路径”“依赖关系”


Comparison Signals:
  “A 和 B 有何异同”“不同团队”“多个事件”


Exact Signals:
  明确 ID、日期、字段、接口名、状态查询

Router 本身也要评测:

route_accuracy
route_confusion_matrix
quality_by_route
cost_by_route
fallback_rate

9. 最小实现:先做 Graph-Assisted Retrieval

下面的 Python 示例不是完整 GraphRAG,而是更适合现有系统的最小增量:以 ES Hybrid Search 为 Seed,按关系类型扩展少量邻居,再统一 Rerank。

from __future__ import annotations


from dataclasses import dataclass
from typing import Protocol


@dataclass(frozen=True)
class Chunk:
    chunk_id: str
    document_id: str
    text: str
    entity_ids: tuple[str, ...]
    score: float
    source: str


@dataclass(frozen=True)
class Edge:
    source_id: str
    relation_type: str
    target_id: str
    confidence: float
    evidence_chunk_ids: tuple[str, ...]


class SearchIndex(Protocol):
    def hybrid_search(
        self,
        query: str,
        *,
        tenant_id: str,
        limit: int,
    ) -> list[Chunk]: ...


    def get_chunks(
        self,
        chunk_ids: list[str],
        *,
        tenant_id: str,
    ) -> list[Chunk]: ...


class GraphStore(Protocol):
    def expand(
        self,
        entity_ids: set[str],
        *,
        tenant_id: str,
        relation_types: set[str],
        max_hops: int,
        max_edges: int,
        min_confidence: float,
    ) -> list[Edge]: ...


class Reranker(Protocol):
    def rank(
        self,
        query: str,
        chunks: list[Chunk],
        *,
        limit: int,
    ) -> list[Chunk]: ...


def graph_assisted_retrieve(
    query: str,
    *,
    tenant_id: str,
    search: SearchIndex,
    graph: GraphStore,
    reranker: Reranker,
) -> list[Chunk]:
    # 1. 普通 Hybrid Search 仍然是第一入口。
    seeds = search.hybrid_search(
        query,
        tenant_id=tenant_id,
        limit=30,
    )


    seed_entities = {
        entity_id
        for chunk in seeds[:10]
        for entity_id in chunk.entity_ids
    }


    # 2. 只允许业务认可的关系,并限制跳数和边数。
    edges = graph.expand(
        seed_entities,
        tenant_id=tenant_id,
        relation_types={
            "APPEARS_IN",
            "CAUSES",
            "DEPENDS_ON",
            "DECIDED_BY",
            "REVISION_OF",
        },
        max_hops=2,
        max_edges=80,
        min_confidence=0.75,
    )


    evidence_chunk_ids = {
        chunk_id
        for edge in edges
        for chunk_id in edge.evidence_chunk_ids
    }


    expanded = search.get_chunks(
        sorted(evidence_chunk_ids),
        tenant_id=tenant_id,
    )


    # 3. 合并去重后统一交给同一个 Reranker。
    merged: dict[str, Chunk] = {
        chunk.chunk_id: chunk for chunk in seeds
    }
    for chunk in expanded:
        merged.setdefault(chunk.chunk_id, chunk)


    return reranker.rank(
        query,
        list(merged.values()),
        limit=12,
    )

生产实现还需要:

  • ACL 必须在 Seed Search 和 Graph Expansion 两边同时生效;
  • 每条扩展边保存 Evidence Chunk;
  • 图扩展不能跨 Tenant;
  • 限制 Hub Node;
  • 记录每个新增 Chunk 是由哪条路径引入;
  • 对旧 Revision 和失效关系做过滤;
  • 图服务失败时回退 Basic Hybrid Search。

10. 图检索中的几个关键算法问题

10.1 Entity Resolution 比关系抽取更难

同一个实体可能写成:

Chico
Chico Gong
Gong Haoran
作者

不同实体也可能同名。

错误合并会制造不存在的关系;错误拆分会让路径断裂。

需要记录:

canonical_entity_id
alias
resolution_method
resolution_score
source_document
manual_override
model_version

对高影响实体,允许人工合并和拆分。

10.2 Hub Explosion

“公司”“系统”“用户”“北京”之类高频实体可能连接数千条边。无约束 BFS 会迅速把整个语料带进 Context。

常见控制方式:

  • 按关系类型白名单;
  • 限制最大 Degree;
  • 对高 Degree 节点降权;
  • 限制每跳 Edge Budget;
  • 按 Query 与 Edge Description 相关性筛选;
  • 使用 Personalized PageRank;
  • 在扩展后再次 Rerank。

10.3 Community Detection 不是固定真相

Leiden 社区取决于:

  • 节点和边是否正确;
  • Edge Weight;
  • Resolution 参数;
  • 当前语料快照;
  • 增量合并策略。

社区适合做索引与导航,但不要把社区边界解释成绝对业务分类。

10.4 摘要会丢信息

社区报告是压缩层。它可能:

  • 忽略低频但关键事实;
  • 合并冲突观点;
  • 抹平时间变化;
  • 产生没有直接证据的概括;
  • 在底层文档删除后仍残留信息。

因此最终答案必须保留从:

Claim
→ Community Finding
→ Entity / Relation
→ TextUnit
→ Document Revision

的可追溯路径。


11. 如何评测 GraphRAG

不要只测最终 Answer Correctness。

11.1 图构建质量

entity_precision
entity_recall
entity_resolution_precision
relation_precision
relation_recall
relation_type_accuracy
relation_direction_accuracy
evidence_alignment_rate
phantom_entity_rate
orphan_relation_rate

11.2 图检索质量

seed_hit@K
evidence_path_recall@K
required_entity_coverage
required_relation_coverage
path_precision
hop_count
graph_expansion_gain
graph_expansion_noise
hub_candidate_ratio

Graph 的价值应按“相对基线新增了什么”计算,而不是只看图检索自己的 Recall:

incremental_graph_recall =
图扩展新找到的 Gold Evidence
/ Baseline 未找到的 Gold Evidence

当 Baseline 已找全 Gold 时,该指标记为 N/A,而不是 0。它回答的是:图是否挽救了普通检索真正漏掉的证据。

同时观察新增候选的精度和噪声:

graph_candidate_precision =
图扩展新增的相关 Chunk
/ 图扩展新增的全部 Chunk

graph_expansion_noise =
图扩展新增的无关 Chunk
/ 图扩展新增的全部 Chunk

最终还要继续检查这些新增 Gold 是否保留到 Rerank 与 Context,而不是在后续阶段再次丢失。

11.3 社区摘要质量

community_fact_coverage
community_source_coverage
summary_faithfulness
conflict_preservation
temporal_consistency
stale_summary_rate

11.4 Query Route 质量

评测集要按类型分桶:

local fact
entity-centric
multi-hop
global theme
comparison
temporal evolution
no-answer
permission-sensitive

BenchmarkQED 将查询按 Data/Activity 和 Local/Global 两个维度划分,并强调不同检索方法各有适用查询类型;GraphRAG-Bench 则进一步评估图构建、检索和推理链路。[14][16]

11.5 最终答案与成本

answer_correctness
comprehensiveness
diversity
faithfulness
citation_precision
citation_recall
latency_p50 / p95
indexing_cost_per_1m_tokens
query_cost
reindex_cost

Microsoft 公开的 LazyGraphRAG 研究报告显示,在其特定实验里,LazyGraphRAG 以接近 Vector RAG 的索引成本获得较强的局部和全局问答表现,并显著降低 Full GraphRAG 的成本。[17]

这类结果值得参考,但仍应在自己的 Query Set、语料和模型上复现。


12. 生产环境常见失败模式

失败模式表现根因修复方向
幻觉关系图中出现原文没有的边LLM 抽取过度推断强制 Evidence Span;关系 Judge;置信阈值
实体误合并两个同名人物被合成一个只按名称归一上下文消歧;类型与时间约束;人工修正
实体过度拆分同一实体形成多个节点Alias 与指代没有统一Canonical ID;Alias 表;合并任务
Hub 爆炸Context 被高频实体占满无约束多跳扩展Degree 限制;关系白名单;PPR/Rerank
社区摘要过期回答引用已删除或旧版本事实增量更新未失效上层摘要Dependency DAG;Stale 标记;重建队列
权限泄漏用户通过关系看到无权访问内容ACL 只在 Chunk Search 生效图节点、边、证据和摘要统一 ACL
图路径正确但证据不足模型把结构当事实边没有原文证据Path + Source Chunk 联合提供
Global Search 太贵简单问题触发大量 Map 调用缺少 Query Router路由与预算;动态社区选择
图增加召回但降低答案引入太多相关邻居Graph Expansion Precision 低扩展后 Rerank;Edge Budget
更新后图和 ES 不一致路径指向旧 Chunk非原子 Projection 切换Projection Version + Alias 切换
图很好看但无业务提升只评节点数和可视化没有 Query-based Evaluation以失败 Query 和 Gold Evidence 为中心

13. 方案比较:不要默认选择最复杂的一档

方案最适合索引成本查询成本更新难度关系表达
BM25 + Dense + Rerank局部事实、一般知识问答
Parent / Neighbor Context长段落、连续上下文章节邻接
RAPTOR / 摘要树长文档、多层抽象树形层次
Relation-free Graph / LinearRAG大语料、多跳,但显式关系不可靠低到中包含、提及和语义链接
Graph-Assisted Hybrid实体与有限多跳显式边 + 原文
Microsoft GraphRAG Local实体调查LLM 抽取实体图
Microsoft GraphRAG Global全局主题与趋势社区层次与报告
DRIFT / Agentic Graph Search同时需要广度和深度迭代图与文本检索
权威 Knowledge Graph RAG稳定业务关系、合规查询取决于数据源中到高最强,语义明确
Long Context小语料或一次性分析隐式关系

LightRAG、HippoRAG、KET-RAG、LinearRAG 与 LazyGraphRAG 等路线都在尝试降低图构建或检索成本,说明“完整 LLM 抽图 + 全量社区摘要”并不是唯一 GraphRAG 形态。[9][17][18][19][21]


14. 推荐的渐进式落地路线

阶段 1:先证明问题存在

建立 100–300 条真实 Query Set,标记:

哪些是局部问题
哪些是实体问题
哪些是真正多跳
哪些是全局问题

先跑好 Hybrid Baseline。

阶段 2:只增加明确关系

优先接入:

  • 业务已有外键;
  • 人工维护关系;
  • 代码依赖;
  • 目录与章节;
  • 可靠的事件时间线。

不要一开始就让 LLM 自由发明关系类型。

阶段 3:Graph-Assisted Hybrid

只有当图扩展显著提升 Context Recall,并且 Expansion Noise 可控,才上线图辅助检索。

阶段 4:社区摘要

当“整体主题、趋势、跨文档归纳”是真实高价值需求时,再生成社区报告。

只有在固定 Local/Global Router 仍无法处理复杂问题时,才引入 DRIFT 或多轮图搜索;同时设置:

max_iterations
max_graph_edges
max_tool_calls
max_tokens
deadline

15. 决策清单

查询价值

  • 已量化需要跨 Chunk 或跨文档关系的高价值问题占比、失败成本和查询频率。
  • 已经收集到 Hybrid Search 明确失败的多跳或全局案例。
  • 图路径本身对用户有解释价值。
  • 同一语料会被重复查询,索引成本可以摊销。
  • 不是为了展示可视化网络图而建设图。

数据条件

  • 有稳定实体 ID 或可接受的 Entity Resolution 方案。
  • 关系类型、方向和证据可以定义。
  • 每条关系能追溯到 Source Chunk 或权威业务表。
  • 有 Revision、有效期和删除传播设计。
  • ACL 能作用到节点、边、摘要和证据。

检索与评测

  • 已有 BM25 + Dense + Reranker 基线。
  • 评测集按 Local、Multi-hop、Global 等 Query Type 分桶。
  • 分别测图构建、图检索、Context 和 Answer。
  • 保存图扩展前后的 Candidate Diff。
  • 能报告 Graph Expansion Gain 与 Noise。

成本与运维

  • 统计完整索引、增量更新和单次查询成本。
  • Community Summary 有 Stale 与重建机制。
  • 模型或 Prompt 升级可以触发版本化 Reindex。
  • 图服务失败时可以回退普通 Hybrid Search。
  • Projection Version 可以与 ES Alias 原子切换。

架构选择

  • 已确认是否真的需要专用图数据库。
  • 简单邻接查询能否先由 MySQL 或内存图完成。
  • 现有知识图谱能否直接 Bring Your Own Graph。
  • 全局问题能否先用摘要树或 LazyGraphRAG 类方法解决。
  • 没有把所有 Query 强制路由到 Global Search。

总结

GraphRAG 不是 Vector RAG 的下一代必选升级,而是一组针对特定失败模式的结构化检索方法。

它最有价值的场景是:

证据分散
关系明确
问题需要多跳或全局理解
语料相对稳定
查询会反复发生

它最容易复杂化系统的场景是:

问题主要是局部事实
关系稀疏或不可靠
语料高速更新
没有图质量评测
所有查询都走昂贵链路

对现有 MySQL + Elasticsearch 系统,推荐顺序是:

  1. 先把 Hybrid Search、Reranker、Context Trace 和评测集做扎实;
  2. 把稳定业务关系保存在 MySQL,并附原始证据;
  3. 从 Seed Chunk 做受控的 1–2 跳图扩展;
  4. 验证图扩展是否对 Baseline 漏掉的 Gold Evidence 产生可重复的增量召回;
  5. 只有全局问题足够重要时,才构建社区和社区摘要;
  6. 只有在线图遍历和图分析成为核心负载时,才引入专用图数据库。

最终的判断标准不是“图里有多少节点”,而是:

图是否让原本找不到的关键证据稳定进入上下文,并且它带来的质量收益大于索引、更新、权限和运维成本。


参考资料

  1. Microsoft, GraphRAG GitHub Repository and Releases
    https://github.com/microsoft/graphrag
    https://github.com/microsoft/graphrag/releases/tag/v3.1.0

  2. Microsoft, GraphRAG Changelog
    https://github.com/microsoft/graphrag/blob/main/CHANGELOG.md

  3. Microsoft, GraphRAG Documentation — Welcome and Query Overview
    https://microsoft.github.io/graphrag/
    https://microsoft.github.io/graphrag/query/overview/

  4. Microsoft, GraphRAG Indexing Architecture
    https://microsoft.github.io/graphrag/index/architecture/

  5. Microsoft, GraphRAG Output Schemas and Bring Your Own Graph
    https://microsoft.github.io/graphrag/index/outputs/
    https://microsoft.github.io/graphrag/index/byog/

  6. Microsoft, GraphRAG Global Search
    https://microsoft.github.io/graphrag/query/global_search/

  7. Microsoft Research, Introducing DRIFT Search
    https://www.microsoft.com/en-us/research/blog/introducing-drift-search-combining-global-and-local-search-methods-to-improve-quality-and-efficiency/

  8. Edge et al., From Local to Global: A Graph RAG Approach to Query-Focused Summarization
    https://arxiv.org/abs/2404.16130

  9. Gutiérrez et al., HippoRAG: Neurobiologically Inspired Long-Term Memory for Large Language Models
    https://arxiv.org/abs/2405.14831

  10. Zhu et al., Knowledge Graph-Guided Retrieval Augmented Generation (KG²RAG)
    https://arxiv.org/abs/2502.06864

  11. Sarthi et al., RAPTOR: Recursive Abstractive Processing for Tree-Organized Retrieval
    https://arxiv.org/abs/2401.18059

  12. Mavromatis and Karypis, GNN-RAG: Graph Neural Retrieval for Large Language Model Reasoning
    https://arxiv.org/abs/2405.20139

  13. Microsoft, GraphRAG CLI — Index and Update
    https://microsoft.github.io/graphrag/cli/

  14. Xiao et al., GraphRAG-Bench: Challenging Domain-Specific Reasoning for Evaluating Graph Retrieval-Augmented Generation
    https://arxiv.org/abs/2506.02404

  15. Microsoft Research, GraphRAG Auto-Tuning Provides Rapid Adaptation to New Domains
    https://www.microsoft.com/en-us/research/blog/graphrag-auto-tuning-provides-rapid-adaptation-to-new-domains/

  16. Microsoft Research, BenchmarkQED: Automated Benchmarking of RAG Systems
    https://www.microsoft.com/en-us/research/blog/benchmarkqed-automated-benchmarking-of-rag-systems/

  17. Microsoft Research, LazyGraphRAG: Setting a New Standard for Quality and Cost
    https://www.microsoft.com/en-us/research/blog/lazygraphrag-setting-a-new-standard-for-quality-and-cost/

  18. Guo et al., LightRAG: Simple and Fast Retrieval-Augmented Generation
    https://arxiv.org/abs/2410.05779

  19. Huang et al., KET-RAG: A Cost-Efficient Multi-Granular Indexing Framework for Graph-RAG
    https://arxiv.org/abs/2502.09304

  20. Xiang et al., When to use Graphs in RAG: A Comprehensive Analysis for Graph Retrieval-Augmented Generation(ICLR 2026)
    https://arxiv.org/abs/2506.05690
    https://iclr.cc/virtual/2026/poster/10007992

  21. Zhuang et al., LinearRAG: Linear Graph Retrieval Augmented Generation on Large-scale Corpora(ICLR 2026)
    https://arxiv.org/abs/2510.10114
    https://github.com/DEEP-PolyU/LinearRAG


图片清单

1. 原创封面图

  • 文件名:graphrag-value-vs-complexity-cover.svg
  • 比例:16
    (SVG viewBox 1600 × 900)
  • 用途:文章封面和社交分享图
  • Alt:普通检索管线在必要位置分叉为关系图,并通过天平表达质量收益与系统复杂度之间的权衡
  • 状态:图像模型用于探索视觉方向,正式封面转为无文字 SVG,以避免生成文字、数字或品牌标识进入技术文章
  • 生成提示词:
A refined editorial technology illustration about deciding when GraphRAG is valuable. A clean retrieval pipeline starts with documents and search, then selectively branches into an entity relationship graph and hierarchical communities only where needed. Show a visual balance between useful connected evidence on one side and operational complexity on the other, with precise nodes, paths, source documents, and subtle cost signals. Deep navy, warm white, restrained cyan and amber accents, modern technical magazine style, spacious 16:9 composition, no text, no letters, no numbers, no logos, no watermark.

2. Microsoft GraphRAG 基本索引流程

  • 文件名:graphrag-index-query-modes.mmd
  • 用途:解释从 TextUnit、实体关系、社区到四种查询模式的链路
  • Alt:Microsoft GraphRAG 的索引流程与 Basic、Local、Global、DRIFT 查询模式
  • 形式:正文第 3 节 Mermaid Flowchart

3. MySQL + Elasticsearch 渐进式 GraphRAG 架构

  • 文件名:graphrag-mysql-es-production-architecture.mmd
  • 用途:解释事实层、检索投影、图投影、Query Router 与可观测系统
  • Alt:以 MySQL 为事实源、Elasticsearch 和 Graph Projection 为可重建索引的生产架构
  • 形式:正文第 7 节 Mermaid Flowchart

4. Query Router 决策图

  • 文件名:graphrag-query-router-decision.mmd
  • 用途:根据结构化查询、全局主题、实体路径和多跳需求选择检索方式
  • Alt:在 SQL、Basic Hybrid、Local Graph、Global 和 DRIFT 之间选择的查询路由决策图
  • 形式:正文第 8 节 Mermaid Flowchart

5. GraphRAG 渐进式采用状态机

  • 文件名:graphrag-adoption-ladder.mmd
  • 用途:解释从 Hybrid Baseline 到关系投影、图辅助检索、社区摘要和 Agentic Search 的升级门槛
  • Alt:GraphRAG 从基础混合检索逐步升级或停止的采用状态机
  • 形式:正文第 14 节 Mermaid State Diagram

讨论

继续讨论这篇笔记

有问题、补充案例或不同观点,可以通过 GitHub Discussions 继续交流。

On this page

摘要读者将学到什么研究更新:2026 年的证据不支持“有图就更强”1. 先给结论:图不是目标,跨证据推理才是目标2. 三种不同的 GraphRAG 不要混为一谈2.1 从非结构化文本自动抽图2.2 在已有权威知识图谱上做 RAG2.3 图只是检索时的辅助结构2.4 Relation-free Graph:不可靠的关系可以不抽3. Microsoft GraphRAG 实际做了什么3.1 默认输出不是一个图数据库3.2 四种查询模式解决不同问题4. GraphRAG 真正有价值的五类场景4.1 全局 Sensemaking:问题没有一个可直接命中的 Chunk4.2 多跳问题:完整答案依赖多个关系边4.3 实体调查:需要从一个对象扩展到邻居和事件4.4 关系本身是业务资产4.5 查询会反复发生,索引成本可以摊销5. 什么时候 GraphRAG 只是复杂化系统5.1 主要是局部事实问答5.2 语料规模不大,完整上下文仍然可控5.3 关系稀疏、模糊或很难定义5.4 语料更新极快,社区摘要很快过期5.5 没有 Query Router,所有问题都走最贵路径5.6 没有图质量评测5.7 团队把“有图”误当成“有因果”6. GraphRAG 的复杂度账单6.1 索引成本6.2 查询成本6.3 数据维护成本6.4 组织成本7. 推荐的生产架构:图是派生索引,不是唯一真相7.1 MySQL 保存稳定事实7.2 Elasticsearch 继续承担第一阶段检索7.3 Community Summary 作为派生内容8. Query Router:决定是否值得走图9. 最小实现:先做 Graph-Assisted Retrieval10. 图检索中的几个关键算法问题10.1 Entity Resolution 比关系抽取更难10.2 Hub Explosion10.3 Community Detection 不是固定真相10.4 摘要会丢信息11. 如何评测 GraphRAG11.1 图构建质量11.2 图检索质量11.3 社区摘要质量11.4 Query Route 质量11.5 最终答案与成本12. 生产环境常见失败模式13. 方案比较:不要默认选择最复杂的一档14. 推荐的渐进式落地路线阶段 1:先证明问题存在阶段 2:只增加明确关系阶段 3:Graph-Assisted Hybrid阶段 4:社区摘要阶段 5:Agentic Graph Search15. 决策清单查询价值数据条件检索与评测成本与运维架构选择总结参考资料图片清单1. 原创封面图2. Microsoft GraphRAG 基本索引流程3. MySQL + Elasticsearch 渐进式 GraphRAG 架构4. Query Router 决策图5. GraphRAG 渐进式采用状态机