LLM之RAG技术从入门到精通
- RAG技术介绍
- 诞生背景
- 定义
- RAG与微调
- RAG流程架构
- RAG三种范式
- Naive RAG
- Advanced RAG
- 预检索过程
- 嵌入
- 后期检索过程
- RAG管道优化
- Modular RAG
- RAG工作流程
- 企业知识问答知识库
- RAG评估
- 评价方法
- 独立评估
- 端到端评估
- 关键指标和能力
- RAG优化
- RAG在企业知识库应用下的场景流程
- RAG优化
- 总结
RAG技术介绍
诞生背景
大型语言模型(LLMs)展示了强大的能力,但在实际应用中仍面临挑战,如幻觉现象、知识更新缓慢,以及在回答中缺乏透明度。总结来说,LLM存在幻觉、知识的时效性、数据的安全性等问题。
所以需要一种技术来解决这些问题,所以RAG技术应运而生。
定义
RAG: 检索增强生成(RAG)指的是在使用LLMs回答问题之前,从外部知识库中检索相关信息。RAG已被证明能显著提高答案的准确性,减少模型的幻觉现象,特别是对于知识密集型任务。通过引用来源,用户可以验证答案的准确性,并增加对模型输出的信任。它还促进了知识更新和特定领域知识的引入。RAG有效地结合了LLMs的参数化知识和非参数化的外部知识库,使其成为实施大型语言模型的最重要方法之一。检索增强生成是一种利用外部来源获取的事实来提高生成式AI模型的准确性和可靠性的技术。通过结合检索(从数据库或文档集合中提取信息)和生成(利用语言模型生成文本)的方法来改善回答或生成的文本的质量和相关性。
RAG 系统包括两个主要阶段:
- 使用编码模型(如 BM25、SentenceBert、ColBERT 等)根据问题找到相关的文档[Robertson et al.,2009, Karpukhin et al., 2020, Khattab and Zaharia, 2020]。
- 生成阶段:以找到的上下文作为基础,系统生成文本。
RAG与微调
在大语言模型的优化过程中,除了RAG,微调(finetune)也很常用。
RAG (Retrieval-Augmented Generation)
作用: 提供类似教科书的信息检索功能,适用于解答具体问题或执行特定信息检索任务。
局限性: 不适合教授模型理解广泛领域或学习新的语言、格式或风格。
优势: 提高答案准确性,减少虚假信息。
识别最新信息,保持回答的及时性和准确性。
高度透明,增强用户对输出结果的信任。
可定制化,支持不同领域的专业知识。
在安全性和隐私管理方面有较好的控制。
处理大规模数据集具有更好的扩展性和经济效率。
提供更值得信赖的结果。
微调 (Fine-tuning)
作用: 通过广泛学习吸收知识,适用于模型需要模仿特定结构、风格或格式时。
局限性: 不适合向模型中添加新知识,或应对需要快速迭代新场景的情况。
优势: 强化模型已有知识。
调整或定制模型输出。
适用于复杂指令的训练,提升交互效率。
具体微调的方式请参考:https://blog.csdn.net/acelit/article/details/137838266
RAG流程架构
RAG三种范式
Naive RAG
Naive RAG研究范式代表了最早的方法论,在广泛使用后不久就变得突出采用ChatGPT。Naive
RAG的经典过程是:索引、检索和生成。Naive RAG概括为“检索”-“读取”框架。
- 索引
从源获取数据并为其建立索引的管道通常是离线处理的。具体来说,数据索引的构建包括以下步骤:
数据索引:清洗和提取原始数据、转换诸如PDF、HTML、Word、Markdown等不同文件格式转换为纯文本; - 分块:
将加载的文本分为较小的块。因为语言模型通常有上下文长度有限制,因此有必要创建尽可能小的文本块(不是越小越好); - 嵌入和创建索引:
通过语言模型将文本编码为向量(Embedding技术)。得到的向量将用于后续的检索过程,以计算向量和问题向量之间的相似性。嵌入模型需要很高的推理速度。由于需要对大量的语料库进行编码,并在用户提问时实时对问题进行编码,因此模型的参数大小不应太大。生成嵌入后,下一步是创建索引,存储原始语料库块,并以键值对的形式进行嵌入,以便在未来快速频繁地搜索。 - 检索
给定用户的输入,使用与第一个stage相同的模型把query转换为向量。然后计算query嵌入和语料库中的文档块嵌入的相似度。选择前K个相似度最高的文档块作为增强上下文信息。 - 生成
把给定的问题和相关文档合并为新的Prompt提示。然后,大型语言模型基于所提供的信息来回答所述问题。它会判断是基于大型模型知识还是仅基于给定信息进行回答,取决于不同任务的需要。如果有对话历史信息,也可以合并到Prompt中进行多轮对话。
Naive RAG的缺点
Naive RAG在三个领域面临主要挑战:
- 检索质量、响应生成质量和增强过程。
关于检索质量,问题是多方面的。主要问题是精度低,检索集中并非所有块都与查询相关,这会导致潜在的幻觉问题。第二个问题是低召回率,当所有相关块没有全部被召回时,LLM就没有获得足够的上下文来合成答案。此外,过时的信息带来了另一个挑战,即数据冗余或过时的数据可能导致不准确的检索结果。- 就生成响应的质量而言,问题同样是多样化的。
幻觉是一个突出的问题,模型编造了一个上下文中不存在的答案。另一个问题是召回的信息可能是不相关的,导致模型生成的答案无法解决查询问题。此外,毒性或偏见,即模型产生有害或冒犯性反应,是另一个问题。- 最后,增强过程也面临一些挑战。
根据当前生成任务,从相关段落检索文档是至关重要的。如果处理不当,输出可能会显得不连贯或不连贯。冗余和重复是另一个问题,特别是当多个检索到的段落包含相似的信息,导致生成步骤中的内容重复时。此外,确定多个检索到的段落对生成任务的重要性或相关性具有挑战性,并且扩充过程需要平衡每个段落的值适当。检索到的内容也可能来自不同的写作风格或语调,增强过程需要调和这些差异以确保输出的一致性。最后,生成模型可能过度依赖增强信息,导致输出仅重复检索到的内容,而不提供新的价值或合成信息。
Advanced RAG
Advanced RAG针对Naive RAG的不足进行了有针对性的改进。在检索生成的质量方面,Advanced RAG结合了检索前和检索后的方法。为了解决Naive RAG遇到的索引问题,Advanced RAG通过滑动窗口、细粒度分割和元数据等方法优化了索引。与此同时,它已经提出了优化检索过程的各种方法。在具体实现方面,Advanced RAG可以通过管道或端到端的方式进行调整。
预检索过程
优化数据索引
优化数据索引的目的是提高索引内容的质量。目前,有五种主要策略用于此目的:增加索引数据的粒度、优化索引结构、添加元数据、对齐优化和混合检索。
增强数据粒度:
预索引优化的目标是为了提高文本的标准化、一致性,并确保事实的准确性以及上下文丰富性,以保证RAG系统的性能。文本标准化包括去除不相关的信息和特殊字符,以提高检索器的效率。就一致性而言,主要任务是消除实体和术语中的歧义,同时消除重复或冗余信息,以简化检索者的工作重点。确保事实的准确性至关重要,只要可能,就应核实每一条数据的准确性。上下文保留,以适应系统在现实世界中的交互上下文,可以通过添加另一层具有领域特定注释的上下文,再加上通过用户反馈循环的持续更新来实现。时间敏感性是重要的上下文信息,应设计机制来刷新过时的文档。总之,优化索引数据的重点应该放在清晰度、上下文和正确性上,以使系统高效可靠。以下介绍了最佳实践。优化索引结构:
可以是通过调整块的大小、改变索引路径和合并图结构信息来实现。调整区块(从小到大)的方法包括收集尽可能多的相关信息上下文尽可能地减少噪声。在构建RAG系统时,块大小是一个关键参数。有不同的评估框架来比较单个块的大小。LlamaIndex使用GPT4来评估保真度和相关性,LlamaIndex对不同的分块方法有自动化评估方法。跨多个索引路径查询的方法与以前的元数据过滤和分块方法密切相关,并且可能涉及同时跨不同索引进行查询。标准索引可用于查询特定查询,或者独立索引可用于基于元数据关键字进行搜索或筛选,例如作为特定的“日期”索引。引入图结构将实体转换为图节点,将它们的关系转换为图关系。这可以通过利用节点之间的关系来提高准确性,尤其是对于多跳问题。使用图形数据索引可以增加检索的相关性。
添加元数据信息:
这里的重点是将引用的元数据嵌入到块中,例如用于筛选的日期和目的。添加参考文献的章节和小节等元数据也有利于改进检索。当我们将索引划分为多个块时,检索效率就成了一个问题。首先过滤元数据可以提高效率和相关性。
对齐优化:
这一策略主要是解决对齐问题和之间的差异文件。对齐概念包括引入假设问题,创建适合每个文档回答的问题,并将这些问题嵌入(或替换)为文件。这有助于解决文档之间的对齐问题和差异。
混合检索:
这种策略的优势在于利用了不同检索技术的优势。智能地结合各种技术,包括基于关键字的搜索、语义搜索和矢量搜索可以适应不同的查询类型和信息需求,确保对最相关和上下文丰富的信息的一致检索。混合检索可以作为检索策略的有力补充,增强RAG管道的整体性能。
嵌入
-
微调嵌入:
微调嵌入模型直接影响RAG的有效性。微调的目的是增强检索到的内容和查询之间的相关性。微调嵌入的作用类似于在生成语音之前调整耳朵,优化检索内容对生成输出的影响。通常,用于微调嵌入的方法属于在特定领域上下文中调整嵌入和优化检索步骤的类别。特别是在处理进化术语或稀有术语的专业领域,这些定制的嵌入方法可以提高检索相关性。BGE嵌入模型是一种精细调谐和高性能嵌入模型,如BAAI 3开发的BGE-large-EN。为了创建用于微调BGE模型的训练数据,首先使用像gpt-3.5-turbo这样的LLM来基于文档块来制定问题,其中问题和答案(文档块)形成用于微调过程的微调对。 -
动态嵌入:
动态嵌入根据单词出现的上下文进行调整,不同于为每个单词使用单个向量的静态嵌入。例如在BERT这样的transformer模型中,根据周围的单词,同一个单词可以具有不同的嵌入。理想情况下,嵌入应该包含尽可能多的背景以确保“健康”的结果。基于GPT等大型语言模型的原理,OpenAI的embeddings-ada-02比静态嵌入模型更复杂,可以捕获一定程度的上下文。虽然它擅长上下文理解,但它对上下文的敏感性可能不如GPT4等最新的全尺寸语言模型。
后期检索过程
在从数据库中检索到有价值的上下文后,将其与查询合并以输入LLM会带来挑战。同时向LLM提交所有相关文件可能超过上下文窗口限制。连接众多形成冗长检索提示的文档是无效的,引入噪声并阻碍LLM对关键问题的关注信息检索到的内容的附加处理是解决这些问题所必需的。
- 重新排序:
重新排序将最相关的信息重新定位到提示的边缘是一个简单的想法。这一概念已在LlamaIndex、LangChain和HayStack等框架中实现。例如,Diversity Ranker根据文档多样性优先排序,而LostThereMiddleRanker交替将最佳文档放置在上下文窗口的开头和结尾。同时,应对口译的挑战基于向量的对语义相似性的模拟搜索,像cohereAI rerank,bgererank5这样的方法,或LongLLM语言重新计算相关文本和查询; - Prompt压缩:
研究表明噪声在检索到的文档中,会对RAG性能产生不利影响。在后处理中,重点在于压缩不相关的上下文,突出关键段落,减少整体上下文长度。选择性语境和LLMLingua等方法利用小语言模型来计算即时相互信息或困惑,估计元素重要性。然而,这些方法可能会在RAG或长上下文场景中丢失关键信息。Recomp通过训练不同粒度的压缩器来解决这一问题。长上下文在处理广泛的上下文时,进行分解和压缩,而“行走在记忆迷宫中”则设计了一个分层摘要树来增强LLM的关键信息感知。
RAG管道优化
检索过程的优化旨在增强RAG系统的效率和信息质量,Current研究主要集中在智能地将各种搜索技术,优化检索步骤,介绍认知回溯的概念,灵活应用各种查询策略,并利用嵌入相似性。这些努力共同努力在RAG中上下文信息的高效性和丰富性检索
探索混合搜索:
通过智能混合各种技术,如基于关键字的搜索、语义搜索和矢量搜索,RAG系统可以利用每种方法的优势。这种方法使RAG系统能够适应不同的查询类型和信息需求,确保一致检索最相关和上下文丰富的信息。混合搜索是对检索策略的有力补充,增强了RAG管道的整体性能;递归检索和查询引擎:
在RAG系统中优化检索的另一种强大方法涉及实现递归检索和复杂的查询引擎。递归检索需要在初始检索过程中获取较小的文档块阶段捕获关键语义。在后面在这个过程的各个阶段,向语言模型提供具有更多上下文信息的较大块(LM)。这种两步检索方法有助于在效率和上下文丰富的响应之间取得平衡;后退提示:
集成到RAG过程中,逐步后退的快速方法[Zheng etal.,2023]鼓励LLM从特定的实例中后退对基本概念或原则进行推理。实验结果表明,通过结合向后提示,展示其自然适应性至RAG。检索增强步骤可以应用于生成向后提示的答案,以及最后的问答过程;子查询:
可以在中使用各种查询策略不同的场景,包括使用LlamaIndex等框架提供的查询引擎,使用树查询,使用矢量查询,或使用最多块的基本顺序查询;HyDE:
此方法基于以下假设生成的答案在嵌入空间中可能比直接查询更接近。利用LLM、HyDE生成一个假设文档(答案)作为响应到查询,嵌入文档,并使用这种嵌入来检索类似于假设文档的真实文档。与寻求嵌入相似性相反该方法以查询为基础,强调从答案到答案的嵌入相似性。然而,它可能不总是产生有利的结果,特别是在语言模型不熟悉的实例讨论的主题,可能导致生成易于出错的实例。
Modular RAG
模块化RAG结构打破了传统索引、检索和生成的Naive RAG框架,在整个过程中提供更大的多样性和灵活性。一方面,它集成了各种方法扩展功能模块,例如合并搜索相似性检索模块,并在检索器中应用微调方法。此外,具体问题导致了重组的出现RAG模块和迭代方法。模块化RAG范式正在成为RAG领域的主流,允许串行管道或端到端训练方法跨多个模块。三种RAG的比较范例如图3所示。
Modular RAG的组织方法是灵活的,允许模块的替换或重新配置在基于特定问题上下文的RAG过程中。对于Naive RAG,它由两个模块组成检索和生成(在中称为读取或合成一些文献),该框架提供了适应性和丰富性。目前的研究主要探讨两个组织涉及模块的添加或替换的范例,以及之间组织流程的调整模块。
- 添加或更换模块
添加或替换模块的策略需要维护Retrieval Read的结构,同时引入额外的模块来增强特定的功能。RRR提出了RewriteRetrieve Read过程,利用LLM性能作为重写器模块强化学习的奖励。这允许重写器调整检索查询,从而提高读取器的下游任务性能。类似地,模块可以在生成读取等方法中选择性地替换,其中LLM生成模块取代了检索模块。背诵阅读将外部检索转换为从模型权重的检索,最初让LLM记忆任务相关信息,并生成用于处理知识密集型自然语言处理任务的输出。 - 调整模块之间的流量
调整模块之间的流程,重点是增强语言模型和检索模型之间的交互。DSP引入了演示搜索预测框架,将上下文学习系统视为一个明确的程序,而不是一个终端任务提示,以解决知识密集型任务。ITER-RETGEN利用生成的内容来指导检索,在Retrieve ReadRetrieve Read流中迭代执行“检索增强的生成”和“生成增强的检索”。Self-RAG遵循决策-检索-反映-读取过程,引入了一个用于主动判断的模块。这种自适应和多样化的方法允许在模块化RAG框架内动态组织模块。
RAG工作流程
基于上述描述这里总结了一份较为通用的RAG流程架构
企业知识问答知识库
RAG评估
在探索RAG的开发和优化过程中,有效评估其性能已成为一个核心问题本章主要讨论了评估方法、RAG的关键指标、它应该具备的能力,以及一些主流评价框架。
评价方法
评估RAG有效性主要有两种方法:独立评估和端到端评估。
独立评估
独立评估包括评估检索模块和生成(读取/合成)模块。
- 检索模块
一套衡量系统(如搜索引擎、推荐系统或信息检索系统)根据查询或任务对项目进行排名的有效性的指标通常用于评估RAG检索模块的性能。示例包括命中率、MRR、NDCG、精度等。 - 生成模块
这里的生成模块是指通过将检索到的文档补充到查询中而形成的增强或合成输入,与通常评估的最终答案/响应生成不同端到端。生成模块的评估指标主要集中在上下文相关性上,测量检索到的文档与查询问题的相关性。
端到端评估
端到端评估评估RAG模型对给定输入生成的最终响应,包括模型生成的答案与输入查询的相关性和一致性。从内容生成目标的角度来看,评估可以分为未标记的以及标记的内容。未标记内容评估指标包括答案保真度、答案相关性、无害性等,而标记内容评估标准包括准确性和EM。此外,从评估方法的角度来看,端到端评估可以分为手动评估和使用LLM的自动评估。以上总结了RAG端到端评估的一般情况。此外,基于RAG在特定领域的应用,采用了特定的评估指标,例如用于问答任务的EM,UniEval和用于摘要任务的E-F1,以及用于机器翻译的BLEU。这些指标有助于理解RAG在各种特定应用场景中的性能。
关键指标和能力
现有的研究往往缺乏对检索增强生成对不同LLM的影响的严格评估。在大多数情况下,评估RAG在各种下游任务和不同检索器中的应用可能会产生不同的结果。然而,一些学术和工程实践侧重于RAG的一般评估指标及其有效使用所需的能力。本节主要介绍了评估RAG有效性的关键指标和评估其性能的基本能力。
主要绩效指标
最近的OpenAI报告提到了优化大型语言模型(LLM)的各种技术,包括RAG及其评估指标。此外,最新的评估框架,如RAGAS和ARES也涉及RAG评估指标。总结这些工作,主要关注三个核心指标:答案的真实性、答案相关性和上下文相关性。
- 诚信
该指标强调,模型生成的答案必须与给定的上下文保持一致,确保答案与上下文信息一致,不会偏离或矛盾。评估的这一方面对于解决大型模型中的幻觉至关重要。- 答案相关性
这个指标强调生成的答案需要与提出的问题直接相关。- 语境相关性
该度量要求检索到的上下文信息尽可能准确和有针对性,避免不相关的内容。毕竟,处理长文本对LLM来说代价高昂,过多的无关信息会降低LLM利用上下文的效率。OpenAI报告还提到“上下文回忆”作为一个补充指标,衡量模型检索回答问题所需的所有相关信息的能力。该度量反映了RAG检索模块的搜索优化水平。低召回率表明潜在地需要优化搜索功能,例如引入重新排序机制或微调嵌入,以确保更相关的内容检索。
关键能力
RGB的工作从RAG所需的四个基本能力方面分析了不同大型语言模型的性能,包括噪声鲁棒性、负抑制、信息集成和反事实鲁棒性,为检索增强生成建立了基准。RGB主要关注以下四个方面能力:
- 噪声鲁棒性
这种能力衡量模型处理有噪声文档的效率,这些文档与问题有关,但不包含有用的信息。
- 否定拒绝
当模型检索到的文档缺乏回答问题所需的知识时,模型应该正确地拒绝响应。在阴性拒绝的测试设置中,外部文件仅包含噪音。理想情况下,LLM应该发出“缺乏信息”或类似的拒绝信号。
- 信息集成
这种能力评估模型是否可以集成来自多个文档的信息来回答更复杂的问题。
- 反事实稳健性
该测试旨在评估当收到关于检索信息中潜在风险的指令时,模型是否能够识别和处理文档中的已知错误信息。反事实稳健性测试包括LLM可以直接回答的问题,但相关的外部文件包含事实错误。
RAG优化
RAG在企业知识库应用下的场景流程
RAG优化
优化整个RAG的流程
当前的思路主要集中在混合检索、递归检索和子查询、HyDE等方案。
- RAG中的R本质就是检索,原来搜索领域留下的各种宝贵经验很多都能够借鉴,关键词、字面匹配等,都是可以使用的。
- 递归检索在文中的概念,其实是把索引文段和返回文段进行分拆,计算相似度的时候是query和小片段,但是返回的是大片段,用大片段给大模型做检索增强。
- 论文中提到的子查询(subquery),其实是传统搜索领域的词了,在这里面有一些类似“检索语法树”的概念,例如可以用“should”、“must”、“filter”之类的检索策略来约束整个检索,使之更加精准可控,这个是能提升检索的效果的。
- HyDE方案是指,让大模型对query先生成一个答案,对答案做embedding相比对原query能更接近索引中的doc的embedding,此时对检索难度是有很大程度的下降。这里所代表的,或者说更抽象的,是通过query拓展的手段让检索query和doc拉到更接近的语义空间的思想,query2doc也是这个思想,实践起来非常容易而且效果明显。
query2doc
文章的思想是:在开始检索之前,先用query让模型生成一次答案,然后把query和答案合并送给模型。
举个例子,例如用户输入的是“儿童防沉迷”,原来是直接把“儿童防沉迷”直接用于检索,输入检索库中进行召回,然而现在,我们会结合prompt,先输入给大模型,并得到大模型的结果:
输入: 什么是儿童防沉迷。
要求,用大约100字回复。
。。。。。。。。。
输出:(结果来自chatglm2)
儿童防沉迷是指避免儿童沉迷于网络、游戏、电子书等电子娱乐活动,保护儿童身心健康和防止未成年人受到网络游戏沉迷、网络信息诈骗等问题的影响。为了实现这一目标,家长和社会应该共同努力,对儿童进行网络安全教育,限制儿童使用电子产品的时间和内容,并营造良好的家庭氛围,鼓励儿童积极参与有益身心的活动,如运动、阅读、艺术等。
可以看到,相比原始query儿童防沉迷,还拓展了大量的相关信息,例如游戏、网络、未成年人等,这些词汇很直观地,能扩展更多概念解释,对提升召回肯定是有好处的。改写完了,但是要放进去检索,更好地进行召回,还是有些技巧的,按照论文,对字面检索和向量检索,都有一些特定的设计。
- 字面检索,因为模型的生成多半会很长,所以在相似度计算的过程中,会稀释,所以在拼接过程中,需要对原始query复制几份再来拼接,用公式来描述,就是这样,其中d‘是大模型生成的内容,n是复制的次数。
- 向量检索,因为向量召回的泛化能力是比较强的,因此不需要复制,直接拼接起来。
总结
RAG结合了LLM的参数化知识和非参数化外部知识,缓解了幻觉问题,通过检索技术及时识别信息,并提高了响应的准确性。此外,通过引用来源,RAG提高了模型输出的透明度和用户信任度。RAG还可以通过索引相关文本语料库来基于特定领域进行定制。