深度解读GraphRAG:如何通过知识图谱提升 RAG 系统

13365c64b34462a52fa5f00cc4e56686.png

5cbe5c1677809bce18a89c9479ab6e26.png

01.

RAG 简介与 RAG 面临的挑战

检索增强生成(Retrieval Augmented Generation,RAG)是一种连接外部数据源以增强大语言模型(LLM)输出质量的技术。这种技术帮助 LLM 访问私有数据或特定领域的数据,并解决幻觉问题。因此,RAG 已被广泛用于许多通用的生成式 AI(GenAI)应用中,如 AI 聊天机器人和推荐系统。

一个基本的 RAG 通常集成了一个向量数据库和一个 LLM,其中向量数据库存储并检索与用户查询相关的上下文信息,LLM 根据检索到的上下文生成答案。虽然这种方法在大部分情况下效果都很好,但在处理复杂任务时却面临一些挑战,如多跳推理(multi-hop reasoning)或联系不同信息片段全面回答问题。

以这个问题为例:“_What name was given to the son of the man who defeated the usurper Allectus?_”

一个基本的 RAG 通常会遵循以下步骤来回答这个问题:

  1. 识别那个人:确定谁打败了 Allectus。

  2. 研究那个人的儿子:查找有关这个人家庭的信息,特别是他的儿子。

  3. 找到名字:确定儿子的名字。

通常第一步就会面临挑战,因为基本的 RAG 根据语义相似性检索文本,而不是基于在数据集中没有明确提及具体细节来回答复杂的查询问题。这种局限性让我们很难找到所需的确切信息。解决方案通常是为常见查询手动创建问答对。但这种解决方案通常十分昂贵甚至不切实际。

为了应对这些挑战,微软研究院引入了 GraphRAG,这是一种全新方法,它通过知识图谱增强 RAG 的检索和生成。在接下来的部分中,我们将解释 GraphRAG 的内部工作原理以及如何使用 Milvus 向量数据库搭建 GraphRAG 应用。

02.

GraphRAG 及其工作原理简介

与使用向量数据库检索语义相似文本的基本 RAG 不同,GraphRAG 通过结合知识图谱(KGs)来增强 RAG。知识图谱是一种数据结构,它根据数据间的关系来存储和联系相关或不相关的数据。

GraphRAG 流程通常包括两个基本过程:索引和查询。

4cfb9ff07cb1c677806aaeb8c4c610ac.png

(图片来源: https://arxiv.org/pdf/2404.16130)

索引

索引过程包括四个关键步骤:

1. 文本单元分割(Text Unit Segmentation):整个输入语料库被划分为多个文本单元(文本块)。这些文本块是最小的可分析单元,可以是段落、句子或其他逻辑单元。通过将长文档分割成较小的文本块,我们可以提取并保留有关输入数据的更详细信息。

2. 提取 Entity、关系(Relationship)和 Claim:GraphRAG 使用 LLM 识别并提取每个文本单元中的所有Entity(人名、地点、组织等)、Entity 之间的关系以及文本中表达的关键 Claim。我们将使用这些提取的信息构建初始知识图谱。

3. 层次聚类:GraphRAG 使用 Leiden 技术对初始知识图谱执行分层聚类。Leiden 是一种 community 检测算法,能够有效地发现图中的 community 结构。每个聚类中的 Entity 被分配到不同的 community,以便进行更深入的分析。

注意:community 是图中一组节点,它们彼此之间紧密连接,但与网络中其他 dense group 的连接较为“稀疏”。

4. 生成 Community 摘要:GraphRAG 使用自下而上的方法为每个 community 及其中的重要部分生成摘要。这些摘要包括 Community 内的主要 Entity、Entity的关系和关键 Claim。这一步为整个数据集提供了概览,并为后续查询提供了有用的上下文信息。

6a3f867f69971b1d41c6999a937de703.png

(图片来源:https://microsoft.github.io/graphrag/)

查询

GraphRAG 有两种不同的查询工作流程,针对不同类型的查询进行了优化:

  • 全局搜索:通过利用 Community 摘要,对涉及整个数据语料库的整体性问题进行推理。

  • 本地搜索:通过扩展到特定 Entity 的邻居和相关概念,对特定 Entity 进行推理。

这个全局搜索工作流程包括以下几个阶段:

1dc1a448e1d4676a3c2e38be561a7c1a.png

(图片来源:https://microsoft.github.io/graphrag/)

  1. 用户查询和对话历史:系统将用户查询和对话历史作为初始输入。

  2. Community 报告分批:系统使用由 LLM 从 Community 层次结构的指定级别生成的节点 Community 报告作为上下文数据。这些 Community 报告被打乱并分成多个批次(打乱的 Community 报告批次 1、批次 2... 批次 N)。

  3. RIR(评级中间响应):每批 Community 报告进一步被划分为预定义大小的文本块。每个文本块用于生成一个中间响应。响应包含一个信息片段列表,称为点。每个点都有一个数值分数,表示其重要性。这些生成的中间响应是评级中间响应(评级中间响应 1、响应 2... 响应 N)。

  4. 排名和过滤:系统对这些中间响应进行排名和过滤,选择最重要的点。选定的重要点形成聚合的中间响应。

  5. 最终响应:聚合的中间响应被用作上下文以生成最终回复。

当用户提出关于特定 Entity(如人名、地点、组织等)的问题时,我们建议使用本地搜索工作流程。这个过程包括以下步骤:

3bc89ed57bc6e8578fd0479cec79b441.png

(图片来源:https://microsoft.github.io/graphrag/)

  1. 用户查询:首先,系统接收用户查询,这可能是一个简单的问题或更复杂的查询。

  2. 搜索相似 Entity:系统从知识图中识别出与用户输入语义相关的一组 Entity。这些 Entity 作为进入知识图谱的入口点。这一步骤中使用像 Milvus 这样的向量数据库进行文本相似性搜索。

  3. Entity-文本单元映射:提取的文本单元被映射到相应的 Entity,移除原始的文本信息。

  4. Entity-关系提取:这一步提取关于 Entity 及其相应关系的特定信息。

  5. Entity-协变量(Covariate)映射:这一步将 Entity 映射到它们的协变量,这可能包括统计数据或其他相关属性。

  6. Entity- Community 报告映射:Community 报告被整合到搜索结果中,纳入一些全局信息。

  7. 利用对话历史:如果有对话历史,系统使用对话历史来更好地理解用户的意图和上下文。

  8. 生成响应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值