引言
最近因为团队有 GraphRAG 的需求,一直在调研这方面相关的工作。其实很早就了解以及折腾过这个领域中的鼻祖:微软的GraphRAG,至今依然很经典,但是当时也是浅尝辄止,没有好好深入了解。这次也是想借此机会好好整理下 GraphRAG 的技术内容,温故而知新,并且研究一些这方面做得比较好的开源项目,了解下目前这块的进展,后续慢慢更新。
GraphRAG 是什么?
GraphRAG是一种结构化、分层的检索增强生成(RAG)方法,与使用纯文本片段的简单语义搜索方法不同。GraphRAG流程包括从原始文本中提取知识图谱、构建社区层次结构、为这些社区生成摘要,然后在执行基于RAG的任务时利用这些结构。
简而言之,可以理解为将我们平常所熟知的 RAG(这里我们称之为 Naive RAG)中所使用的向量数据库替换为知识图谱,在 R(etrieve) 阶段,从知识图谱中检索相关信息,而不是像原来一样,基于向量相似度从向量数据库中检索相关文本块。
GraphRAG 解决的问题
既然在这之前已经有了 Naive RAG(使用向量相似度作为检索技术),为何还需要 GraphRAG 呢?GraphRAG 到底解决了什么问题或者痛点呢?这就得提到 Naive RAG 表现比较差的两个场景了:
- "连接点"难题:当答案需整合多个分散信息片段时(也就是熟知的多跳问题),Naive RAG 通常表现很差
- 全局语义理解:当需要从大量数据集甚至单个大型文档中整体理解抽象、全局的语义概念时,Naive RAG 的效果也很差。
Naive RAG 在这两类问题上表现不佳,其根本原因在于它的检索机制本质是扁平的、局部的、基于向量相似性匹配的检索,缺乏对信息之间结构化关系和整体语义组织的建模能力。GrapRAG 则是为了解决这些问题而设计的,其通过构建知识图谱,创建了实体之间的关联关系和结构化信息,再加上对知识图谱进行社区检测操作、输出社区报告和摘要,实现了对全局信息和整体文档的更好的理解,因此能在这两类问题上有不错的表现。下面简单举例说明下这两个问题。
问题举例说明
假设你有一个包含 5,000 篇科技新闻、产品评测、供应链报告和专利文档 的私有知识库,内容涵盖 2020--2025 年华为手机相关动态。
这些文档分散提及以下信息:
-
文档 A(2023年供应链报告):
"中芯国际已为华为提供 7nm 芯片代工服务,用于新款旗舰手机。"
-
文档 B(2024年发布会新闻稿):
"华为 Mate 60 Pro 搭载麒麟 9000S 芯片,支持 5G。"
-
文档 C(行业分析文章):
"麒麟 9000S 是华为自研 SoC,由中芯国际代工,采用 N+2 工艺(等效 7nm)。"
-
文档 D(用户论坛摘要):
"Mate 60 系列是华为自 2019 年后首次在旗舰机上恢复 5G 功能。"
-
文档 E(专利数据库):
"华为于 2022 年申请了射频前端模组专利,用于绕过美国 5G 射频限制。"
多跳问题
用户问题:
"华为是如何在被制裁的情况下让 Mate 60 Pro 支持 5G 的?"
这个问题的答案分散在多个文档中,没有任何一篇完整说明整个技术路径。
Naive RAG 效果
- 检索系统根据"华为 Mate 60 Pro 5G 制裁"生成嵌入,返回最相似的几个文本块。
- 可能命中:
- 文档 B:"Mate 60 Pro 支持 5G。"
- 文档 D:"Mate 60 是 2019 年后首款 5G 华为手机。"
- 但无法召回关于芯片代工(文档 A/C)或射频专利(文档 E)的内容,因为它们不包含"Mate 60 Pro"或"5G"等关键词组合。
- 生成结果 : "华为 Mate 60 Pro 支持 5G,这是自 2019 年以来的首次回归。"
→ 未回答"如何实现",缺失核心技术路径。
GraphRAG 效果
- 离线阶段构建知识图谱,识别关键实体与关系:
- 实体:
华为、Mate 60 Pro、麒麟 9000S、中芯国际、5G、射频专利 - 关系:
Mate 60 Pro ---搭载→ 麒麟 9000S麒麟 9000S ---由→ 中芯国际 代工中芯国际 ---提供→ 7nm 工艺华为 ---拥有→ 射频前端专利射频专利 ---用于→ 绕过 5G 限制
- 实体:
- 查询时,系统围绕"Mate 60 Pro"和"5G"展开局部图遍历,聚合所有关联路径。
- 生成结果 : "华为通过三方面突破实现 Mate 60 Pro 的 5G 功能:(1) 自研麒麟 9000S 芯片;(2) 由中芯国际使用 7nm 级工艺代工;(3) 应用其 2022 年申请的射频前端专利,规避美国对 5G 射频组件的限制。"
→ 完整还原技术逻辑链,实现多跳推理。
全局语义理解问题
用户问题:
"过去五年,华为手机业务的战略重心发生了哪些变化?"
这是一个宏观、抽象、需要整体洞察的问题。
Naive RAG 效果
- 检索"华为 手机 战略 五年 变化",可能返回几篇标题含"战略"的文章片段。
- 结果可能包括:
- 2021年:"华为聚焦软件生态(鸿蒙)"
- 2023年:"回归硬件,发布 Mate 50"
- 2024年:"Mate 60 Pro 支持 5G"
- 但这些片段孤立、无组织,LLM 很难从中提炼出清晰演进脉络。
- 生成结果 : "华为这几年发布了鸿蒙系统,后来又出了新手机,最近还支持 5G 了......"
→ 零散、缺乏结构、无深度洞察。
GraphRAG 效果
- 图谱构建后,通过社区检测(Leiden 算法)发现多个主题社区:
- 社区1(2020--2021) :以"鸿蒙 OS""HMS 生态""剥离荣耀"为核心 → 软件求生期
- 社区2(2022--2023) :聚焦"4G 旗舰回归""卫星通信""国产供应链" → 硬件重建期
- 社区3(2024--2025) :关键词"5G 回归""自研芯片量产""高端市场反攻" → 技术突围期
- 每个社区已有预生成的摘要。
- 生成结果 : "华为手机战略经历了三个阶段:(1) 生存转型期 (2020--2021):转向鸿蒙生态,剥离荣耀以保核心;(2) 能力重建期 (2022--2023):在无 5G 条件下推出卫星通信等创新功能;(3) 技术反攻期 (2024 起):通过自研芯片与国产代工实现 5G 回归,重夺高端市场。"
→ 结构清晰、时间有序、洞察深刻。
问题总结与对比
其实除了上述提到的两个主要的问题,还有一些在 Naive RAG 上表现比较差的问题,在这里与之前的问题一起,包括 GraphRAG 如何相应地解决这些问题,整理在下面的表格:
| 痛点 | Naive RAG 的表现 | GraphRAG 如何解决 |
|---|---|---|
| 1. 无法进行多跳推理(Multi-hop Reasoning) (即"连接点"问题) | 只能检索与查询字面最相似的片段,无法将分散在不同文档中的实体/事实关联起来。例如:"A 和 C 有什么关系?"但 A→B→C 的路径分布在三篇文档中 → RAG 找不到答案。 | ✅ 通过知识图谱显式建模实体间关系,支持图遍历(如 A → B → C),实现跨文档多跳推理。 |
| 2. 缺乏全局语义理解能力 | 每次只看局部 top-k 文本块,无法把握整个语料库的主题结构、趋势或宏观模式。回答"整体上讲了什么?"这类问题效果差。 | ✅ 利用社区检测(如 Leiden 算法)对图谱聚类,生成分层社区摘要,支持"Global Search"回答全局性问题。 |
| 3. 对模糊/抽象/高层次问题响应弱 | 查询如"主要风险有哪些?""核心争议是什么?"缺乏关键词匹配,检索结果噪声大或不相关。 | ✅ 社区摘要天然包含高层次语义(如"该社区聚焦数据隐私与模型偏见"),可直接用于回答抽象问题。 |
| 4. 重复信息冗余,缺乏去重与整合 | 多篇文档可能重复提及同一事实,RAG 会多次检索相似片段,导致 LLM 输入冗长、矛盾或低效。 | ✅ 图谱将相同实体/关系归一化,天然去重;社区摘要自动融合多源信息,输出更简洁一致。 |
| 5. 难以解释答案来源 | 虽可引用检索段落,但无法说明"为什么这些段落相关"或"逻辑链如何形成"。 | ✅ 图结构提供可追溯的推理路径(如实体 A → 关系 R → 实体 B),增强可解释性与可信度。 |
| 6. 对私有/专业领域术语理解浅层 | 向量嵌入可能无法准确捕捉领域内细微语义(如同义词、缩写、隐含关系)。 | ✅ 在图构建阶段可通过定制化 NER 和关系抽取(如用领域 LLM 提示工程)显式捕获专业语义,提升准确性。 |