复杂RAG(检索增强生成)的入门介绍

2024/12/20 21:04:20

本文主要是介绍复杂RAG(检索增强生成)的入门介绍,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

如果你在寻找一个非技术性的RAG入门指南,包含入门问题解答及相关用例讨论,可以查看我们在这里对RAG的介绍这里。

在这篇文章中,我们讨论了在实现RAG的过程中各种技术考量,探讨了分块、查询增强、层级、多步推理和知识图等概念。我们还讨论了RAG基础设施领域待解决的问题及潜在机会,并介绍了一些构建RAG管道的基础设施方案。

构建一个检索和生成系统时,最先遇到的障碍和设计选择是如何准备文档以便存储和提取信息。本文主要将讨论这一点。

作为回顾,这里简单介绍一下RAG系统架构。

来源: https://blog.griddynamics.com/retrieval-augmented-generation-llm/

关联 vs 相似性

当我们讨论RAG中的有效信息检索时,理解“相关性”和“相似性”之间的区别至关重要。相似性是指词语匹配的相似性,而相关性是指想法之间的关联性。你可以利用向量数据库查询来找到语义上接近的内容,但识别和检索相关的内容则需要更先进的工具,

这是一个重要的概念,请记住这一点,当我们下面探讨各种RAG技术时。如果你还没看过,你可以看看Llamaindex关于如何构建生产RAG应用的视频,这对我们的RAG系统开发技术讨论很有帮助。

视频来源:https://www.youtube.com/watch?v=TRjq7t2Ms5I&ab_channel=AIEngineer(YouTube视频链接)

RAG的技术实现方法: 分段策略

在自然语言处理中,“分块”是指将文本分割成小的、简洁的、有意义的“片段”。相比于在大型文档中,RAG系统可以在较小的文本片段中更快、更准确地找到相关上下文。

你怎么确保你选的片段是正确的?你分块技巧的有效性很大程度上取决于片段的质量和结构。

这关乎找到一个平衡点——既要确保捕获所有关键信息,又不能牺牲速度。

虽然较大的片段可以捕获更多的上下文,但它们会带来更多的噪音,并且处理起来需要更多时间和计算资源。较小的片段噪音较少,但可能无法完全捕捉所需的上下文。重叠的片段是一种平衡这些限制的方法。通过重叠,查询可以从多个片段中找到足够的相关信息,从而生成一个恰当的上下文回答。

一个局限性是,这个策略假定您需要检索的所有信息都包含在一份文件里。如果需要的背景信息分散在多个文件中,你可能需要考虑使用文档结构和知识图谱等工具。

文档层级

文档层次结构是一种强大的方法,用于组织数据以提高信息检索的效果。你可以把文档层次结构想象成 RAG 系统的目录。它以结构化的方式组织数据块,使 RAG 系统可以高效地检索和处理相关内容。文档层次结构在 RAG 中起着关键作用,有助于提高其有效性。有助于 LLM 决定哪些数据块包含最相关的数据,以便提取。

文档层级结构 — 来源网址: https://www.arcus.co/blog/rag-at-planet-scale

文档层次结构将块与节点关联,并以父子关系组织节点。每个节点包含其内容的摘要,这使得检索和生成系统可以更快地遍历数据并确定要提取的块。

为什么要文档的层次结构,如果大型语言模型真的能理解文档里的文字?

可以将文档层级结构想象成目录或文件夹中的文件结构。虽然LLM可以从向量数据库中提取相关的文本片段,但通过将文档层级结构作为预处理步骤,可以更快、更可靠地定位最相关的文本片段。这种方法不仅提高了检索的速度和可靠性,还增加了重复性,并有助于减少因文本片段提取不当而产生的幻觉。构建文档层级结构可能需要特定领域的专业知识,以确保其摘要与当前任务完全相关。

让我们来看一个与人力资源相关的实际案例。假设一家公司有10个办事处,每个办事处都有符合当地规定的HR政策,但使用相同的模板来记录这些政策的具体内容。因此,每个办事处的人力资源政策文件格式大致相同,但每一部分都会详细列出当地的特别规定,例如比如公共假期和医疗保健等。

在向量数据库里,“公共假日”段落会非常相似的段落。在这种情况下,向量查询可能会检索到大量的重复且无用的数据,这可能会导致系统产生错误信息。使用文档层次结构,RAG系统可以首先查找与芝加哥办事处相关的文件,更可靠地回答有关芝加哥办事处公共假日的问题。

这应该会越来越清楚,构建一个RAG系统中大部分的工作是理解非结构化数据,并增加额外的上下文限制条件,使LLM能够更准确地提取信息。我认为这类似于给实习生提供的指导,告诉他们如何开始时通过数据集进行推理。就像实习生一样,LLM可以理解文档中的个别单词以及它们可能与问题有何相似之处,但它不知道如何根据基本原则来构造一个上下文相关的答案。

知识图

知识图谱是实现文档层级一致性的良好数据框架。知识图谱是概念和实体之间关系的确定性映射。与向量数据库中的相似性搜索不同,知识图谱能够一致且准确地找到相关规则和概念,并显著减少幻象。使用知识图谱来映射文档层级的好处在于,可以将信息检索的工作流程转换为LLM可以遵循的指令。(即,要回答X问题,我知道我需要从文档A中提取信息,然后将X与文档B进行对比)。

知识图谱用自然语言来描述关系,这意味着即使是非技术人员也可以构建和修改规则及关系以控制RAG系统。例如,这样的规则可能为:“当有人问到休假政策时,首先查阅正确办公室的人力资源政策文件,然后在文件中查找关于假期的内容。”

这是一个知识图谱的例子。来源网址:https://www.researchgate.net/figure/Control-interfaces-for-Knowledge-graph-and-Hierarchy-More-details-in-Sarrafzadeh-et-al_fig4_318764253

查询扩充

查询增强解决了RAG(检索增强生成)中常见的措辞不恰当的问题,因此我们在这里要解决的是,确保任何缺少具体细节的问题都能获得适当的上下文,以最大化相关性。(详见此处的讨论)

措辞不当的问题常常是由于语言的复杂性。例如,一个词在不同的上下文中可能具有完全不同的含义。正如 Agustinus(CarSales.AU 的 AI 负责人)所提到的,这是一个特定领域的问题。考虑一下这个例子:“炸鸡”更接近“鸡汤”还是“炒饭”?答案会根据上下文有所不同。从_食材_的角度看,“炸鸡”更接近“鸡汤”。但从_烹饪方法_的角度来看,“炸鸡”更接近“炒饭”。这样的解读具有很强的领域特定性。

如果你要让你的LLM理解和使用特定公司或领域的词汇呢?一个简单的例子是公司首字母缩写(例如ARP代表会计对账流程)。再来看我们一个客户,一家旅行社的更复杂例子。对于我们的旅行社客户来说,他们需要区分“靠近海滩”和“临海滩”的短语。大多数LLM会把这两个术语视为相同,但在旅游语境中,“临海滩的房屋”和“靠近海滩的房屋”是完全不同的概念。我们的解决方案是通过预处理查询,将“靠近海滩”的房产归类到一个特定的类别,而把“临海滩”的房产归类到另一个类别,从而添加公司特定的上下文来指代相应的类别。

查询计划

查询规划(Query Planning)指的是生成所需子问题的过程,这些子问题能正确提供上下文并生成答案,当这些答案结合起来时,能完整回答原始问题。这个增加上下文的过程在原理上类似于查询增强。

我们来看这样一个问题:“哪个城市的居民人数最多?”。为了回答这个问题,RAG系统必须生成答案来回答以下子问题,如图所示,然后按人口数量对城市进行排序,如图所示。

  • 多伦多人口是多少?
  • 芝加哥人口是多少?
  • 休斯顿人口是多少?
  • 波士顿人口是多少?
  • 亚特兰大人口是多少?

LlamaIndex 使用这些策略之一来确定它需要回答哪些相关sub-questions,以回答顶层问题。LlamaIndex 还采用各种其他strategies,这些策略大多是上述核心概念的变体或扩展。

下面的代码片段展示了LlamaIndex的查询规划代理使用这段代码来找出子问题。

‘dependencies’: {‘title’: ‘依赖项’,

‘description’: ‘需要回答的子问题列表,用以回答由 query_str 提供的问题。如果没有子问题,则该列表应为空,且将指定 tool_name。’,

大型语言模型在没有辅助的情况下在推理方面会有困难,因此生成子问题的主要挑战始终是准确性。

“为了验证这种行为,我们在LlamaIndex子问题查询引擎上实现了这个例子(代码链接)。正如我们观察到的,系统经常生成错误的子问题,并且错误地使用了检索函数。” — Pramod Chunduri 在构建高级RAG管道方面的见解 (2023年10月30日)

说清楚了,这并不是对LlamaIndex的批评,而是依赖大型语言模型进行推理时遇到的困难。

我们很可能需要外部推理结构和规则,以推行某些原则和个人的提问方式,通过生成和存储子问题来实现。考虑到每个行业、公司或个人的偏好可能与LLM的不同,这种情况下难度会呈指数级增加。

让我们考虑上述城市人口问题的外部的推理方法。该规则用自然说话的方式编写,然后由LLM代理在回答问题的时候读取。

当你考虑人口最多的城市时,问他们想看哪个洲,然后找到该洲内的所有城市比较人口。

这种方法受到批评,因为它代表了对推理过程的手动干预,而人们不可能预见每一个可能问题下的每一个子问题。这确实如此。鉴于目前大语言模型的状态,人们应在大语言模型失效时介入外部推理规则,而不是不应试图重新创建每一个可能的子问题。

将所有内容整合成一个能够执行多步推理和查询优化的RAG系统

在我们之前的文章中,我们讨论了复杂RAG中多跳检索的作用,以及复杂RAG可能出现的各种工作流程场景。这里将介绍构建多跳检索时可能出现的问题。

  • 数据集成与质量:至关重要的是,相互连接的数据源必须高质量且无偏,同时保持相关性和最新性。质量差或有偏差的数据会导致多步骤结论不准确。
  • 上下文理解和关联:系统不仅要理解每个查询和子查询,还要理解它们如何连接起来形成一个连贯的整体。这涉及高级的自然语言理解来识别不同信息之间的细微关联。
  • 用户意图识别:识别用户的潜在意图及其随着每次查询而演变的方式至关重要。系统应根据查询随时间演变的性质调整其检索策略。这与查询扩展高度重叠。

让我们通过一个来自医疗领域的例子来分析一下。在这篇文章《多跳问题回答:大型语言模型与知识图谱的结合》中,Wisecube 提出了以下问题:“阿尔茨海默病治疗方面有哪些最新的进展?”一个采用这些策略的RAG系统将会采取以下步骤:

查询计划:

  • “阿尔茨海默病目前的治疗方法有哪些,这些方法又有什么副作用?”
  • “这些治疗方法的最新研究进展如何?”
  • 另外,这些治疗方法的最新研究进展如何?

查询扩充:

  • “这些治疗方法的最新研究是什么?”通过知识图谱,代理可以持续获取有关阿尔茨海默病治疗的结构化数据,例如“胆碱酯酶抑制剂”和“美金刚”。
  • RAG系统然后将问题细化为“胆碱酯酶抑制剂和美金刚在阿尔茨海默病治疗中的最新研究是什么?”

文档层次结构和向量数据库检索技术。

  • 通过文档层级结构,识别与“胆碱酯酶抑制剂”和“美金刚”最相关的文档和段落,并返回相关答案。
  • 你还可以让一个大型语言模型把这些片段加入到它的知识库中,从而随着时间的推移不断增加上下文数据。然后,该语言模型可以再次执行向量数据库检索过程,利用增强的知识库(现在由知识图谱结构化)和新的增强查询,从向量数据库中检索更多相关的信息,从而给出满意的答案。
  • 用大型语言模型“走到相关的文档片段”的原理由Greywing(YCW21)的CTO Hrishi 阐述。

增强回复:

  • 作为后期处理步骤中的一个环节,您也可以选择这样做,使用针对医疗行业的知识图谱来增强后期处理结果。例如,您可以包含美金刚治疗相关的默认健康警告,或与这两种治疗和副作用相关的其他信息。

使用知识图谱进行查询增强的一个好处在于,知识图谱可以确保某些关键主题和概念在关系已知的情况下一致的检索。在响应增强步骤中,RAG系统可以自动包含某些必要的警告或相关概念,只要答案中涉及特定的药物、疾病或概念。这正是我们WhyHow.AI团队正在进行的令人兴奋的工作。

RAG中未解决的问题,代表未来的机遇

从短期来看,有许多机会可以降低成本并提高准确性。这为开发更高级且资源高效的检索过程(即更精准的数据检索过程)开辟了途径,其中RAG(检索和加权检索)是一个关键因素。

长期来看,存在重要的机会来设计方法以可扩展的方式构建和存储语义推理。这涉及探索知识表示的新领域,例如用于表达复杂数据关系的高级编码技术以及创新的存储方案。这些发展将使RAG系统能够更有效地管理和利用日益复杂的数据。

RAG开发面临的挑战

在我们下一篇文章中,我们将回顾知识图谱在复杂检索增强生成(RAG)和多跳流程中的具体实现方法。

WhyHow.AI 正在构建工具,以帮助开发人员通过图结构在 RAG 流程中增加更多的确定性和控制。如果您正在考虑、实施或将知识图谱纳入 RAG 流程,欢迎通过 team@whyhow.ai 与我们交流,或通过 WhyHow.AI 订阅我们的新闻通讯。加入我们在 新创建的 Discord 服务器 上关于规则、确定性以及知识图谱在 RAG 中的应用讨论。

可读的文章

  • 数据科学社区: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 (更好编程):https://betterprogramming.pub/exploring-end-to-end-evaluation-of-rag-pipelines-e4c03221429
  • Neo4j 中的 RAG 与知识图谱:https://neo4j.com/developer-blog/fine-tuning-retrieval-augmented-generation/
  • Pinecone 的 RAG 与保障措施:https://www.pinecone.io/learn/fast-retrieval-augmented-generation/


这篇关于复杂RAG(检索增强生成)的入门介绍的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程