GraphRAG 是什么?什么时候需要知识图谱?

深入新技术对比约 5 分钟读完

一句话回答

GraphRAG 泛指用知识图谱增强检索的 RAG,最有代表性的是微软开源的 GraphRAG:建索引时用大模型从文档中抽取实体和关系构建图,再对图做社区划分,并为每个社区预先生成摘要。它擅长普通向量 RAG 处理不好的两类问题:需要全局理解的问题("这批文档的主要主题是什么"),和需要串起多个事实的多跳关系问题。代价是索引成本高、更新麻烦,大多数问答场景应该先把普通 RAG 做好。

详细解析

普通 RAG 处理不好的问题

  • 全局问题:"这 500 份用户访谈里,大家最常抱怨什么?"答案分散在所有文档里,和哪一块都不特别相似,检索出的前 k 块只覆盖很小一部分
  • 多跳问题:"负责支付网关的团队,上个季度处理过哪些线上事故?"要先从组织文档里查到负责的团队,再从事故报告里找这个团队处理的事故。每一块只包含其中一跳,问题整体和哪一块都不太像

GraphRAG 怎么做

建索引:

  1. 把文档切成文本块
  2. 用大模型从每一块中抽取实体(名称、类型、描述)和关系(谁和谁、什么关系)
  3. 合并不同块里的同一个实体,汇总描述,得到一张图
  4. 用 Leiden 算法做层级社区划分:联系紧密的实体分到同一个社区,大社区下面还有子社区
  5. 自底向上为每个社区生成摘要报告

抽取结果大致是这样的:

JSON
{
  "entities": [
    { "name": "支付网关", "type": "系统", "description": "对接第三方支付渠道的内部服务" },
    { "name": "交易平台组", "type": "团队", "description": "负责支付网关的开发和运维" },
    { "name": "INC-0412", "type": "事故", "description": "支付回调超时,部分订单状态异常" }
  ],
  "relationships": [
    { "source": "交易平台组", "target": "支付网关", "description": "负责维护" },
    { "source": "INC-0412", "target": "支付网关", "description": "发生在该系统" }
  ]
}

查询时有两种主要方式:

  • 全局搜索:把问题分别交给各个社区摘要,生成部分答案(map),再汇总成最终答案(reduce),适合"整体有哪些主题"这类问题
  • 局部搜索:先找到和问题相关的实体,再沿着关系扩展到相邻的实体、关系、所属社区的摘要和原文片段,组成上下文,适合围绕具体实体的问题

和普通向量 RAG 对比

维度 向量 RAG GraphRAG
建索引 切块、计算 Embedding 切块后用大模型抽取实体和关系、划分社区、生成摘要
索引成本 低 高,每一块都要调用大模型
更新 增删改对应的块即可 麻烦,实体合并、社区和摘要都可能受影响
擅长 答案集中在少数片段里的具体问题 全局总结类问题、跨文档的多跳关系问题
查询成本 低 全局搜索要处理大量社区摘要,较高
可解释性 引用原文片段 能展示实体和关系路径,也能回溯到原文

什么时候值得用

  • 用户的问题主要是总结、归纳整个文档集合,而且这类问题很多
  • 领域天然是关系型的:组织架构、供应链、代码依赖、法规之间的引用
  • 预算允许大量的索引调用,文档更新也不频繁

更多时候可以先用轻量的做法:切块时顺便抽取实体作为元数据,检索时按实体过滤或扩展;关系数据本来就在数据库里(如组织架构、配置管理库),就让模型通过工具调用直接去查,不必再从文本里抽取一遍。微软 GraphRAG 的官方仓库也提醒,建索引可能是一项昂贵的操作。

面试官可能追问

从文本里抽取实体和关系,难点在哪?

一是实体对齐:同一个实体有不同叫法(全称、简称、英文名),不同的实体又可能同名,合并错了图就乱了。二是抽取质量:模型会漏掉关系,也会编造关系,需要预先定义实体和关系的类型,用领域样例调 Prompt。三是成本,文档越多,调用次数越多。

文档更新后怎么办?

新文档要抽取实体和关系并合并进图,受影响的社区要重新划分、重新生成摘要,比向量 RAG 改几个块复杂得多。规模大时常见的做法是定期批量重建。对时效性要求高、文档频繁变化的场景,不太适合 GraphRAG。

不用 GraphRAG,"总结全部文档"这类问题怎么处理?

可以对所有文档做 Map-Reduce 总结(见 长文档怎么处理),代价是每次提问都要处理全部内容;也可以预先生成层级摘要,比如 RAPTOR 的思路:把相似的块聚类并生成摘要,再对摘要继续聚类和总结,形成一棵树,查询时可以在不同层级检索。按时间、类别做统计的问题,用结构化数据和 SQL 回答更准。

已经有结构化的知识图谱,怎么和大模型结合?

让模型根据图的结构生成查询语句(如 Neo4j 的 Cypher),或者把常用的查询封装成工具,让模型通过工具调用去查,结果作为上下文再生成回答。和 Text-to-SQL 一样,要做语句校验、权限控制和结果数量限制(见 Text-to-SQL)。

易错点

  • GraphRAG 不是把向量库换成图数据库,核心是用大模型从文本中抽取结构,并预先生成社区摘要
  • 没确认失败的问题确实是关系类或全局类,就因为"多跳"听起来高级而上知识图谱
  • 低估索引成本:每一块都要调用大模型,文档量大时要提前估算费用和耗时

AI 模拟面试官

用自己的话回答,AI 对照参考答案打分、指出遗漏,再追问,最多 3 轮

登录后就可以和 AI 面试官对练,面试记录也会保存下来。登录

这道题你掌握了吗?

选一个最接近的状态,没掌握的题会出现在"我的进度 · 待复习"里。

学习记录暂存在本机浏览器。登录后自动同步到账号,换设备也能看到。