论文标题:From Local to Global: A Graph RAG Approach to
Query-Focused Summarization
论文作者:Darren Edge、Ha Trinh、Newman Cheng、Joshua Bradley、Alex Chao、Apurva Mody、Steven Truitt
论文地址:https://arxiv.org/pdf/2404.16130
代码地址:https://github.com/microsoft/graphrag
摘要
检索增强生成(RAG)通过从外部知识源检索相关的信息,使得大型语言模型(LLMs)能够回答私有的或之前未见的文档集合中的问题。然而,RAG在全局问题上会失败,这些问题是针对整个文本语料库提出的问题,如“数据集的主要主题是什么?”,因为这本质上是一个Query-Focused Summarization (QFS)任务,而不是明确的检索任务。先前的QFS方法,同时无法扩展到通常RAG系统中索引的文本量。为了结合这两种方法的优点,我们提出了一种基于图的RAG方法,该方法能够在私有文本语料库上进行问题回答,并且能够随着用户问题的普适性和源文本量的扩展进行扩展。我们提议的方法将使用LLM在两个阶段构建基于文本的图表式索引: 首先从源文档中推导出实体知识图谱,然后为所有密切相关实体的所有社区预生成社区摘要。在收到一个问题后,每个社区摘要将用来生成一个部分响应,然后所有部分响应再被总结为给用户的最终响应。对于1百万个token的数据集上的一类全局应用场景理解问题,我们展示Graph RAG相对朴素RAG基线在生成答案的全面性和多样性方面能够带来显著的提升。我们将会开源基于Python的Graph RAG的全局和局部实施,详细信息可以在https://aka.ms/graphrag看到。
介绍
检索增强生成(RAG,Lewis等人,2020年)是回答用户问题时处理整个数据集的一种成熟方法,但这个方法设计的初衷是答案包含在文本的局部区域中,这些区域的检索对于生成任务提供了足够的背景知识这样的场景。相比之下,更恰当的任务框架是查询指向的摘要(QFS,Dang, 2006),特别是查询指向的抽象概括,这种概括生成自然语言摘要,而不是简单的拼接摘录(Baumel等,2018;Laskar等,2020;Yao等,2017)。然而,在最近几年里,关于归约任务能否抽象概括以及是否需要摘录,是具有一般性的还是针对特定查询,是一篇文档的处理还是多篇文档的汇总这样的区别变得不那么重要了。尽管早期利用transformer架构取得了显著的提升,使其在所有这类摘要任务上超越了当时的最佳水平(Goodwin等人,2020年;Laskar等人,2022年;Liu和Lapata,2019年),但是当今最先进的语言模型,包括GPT系列(Achiam等人,2023年;Brown等人,2020年),Llama系列(Touvron等人,2023年)和Gemini系列(Anil等人,2023年),使用上下文学习不仅可以概括其上下文窗口内的任何内容,而且现在已将这些任务简化为一种轻而易举的工作。
然而,在整个语料库上进行以查询为中心的抽象摘要仍然是一个挑战。如此大量的文本内容往往远远超过了LLM上下文窗口的限制,而且,即便是扩大这样的窗口也不足以解决一个问题,这个问题是:在更长的上下文中,信息可能在中间部分“丢失”(Kuratov等人,2024年;Liu等人,2023年)。此外,虽然初级RAG直接检索文本片段可能不足以支持QFS任务,但通过一种辅助的预索引方法,有可能支持一个专为全局概括设计的新RAG方法。
在这篇论文中,我们提出了一种基于LLM生成知识图谱的全局总结的Graph RAG方法。与相关工作利用了图形索引结构化检索和遍历能力(第4.2节)的特点不同,我们关注的是一种此前未被探讨的图的质量特性:它们内置的模块性(Newman, 2006),以及社区检测算法将图划分成紧密相关的节点组成的模块化社区的能力(例如,Louvain, Blondel等人,2008年;Leiden, Traag等人,2019年)。使用LLM生成的社区描述的摘要全面涵盖了底层图索引和它表示的输入文档。使用map-reduce方法的回答问题集中归概括整个文档集合成为可能:首先,使用每个社区概括独立地、并行地针对查询回答,然后,将所有相关的部分答案汇总成最终的全局答案。
Graph RAG Approach & Pipeline
我们现在逐层拆解Graph RAG方法的高层数据流与流程,描述每一步骤的核心设计参数、技术与实现细节。
Source Documents →Text Chunks
一个基本的设计决策是在多大程度上将从源文档中提取的文本划分为小段进行处理。在接下来的步骤中,这些片段将会被传递给一套专门设计的LLM提示,用于提取图索引的各个元素。较长的文本片段需要较少的 LLM 调用进行提取,但会遭受较长LLM上下文窗口的召回降级(Kuratov等人,2024年;Liu等人,2023年)。在一次提取循环的情况下(即,没有获取的情况下),这种行为在图2是可以观察到的:在样本数据集(HotPotQA, Yang等人, 2018年)上,使用600个token的块大小提取了几乎两倍的数量实体引用,相较于使用2400个token的块大小。虽然提取更多引用通常更好,但对于目标活动,任何提取过程都需要平衡召回率和精确率。
Text Chunks → Element Instances
这一步骤的基本要求是,从每一部分源文本中识别并提取图的节点和边实例。我们使用一个多部分大型语言模型(LLM)提示来进行以下操作:首先识别文本中的所有实体,包括它们的名字、类型和描述,然后再找出所有相关实体之间的关系,包括源实体和目标实体以及它们关系的描述。这两种元素实例被输出为一个包含分隔符的单个列表的元组。将此提示应用于文档集合领域的首要机会在于选择有限训练示例以供LLM进行上下文学习(Brown等人,2020)。
例如,尽管我们默认的提示用于提取人、地点和组织这类广泛的实体类,但在科学、医学、法律等领域需要专业知识时,则会从这些专门的领域中受益,我们需要具体到这些领域的少量示例。我们也支持一个次要的提取提示,用于提取我们希望与提取的节点实例关联的任何额外变量。我们默认的附带提示旨在提取检测到的实体所关联的声明,包括主题、对象、类型、描述、文本跨度以及开始和结束日期。
为了平衡效率和质量的需求,我们通过多轮“筛选”,最多至指定的最大轮次,促使大型语言模型(Large Language Model,LLM)发现并识别之前提取过程可能遗漏的实体。这是一个多阶段的过程,我们首先请求LLM评估是否所有实体都被提取出来,使用一个logit偏置of 100来强迫其作出是否全部已提取的明确回答。如果LLM回应说遗漏了实体,我们将通过提示“许多实体在上一次的提取中被遗漏”来鼓励LLM识别这些遗漏的实体。这一方法允许我们在不降低质量(如图2所示)或人为引入噪音的情况下,使用更大的片段大小。
Element Instances → Element Summaries
将LLM用于“提取”源文本中实体、关系和声明的描述,这已经是一种归约总结的形式,依赖于LLM生成独立有意义的摘要,以概括文本可能暗示但并未明确表述的概念(例如,暗示的关系存在)。将所有这些实例级别的摘要转化为每个图形元素(即实体节点、关系边和声明指标)的单一描述性文本块,需要对匹配的实例组进行额外的LLM总结。
在这个阶段,潜在的问题是,LLM可能不会在文本格式中一致地提取到相同的实体引用,这会导致实体图中出现重复的实体元素,从而产生重复的节点。然而,考虑到接下来的步骤中,所有紧密相关的实体群将被检测并总结出来,且给定LLM能够理解在不同名称形式背后的共同实体,我们的整体方法对于这些名称形式的变异性具有强健性,前提是有足够的连接,将所有变体连接到一组紧密相关的共享实体上。
总的来说,我们在潜在嘈杂的图结构中对同质节点使用丰富描述性文本的做法,既符合大语言模型的能力,也满足了全局范围内问题驱动式摘要的需求。这些特性也让我们的图索引与其他依赖简洁一致的知识三元组(主题、谓词、对象)进行下游推理任务的知识图谱有所不同。
Element Summaries → Graph Communities
在上一步中创建的索引可以被建模为一个同质无向加权图形,其中实体节点由关系边连接,边的权重代表检测到的关系实例的规范化计数。对于这样的图,可以使用多种社区检测算法来将图划分为社区,这些社区内的节点与其他图中的节点相比具有更强的连接(例如,请参阅Fortunato, 2010和Jin等人, 2021的综述)。
在我们的pipeline中,我们使用Leiden(Traag等人,2019年)的原因在于它能够有效处理大型图的层次社区结构(图3)。该层次结构的每一层都提供了一个互斥的社区分割,涵盖图中的所有节点,而且是完全包含的,这使得能够对全局进行分而治之的总结。
Graph Communities → Community Summaries
下一步是创建Leiden层次结构中每个社区的报告式摘要,使用一种旨在处理非常大数据集的方法。这些概要在自己独立存在时非常有用,有助于理解数据集的全局结构和语义, 并且在没有特定问题的情况下,人们也可以用它们来理解一组文本材料的含义。这意味着,即使没有特定问题的指引,这些概要也能够提供对数据集的整体框架和语义的理解帮助, 从而在处理一组文本材料时提供线索和思考的基础。例如,用户可以在较高层次浏览社区摘要,寻找感兴趣的普遍主题,然后通过链接深入到较低层次的报告,获取每个子话题的更详细信息。然而,在这里,我们专注于它们作为基于图的索引的一部分的实用性,该索引用于回答全局查询。
社区摘要按以下方式生成:
叶级社区。对于叶级社区(节点、边、属性)的元素摘要,将按照优先级进行排序,然后在上下文窗口(LLM)达到字符限制前,依次添加到上下文窗口中。排序的原则是:对社区中的每一边,按照源节点和目标节点的合计度数(即它们的显要性)递减的顺序,添加源节点、目标节点、关联属性,以及这条边的描述。
高层级社区。如果所有元素概括都能适配到上下文窗口的token限制内,就按照针对叶层级社区的方法,对社区内的所有元素概括进行汇总。反之,按照元素概要的token数量降序,对子社区进行排序,然后依次替换子社区概要(较短)以替代其对应的元素概括(较长),直至达到适配上下文窗口的目标。
Community Summaries → Community Answers → Global Answer
给定一个用户查询,可以使用上一步生成的社区摘要,在多阶段过程中生成最终答案。社区结构的层级性质意味着,问题可以通过不同级别的社区概览形式来回答,这引发了一个问题:在层级社区结构中的特定级别是否能提供最佳平衡,既包含细致的概览细节,又覆盖广泛的知识解析问题(在第3部分中评估)。
对于给定的社区级别,任何用户查询的全局答案生成如下:
*准备社区摘要。*社区摘要随机洗牌并分成预设token大小的片段。这确保相关的信息分布在各个片段中,而不是集中在单一的上下文窗口中,从而可能丢失部分关键信息。
*将社区答案映射整合。*生成阶段性的答案,为每一个分块都产生一个。同时,要求LLM为生成的答案提供0-100的分数,表示该答案在回答目标问题时的有用程度。分数为0的答案将被过滤掉。
*归纳为全局答案。*将中间社区答案按照有用度评分降序排列,然后逐步添加到新的上下文窗口中,直至达到令牌限制。生成最终上下文作为返回给用户的全局答案。
Conclusion
我们提供了一个全局性的方法,将知识图谱生成、检索增强生成(RAG)以及查询定向摘要(QFS)结合起来,以便在全文本语料库上支持人类的理解。初步评估显示,与基础的记忆型文本参照系统相比,在完整性和答案多样性方面,改进是显著的。同时,这种方法与一种不依赖图而是通过分布式计算方式汇总源文本的全球性方法相比较,表现出了可喜的正面评价。对于需要对同一数据集进行大量全局查询的情况,基于实体的图索引中根级社区的摘要提供了一种数据索引,相较于简单的关系图进行的查询,其效果更优秀,且与其它全局方法相比,在消耗的资源(如token)上至少降低了一个数量级,从而实现了更好的性能。因此,此方法特别适用于资源有限或者查询密集型应用,能显著提升数据查询的效率和响应速度,同时保持较高的查询准确率。
即将在 https://aka.ms/graphrag 上发布一个开源的、基于Python的全局和局部Graph RAG方法实现。