支持私有化部署
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


Graph RAG 优化实践

发布日期:2024-12-13 12:10:46 浏览次数: 2206 作者:亚信科技新技术探索

摘要:随着大型语言模型(LLMs)在自然语言处理和自然语言生成领域的广泛应用,检索增强生成(RAG)技术已成为一种高效的方法,它能够从外部知识库中检索相关信息,以精确回应用户的问题。但是,在面对用户提出的全局性问题时,RAG的表现往往难以满足预期,微软公司提出了一种创新的RAG方法——“Graph RAG”,该方法通过利用LLMs构建知识图谱,并生成全局性的社区摘要,以助力解答用户的全局性问题。然而,在行业场景中应用Graph RAG时,仍需进行适配与优化,以确保其效果。本文将详细介绍如何在现有Graph RAG的基础上进行优化,并展示优化后的效果表现。


背景介绍


随着大语言模型(LLMs)在自然语言处理和自然语言生成任务中的广泛应用,检索增强生成(RAG)成为从外部知识源中检索相关信息并精确回答用户问题的有效方法。RAG方法适用于答案存在于某些特定的文本片段中的场景,通过检索这些片段来为答案生成提供足够的依据,使LLMs能够基于行业场景或之前未见过的知识内容来回答用户的问题。但是,面对用户的全局性问题时,RAG的表现往往不尽如人意。


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


为了解决这一问题,微软提出了一种新颖的RAG方法 - “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全局问答时,Graph RAG使用LLMs以各社区摘要为媒介通过Map-Reduce方法来回答用户的全局性问题。其中,map操作是独立地使用每一个社区摘要或多个相关联的社区摘要组来回答用户的问题,而reduce操作则将所有map操作生成的部分答案总结为一个最终的答案。


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


Graph RAG项目执行方法


对于微软开源的Graph RAG项目,可通过如下方法进行执行:


Step1:安装graphrag


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



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


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



Step3:下载输入文档


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



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


Step4:初始化项目执行配置


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



初始化操作将生成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文件后,即可执行如下命令进行知识图谱构建:



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


Graph RAG项目优化


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


(一)文本块切分优化


当前Graph RAG项目采用“固定大小分块”的策略对输入文档进行切分,导致切分结果可能只包含部分句子或段落,上下文信息存在丢失。大模型在处理单个文本块时可能无法拥有完整的语义信息,以至于实体、边的信息抽取效果不理想,影响整个知识图谱的质量及问答效果。


同时,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:边信息补全

53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询