《GraphRAG 核心实战:从 Leiden 算法到层级化摘要,构建 AI 的“上帝视角”》
在前两篇文章中,我们解决了 RAG 的“碎片化”痛点,通过“实体对齐”清洗了数据,并利用 Leiden 算法完成了图谱的“社区检测”。
现在,你的知识图谱已经具备了清晰的拓扑结构。但面对一个宏观问题(例如:“这份 500 页的行业报告主要讲了哪几个核心趋势?”),仅仅有结构是不够的。我们需要让 LLM 能够“读懂”这些结构。
这就是GraphRAG 索引阶段的核心魔法:利用 LLM 为每个社区生成摘要,并层层向上汇总。
1. 为什么需要“层级化摘要”?
传统的 RAG 是扁平的。当你问一个宏观问题时,系统只能随机抓取一些切片,或者检索排名靠前的几个片段。这就像是你问向导“这个城市怎么样”,他却只给你背了一段关于“某条街道垃圾桶位置”的描述。
而在 GraphRAG 中,我们通过社区检测建立了一个树状结构(Tree Structure):
- 叶子节点(Level 0):最小的社区,包含具体的实体和关系(如:具体的某几款芯片型号及其参数)。
- 中间节点(Level 1-N):由下层社区合并而成的大社区(如:整个“半导体制造”板块)。
- 根节点(Root):整个图谱的全局摘要。
这种结构让 AI 拥有了类似人类专家的“归纳能力”。
2. 核心流程:自下而上的信息压缩
这个过程完全由 Prompt 驱动,是一个自动化的流水线:
生成底层描述:
首先,LLM 会遍历每一个最小的社区(Leaf Community)。它会读取该社区内所有的实体(Entities)、关系(Relationships)以及原始的文本块(Text Units)。Prompt 示例思路:“你是一个分析专家。请根据以下实体列表、关系列表和源文本,为该社区生成一段详尽的摘要。摘要应包含该社区涉及的主要主题、关键实体及其相互作用。”
层级聚合:
一旦所有 Level 0 的社区都有了摘要,算法就会将这些摘要作为输入,传递给上一层级的父社区。Prompt 示例思路:“以下是属于‘人工智能硬件’这一大类下的几个子领域的摘要。请综合这些信息,为‘人工智能硬件’这一更高层级的概念生成一份更宏观的报告。”
循环直至根节点:
这个过程不断重复,直到生成整个图谱的根节点摘要。最终,你得到了一棵内容丰富的知识树。
3. 查询时的“全局搜索”模式
有了这棵树,当用户发起查询时,GraphRAG 就可以启用**全局搜索(Global Search)**模式:
- 传统 RAG:检索 -> 找到 Top-K 个切片 -> 扔给 LLM 回答。
- GraphRAG 全局搜索:
- 并行查询多个层级的社区摘要。
- 筛选出与问题最相关的几个“分支”(比如用户问“风险”,系统可能定位到“供应链风险”和“合规风险”这两个分支的摘要)。
- 将这些高度浓缩的摘要作为上下文喂给 LLM。
效果对比:
如果问“报告中提到了哪些关于‘特斯拉’的关键信息?”
- 普通 RAG可能会漏掉分散在第 100 页和第 300 页的信息。
- GraphRAG会直接调取包含“特斯拉”实体的那个社区的摘要,甚至调取上一层级“新能源汽车市场”的摘要,从而给出一个既包含细节又有行业背景的完美回答。
4. 避坑指南:Token 消耗与成本控制
虽然这套机制非常强大,但它也是“吞金兽”。
- 索引成本高:你需要为成百上千个社区调用 LLM 进行摘要生成。
- 优化策略:
- 过滤噪声:在生成摘要前,先通过算法过滤掉度数(Degree)太低的孤立节点,不要为它们浪费 Token。
- 并发处理:同一层级的社区互不依赖,完全可以多线程/多进程并发调用 API。
- 模型分级:底层细节摘要可以用稍弱的模型(如 GPT-4o-mini),顶层宏观摘要再用最强模型(如 GPT-4o),以平衡成本与质量。
5. 总结
通过引入社区检测和层级化摘要,我们实际上是在用计算换智能。我们把非结构化文档变成了结构化的“知识地图”。
至此,我们已经完成了 GraphRAG 最核心的**索引(Indexing)**部分。但在实际工程中,如何存储这些复杂的图结构和摘要?如何进行高效的混合检索?
下一篇,我们将进入工程落地环节:《GraphRAG 存储与检索架构:Neo4j 与向量数据库的混合双打》,带你打通 GraphRAG 的最后一公里。
