2024年5月11日

GraphRAG

GraphRAG 是一种基于知识图谱的检索增强策略,通过从文档中抽取实体和关系构建知识图谱,利用图结构进行社区检测和层次化摘要,从而解决传统 RAG 在**全局性问答**和**多跳推理**上的固有缺陷。

知识库大模型检索增强raggraphknowledge-graph

GraphRAG

先说结论

GraphRAG 是一种基于知识图谱的检索增强策略,通过从文档中抽取实体和关系构建知识图谱,利用图结构进行社区检测和层次化摘要,从而解决传统 RAG 在全局性问答多跳推理上的固有缺陷。

QUESTION 面试高频:为什么需要 GraphRAG?传统 RAG 有什么做不到的? 传统 RAG 擅长回答具体事实性问题("X 的定义是什么"),但不擅长回答全局/总结性问题("这个数据集的主要主题有哪些"、"A 和 B 的关系是什么")。原因在于传统 RAG 基于 Chunk 级检索,无法建立跨文档的全局视图。GraphRAG 通过知识图谱建立实体间的关联,利用社区层级结构实现全局推理。

核心架构

文档 → LLM 提取实体和关系 → 构建知识图谱 → 社区检测 → 社区摘要
                                                          ↓
查询 → 社区摘要检索 → 全局/局部推理 → 回答

索引阶段(Indexing)

步骤 说明 关键技术
文本分块 将文档切分为适合处理的片段 标准分块策略
实体和关系抽取 从每个 Chunk 中抽取实体(节点)和关系(边) LLM + Prompt Engineering
知识图谱构建 将所有实体和关系聚合为图结构 图数据库(Neo4j/NetworkX)
社区检测 在图上运行社区发现算法 Leiden 算法
社区摘要 为每个社区生成层次化摘要 LLM 摘要
嵌入索引 对社区摘要进行向量化存储 标准 Embedding

查询阶段(Querying)

查询模式 说明 适用问题类型
Local Search 从相关实体出发,在子图上检索 具体事实性问题("X 的属性?")
Global Search 汇总所有社区摘要进行推理 全局总结性问题("主要主题?")
Community Search 检索特定社区的摘要和实体 领域覆盖性问题

知识图谱构建详解

实体与关系抽取

QUESTION 面试高频:GraphRAG 如何从文本中抽取实体和关系?

通常使用 LLM + 结构化 Prompt 的方式:

EXTRACTION_PROMPT = """
从以下文本中抽取所有实体和关系。

实体类型:人物、组织、地点、概念、事件...
关系类型:属于、位于、参与、导致、相关...

输出格式:
- 实体:(名称, 类型, 描述)
- 关系:(源实体, 关系类型, 目标实体, 描述)

文本:{text}
"""

社区检测算法

算法 特点 适用场景
Leiden 质量高,速度快 GraphRAG 默认选择
Louvain 经典算法,广泛使用 大规模图
Label Propagation 极快,近线性复杂度 超大规模图

社区层次结构

Level 0: 最细粒度社区(每个实体)
    ↓ 聚合
Level 1: 小型社区(数十个实体)
    ↓ 聚合
Level 2: 中型社区(数百个实体)
    ↓ 聚合
Level N: 全局(整个知识图谱)

每个层级都生成对应的摘要,查询时可根据问题粒度选择合适的层级。

GraphRAG vs 传统 RAG

维度 传统 RAG GraphRAG
擅长问题类型 具体事实性问答 全局总结性问答
多跳推理 弱(需多次检索拼接) 强(图结构天然支持路径推理)
索引结构 向量索引 向量索引 + 知识图谱 + 社区索引
索引成本 高(需 LLM 抽取实体/关系)
查询延迟 中(需图遍历 + 社区摘要)
可解释性 高(可追踪实体关系路径)
知识更新 增量更新向量索引 需重新抽取实体/关系并更新图
适用规模 千万级文档 万级文档(成本限制)

QUESTION 面试高频:GraphRAG 的主要缺点是什么? 成本高:索引阶段需要大量 LLM 调用来抽取实体和关系、生成社区摘要,成本是传统 RAG 的数十倍。更新困难:知识库更新时需要重新抽取实体关系并更新图结构。扩展性受限:大规模知识图谱的存储和查询成本随规模非线性增长。因此 GraphRAG 适合高价值、中等规模的知识库场景。

实际应用场景

  1. 法律文档分析:案件关联分析、法条引用链追踪
  2. 学术文献综述:研究方向图谱、学者合作网络
  3. 企业知识管理:组织架构、产品依赖关系、技术文档关联
  4. 情报分析:实体关联、事件链推理
  5. 医疗知识图谱:疾病-症状-药物关联推理

工程落地时我会怎么做

  1. 混合使用:具体问题用传统 RAG,全局问题用 GraphRAG,通过路由选择
  2. 实体去重:同一实体可能有不同表述("北京" vs "Beijing"),需要实体消歧和对齐
  3. 渐进式构建:先小规模验证效果,再逐步扩大图谱覆盖范围
  4. 社区摘要质量:社区摘要的质量直接决定 Global Search 的效果,需要精心设计 Prompt
  5. 定期重建索引:知识图谱不如向量索引易于增量更新,建议定期全量重建

如果要对外讲,可以怎么概括

"GraphRAG 是微软研究院提出的一种基于知识图谱的 RAG 变体,核心解决的是传统 RAG 在全局性问答上的不足。传统 RAG 基于 Chunk 检索,只能找到局部信息,无法回答'主要主题有哪些'这类需要全局视图的问题。GraphRAG 的做法是用 LLM 从文档中抽取实体和关系构建知识图谱,然后运行社区检测算法将图谱划分为层次化的社区,每个社区生成摘要。查询时,Global Search 汇总所有社区摘要进行推理,Local Search 从相关实体出发在子图上检索。它的代价是索引成本高、更新困难,所以适合高价值、中等规模的知识库场景。实际项目中我会采用混合策略:简单问题走传统 RAG,复杂全局问题走 GraphRAG。"

最后记几条

  1. GraphRAG 解决的是全局性问题:传统 RAG 找"局部答案",GraphRAG 做"全局总结"
  2. 社区检测是核心:Leiden 算法将图谱划分为层次化社区,支持多粒度查询
  3. 成本是最大制约:索引成本是传统 RAG 的数十倍,不适合大规模场景
  4. 实体抽取质量决定上限:LLM 抽取实体/关系的准确率直接影响图谱质量
  5. 与传统 RAG 互补:混合使用而非替代,通过路由选择最佳策略

参考资料

  • Edge, D. et al. "From Local to Global: A Graph RAG Approach to Query-Focused Summarization" (微软, 2024)
  • Microsoft GraphRAG 开源项目: https://github.com/microsoft/graphrag
  • Knowledge Graph-RAG 综述: "Knowledge Graph-Based Retrieval-Augmented Generation" (2024)

延伸阅读