从实体抽取到图检索融合,深入剖析 RAGFlow GraphRAG 模块的每一步技术实现细节, 揭示向量 RAG 与图 RAG 双引擎协同的架构奥秘
GraphRAG 是 RAGFlow 的知识图谱增强检索模块,通过构建实体-关系图谱来增强传统 RAG 的检索能力,实现从隐式语义匹配到显式关系推理的跃迁
| 特性维度 | 传统 RAG | GraphRAG |
|---|---|---|
| 数据结构 | 文本块 (Chunks) | 文本块 + 知识图谱 |
| 检索方式 | 向量相似度 | 向量 + 图遍历 |
| 关系理解 | 隐式(上下文窗口) | 显式(实体关系三元组) |
| 多跳推理 | 困难 | 支持 |
| 全局理解 | 弱 | 强(社区摘要) |
| 实体消歧 | 不支持 | 可选 |
| Token 开销 | 低 | 较高(可配置优化) |
GraphRAG 模块位于 ragflow/rag/graphrag/ 目录下,采用分层模块化设计
run_graphrag() 是整个知识图谱构建的入口函数,编排了从文档分块到社区报告的完整流水线
知识图谱构建的基础环节,通过精心设计的 Prompt 和 Few-Shot 机制,利用 LLM 完成实体和关系的结构化抽取
合并指代同一实体的不同表述,消除图谱中的冗余节点,是提升检索准确性的关键环节
使用 editdistance 库计算实体名称间的编辑距离,快速筛选出可能需要合并的候选实体对。
目的:减少候选对数量,避免将大量实体对送入 LLM 判断,显著降低 Token 消耗。
这一步是纯工程手段,速度快、零 Token 开销。
将初筛后的候选实体对送入 LLM,由大模型判断两个实体是否确实指代同一事物。
LLM 能理解语义层面的等价关系(如缩写、别名、多语言表述),远超字符串匹配的能力。
这是 Token 消耗的主要来源,也是 v0.16 提供手动关闭选项的原因。
基于 Leiden 层级社区检测算法自动发现实体聚类,生成社区摘要报告,增强全局理解能力
Leiden 算法通过模块度优化生成高质量的社区划分,相比 Louvain 算法解决了"连接不良社区"的问题。
RAGFlow 使用 graspologic 库的 hierarchical_leiden 实现,支持多层级社区划分。
每个层级产生不同粒度的社区聚类,上层更粗粒度,下层更细粒度。
为每个社区生成摘要报告,基于社区内实体和关系的描述信息,通过 LLM 生成能够代表社区核心内容的文本。
社区摘要的核心价值:提升社区召回的准确性。当用户查询涉及全局性问题时,社区摘要能提供宏观视角的回答。
v0.16 起社区报告生成变为可选,因为该步骤完全依赖 LLM,是 Token 消耗的重要来源之一。
KGSearch 是知识图谱检索的核心类,实现了从查询分析到多路径检索再到概率评分的完整检索链路
向量检索器与图检索器并行工作,通过跨模态融合策略实现互补增强,图结果优先展示确保关键实体关系信息不被淹没
图检索结果前置插入到向量检索结果的位置 0,确保知识图谱的结构化关系信息优先展示
向量检索提供语义匹配,图检索提供结构化关系推理,两者互补增强
| 数据库引擎 | 向量检索融合方式 | 特点 |
|---|---|---|
| Elasticsearch | Boost-based fusion | 基于提升因子的融合,将向量分数转换为 Boost 值 |
| Infinity | Atan 标准化融合 | 使用 Arctan 函数标准化分数后融合,更平滑 |
根据不同场景需求,在效果与成本之间做出最优权衡
| 场景 | 抽取模式 | 实体消解 | 社区报告 | 推荐理由 |
|---|---|---|---|---|
| 快速原型 | Light | 否 | 否 | 最低成本快速验证 |
| 生产环境 | General | 是 | 是 | 完整功能,最佳效果 |
| 大规模文档 | Light | 是 | 否 | 平衡速度和质量 |
| 知识密集型 | General | 是 | 是 | 多跳推理 + 全局理解 |