深度解析知识图谱增强的graphrag及医药案例
原创 kggpt 知识图谱科技 2024-03-09 10:37
本文重点讨论在实施复杂rag时涉及的各种技术考虑因素,包括分块、查询扩充、层次结构、多跳推理和知识图谱增强的概念以及医药行业的案例。同时讨论rag基础设施领域中尚未解决的问题和机遇,并介绍一些构建rag流水线的基础设施解决方案。
在构建rag系统时,首先面临的障碍和设计选择是如何准备文档以供存储和信息提取。这将是本文的主要重点。作为一个复习,这里是一个rag系统架构的概述。
source: https://blog.griddynamics.com/retrieval-augmented-generation-llm/
相关性和相似性
在讨论rag中的有效信息检索时,理解“相关性”和“相似性”的区别至关重要。相似性是指字词匹配方面的相似性,而相关性是关于思想的联系性。你可以使用矢量数据库查询来识别语义上相近的内容,但要识别和检索相关内容需要更复杂的工具。
当我们在下面探索各种rag技术时,这是一个重要的概念要牢记。如果你还没有看过llamaindex关于构建生产rag应用的有用视频,你应该去看一下。这对我们讨论各种rag系统开发技术是一个很好的启蒙讲解。
source: https://www.youtube.com/watch?v=trjq7t2ms5i&ab_channel=aiengineer
graphrag的技术实现
块分割策略
在自然语言处理的背景下,“块分割”是指将文本划分为小而简明、有意义的“块”。与大型文档相比,一个rag系统可以更快速准确地定位较小文本块中的相关上下文。
如何确保选择正确的块?您的块分割策略的有效性主要取决于这些块的质量和结构。
确定最佳块大小是要在获取所有关键信息的情况下维持速度的平衡。
尽管较大的块可以捕捉更多上下文信息,但它们会引入更多噪音并需要更多时间和计算成本来处理。较小的块噪音较少,但可能无法完全捕捉到必要的上下文。通过重叠块可以平衡这两个限制。通过重叠块,查询很可能在多个向量上检索到足够的相关数据以生成适当的上下文响应。
一个局限性是这种策略假设您必须检索的所有信息都可以在单个文档中找到。如果所需上下文分散在多个不同的文档中,您可能希望考虑利用文档层次结构和知识图谱等解决方案。
文档层次结构
文档层次结构是一种有效的组织数据的方式,能够提高信息检索效率。你可以将文档层次结构看作是rag系统的目录,它以一种结构化的方式组织分块数据,使得rag系统能够高效地检索和处理相关数据。文档层次结构在rag系统的有效性中发挥着至关重要的作用,它帮助llm决定哪些分块包含了最相关的数据供提取。
a document hierarchy — source: https://www.arcus.co/blog/rag-at-planet-scale
文档层次结构将数据块与节点关联,并在父子关系中组织节点。每个节点包含所包含信息的摘要,这使得rag系统能够快速遍历数据并理解应提取哪些数据块。
如果llm可以理解文档中的文字,为什么需要文档层次结构?
将文档层次结构视为目录或文件目录。虽然llm可以从向量数据库中提取相关文本块,但通过使用文档层次结构作为预处理步骤来定位最相关的文本块,可以提高检索的速度和可靠性。这种策略可以改善检索的可靠性、速度、可重复性,并有助于减少由于数据块提取问题而引起的错觉。构建文档层次结构可能需要特定领域的或特定问题的专业知识,以确保摘要与当前任务完全相关。
让我们以人力资源领域的一个使用案例为例。假设一家公司有10个办公室,每个办公室都有自己特定于该国的人力资源政策,但使用相同的模板来记录这些政策。因此,每个办公室的人力资源政策文件大致具有相同的格式,但每个部分都将详细介绍有关公共假期、医疗保健等的特定国家政策。
在向量数据库中,每个"公共假期"段落的块看起来非常相似。在这种情况下,使用文档层次结构,通过首先搜索与芝加哥办公室相关的文档,可以更可靠地回答关于芝加哥办公室公共假期的问题。
越来越清楚地,构建rag系统的大部分工作都在于理解非结构化数据,并添加额外的背景信息,以使llm能够进行更确定的信息提取。我认为这就像是我们需要向实习生提供的指导,以使他们能够在工作中理解数据的语料库。就像一个实习生一样,llm可以理解文件中的单词以及它们与所提出的问题之间的相似性,但它不知道如何组合各个原则来得出一种具有上下文的答案。
知识图谱
知识图谱是一种出色的数据框架,用于增强文档层次结构的一致性。知识图谱是概念和实体之间关系的确定性映射。与向量数据库中的相似度搜索不同,知识图谱可以一致而准确地检索相关的规则和概念,并大幅减少错觉。使用知识图谱来映射文档层级结构的好处在于,您可以将信息检索工作流映射为llm可以遵循的指令。(即要回答问题x,我知道我需要从文档a中提取信息,然后将x与文档b进行比较)。
知识图谱使用自然语言来映射关系,这意味着即使是非技术用户也可以构建和修改规则和关系,以控制其企业的rag系统。
例如,一个规则可以是:‘当回答有关请假政策的问题时,首先参考正确的办事处人力资源政策文件,然后在文件中检查关于假期的部分。’
an example of a knowledge graph. source: https://www.researchgate.net/figure/control-interfaces-for-knowledge-graph-and-hierarchy-more-details-in-sarrafzadeh-et-al_fig4_318764253
检索增强
查询扩充解决了糟糕表达问题的问题,这是我们在这里讨论的一个普遍问题。我们现在要解决的问题是确保对于缺少特定细微差别的问题,为了最大化相关性,给予适当的背景信息。
糟糕表达的问题往往是由于语言的复杂性引起的。例如,一个单词在使用的上下文中可能有两个不同的含义。正如carsales.au的人工智能主管agustinus所指出的,这主要是一个特定领域的问题。以这个例子为例:「炸鸡」更类似于「鸡汤」还是「炒饭」?答案因上下文而异。「如果关注的是原料,『炸鸡』与『鸡汤』更接近。但从准备的角度来看,它更接近『炒饭』。这样的解释是领域中心的。
如果你想用公司或领域特定的词来给llm提供背景信息呢?一个简单的例子是公司的首字母缩写(例如arp代表会计对账过程)。此外,考虑我们的一个客户,一个旅行社的更复杂的例子。作为一个旅行公司,我们的客户需要区分「靠近海滩」和「海滩前」这两个短语。对于大多数llms来说,这些术语几乎无法区分。然而,在旅行的背景下,海滩前的房子和靠近海滩的房子是完全不同的事情。我们的解决方案是通过预处理查询并添加公司特定的上下文来将「靠近海滩」的属性映射到一个特定的属性段,将「海滩前」的属性映射到另一个属性段。
查询规划
查询规划表示生成子问题的过程,以适当地将答案置于上下文中并产生全面回答原始问题。这个添加相关背景的过程在原则上类似于查询扩展。
让我们以一个问题为例:“哪个城市的人口最多?”为了回答这个问题,rag系统必须先生成以下子问题的答案,然后按人口对城市进行排名,如下图所示:
“多伦多的人口是多少?”
“芝加哥的人口是多少?”
“休斯顿的人口是多少?”
“波士顿的人口是多少?”
“亚特兰大的人口是多少?”
llamaindex使用这种策略以及其他方法来确定需要回答以回答顶层问题的相关子问题。llamaindex还利用了其他各种策略,这些策略在很大程度上是以上核心概念的变体。
这是llamaindex的“查询计划代理”用来识别子问题的代码片段。
'依赖关系': {'标题': '依赖关系',
“description”: “需要回答的子问题列表,以便回答“query_str”给出的问题。如果没有需要指定的子问题,则应为空,此时指定了“tool_name”。”
由于llm在缺乏辅助的情况下很难进行推理,所以子问题生成的主要挑战在于准确性:
“为了验证这种行为,我们使用llamaindex子问题查询引擎来实现了示例。与我们观察到的情况一致,该系统经常生成错误的子问题,并且还为这些子问题使用了错误的检索函数”——pramod chunduri在构建高级rag流水线时(2023年10月30日)
要明确的是,这不是对llamaindex的反思,而是对仅仅依靠llm进行推理所面临困难的反思。
我们可能需要外部推理结构和规则来强制执行某些原则和个人回答问题的方法,这些问题是通过生成或存储的子问题来解决的。当考虑到各行各业、公司或个人的偏好可能与llm的偏好不同时,这一挑战变得指数级增加。
让我们考虑一下关于城市人口问题的外部推理规则。当回答问题时,这个规则是用自然语言编写的,然后由llm代理阅读:
-
在考虑人口最多的城市时,请询问他们想要查看哪个洲,然后获取该洲的所有城市以比较人口。
这种方法的批评是它代表对推理过程的人工干预,而人们不可能为每个潜在问题想象每个单独的子问题。这是真实的。考虑到llms的现状,人们只应在llms失败时才寻求干预外部推理规则,而不应试图重新创造每个可能的子问题。
将所有内容组合到一个能够进行多跳推理和查询修改的rag系统中
在我们之前的文章中,我们讨论了复杂的多跳检索在复杂rag中的角色以及复杂rag可能在工作流程中出现的各种情况。以下是在构建多跳检索时出现的问题。
-
数据集成和质量:相互连接的数据源必须具有高质量、相关性和最新性。低质量或带偏见的数据可能导致不准确的多步骤结论。
-
情境理解和链接:系统不仅必须理解每个查询和子查询,还必须理解它们如何连接在一起形成一个连贯整体。这涉及到高级的自然语言理解,以辨别不同信息之间的微妙链接。
-
用户意图识别:识别用户潜在意图以及随着每次跳跃而如何演变是关键。系统应根据查询的演化性质调整其检索策略。这与查询增强有很大的重叠部分。
让我们以医学领域的一个例子来进行解构。在这篇文章中,wisecube提出了以下问题:“阿尔茨海默病治疗方面的最新进展是什么?”一个利用上述策略的rag系统将采取以下步骤:
查询规划:
-
“阿尔茨海默病的当前治疗方法和副作用有哪些?”
-
“关于这些治疗方法的最新研究是什么?”
查询增强:
-
“关于这些治疗方法的最新研究是什么?”借助知识图谱的访问,代理程序可以始终检索有关阿尔茨海默病治疗的结构化数据,比如“胆碱酯酶抑制剂”和“美金刚烷”。
-
然后,rag系统会将问题细化为“胆碱酯酶抑制剂和美金刚烷在阿尔茨海默病治疗中的最新研究是什么?”
文档层次和向量数据库检索:
-
使用文档层次结构,确定哪些文档和片段与“胆碱酯酶抑制剂”和“美金刚烷”最相关,并返回相关答案。
-
您还可以让llm将这些片段包含到潜在知识图谱中,以便随着时间的推移逐渐添加更多的上下文数据。然后,llm可以利用增强的潜在知识库(现在由结构化知识图谱)和新的增强查询再次进行向量数据库检索过程,以从向量数据库中检索更多相关信息,得到满意的答案。
-
关于使用llm“走向相关文档片段”的类似原则的一个例子,由greywing公司(ycw21)的首席技术官hrishi阐述。
增强回复:
作为后处理步骤,您还可以选择使用与医疗行业特定的知识图谱来增强后处理输出。例如,您可以包含一个针对美金刚烷治疗的默认健康警告,或者任何与这两种治疗方法或副作用相关的附加信息。
使用知识图谱而不是向量数据库进行查询增强的优势在于,知识图谱可以强制性地检索某些已知关系的关键主题和概念。在增强响应步骤中,rag系统可以自动包含某些警告或相关概念,这些警告或相关概念在回答中包含特定药物、疾病或概念时是必要的。这正是我们所进行的激动人心的工作类型。
rag中的未解决问题代表着未来的机遇
在短期内,有许多机会可以提高rag中的成本效率和准确性。这为开发更复杂的数据检索流程,提供更精确和资源有效的途径。
在长期内,存在着设计和存储可扩展的语义推理方法的重大机会。这涉及到探索知识表示的新领域,如复杂数据关系的高级编码技术和创新的存储解决方案。这些发展将使rag系统能够有效地管理和利用日益复杂的数据关系。
rag开发中的挑战
在我们的下一篇文章中,我们将回顾知识图谱在复杂rag和多跳过程中的具体实现技巧。
相关文章
-
towards data science: https://towardsdatascience.com/10-ways-to-improve-the-performance-of-retrieval-augmented-generation-systems-5fa2cee7cd5c
-
llamaindex: https://docs.llamaindex.ai/en/latest/getting_started/concepts.html#
-
better programming rag evaluation: https://betterprogramming.pub/exploring-end-to-end-evaluation-of-rag-pipelines-e4c03221429
-
neo4j rag and knowledge graphs: https://neo4j.com/developer-blog/fine-tuning-retrieval-augmented-generation/
-
pinecone’s rag with guardrails: https://www.pinecone.io/learn/fast-retrieval-augmented-generation/
发表评论