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 适合高价值、中等规模的知识库场景。
实际应用场景
- 法律文档分析:案件关联分析、法条引用链追踪
- 学术文献综述:研究方向图谱、学者合作网络
- 企业知识管理:组织架构、产品依赖关系、技术文档关联
- 情报分析:实体关联、事件链推理
- 医疗知识图谱:疾病-症状-药物关联推理
工程落地时我会怎么做
- 混合使用:具体问题用传统 RAG,全局问题用 GraphRAG,通过路由选择
- 实体去重:同一实体可能有不同表述("北京" vs "Beijing"),需要实体消歧和对齐
- 渐进式构建:先小规模验证效果,再逐步扩大图谱覆盖范围
- 社区摘要质量:社区摘要的质量直接决定 Global Search 的效果,需要精心设计 Prompt
- 定期重建索引:知识图谱不如向量索引易于增量更新,建议定期全量重建
如果要对外讲,可以怎么概括
"GraphRAG 是微软研究院提出的一种基于知识图谱的 RAG 变体,核心解决的是传统 RAG 在全局性问答上的不足。传统 RAG 基于 Chunk 检索,只能找到局部信息,无法回答'主要主题有哪些'这类需要全局视图的问题。GraphRAG 的做法是用 LLM 从文档中抽取实体和关系构建知识图谱,然后运行社区检测算法将图谱划分为层次化的社区,每个社区生成摘要。查询时,Global Search 汇总所有社区摘要进行推理,Local Search 从相关实体出发在子图上检索。它的代价是索引成本高、更新困难,所以适合高价值、中等规模的知识库场景。实际项目中我会采用混合策略:简单问题走传统 RAG,复杂全局问题走 GraphRAG。"
最后记几条
- GraphRAG 解决的是全局性问题:传统 RAG 找"局部答案",GraphRAG 做"全局总结"
- 社区检测是核心:Leiden 算法将图谱划分为层次化社区,支持多粒度查询
- 成本是最大制约:索引成本是传统 RAG 的数十倍,不适合大规模场景
- 实体抽取质量决定上限:LLM 抽取实体/关系的准确率直接影响图谱质量
- 与传统 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)