RAGFlow v0.9 版本引入了对 GraphRAG 的支持,GraphRAG 最近由微软开源,据称是下一代检索增强生成(RAG)技术。在 RAGFlow 框架内,我们对 RAG 2.0 有了更全面的定义。这个提出的端到端系统以搜索为中心,由四个阶段组成。后两个阶段——索引和检索——主要需要一个专用的数据库,而前两个阶段定义如下:
- 数据提取:利用各种文档模型,确保高质量数据用于索引,从而避免“垃圾进,垃圾出”的问题。
- 文档预处理:在提取的数据发送到数据库之前,可以实施可选的预处理步骤,例如文档聚类和知识图谱构建。这些步骤主要增强多跳问答和跨文档查询。虽然 GraphRAG 确实很先进,但它只是 RAG 2.0 流程中的一部分。
从 v0.9 版本开始,这部分已集成到 RAGFlow 中。下面,我们将探讨加入此功能的原因以及它与微软 GraphRAG 的对比。
知识图谱对于提升 RAG 的效果至关重要。朴素的 RAG 系统通常检索与用户查询相似的内容,因此可能无法始终提供正确答案。像问题摘要(Query-Focused Summarization, QFS)这样的任务,本质上是基于查询的摘要,可以通过使用知识图谱来处理。知识图谱可以有效地基于文本相关性聚合内容,并在对话过程中基于这些聚合的内容生成摘要,从而提高最终回复的准确性。许多现代 AI 搜索解决方案都采用这种方法。此外,RAGFlow 早期版本中引入的 RAPTOR 也采用了文本聚类来提高检索效率;而特定于知识图谱的方法可以基于命名实体生成更“层次化”的结果,为 QFS 查询提供更好的准确性和更全面的响应。目前,大量研究已经证明,通过提供额外的上下文信息,知识图谱可以提高 RAG 输出的有效性,并使 LLM 在许多情况下产生更具解释性的答案。这就是 GraphRAG 的推出迅速引起社区广泛兴趣的原因。在 RAG 兴起之前,已经有很多尝试利用知识图谱进行问答(KGQA)。然而,阻碍其在企业中广泛应用的一个主要障碍始终是知识图谱构建的自动化和标准化。随着 LLM 和 RAG 的出现,现在自动化这一过程变得更加可行,而 GraphRAG 是其中最著名的例子之一。
GraphRAG 显著简化了知识图谱的抽象和构建,极大地促进了标准化产品的推出。因此,我们在 RAGFlow 中实现 GraphRAG 时参考了这种方法。RAGFlow 在文档预处理阶段引入了知识图谱构建作为可选功能,以支持更复杂的问答场景。它还对原始 GraphRAG 进行了以下改进:
- 引入了去重步骤:在原始 GraphRAG 中,提取的命名实体直接使用而没有去重,这可能导致将同义词(如“2024”和“Year 2024”,或“IT”和“Information Technology”)视为不同的实体。这个问题在学术上称为实体消歧(Entity Resolution),通常涉及复杂的算法。然而,RAGFlow 利用 LLM 进行去重,因为 LLM 可以被广泛视为隐式知识图谱。
- 降低 Token 消耗:GraphRAG 本身会消耗大量 Token,因为在其原始实现中,它要求将所有用户上传的文档多次发送给 LLM。这会导致显著的 Token 使用量,特别是对于使用 SaaS 服务的 RAG 系统而言。RAGFlow 通过确保所有文档只提交给 LLM 一次来优化此过程,从而最大程度地减少不必要的 Token 消耗。为了从根本上解决这个问题,可以使用更小、独立的模型进行知识图谱构建。一个成功的例子是 Triplex,它基于拥有 30 亿参数的 Phi-3 进行微调,相比使用 LLM,其成本节省数倍。未来,RAGFlow 也将提供类似的解决方案,进一步降低与 GraphRAG 相关的构建成本。
以下是 RAGFlow 版本 GraphRAG 的演示
在文档解析阶段,用户可以选择“知识图谱”作为特定知识库的切块方法。他们还必须定义希望 LLM 提取的命名实体类型,例如“组织”、“人物”和“地点”,如下图所示:
选择切块方法后,您可以触发 LLM 提取实体并构建知识图谱。RAGFlow 会可视化地显示这些知识图谱,包括节点名称、节点描述和“社区”。
知识图谱也可以显示为思维导图
知识图谱的可视化对于用户调试对话至关重要。目前,RAGFlow 支持使用任何连接的 LLM 来生成知识图谱。然而,LLM 在数据提取方面的能力各不相同,未能成功提取知识图谱可能导致对话错误。在这种情况下,可视化工具可以用于查看生成的知识图谱并分析对话。
目前,RAGFlow 的知识图谱生成是文档级别的,这意味着它不支持为知识库中的所有文档构建知识图谱。换句话说,当前版本的 RAGFlow 中的 GraphRAG 无法链接由多个文档生成的知识图谱。此功能需要显著更多的内存和计算资源。RAGFlow 将在稍后根据用户反馈重新考虑此功能。
下图对比了从《权力的游戏》生成的对话。左侧的对话是使用 GraphRAG 生成的,它表明 GraphRAG 为涉及嵌套逻辑的多跳查询提供了更深入、更全面的答案。右侧的对话是基于使用 GENERAL 解析方法解析的文档生成的,结果为空。
总而言之,RAGFlow 对 GraphRAG 的实现旨在自动化为 RAG 构建知识图谱。虽然 GraphRAG 消除了与传统知识图谱算法相关的许多复杂性,但这并非在 RAG 应用中使用知识图谱的最终解决方案。在实际企业场景中,很大一部分数据不适合构建知识图谱,或者为所有数据构建知识图谱可能不具成本效益。事实上,知识图谱还有更多的应用,例如使用知识图谱重写查询。RAGFlow 计划在不久的将来支持这些功能。
参考资料
- GraphRAG, https://github.com/microsoft/graphrag
- 从局部到全局:一种用于查询重点摘要的 Graph RAG 方法, https://arxiv.org/abs/2404.16130
- HippoRAG:受神经生物学启发的用于大型语言模型的长期记忆, https://arxiv.org/abs/2405.14831