当前位置:   article > 正文

用通俗易懂的方式讲解:一文详解大模型 RAG 模块_大模型rag

大模型rag

什么是 RAG?

RAG 技术是一种检索增强生成的方法,结合了大型语言模型和检索系统的优势,以提高生成内容的准确性、相关性和时效性。

图片

相比于仅依赖大型语言模型的生成,RAG技术可以从外部知识库中检索信息,避免了模型的幻觉问题,并提升了对实时性要求较高问题的处理能力。与传统的知识库问答系统相比,RAG技术更加灵活,可以处理非结构化的自然语言文本。

图片

RAG并非旨在取代已有的知识库问答系统,而是作为一种补充,强调实时性和准确性,并且通过结合生成和检索机制来提升自然语言处理任务的效果。

技术交流&资料

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

成立了大模型技术交流群,本文完整代码、相关资料、技术交流&答疑,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:来自CSDN + 技术交流

通俗易懂讲解大模型系列

RAG模块化

模块化RAG呈现出一种高度可扩展的范式,将RAG系统划分为模块类型、模块和运算符三层结构。每种模块类型代表着RAG系统中的一个核心流程,包含多个功能模块。

图片

每个功能模块又包含多个具体的运算符。整个RAG系统变成了多个模块和相应运算符的排列组合,形成我们所说的RAG流程。在流程中,可以在每个模块类型中选择不同的功能模块,在每个功能模块内部,又可以选择一个或多个运算符。

什么是模块化RAG?

图片

模块化RAG是指检索增强生成技术的一种演进形式,其进展带来了更加多样化和灵活的过程,具体体现在以下关键方面:

  1. 增强数据获取:RAG已经超越了传统的非结构化数据,现在包括半结构化和结构化数据,在预处理结构化数据方面更加关注,以改善检索并减少模型对外部知识来源的依赖。

  2. 整合技术:RAG正在整合其他技术,包括微调、适配器模块和强化学习,以增强检索能力。

  3. 可适应的检索过程:检索过程已经发展到支持多轮检索增强,利用检索内容来指导生成,反之亦然。此外,自主判断和LLM的使用增加了通过确定检索的需求来回答问题的效率。

索引模块

索引是将文本分解为可管理的块的过程,在组织系统中是一个至关重要的步骤,面临着三个主要挑战:

  • 不完整的内容表示。块的语义信息受到分割方法的影响,在更长的上下文中会导致重要信息的丢失或被淹没。

  • 不准确的块相似性搜索。随着数据量的增加,检索中的噪音增加,导致频繁与错误数据匹配,使检索系统变得脆弱且不可靠。

  • 引用轨迹不清晰。检索到的块可能来自任何文档,缺乏引用轨迹,可能导致存在来自多个不同文档的块,尽管在语义上相似,但包含的内容却是完全不同的主题。

块优化

较大的块可以捕捉更多的上下文,但也会产生更多的噪音,需要更长的处理时间和更高的成本。而较小的块可能无法完全传达所需的上下文,但它们的噪音较少。

滑动窗口

平衡这些需求的一种简单方法是使用重叠的块。通过使用滑动窗口,语义转换得到增强。然而,存在一些限制,包括对上下文大小的控制不够精确,截断单词或句子的风险,以及缺乏语义考虑。

从小到大

关键思想是将用于检索的块与用于合成的块分开。使用较小的块可以提高检索的准确性,而较大的块可以提供更多的上下文信息。

图片

元数据附加

块可以使用元数据信息进行丰富,例如页码、文件名、作者、时间戳、摘要,或者块可以回答的问题。

结构化组织

提高信息检索效率的一种有效方法是为文档建立分层结构。通过构建块结构,RAG系统可以加速检索和处理相关数据。

层次化索引

在文档的层次结构中,节点按照父子关系排列,与之关联的块链接到这些节点上。数据摘要存储在每个节点上,有助于快速遍历数据,并帮助RAG系统确定要提取的块。这种方法还可以缓解由块提取问题引起的幻觉。

构建结构化索引的方法主要包括:

  • 结构意识。对文档进行段落和句子分割。

  • 内容意识。利用PDF、HTML、Latex等文件的内在结构。

  • 语义意识。基于NLP技术,如利用NLTK,对文本进行语义识别和分割。

知识图谱文档组织

在构建文档的层次结构时,利用知识图谱(KGs)有助于保持一致性。它描述了不同概念和实体之间的关系,显著降低了幻觉的可能性。

预检索模块

RAG的主要挑战之一是用户提出精确清晰的问题是困难的,不明智的查询会导致检索效果不佳。

  • 问题措辞不当。问题本身复杂,语言组织不佳。

  • 语言复杂性和歧义性。当处理专业词汇或具有多重含义的模糊缩写时,语言模型经常会遇到困难。

查询扩展

将单个查询扩展为多个查询丰富了查询的内容,为解决特定细微差别的缺乏提供了进一步的上下文,从而确保生成的答案的最佳相关性。

多查询

通过使用提示工程来通过LLM扩展查询,这些查询可以并行执行。查询的扩展不是随意的,而是经过精心设计的。这种设计的两个关键标准是查询的多样性和覆盖范围。

子查询

子问题规划的过程代表了生成必要的子问题,以在组合时为原始问题提供上下文并完全回答。这个添加相关上下文的过程原则上类似于查询扩展。具体来说,可以使用从最少提示到最多提示的方法,将复杂问题分解为一系列更简单的子问题。

CoVe

CoVe(Chain-of-Verification)是由Meta AI提出的另一种查询扩展方法。扩展的查询经过LLM的验证,以达到减少幻觉的效果。经过验证的扩展查询通常具有更高的可靠性。

查询转换

重写

原始查询在实际场景中并不总是最佳的LLM检索条件。因此,我们可以提示LLM重写查询。除了使用LLM进行查询重写外,还可以利用专门的较小语言模型,例如RRR(重写-检索-阅读)。

HyDE

当响应查询时,LLM构建假设文档(假定答案),而不是直接在向量数据库中搜索查询及其计算的向量。它专注于从答案到答案的嵌入相似性,而不是寻求问题或查询的嵌入相似性。此外,它还包括反向HyDE,它专注于从查询到查询的检索。

图片

查询路由

根据不同的查询,将其路由到不同的RAG管道,这适用于一个灵活的RAG系统,设计用于适应多样化的场景。

元数据路由器/过滤器

第一步涉及从查询中提取关键字(实体),然后基于块内的关键字和元数据进行过滤,缩小搜索范围。

语义路由器

另一种路由方法涉及利用查询的语义信息。具体方法请参见语义路由器。当然,也可以采用混合路由方法,结合基于语义和基于元数据的方法,以增强查询路由的效果。

查询构建

将用户的查询转换为另一种查询语言,以访问替代数据源。常见的方法包括:

  • 文本到Cypher

  • 文本到SQL

检索模块

检索过程在RAG中起着至关重要的作用。利用强大的PLM可以有效地在潜在空间中表示查询和文本,从而促进问题和文档之间的语义相似性的建立,以支持检索。

检索模型选择

Hugging Face的MTEB排行榜评估了几乎所有可用的嵌入模型在8个任务上的性能 C-MTEB侧重于评估中文嵌入模型的能力,涵盖了6个任务和35个数据集。

稀疏检索器

尽管稀疏编码模型可能被认为是一种略显过时的技术,通常基于诸如词频统计之类的统计方法,但由于其更高的编码效率和稳定性,它们仍然具有一定的地位。常见的系数编码模型包括BM25和TF-IDF。

图片

密集检索器

  • 建立在BERT架构上的编码器-解码器语言模型,例如ColBERT。

  • 像BGE和Baichuan-Text-Embedding这样的全面多任务微调模型。

  • 基于云API的模型,例如OpenAI-Ada-002和Cohere Embedding。

  • 面向大规模数据应用的下一代加速编码框架Dragon+。

  • 混合/混合检索

检索器微调

在某些情况下,上下文可能与预训练模型在嵌入空间中认为相似的内容有所偏离,特别是在高度专业化的领域,如医疗保健、法律和其他丰富专有术语的领域中,调整嵌入模型可以解决这个问题。虽然这种调整需要额外的工作,但它可以大大提高检索效率和领域对齐度。

SFT(自我训练)

可以基于领域特定数据构建自己的微调数据集,使用LlamaIndex可以迅速完成此任务。

LSR(语言模型监督检索器)

与直接从数据集构建微调数据集不同,LSR利用语言模型生成的结果作为监督信号,在RAG过程中微调嵌入模型。

RL(强化学习)

受RLHF(从人类反馈中进行强化学习)的启发,利用基于语言模型的反馈通过强化学习来强化检索器。

Adapter

有时,对整个检索器进行微调可能成本高昂,特别是在处理无法直接微调的基于API的检索器时。在这种情况下,我们可以通过引入Adapter模块并进行微调来缓解这一问题。

后处理模块

将整个文档块检索并直接输入LLM的上下文环境并不是一个最佳选择。对文档进行后处理可以帮助LLM更好地利用上下文信息。

主要挑战包括:

  1. 中间丢失。与人类类似,LLM倾向于只记住长文本的开头和结尾,而忘记中间部分。

  2. 噪声/反事实块。检索到的嘈杂或事实相互矛盾的文档可能会影响最终的检索生成。

  3. 上下文窗口。尽管检索了大量相关内容,但大型模型对上下文信息长度的限制阻止了所有内容的包含。

重新排序

重新排序已检索到的文档块,而不改变其内容或长度,以增强LLM对更关键的文档块的可见性。具体来说:

基于规则的重新排序

根据某些规则,计算指标以重新排序文档块。常见的指标包括:

  • 多样性

  • 相关性

  • MRR

MMR的背后思想是减少冗余并增加结果的多样性,它常用于文本摘要。MMR根据查询相关性和信息新颖性的综合标准,在最终的关键短语列表中选择短语。

模型基础的重新排序

利用语言模型对文档块进行重新排序,可选的模型包括:

  • 来自BERT系列的编码器-解码器模型,例如SpanBERT

  • 专门的重新排序模型,例如Cohere rerank或bge-raranker-large

  • 通用的大型语言模型,例如GPT-4

压缩和选择

在RAG过程中的一个常见误解是认为尽可能检索更多相关文档并将它们连接起来形成一个冗长的检索提示是有益的。然而,过多的上下文可能会引入更多的噪音,降低LLM对关键信息的感知,并导致诸如“中间丢失”之类的问题。解决这个问题的常见方法是压缩和选择检索到的内容。

LLMLingua

通过利用对齐和训练良好的小型语言模型,例如GPT-2 Small或LLaMA-7B,可以实现从提示中检测和删除不重要的标记,将其转换为人类难以理解但LLM很好理解的形式。

Recomp

Recomp引入了两种类型的压缩器:一种是抽取式压缩器,从检索到的文档中选择相关的句子;另一种是生成式压缩器,通过将多个文档中的信息融合产生简洁的摘要。这两种压缩器都经过训练,以在生成的摘要被添加到语言模型的输入时提高语言模型在最终任务上的性能,同时确保摘要的简洁性

选择性上下文

通过识别并删除输入上下文中的冗余内容,可以简化输入,从而提高语言模型的推理效率。选择性上下文类似于“停用词移除”策略。

LLM批评

另一种直观且有效的方法是让LLM在生成最终答案之前评估已检索的内容。这使得LLM可以通过LLM批评过滤掉相关性较差的文档。

生成模块

利用LLM根据用户的查询和检索到的上下文信息生成答案。

生成器选择

根据场景的不同,LLM的选择可以分为以下两种类型:

云API基础生成器

基于云API的生成器利用第三方LLM的API,例如OpenAI的ChatGPT、GPT-4和Anthropic Claude等。优势包括:

  • 无服务器压力

  • 高并发性

  • 能够使用更强大的模型

缺点包括:

  • 数据通过网络传递,存在数据隐私问题

  • 无法调整模型(在绝大多数情况下)

本地部署

本地部署的开源或自行开发的LLM,例如Llama系列、GLM等。其优势和劣势与基于云API的模型相反。本地部署的模型提供更大的灵活性和更好的隐私保护,但需要更高的计算资源。

生成器微调

除了直接使用LLM外,根据场景和数据特征进行目标微调可以获得更好的结果。这也是使用本地部署设置的最大优势之一。常见的微调方法包括以下几种:

SFT

当LLM在特定领域缺乏数据时,可以通过微调向LLM提供额外的知识。Huggingface的微调数据也可以作为一个初始步骤。

微调的另一个好处是能够调整模型的输入和输出。例如,它可以使LLM适应特定的数据格式,并按照指示以特定的风格生成响应。

RL

通过强化学习将LLM的输出与人类或检索器的偏好进行对齐是一个潜在的方法。例如,手动注释最终生成的答案,然后通过强化学习提供反馈。除了与人类偏好保持一致外,还可以与微调模型和检索器的偏好保持一致。

蒸馏

当情况阻止访问强大的专有模型或更大参数的开源模型时,一种简单有效的方法是将更强大的模型(例如GPT-4)蒸馏为更小的模型。

调度模块


Orchestration指的是控制RAG过程的模块。与以前固定的过程不同,RAG现在涉及在关键点做出决策,并根据结果动态选择下一步。与Naive RAG相比,这也是模块化RAG的主要特点之一。

调度

Judge模块评估RAG过程中的关键点,确定是否需要检索外部文档存储库,答案是否满意,以及是否需要进一步探索。它通常用于递归、迭代和自适应检索。具体来说,它主要包括以下两种操作符:

基于规则

下一步的行动基于预定义的规则确定。通常,生成的答案会得分,然后根据得分是否达到预定义的阈值来决定是否继续或停止。常见的阈值包括令牌的置信水平。

基于提示

LLM自主确定下一步的行动。主要有两种方法实现这一点。第一种方法涉及提示LLM反思或根据对话历史进行判断,如ReACT框架所示。这里的好处是消除了对模型进行微调的需要。然而,判断的输出格式取决于LLM是否遵循指令。基于提示的案例是FLARE。

基于调整

第二种方法涉及LLM生成特定的令牌来触发特定的操作,这种方法可以追溯到Toolformer,并应用于RAG,例如Self-RAG。

检索融合

如前面关于查询扩展的部分所述,当前的RAG过程不再是一个单一的管道。它通常需要通过多个分支来扩展检索范围或多样性。因此,在扩展到多个分支之后,融合模块被依赖于来合并多个答案。

概率集成

融合方法基于从多个分支生成的不同令牌的加权值,从而全面选择最终的输出。加权平均是主要采用的方法。参见REPLUG。

RRF(互惠排名融合)

RRF是一种将多个搜索结果列表的排名结合起来生成单一统一排名的技术。与满足任何单一分支下的重新排序相比,与满足任何单一分支下的重新排序相比,RRF产生的结果更为有效。

典型的RAG流程模式

微调阶段

检索器微调

  • 直接微调检索器。 构建用于检索的专门数据集,并对密集检索器进行微调。例如,使用开源检索数据集或基于特定领域数据构建数据集。

  • 添加可训练的适配器模块。 直接微调基于云API的嵌入模型。

  • LM监督检索(LSR)。 根据LLM生成的结果对检索器进行微调。

  • LLM奖励RL: 仍然使用LLM输出结果作为监督信号。利用强化学习来使检索器与生成器对齐。

图片

生成器微调

  • 直接微调。通过外部数据集的微调可以为生成器提供额外的知识。另一个好处是能够定制输入和输出格式。通过设置问答格式,LLM可以理解特定的数据格式,并根据指令进行输出。

  • GPT-4蒸馏。在使用开源模型的本地部署时,一个简单有效的方法是使用GPT-4批量构建微调数据,以增强开源模型的能力。

  • LLM/人类反馈的强化学习。基于最终生成的答案的反馈进行强化学习。除了使用人类评估之外,GPT-4还可以作为评估法官。

图片

推理阶段

顺序结构

RAG流的顺序结构将RAG的模块和操作以线性管道的形式组织起来,如下图所示。如果包括了前检索和后检索模块类型,则代表了典型的高级RAG范式;否则,它体现了典型的简单RAG范式。

图片

最广泛使用的RAG流水线目前是顺序结构,通常在检索之前包括查询重写或HyDE,并在检索后包括重新排序操作,例如QAnything案例。

在RRR中,Query Rewrite模块是一个较小的可训练语言模型,在强化学习的背景下,重写器的优化被形式化为马尔可夫决策过程,LLM的最终输出作为奖励。检索器利用稀疏编码模型BM25。

条件结构

具有条件结构的RAG流涉及根据不同条件选择不同的RAG路径。通常,这是通过路由模块实现的,该模块根据查询关键词或语义确定路径。

基于问题类型选择不同路径,针对特定情景导向不同的流。例如,当用户询问严肃问题、政治问题或娱乐话题时,来自大模型的答案容忍度不同。不同的路由分支通常在检索源、检索过程、配置、模型和提示方面有所不同。

图片

分支结构

具有分支结构的RAG流与条件方法不同之处在于,它涉及多个平行分支,而不是在条件方法中从多个选项中选择一个分支。在结构上,它可以分为两种类型:

前检索分支(多查询,并行检索)。这涉及扩展原始查询以获取多个子查询,然后针对每个子查询进行单独的检索。在检索之后,该方法允许基于子问题和相应的检索内容立即生成答案。或者,它可能仅涉及使用扩展的检索内容,并将其合并为生成的统一上下文。

后检索分支(单一查询,并行生成)。该方法保留原始查询并检索多个文档块。随后,它同时使用原始查询和每个文档块进行生成,最终将生成的结果合并在一起。

图片

REPLUG体现了经典的后检索分支结构,其中为每个分支预测了每个标记的概率。通过加权可能性合集,将不同的分支聚合在一起,最终生成的结果用于通过反馈对检索器进行微调,称为Contriever。

循环结构

具有循环结构的RAG Flow是模块化RAG的一个重要特征,涉及相互依赖的检索和推理步骤。通常包括一个用于流程控制的Judge模块。这可以进一步分为迭代、递归和自适应(主动)检索方法。

图片

迭代结构

有时,单次检索和生成可能无法有效解决需要广泛知识的复杂问题。因此,在RAG中可以使用迭代方法,通常涉及固定数量的迭代进行检索。

图片

迭代检索的一个典型案例是ITER-RETGEN,它迭代进行检索增强生成和生成增强检索。检索增强生成根据所有检索到的知识输出任务输入的响应。在每次迭代中,ITER-RETGEN利用上一次迭代的模型输出作为特定上下文,帮助检索更相关的知识。循环的终止由预定义的迭代次数确定。

递归结构

递归检索的特征特点与迭代检索相反,其清晰依赖于先前步骤并持续深化检索。通常,递归检索具有终止机制作为递归检索的退出条件。在RAG系统中,递归检索通常涉及查询转换,依赖于每次检索的新重写查询。

图片

递归检索的典型实现,如ToC,涉及递归执行RAC(递归增强澄清),逐渐将子节点插入澄清树中,从初始模糊问题(AQ)开始。在每个扩展步骤中,根据当前查询执行段落重新排名,以生成明确的问题(DQ)。在达到最大有效节点数或最大深度时,树的探索结束。一旦构建了澄清树,ToC收集所有有效节点并生成全面的长文本答案来解决AQ。

自适应结构

随着RAG的发展,逐渐从被动检索转向了自适应检索的出现,也称为主动检索,这在一定程度上归功于LLM的强大能力。这与LLM Agent共享一个核心概念。

RAG系统可以主动确定检索的时机,并决定何时结束整个过程并生成最终结果。基于判断标准,这可以进一步分为基于提示和基于调整的方法。

图片

基于调整的方法涉及对LLM进行微调以生成特殊标记,从而触发检索或生成。这个概念可以追溯到Toolformer,其中生成特定内容有助于调用工具。在RAG系统中,这种方法用于控制检索和生成步骤。一个典型的案例是Self-RAG。具体来说:

  1. 给定一个输入提示和前一个生成结果,首先预测特殊标记“Retrieve”是否有助于通过段落检索增强持续的生成。

  2. 如果需要检索,模型生成:评价标记来评估检索段的相关性,下一个响应段,以及评价标记来评估响应段中的信息是否得到段的支持。

  3. 最后评价标记评估响应的整体效用,并选择最佳结果作为最终输出。

企业案例

OpenAI

OpenAI团队的Demo Day演示并不能完全代表OpenAI的实际操作。在努力提高RAG成功率的过程中,OpenAI团队从45%的准确率开始,并尝试了各种方法,确定了最终用于生产的方法。

图片

他们探索了假设性文档嵌入(HyDE)、微调嵌入和其他方法,但结果并不令人满意。通过尝试不同大小的信息块和嵌入不同的内容部分,他们将准确率提高到了65%。通过重新排名和针对不同类型问题定制的方法,他们进一步将准确率提高到了85%。最终,通过结合提示工程、查询扩展和其他方法,他们实现了98%的准确率。

Baichuan

Baichuan是受Meta的CoVe启发而设计的,提出了一种将复杂提示拆解为多个独立并行可检索的查询的方法。Baichuan利用了自己的专有TSF(Think-Step Further)来推断和挖掘用户输入背后更深层次的问题,从而更精确、全面地理解用户意图。

图片

在检索步骤中,百川智能开发了百川文本嵌入向量模型,该模型在高质量的中文数据上进行了预训练,包括超过1.5万亿个标记。他们通过专有的损失函数解决了对比学习中的批大小依赖性问题。这个向量模型已经超越了C-MTEB。

此外,他们引入了稀疏检索和重新排名模型(未透露),形成了一种混合检索方法,将向量检索与稀疏检索并行使用,显著提高了召回率达到95%。

此外,他们引入了自我批评,使大型模型能够根据提示、相关性和效用对检索到的内容进行内省,并进行二次审查以选择最匹配和高质量的候选内容。

Databricks

https://docs.databricks.com/en/generative-ai/retrieval-augmented-generation.html

Databricks作为大数据领域的领先服务提供商,在RAG设计中保持了其独特的特点和优势。

当用户输入问题时,系统从预处理的文本向量索引中检索相关信息,并结合提示工程生成响应。上半部分,即非结构化数据管道,遵循主流的RAG方法,并没有显示出任何特殊性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/547600
推荐阅读
相关标签
  

闽ICP备14008679号