GraphRAG论文解读
论文介绍
论文发布于2024年4月24日,7月2日项目开源,作者都来自于微软研究院,论文目前是一个预印本(preprint),没有正式发表。
第一个提出知识图谱+检索增强生成的方法,目的是解决大模型在利用外部知识回答问题时,原生的RAG方法难以有效回答QFS(查询聚焦摘要)问题。主要涉及两个阶段:1.利用prompt使大模型进行多轮实体关系提取,并构建知识库的知识图谱。2.对知识图谱进行社区检测并利用LLM生成社区摘要。
论文地址: From Local to Global: A Graph RAG Approach to
Query-Focused Summarization
项目源码:GitHub Repository
微软项目说明:Welcome to GraphRAG
论文摘要解读
局限性:传统的RAG系统擅长于检索和生成局部查询的答案,但在需要对整个数据集进行主题摘要的全局查询方面表现不佳。
Graph RAG:从源文档中构建一个基于图的文本索引,并利用该索引生成对全局查询的综合且多样化的答案。
论文方法解读
源文档—文本块
在此过程需要将长文本分成大小适中的文本块,在后续过程中我们需要把每一个文本块交由大模型处理,而大模型的上下文窗口有限,一般为512-2048token,不同模型不一致。
文本块的粒度:较长的文本块需要更少的LLM调用来进行提取,有更高的效率和低成本,但在较长的LLM上下文窗口中会出现召回率下降的问题,即提取实例不充分,有遗漏情况。
在单轮提取(即零收集)的情况下,可以在图 2 中观察到这种行为:在样本数据集上,使用大小为 600 的块提取的实例几乎是使用 2400 的块的两倍。
文本块—元素实例
从每个文本块中识别和提取图节点和边的实例。这个过程是为了从文本中提取结构化信息,特别是识别实体及其关系。通过优化提示和多轮收集,确保即使在处理大块文本时,也能保持高质量的提取结果。这种方法特别适合需要从大量文本中提取复杂信息的任务,如知识图谱构建和信息检索。
步骤
-
实体识别:
- 使用一个多部分的LLM(大型语言模型)提示,首先识别文本中的所有实体。
- 实体包括名称、类型和描述。
-
关系识别:
- 接下来,识别清晰相关的实体之间的关系。
- 包括关系的源实体和目标实体及其关系的描述。
-
输出形式:
- 实体和关系都作为一个包含分隔元组的列表输出。
优化方法
领域适应:
- 可以通过为LLM提供少量示例来使提示适应特定领域(如科学、医学、法律等)。
- 这些示例用于上下文学习,使模型更好地理解和处理特定领域的文本。
次要提取提示:
- 除了主要的实体和关系提取,还可以使用次要提示提取附加信息(协变量)。
- 默认情况下,次要提示提取与实体相关的声明,包括主体、客体、类型、描述、源文本范围和开始/结束日期。
多轮收集:
- 为了在效率和质量之间取得平衡,使用多轮“收集”来确保所有实体都被检测到。 这种方法允许使用较大的文本块大小,而不会降低提取质量或引入噪音。
- 第一步:要求LLM评估是否所有实体都已提取,强制做出是/否决定。
- 如果LLM回答遗漏了实体,继续提示“上次提取中遗漏了许多实体”,鼓励LLM收集这些遗漏的实体。
元素实例—元素摘要
此过程, 将每个图元素(如实体节点、关系边和声明协变量)的实例级摘要转换为单一描述文本块。为此,需要进一步使用LLM对匹配的实例组进行总结和整合。
潜在问题和解决方法
- 可能的问题是LLM在不同的地方引用同一个实体时,格式不一致,导致出现重复的实体节点。
- 解决方法是,后续步骤会检测并总结所有密切相关的实体。LLM可以理解多个名称变体背后的共同实体,只要这些变体之间有足够的连接性到一组密切相关的实体,方法就能应对这些差异。
方法的优势
丰富描述性文本的使用:
- 使用丰富的描述性文本来描述同类节点,即使在图结构中有潜在的噪声,这种方法也符合LLM的能力和全球、查询聚焦摘要的需求。
- 这种方法不同于典型的知识图谱,后者依赖于简洁且一致的知识三元组(主体、谓词、客体)来进行推理任务。
元素摘要 → 图社区
通过将前一步的索引构建成一个同质无向加权图,并应用社区检测算法(如 Leiden 算法),我们能够将图划分为若干社区。这些社区内部节点之间的连接更强,通过这种划分,可以有效地进行全局信息的总结和处理,实现“分而治之”的全局摘要。这种方法不仅能够高效处理大规模图,还能提供详细的层次化社区结构,为进一步分析和总结提供了坚实的基础。
具体过程和方法如下:
图模型创建
创建无向加权图:
- 利用前一步生成的索引,构建一个同质的无向加权图。
- 在这个图中,节点代表实体,边代表关系,边的权重表示检测到的关系实例的标准化计数。
社区检测
社区检测算法:
- 在构建的图上应用社区检测算法,将图划分为若干社区。
- 社区是指内部节点之间的连接比与其他节点的连接更强的节点群。
- 常用的社区检测算法包括 Fortunato (2010) 和 Jin 等人 (2021) 综述中提到的多种方法。
使用 Leiden 算法
选择 Leiden 算法:
- 在这个管道中,我们选择 Leiden 算法(Traag et al., 2019),因为它能高效地恢复大规模图的层次社区结构。
- Leiden 算法具有以下优点:
- 能够高效处理大规模图。
- 能恢复层次化的社区结构。
分层社区结构
层次化社区结构:
- 图的每个层次提供一个社区划分,这些划分覆盖了图的所有节点,并且是互斥且集体穷尽的。
- 这种层次化的社区划分使得全局摘要能够采用“分而治之”的方法。
圆圈表示实体节点,其大小与其度数成正比。节点布局是通过 OpenORD 和 Force Atlas 2执行的。节点颜色代表实体社区,以层次聚类的两个级别显示:(a) 级别 0,对应于具有最大模块性的层次分区;(b) 级别 1,揭示这些根级别社区内的内部结构。
图社区 → 社区摘要
介绍了如何为每个社区生成报告式的摘要,特别是在大型数据集上进行缩放的方法。社区摘要不仅有助于理解数据集的全局结构和语义,还能在没有具体问题的情况下帮助理解数据集。以下是详细步骤和方法:
创建社区摘要
生成社区摘要:
- 为 Leiden 层次结构中的每个社区创建报告式摘要。
- 这些摘要有助于理解数据集的全局结构和语义。
- 用户可以浏览社区摘要来发现感兴趣的主题,然后查看更详细的子主题报告。
叶级社区摘要
- 对于叶级社区(最底层的社区),按照优先级将元素摘要(节点、边、协变量)逐步添加到LLM的上下文窗口,直到达到token限制。
- 优先级排序如下:
- 按照社区边连接的源节点和目标节点的度(即整体重要性)从高到低排序。
- 依次添加源节点、目标节点、关联协变量和边的描述。
高层级社区摘要
- 如果所有元素摘要都能在上下文窗口的token限制内,则与叶级社区一样,对所有元素摘要进行总结。
- 如果超出上下文窗口的token限制:
- 按照元素摘要token数量从高到低排序子社区。
- 逐步用子社区摘要(更短)替换关联的元素摘要(更长),直到满足上下文窗口的token限制。
示例流程
假设我们有一个大型数据集并将其分为多个社区:
-
叶级社区处理:
- 首先处理最底层的社区。
- 按照重要性顺序逐步添加节点和边的描述,确保在token限制内。
-
高层级社区处理:
- 如果叶级社区的所有描述都能适应上下文窗口,则直接进行总结。
- 如果不能适应,则按子社区的重要性顺序进行替换,确保每个子社区的总结在token限制内。
社区摘要 → 社区答案 → 全局答案
如何使用社区摘要生成最终的全局答案,分为多个阶段进行处理。由于社区结构具有层次性,不同层次的社区摘要可以用来回答问题,这意味着需要评估哪个层次能够在摘要细节和广泛性之间达到最佳平衡。
以下是详细的步骤和方法:
生成社区摘要
- 随机打乱社区摘要,并将其分成预定大小的块。
- 这样可以确保相关信息分布在不同的块中,而不是集中在单个上下文窗口中(集中可能导致信息丢失)。
生成社区答案
- 并行生成每个块的中间答案。
- 要求LLM为每个生成的答案打分(0-100分),表示该答案对目标问题的帮助程度。
- 将得分为0的答案过滤掉。
汇总为全局答案
- 按照帮助分数从高到低排序中间答案。
- 迭代地将这些中间答案添加到一个新的上下文窗口,直到达到token限制。
- 使用这个最终上下文生成返回给用户的全局答案。
这种方法确保了在回答用户查询时,能够综合不同社区层次的信息,并且通过评分机制筛选出最有用的答案,从而生成一个详细且全面的全局答案。
论文实验解读
数据集及评价指标
数据集:
包含两个数据集:播客成绩单:大小:1669 × 600 token 文本块,块之间有 100 token 重叠。新闻文章:大小:3197 × 600 token 文本块,块之间有 100 token 重叠。
实验结果
待补充
论文结论解读
待补充