本文系统梳理 GraphRAG 的核心原理、与传统 RAG / 知识图谱 / 图数据库的区别与联系,并深入剖析分层社区检测机制与 LightRAG 的设计取舍。


目录

  1. 四个概念速览
  2. GraphRAG 是什么
  3. 实体抽取:用的是什么模型?
  4. 查询时的混合检索机制
  5. 分层社区检测:GraphRAG 的核心设计
  6. 为什么增量更新这么难?
  7. LightRAG:工程化的取舍
  8. 选型指南

一、四个概念速览

在深入之前,先厘清四个常被混淆的概念:

概念本质定位核心功能
RAGAI 应用架构模式检索外部知识增强 LLM 生成
知识图谱知识表示方法以图结构组织实体与关系
图数据库存储基础设施高效存储和查询图结构数据
GraphRAG进阶 RAG 范式在 RAG 管道中引入图结构进行关系感知检索

三者的层级关系:

图数据库(基础设施层)
  └── 知识图谱(数据组织方法,运行在图数据库上)
        └── GraphRAG(AI 应用架构,以知识图谱为检索引擎)

二、GraphRAG 是什么

GraphRAG(Graph Retrieval-Augmented Generation)由微软研究院于 2024 年 4 月在论文 “From Local to Global: A Graph RAG Approach to Query-Focused Summarization” 中正式提出,并于同年 7 月开源,目前已超 31K Stars。

传统 RAG 的瓶颈

传统 RAG 把文档切块后做向量检索,本质是找相似文本片段。这在单跳问答场景下表现良好,但面对以下场景时明显力不从心:

  • 多跳推理:答案需要跨多个文档片段推导
  • 全局总结:需要理解整个语料库的宏观主题
  • 关系追踪:需要明确追踪"A 通过 B 影响了 C"这类逻辑链

GraphRAG 的核心思想

在入库阶段就用 LLM 抽取实体与关系,构建全局知识图谱,让检索从"找相似"升级为"遍历关系网络"。

完整工作流程

索引阶段(Indexing):

原始文档
  → ① LLM 抽取实体 + 关系(三元组)
  → ② 构建全局知识图谱(节点 = 实体,边 = 关系)
  → ③ Leiden 算法做社区检测(分层聚类)
  → ④ LLM 对每个社区生成层级摘要

查询阶段(Query):

查询模式适用场景工作原理
全局搜索(Global Search)宏观总结性问题遍历社区摘要,综合生成答案
本地搜索(Local Search)具体实体相关问题定位实体节点,结合邻居关系检索
漂移搜索(Drift Search)多跳推理问题从起点实体沿关系链探索

GraphRAG vs 传统 RAG

维度传统 RAGGraphRAG
数据结构平坦向量索引(文本块)知识图谱(节点 + 边)
检索方式语义相似度匹配图遍历 + 语义检索(混合)
上下文类型孤立的文本片段连接的关系网络
推理能力单跳,逻辑链条易断裂多跳,跨文档关联
全局理解强(社区摘要提供全局视野)
构建成本低(切块 + 向量化)高(LLM 实体抽取,数倍成本)
更新维护简单(增量追加)复杂(图谱更新、社区重算)

学术评测结论(arXiv 2502.11371):RAG 在单跳问题和细粒度细节检索上更优;GraphRAG 在多跳推理和全局总结性问题上更优。两者互补,而非替代关系。


三、实体抽取:用的是什么模型?

这是一个常见的误区——GraphRAG 的实体抽取用的是生成式 LLM,而不是 Embedding 模型

两类模型的本质差异

Embedding 模型生成式 LLM
输出形式向量数字 [0.12, -0.87, ...]自然语言文本
能否识别"谁 - 关系 - 谁"
成本极低较高

Embedding 模型本质上是个压缩机,它能衡量语义相似度,但无法"生成"出"A 和 B 之间存在 X 关系"这样的结构化信息。

实体抽取的质量保障机制

裸调 LLM 的输出不稳定,GraphRAG 通过以下几层手段约束:

① 强结构化 Prompt + JSON Schema 约束

你是一个知识图谱构建助手。
请从以下文本中提取所有实体和关系。

输出格式必须严格遵守以下 JSON Schema:
{
  "entities": [
    {"name": "实体名", "type": "PERSON|ORG|LOCATION|EVENT|CONCEPT", "description": "简短描述"}
  ],
  "relationships": [
    {"source": "实体A", "target": "实体B", "relation": "关系类型", "description": "关系说明"}
  ]
}

文本内容:[TEXT_CHUNK]

现代 LLM 支持 response_format: { type: "json_object" } 或 JSON Schema 约束,强制输出合法结构。

② 多次抽取 + 合并去重(Gleaning)

对同一个 chunk 抽取多次(默认 1~3 次),合并结果解决"漏抽"问题。

③ 实体消歧(Entity Resolution)

"苹果公司"与"Apple Inc."可能被抽取为不同实体,后处理步骤通过 Embedding 相似度聚合同义实体,再由 LLM 判断是否为同一个。

两类模型的分工

在 GraphRAG 完整管道中,两类模型各司其职:

原始文档
  → 生成式 LLM:抽取实体和关系(理解内容)
  → 构建知识图谱
  → Embedding 模型:对节点和社区摘要做向量化(支持混合检索)
  → 查询时:图遍历 + 向量检索混合

四、查询时的混合检索机制

Local Search(本地搜索) 为例,走一遍完整链路:

用户问:"爱因斯坦和玻尔在量子力学上的争论涉及哪些核心实验?"

Step 1:实体识别
  LLM 解析 Query,识别关键实体:爱因斯坦、玻尔、量子力学

Step 2:向量检索(找入口节点)
  对关键实体做 Embedding,在图谱节点向量索引里匹配
  → 命中节点:Einstein(node_001)、Bohr(node_002)

Step 3:图遍历(从节点出发扩展子图)
  以 Einstein、Bohr 为起点,执行 N-hop 图遍历:

  Einstein --[参与]--> EPR悖论实验
  Einstein --[反对]--> 哥本哈根诠释
  Bohr     --[提出]--> 哥本哈根诠释
  Bohr     --[辩论]--> Einstein
  EPR悖论  --[关联]--> 双缝实验
  EPR悖论  --[引发]--> 贝尔不等式

  图数据库执行 Cypher/GQL 查询,返回子图

Step 4:组合 Context
  Context = [图谱子图的结构化关系]
           + [相关社区摘要]
           + [向量检索召回的原始文本块]

Step 5:LLM 综合生成最终答案
  包含 EPR 实验、双缝实验等的完整答案

两种检索的分工

向量检索图遍历
作用找"入口节点"(语义相似的起点)从入口出发扩展关联上下文
解决“找什么”“怎么关联”
弱点找不到逻辑连接找不到入口(冷启动)
类比搜索引擎顺着链接深挖

两者缺一不可:没有向量检索,不知道从哪个节点开始;没有图遍历,只能找到相似片段,无法追踪关系链。


五、分层社区检测:GraphRAG 的核心设计

解决的根本矛盾

LLM 的上下文窗口有限(如 128K Token),但语料库可以有几千万 Token。如何在回答"整个文档库讲了什么"这类宏观问题时,不把所有节点都塞进上下文?

分层结构示意

Leiden 算法对知识图谱进行层级聚类,生成"社区摘要金字塔":

Level 3(根节点):整个语料库的总摘要
         ▲
Level 2(大社区):[现代物理学] [经典物理学]
         ▲         LLM 为每个社区生成摘要
Level 1(小社区):[量子力学] [相对论] [核物理]
         ▲         LLM 为每个社区生成摘要
Level 0(原始实体):爱因斯坦, 玻尔, EPR实验, 量子纠缠…

最贴切的类比:地图缩放层级

这个设计思路与 Google Maps 的 Zoom Level 如出一辙:

卫星视角(Zoom 1)  →  Level 3 摘要:"这个语料库讲的是现代物理学"
国家视角(Zoom 3)  →  Level 2 摘要:"量子力学方向 / 相对论方向"
城市视角(Zoom 5)  →  Level 1 摘要:"EPR实验相关研究群"
街道视角(Zoom 8)  →  Level 0 实体:爱因斯坦、玻尔、EPR实验…

地图不会在你看世界地图时加载每一条街道,GraphRAG 也不会在回答宏观问题时加载每个实体节点。

按问题粒度自动命中对应层级

问题粒度                          命中的层级
  │
  ├─ "整个文档库说了什么?"   → Level 2~3 摘要,LLM 一次回答
  │
  ├─ "量子力学领域的主要争论?"→ Level 1 摘要,缩小范围
  │
  └─ "爱因斯坦和玻尔争了什么?"→ Level 0 实体 + 图遍历

分层社区的本质是一套预计算好的多粒度摘要索引,让 LLM 在任何粒度的问题上都只需要加载"刚好够用"的上下文。


六、为什么增量更新这么难?

问题根源:Leiden 是全局算法

Leiden 算法通过最大化图的模块度(Modularity)来划分社区,这是一个全局最优化计算——它的结果依赖于整张图的结构。

当新文档加入,新实体被追加到图谱后,问题随之出现:

原图谱(已建好3层社区):
  社区A = {量子力学相关:爱因斯坦, 玻尔, EPR实验}
  社区B = {相对论相关:时空弯曲, 光速, 引力波}

加入新文档,抽取出:霍金, 黑洞辐射, 信息悖论

新节点与多个旧社区都有关联:
  霍金 ←→ 爱因斯坦(社区A)
  霍金 ←→ 引力波(社区B)
  黑洞辐射 跨越 社区A 和 社区B 的边界

此时,旧社区的划分方案不再是最优解,旧社区摘要也因覆盖的实体变化而过时,必须重新运行 Leiden + 重新生成所有受影响的摘要。

类比:把公司所有员工按项目分成 10 个小组,然后来了 20 个新员工。你不能简单地"把新人随便塞进某个组",因为最优的分组方案整体都变了——可能需要重新划分成 12 个组,原来的某些组也要拆分重组。


七、LightRAG:工程化的取舍

LightRAG 由香港大学团队于 2024 年底提出,目标是用更低成本实现 GraphRAG 的核心能力

核心差异:去掉社区层级

GraphRAG 的图谱:          LightRAG 的图谱:

  [摘要层 3]
  [摘要层 2]               就是一张平图
  [摘要层 1]               节点 + 关系
  [原始实体层]             没有层级

LightRAG 没有社区层级,因此新文档加入时只需追加实体和关系,无需重算任何层级结构

LightRAG 的双层检索

LightRAG 处理不同粒度问题的方式,不依赖预计算摘要,而是:

查询
  │
  ├──► 低层检索(Low-level)
  │    找具体实体和直接关系 → 适合精确事实查询
  │
  └──► 高层检索(High-level)
       找抽象概念和全局主题 → 适合宏观总结
       (通过向量聚合实现,非预计算摘要)

两路结果融合 → LLM 生成答案

全面对比

维度微软 GraphRAGLightRAG
全局总结能力✅ 极强(预计算社区摘要)⚠️ 较弱(向量聚合替代)
增量更新❌ 代价高(需重建层级)✅ 简单追加
初始索引成本❌ 极高✅ 显著降低(约 1/5 ~ 1/10)
多跳推理✅ 支持✅ 支持
适合语料静态、大型、需宏观洞察动态更新、中小规模

本质上是一个设计取舍:

GraphRAG 用"预计算层级摘要"换取了强大的全局理解能力,代价是更新灵活性差;LightRAG 放弃层级结构换来了轻量和灵活,代价是全局总结能力稍弱。


八、选型指南

适合 GraphRAG 的场景

  • 法律文档发现(判例引用链、法规交叉引用)
  • 金融风险分析(企业关联关系、供应链路径)
  • 科学文献研究(跨论文多跳引用推理)
  • 语料库静态且体量大,需要强全局总结能力
  • 需要 3 跳以上逻辑推理的复杂问题

适合 LightRAG 的场景

  • 企业知识库(文档持续更新)
  • 中小规模语料(< 百万节点量级)
  • 对索引成本敏感
  • 动态内容为主,实时性要求较高

坚持传统 RAG 的场景

  • 客服 FAQ、文档检索、单跳事实查询
  • 文档规模极小(< 50 页,直接塞入 context 更高效)
  • 失败案例主要是检索精度或分块碎片化问题(优化分块策略比引入图谱更有效)

2026 年最佳实践:混合架构

用户查询
    │
    ▼
查询路由器(Query Router)
    │
    ├──► 简单问答  → 传统向量 RAG(速度快,成本低)
    │
    ├──► 关系推理  → GraphRAG / LightRAG 图遍历
    │
    └──► 全局总结  → GraphRAG 社区摘要

从向量 RAG 开始,监测你的失败案例。如果多跳查询在关系密集型内容上持续失败,再引入 GraphRAG;如果失败更多是检索精度问题,优化分块和混合搜索即可——不需要知识图谱。


参考资料

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐