游乐游手机版
首页/AI热点日报/热点详情

Graph RAG 优化实践方法

类型:热点整理2026-06-28
GraphRAG利用大语言模型构建知识图谱与社区摘要,解决传统检索增强生成在全局性问题上的不足。针对行业应用,从文本切分、提示词、实体抽取准确率及信息补全四方面优化。在通信套餐推荐场景的验证表明,优化后系统有效提升了问答质量与准确性。

先说几个核心判断:大语言模型(LLMs)在自然语言处理和生成领域的能力,已经让检索增强生成(RAG)成为从外部知识库中精准回答用户问题的关键方法。RAG的核心思路,就是用检索召回和问题最相关的几个片段,直接扔给大模型去生成答案。这个方法在大部分“局部性”问题上表现不错——答案就藏在某几个文档片段里。但一旦遇到“全局性问题”,RAG就容易露怯了。

举个例子——“这10篇文档到底讲了啥?” 这种问题本质上是面向查询的摘要生成(QFS),答案需要综合多个文档的内容。而RAG检索回来的片段,往往只覆盖了一部分信息,再加上大模型面对海量文本时,也很难精准提取和问题紧密相关的内容。因此,用RAG来回答这类QFS任务,效果通常不尽如人意。

为了解决这一难题,微软提出了一个新颖的方案——Graph RAG。它的核心思路是用LLMs构建知识图谱,并生成全局性的社区摘要,专门用于回答那些需要综合多篇文档的全局性问题。而对于传统RAG擅长的局部检索任务,Graph RAG也能通过embedding召回图谱中的节点,达到相当的表现。

本文基于微软的论文[1]及开源项目[2],详细梳理Graph RAG的实现流程、项目执行方法,并结合行业应用场景,重点讨论如何优化以提升问答效果。

背景介绍

随着LLMs在自然语言处理与生成任务中的广泛应用,RAG已成为从外部知识源中检索相关信息并精确回答用户问题的有效方法。RAG适用于答案存在于特定文本片段中的场景——通过检索这些片段,为LLMs提供充分的生成依据,使其能够基于行业场景或未见过的知识内容作答。但当用户提出全局性问题时,RAG的表现往往不尽如人意。

比如说:“提供的这10篇文档的主要主题是什么?” 这类问题本质上更符合面向查询的摘要生成(QFS),答案通常需要综合多个文档的内容。然而,RAG检索并召回的文本片段,几乎无法涵盖所有相关信息。此外,LLMs在应对海量文本时,也难以有效提取出与问题高度相关的内容。因此,用RAG来回答此类QFS任务,效果往往不理想。

为了解决这一问题,微软提出了Graph RAG。该方法利用LLMs构建知识图谱,并生成全局性社区摘要,帮助回答用户的全局性问题。对于传统RAG擅长的基于特定文档内容的检索与生成任务,Graph RAG则通过embedding召回图谱中的节点,实现与传统RAG相当的效果。

本文基于微软的论文[1]及开源项目[2],介绍Graph RAG的实现流程、项目执行方法、基于行业应用场景的优化策略以及优化后的效果。

Graph RAG实现流程介绍

图1:Graph RAG 实现流程

Graph RAG的实现流程如图1所示。紫色高亮部分表示知识图谱的构建流程,绿色高亮部分则为全局问答的实现。

在知识图谱构建过程中,Graph RAG基于以下5个工作流,借助LLMs逐步构建知识图谱:

  • 文本切分:将用户输入的文档按特定的文本块大小(chunk_size)、重叠大小(chunk_overlap)划分为多个文本块,以便后续处理。
  • 图谱信息提取:LLMs基于预设的实体类型,通过少样本提示词从每个文本块中识别并提取图谱节点和边的信息。
  • 图谱元素信息总结:在上一步实体信息提取流程中,LLMs可能会从多个文本块中提取出名称相同但描述不同的实体。为此,额外使用LLMs对这些提取出的实体和边信息进行抽象总结,生成简明且统一的综合性文本描述。
  • 图谱构建与社区划分:在获得综合性的实体信息描述后,Graph RAG基于抽取到的实体、边信息构建知识图谱。并在此知识图谱之上,使用Leiden社区检测算法将图谱划分为若干个社区,形成图谱的层次结构,为后续的全局问答提供基础。
  • 社区报告生成:对Leiden社区层次结构中的每个社区生成报告式摘要,完成知识图谱构建。

在进行Graph RAG全局问答时,系统以各社区摘要为媒介,通过Map-Reduce方法来回答用户的全局性问题。map操作是独立地使用每一个社区摘要或多个相关联的社区摘要组来回答用户的问题,而reduce操作则将所有map操作生成的部分答案总结为一个最终的答案。

在进行Graph RAG局部问答时,系统则使用embedding模型从知识图谱中召回相关节点,基于节点中的实体信息进行rag生成,回答用户的问题。

Graph RAG项目执行方法

对于微软开源的Graph RAG项目,执行步骤如下:

Step1:安装graphrag

首先,安装graphrag库。该核心库提供了所有必要的功能来执行Graph RAG。可以通过以下命令进行安装:

pip install graphrag

Step2:创建项目执行目录、输入目录

接下来,为项目创建一个执行目录及输入目录。例如,执行下面的命令,创建一个名为 ragtest 的项目执行目录,并在其中创建一个 input 子目录,作为输入目录用于存放用户输入的文档:

mkdir -p ./ragtest/input

Step3:下载输入文档

为了测试项目,可以下载并使用公开的文本文件作为用户输入的文档,将其保存到刚刚创建的 input 目录中:

curl https://example.com/sample.txt -o ./ragtest/input/sample.txt

在实际使用Graph RAG时,需将特定应用场景下的输入文档放置于输入目录下,以执行图谱构建及Graph RAG问答。

Step4:初始化项目执行配置

完成上述步骤后,执行下面的命令来初始化:

graphrag init --root ./ragtest

初始化操作将生成Graph RAG项目的执行配置文件(settings.yaml)、存放各工作流所用提示词的文件夹及默认提示词等。

所生成的settings.yaml如图2所示,文件中包含了执行Graph RAG项目所需的各种配置信息,包括:大模型API、大模型生成参数、embedding模型API、项目执行的并发数量以及实体抽取类型等。

项目默认使用OpenAI的gpt-4-turbo-preview作为Graph RAG执行时所用的大模型,并采用text-embedding-3-small作为embedding模型。对于使用开源模型进行项目执行的情况,可以使用Ollama、vLLM等开源框架,基于开源模型启动类OpenAI输入格式的API服务,并在settings.yaml中修改相应配置,以实现基于开源模型的Graph RAG。

图2:settings.yaml 文件示例

Step5:知识图谱构建

在完成配置settings.yaml文件后,即可执行如下命令进行知识图谱构建:

graphrag index --root ./ragtest

在完成Graph RAG构建工作流后,就能基于构建好的知识图谱及社区摘要报告进行Graph RAG全局及局部问答。

Graph RAG项目优化

为了进一步提升Graph RAG在行业应用场景中的生成效果,我们在Graph RAG的执行工作流中提出了以下4个优化策略,以提升全局问答及局部问答的表现。

(一)文本块切分优化

Graph RAG默认采用“固定大小分块”的策略对输入文档进行切分。这种方法虽然简单,但也有不少槽点:切分结果可能只包含部分句子或段落,上下文信息严重丢失。大模型在处理单个文本块时,无法获得完整的语义信息,实体、边的信息抽取效果自然不理想,最终影响整个知识图谱的质量及问答效果。

同时,Graph RAG对所有输入文档使用相同的切分配置。这显然不合理。不同类型的文档对块大小的要求完全不同:较短的块可能适合处理简短、分散的信息,但用在长篇叙述的文档上,就很容易截断关键内容。较大的块虽然能减少上下文丢失,但单文本块内容过多,又可能超过模型的输入限制。想找一个“万能”的块大小,几乎不可能。

此外,大多数文档还存在上下文关联丢失的问题。当文档被切分成多个独立的文本块时,块之间的语义联系和关联关系变得模糊。例如,文档在前面介绍某个手机套餐,后续部分提到该套餐的增值服务时,却再也没有提及套餐名称。这让后续文本块中的信息难以与前文关联起来。

针对这些局限性,我们提出了更优的文本切分方法。具体来说,使用常见的中文标点符号对输入文档实现递归、动态切分,使得切分后的文本块内容具有较高的语义完整性和连贯性。为了缓解上下文关联丢失的问题,我们还提出了一种基于文档层次结构的标题补全策略,将前文标题补全到每个文本块中,有效将前文信息与后续文本块关联起来,帮助大模型在执行生成任务时更好地理解文本的语境,提升实体、边信息抽取的准确性和一致性。

(二)提示词优化

完成Graph RAG项目的初始化后,项目会提供一套默认的提示词以执行工作流。但问题是,默认提示词均为英文。使用这些提示词进行Graph RAG,结果中很可能出现中英混合输出,甚至完全以英文呈现。

为了提升生成结果的可读性,我们将提示词转译为中文,并进行了应用场景适配。项目的默认提示词提供了一系列少样本提示词来指导大模型进行实体、边以及社区报告的生成。为了更好地满足特定行业的应用需求,我们针对具有代表性的输入文档,提供了贴合实体及实体间关系、更贴合应用场景的社区报告few-shot示例。并在提示词部分,引导大模型在生成时关注并准确呈现这些关键信息。

(三)实体抽取准确率提升

在实践中,即使提示词经过优化,大模型在进行实体抽取时仍存在一些问题。比如:实体名称与实体类型一致;实体类型与实体名称倒置;生成不在原文中的虚假实体名称,也就是“幻觉”实体。

对于实体名称与实体类型一致的问题,我们增加了对三元组的判断,对这类抽取结果直接剔除。对于实体类型与名称倒置的错误,则进行位置调换,恢复正确的实体抽取结构。而对于大模型产生的幻觉实体,我们采用了深度学习模型进行评估,识别并剔除这些幻觉实体,有效应对了大模型的幻觉现象。

(四)实体信息补全

在Graph RAG项目中,实体和边的信息抽取使用的是同一套提示词。大模型根据输入文本块,一次性提取出文本块中的实体信息及其之间的关系,以构建知识图谱中的节点和边。

完成实体信息抽取后,项目提供了一种实体信息补全方法:通过一个实体信息补全提示词,让大模型基于历史抽取的实体和边信息、以及原始输入文本块,自我判断缺失实体并实现补全。

但在实际应用中,这个补全方法的效果并不理想。因为补全提示词相对简单,加上大模型能力有限,模型很难基于历史抽取结果和输入文本识别出未抽取的实体并进行补全。更多时候,大模型只是在重复或以不同的表述方式呈现相同的实体和边信息。

为此,我们提出了一种大、小模型结合的方法来实现更有效的补全。利用大、小模型同时执行实体信息抽取任务,小模型辅助大模型进行实体信息补全,避免了大模型自我反思难、执行效率低的问题。

此外,当边中的主、客实体未能被有效抽取时,系统会创建一个实体类型和描述均为“空”的占位实体,以确保图谱结构的完整性。但这种补全方式并不利于知识图谱质量的提升。因此,在大模型完成上述抽取流程后,我们还额外引导大模型补全缺失的实体并更新知识图谱,进一步提升了知识图谱的完整性和准确性。

Graph RAG效果验证

为了验证上述优化方法的有效性,我们在通信运营商套餐推荐场景中进行了实验。针对通信运营商套餐设计了一系列全局问答问题,通过人工评估对比优化前后Graph RAG系统的生成质量。

如表1所示,优化后的Graph RAG系统在行业应用场景下的评分表现优于优化前的系统。如图3所示,当用户希望通过Graph RAG系统为女儿推荐一个月费低于50元的手机套餐时,优化前的系统生成的回答(如左侧示例)存在以下问题:首先,回答中间出现了中英混合的输出,影响了内容的可阅读性;其次,生成结果包含大模型虚构的套餐(如“Star Card”)以及错误的推荐信息(如“爱心卡(语音版)”,该套餐虽然月租低于50元,但仅限残疾人办理)。根据Graph RAG测试文档,39元档的“畅玩卡”套餐是唯一符合用户需求的选项。优化后的Graph RAG系统则提供了有效、准确的套餐推荐。

表1:Graph RAG系统对比

图3:Graph RAG系统调用示例

通过进一步分析Graph RAG系统中各个工作流的输出结果,可以更直观地了解优化方法对系统带来的改进。首先,在文本块切分工作流中,引入优化后的文本块切分方法后,如图4所示,每个文本块包含的token数量(即图中的n_tokens值)是动态的。同时,前文的标题结构也被引入到每个文本块的开头,确保了切分后的文本块保留一定的上下文信息。如图5优化前后的文本块内容对比所示,优化前的文本块切分方法强行截断了“套餐超出资费”的描述内容。而优化后的切分方法则能有效保留完整内容,避免了不必要的断句问题。

图4:优化后Graph RAG系统的文本块切分结果

图5:文本块切分方法对比

对于优化前的Graph RAG系统,当文本块切分存在问题,实体信息被错误拆分或被割裂时,错误的切分结果会造成提取到的实体信息与文档中的实际信息不符。例如,如图6所示,优化前的切分方法将“5G畅享套餐”切分为了“G畅享套餐”,以至于大模型提取到的实体为“G畅享套餐”。而经过优化后的文本切分方法,语义连贯性得以保留,确保抽取到的套餐信息与原始文档一致。

图6:文本块切分方法对实体信息抽取的影响

同时,如图7中的对比结果所示,该示例中的文本块内容属于“5G畅享套餐”的相关介绍。当文本块中缺乏与之相关的前文信息时,大模型在进行实体抽取时,会误判整个文本块内容描述的是“5G畅享云套餐”,将文本块中所有的套餐信息与之相关联。而在引入标题信息后,大模型能够将前文的信息与当前文本块关联,从而提高实体抽取的准确性。

图7:引入前文标题信息对套餐名称抽取结果的影响

此外,通过对实体抽取工作流的抽取结果进行分析,可以发现优化前的Graph RAG系统难以准确按用户需求提取实体,抽取结果中存在中英混杂、未按预设实体类型抽取、实体类型为空的情况(见图8中优化前Graph RAG系统的实体抽取示例)。而优化后的系统有效解决了上述问题,如图11优化后的抽取结果,相同的实体,抽取结果更加符合预期。

图8:优化前后Graph RAG系统的实体抽取示例

更进一步,对于图9中展示的文本块内容,爱心卡套餐并未提及套餐的受理渠道,但大模型的抽取结果默认其受理渠道为线上及线下渠道。我们通过模型对抽取结果进行评估,将评分结果为负分的实体判定为幻觉实体,有效剔除了类似于示例中的幻觉实体。

图9:幻觉实体示例

最后,在知识图谱构建过程中,图10中的优化前示例展示了边抽取结果中包含了“畅玩卡套餐”这一主实体信息,但实体抽取结果中却未能捕捉该实体。因此,优化前的系统在构建知识图谱时会自动补充一个空的“畅玩卡套餐”实体。而在优化后的Graph RAG系统中,从图10的优化后示例可以看出,缺失的实体得以有效补全,生成了质量更高的知识图谱。

图10:边信息补全

来源:https://www.53ai.com/news/RAG/2024121375846.html

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。