本文基于该篇文章,按照自己理解思路整理。
https://arxiv.org/abs/2402.19473
更详细RAG技术论文可从该链接获取。
1. RAG基础介绍
RAG:Retrieval-Augmented Generation 中文译为检索增强生成,指利用外部知识库检索相关信息,结合各类预训练模型,提升其训练和推理的优化方法。
RAG的概念早在2020年便被提出,其核心思想是通过一个检索器为用户查询相关文档知识,指导生成器(多为大语言模型)生成相关回答,提升模型性能。
1.1 大模型推理中的RAG
1.1.1 问题背景
大模型具备强大的few-shot能力,并且基于大模型的问答系统已经广泛应用在我们的日常生活中,但大模型本身仍存在着产生误导性 “幻觉”、依赖信息过时、缺乏专业领域知识等问题,这限制了模型生成的效果。
下面这幅图就解释了3种大模型产生的幻觉类型。分别是:1.输入冲突幻觉;2.上下文冲突幻觉;3.试试冲突幻觉。
1.1.2 解决方法
在模型生成答案之前,先从文档数据库中检索相关信息,然后利用这些信息来引导模型生成过程,可以极大提升生成内容的准确性和相关性,有效缓解幻觉问题,同时可以提高知识更新的速度,并增强内容生成的可追溯性与可信度。
1.1.3 任务流程
一个RAG 案例如上图所示。因预训练数据的限制,大模型缺乏最新事件的知识,因此ChatGPT 表示无法回答最新事件相关问题。
而RAG 技术通过从外部知识库获取了一系列与询问相关的新闻文章,将文章连同最初的问题合并成一个丰富的提示,使 ChatGPT 能够综合出一个有根据的回应,提升了大模型问答的时效性与准确性。
2.RAG范式发展
随着大模型性能的不断提升,RAG技术的研究范式也在不断地发展,根据RAG系统的结构类型,其研究发展历程主要可以分为三个阶段:朴素RAG、进阶RAG、模块化RAG。
2.1 第一阶段——朴素RAG
朴素RAG流程包括索引、检索和生成三步骤。
- 索引
在离线状态下,从数据来源处获取数据并建立索引的过程。 - 检索
根据用户输入,在向量数据库中检索top-k个相似数据作为当前问题的补充信息。 - 生成
将检索到的数据组合为一个prompt,输入给大语言模型中得到输出。
2.1.1 朴素RAG——索引
在这一步骤中,RAG系统需要清理和提取各种格式(如PDF、HTML、Word和Markdown)的原始数据,然后将其转换为统一的纯文本格式,再使用嵌入模型将文本数据转换为向量表示,并存储在向量数据库中,利用其向量表征做为索引,这一步对于在随后的检索阶段实现高效的相似性搜索至关重要。
提取词语向量的经典模型是word2vec,其支持CBOW(连续词袋)、Skip-gram两种方法计算每个词语的词向量,最后通过平均池化、加权池化、向量拼接等方法得到句子级向量。
2.1.2 朴素RAG——检索
在获取到用户输入的查询(query)后,RAG系统会使用与索引步骤相同的嵌入模型,将输入的查询转换为向量表示,然后计算查询向量和索引知识库中的知识向量之间的相似性得分,对与query最相似的前K个知识文本段进行优先级排序并召回,这些数据将在最终的prompt中充当上下文的角色。计算向量相似性得分的方式通常有余弦距离、欧氏距离、曼哈顿距离等。
2.1.3 朴素RAG——生成
在这一步骤中,用户输入的query和检索召回的知识文档会被合成为一个prompt整体,大模型的任务就是推理这个prompt,对其做出回答响应。模型的回答方式可以根据特定任务的需求而变化,既可以允许它利用其固有的参数知识回答,也可以限制其利用检索召回文档中包含的信息进行回答。同时,任何对话历史都也可以集成到prompt中,使模型能够有效地进行多轮对话交互。
2.1.4朴素RAG——总结
朴素RAG在一定程度上缓解了大模型幻觉的问题,但是由于其结构简单,仍然存在着明显的缺点:
- 检索质量
- 低精度问题:检索结果中的文档块可能与查询内容不完全相关。
- 低召回率问题:未能检索到所有相关文档块。
- 过时信息问题:数据的冗余或过时。多数据源检索相似信息时,可能会因为信息冗余导致模型重复响应
- 增强生成质量
- 模型幻觉:生成内容与检索召回上下文没有对齐。
- 多任务场景:检索信息应用于多任务场景可能会导致输出不连贯。
- 复杂任务:单一检索不足以获取足够上下文信息。
- 增强过程
- 上下文融合:如何高效的上下文融合策略,避免内容杂乱无章。
- 过度依赖增强信息:过度依赖检索信息,导致生成只是简单回显检索内容。
- 输出一致性:检索内容可能风格不同。
2.2 第二阶段——进阶RAG
进阶RAG针对性对朴素RAG对不同阶段优化,尝试克服其缺点。
进阶RAG所做的优化,可以分为检索前、检索中、检索后处理和pipeline优化四类。
2.2.1 进阶RAG——检索前处理
检索前处理阶段,进阶RAG主要关注如何优化索引结构和原始查询语句,具体提出的方法包括:
- 增强数据粒度
早期RAG往往使用整个知识文档进行向量表征,获取的文档向量往往粒度较粗,多数知识在转化为向量后就被稀释。 - 优化索引结构
索引结构可以通过调整文本段大小、引入图结构信息等方法来实现。 - 添加元数据
为原有文档添加元数据信息,通过元数据筛选辅助检索。 - 对齐优化
用户query和doc之间等语义空间可能存在较大差异,可以使用一定的对齐策略使相关知识更容易被检索到。
2.2.2 进阶RAG——检索中处理
在RAG检索过程中,通常会利用文本的特征向量进行检索,其中的关键是向量特征提取模型,embedding模型性能决定检索准确性,因此在检索中,通常会对embedding模型进行优化:
- 微调
针对特定问题、特定领域或者是特定的检索对,使用特定的向量表征一般都会有比较好的效果,因此在有一定规模训练数据下,微调embedding模型可以在一定程度上提升检索准确度上限。 - 动态嵌入
根据单词出现位置的上下文信息,对单词embedding进行调整,同一个词语出现位置不同可以拥有不同的向量表征。动态嵌入更能够表示词语在上下文中的准确含义。
2.2.3 进阶RAG——检索后处理
在检索并召回到相关知识片段后,如何将其有效地与原始query集成为prompt是至关重要的,在这部分进阶RAG提出的方法包括:
- 上下文压缩
在利用大模型生成答案前,先进行prompt压缩,减少噪音,凸显关键段落,有利于提高回答质量和应对大模型最大tokens数限制。 - 重排
重排的目的是为了解决大模型处理长文本时存在的lost in the middle现象,将最相关的信息进行重新排序,能够让大模型着重关注与query更相关的信息。
2.2.4 进阶RAG——pipeline优化
在RAG检索过程中,还提出了一些针对整个RAG过程的优化方法,具体包括:
- 递归检索
在将索引文段和返回文段进行拆分,计算query和小知识片段相似度,但召回目标是小片段所属的大片段,用大片段给大模型做检索增强。 - 后退提示
引导大模型回退到实例前提条件领域,从更底层的角度,利用更广泛的概念和原则进行推理。
2.3 第三阶段——模块化RAG
模块化RAG打破了传统索引、检索和生成三步的朴素RAG和进阶RAG框架。为RAG过程提供了更多的多样性和灵活性。
- 搜索模块
搜索模块针对特定的任务场景,跨各种数据源进行搜索。 - 记忆模块
利用大模型本身生成能力来辅助检索,使用模型输出增强自己。 - 融合模块
融合模块将用户查询扩展到不同角度,利用并行搜索和重排技术,解决传统搜索局限性。 - 路由模块
在不同数据源间进行导航,为查询选择最优数据路径。 - 生成模块
生成模块任务是响应大模型的输出,生成模块还可为RAG其他流程生成数据。 - 任务适配模块
使RAG系统能适应各种下游任务
3. RAG增强技术
根据朴素RAG和进阶RAG的整体流程,我们可以将RAG增强技术大致的分为5类:输入增强、检索增强、生成增强、结果增强以及Pipeline增强。
3.1 输入增强
输入是指用户查询,该查询最初被输入到检索器中。输入的质量显著影响检索阶段的最终结果。
3.1.1 查询改写(Query transformation)
- Query2Doc
使用LLM的一些提示生成伪文档,然后将它们与原始查询组合以创建新的查询,提高检索的命中率。 - Doc2Query
为每篇文档生成若干query,使用这些关联的query代替文档被检索。类似于为每篇文档提取一个语义摘要。 - HyDE
通过LLM对用户query生成一篇假设性文档,根据这个文档对向量去查找相似的N个向量。
3.1.2 数据增强(Data Augmentation)
数据增强在检索之前改进了数据,包括去除不相关信息、消除歧义、更新过时的文档、合成新数据等技术。
- Make-An-Audio
Make-An-Audio使用字幕和音频文本检索为无语言音频生成字幕以减轻数据稀疏性,并添加随机概念音频来改进原始音频。 - LESS(LLM Tuning)
通过计算每个数据样本对模型参数的影响来选择对目标任务有帮助的数据样本,从而提高模型性能。
3.2 检索增强
检索到的内容质量决定了输入生成器的信息,较低的内容质量会增加模型幻觉和退化的风险。
3.2.1 递归检索(Recursive Retrieval)
- ReACT
ReACT的思想是使用CoT(Chain-of-Thought)来对用户查询进行分解,并对分解后的查询进行检索,来提供更丰富的信息。
3.2.2 分块优化(Chunk Optimization)
- LlamaIndex
small to big,通过检索细粒度内容,但是返回更丰富的信息。如,Sentence-window检索小文本块但是小文本块周围相关句子的窗口。 - RAPTOR
通过递归的向量化、聚类和摘要文本,自下而上构建一个包含不同级别摘要的树状结构。
3.3 生成增强
生成器的质量通常决定了最终输出结果的质量。生成器的能力决定了整个RAG系统有效性的上限。
3.3.1 提示词工程(Prompt Engineering)
- Chain of Thought
CoT通过提示词的调整改变大语言模型的输出结构,通过在提问时给出少量推理样例,让大模型模仿推理过程,可以让模型输出更多的中间计算过程,从而提高输出效果。
- LLMLingua
LLMLingua使用一个小模型压缩查询的整体长度,一方面加快模型推理缓解了不相关信息对模型对负面影响,另一方面也减轻了“Lost in Middle”现象。
3.3.2 解码调整(Decoding Tuning)
通过微调超参数来增强生成器控制。
3.3.3 生成器微调(Generator Finetuning)
微调生成器使模型适合特定领域。
3.4 结果增强
在有些情况下,RAG的结果可能无法达到预期效果,对结果进行增强可以帮助缓解该问题。
3.4.1 输出重写(Output Rewrite)
- Ring
Ring通过对生成器产生的每个令牌对数概率的平均值重新排列候选者来获得多样性结果。
3.5 Pipeline增强
一些研究发现检索并不总是增强最终结果,当模型固有参数足以回答相关问题时,过度地检索会导致资源浪费和潜在混淆。
3.5.1 自适应检索(Adaptive Retrieval)
- Rule-based:根据一定的规则来确定是否使用检索器
- Model-based:基于生成器或其他预训练的模型来确定是否使用检索器
3.5.2 迭代RAG
迭代RAG通过检索和生成阶段重复循环而不是仅使用一轮推理来生成结果,从而达到逐步细化的效果。
4. RAG与Finetune及未来发展
传统prompt工程对外部知识的需求较低,重点是利用LLM本身的能力;Fine-tuning需要进一步训练模型;RAG早期对模型的修改需求也很低,随着研究发展,更多研究将基于Modular RAG与Fine-tune技术的集成。
4.1 RAG未来发展研究方向
- 检索结果中的噪声
RAG在检索过程中如果存在噪声或矛盾信息会严重影响输出质量,错误的信息可能比根本没有信息更糟糕。 - 额外开销
检索在某些情况下可以减少生成成本,但在大多数情况下会产生不可忽略的开销。当RAG与复杂的增强方法相结合时,这一点被放大,如递归检索和迭代RAG。 - 上下文长度
RAG的生成受到大模型的max tokens数约束。如果token太少可能无法包含足够的相关信息,如果token过多可能会导致信息丢失。同时延长的上下文也容易减慢生成的过程。 - 与FT的协同
RAG和微调的协同问题也是一个主要的研究点,如何协调两者之间的关系,同时获得参数化和非参数化的优势,也是一个需要解决的问题。
5. 参考文献
[1] Zhao, P., Zhang, H., Yu, Q., Wang, Z., Geng, Y., Fu, F., Yang, L., Zhang, W., & Cui, B. (2024). Retrieval-Augmented Generation for AI-Generated Content: A Survey. ArXiv, abs/2402.19473.
[2] Gao, Y., Xiong, Y., Gao, X., Jia, K., Pan, J., Bi, Y., Dai, Y., Sun, J., Guo, Q., Wang, M., & Wang, H. (2023). Retrieval-Augmented Generation for Large Language Models: A Survey. ArXiv, abs/2312.10997.
[3] Gao, L., Ma, X., Lin, J., & Callan, J. (2022). Precise Zero-Shot Dense Retrieval without Relevance Labels.
[4] Xia, M., Malladi, S., Gururangan, S., Arora, S., & Chen, D. (n.d.). LESS: Selecting Influential Data for Targeted Instruction Tuning.
[5] Yao, S., Zhao, J., Yu, D., Du, N., Shafran, I., Narasimhan, K., & Cao, Y. (2022). ReAct: Synergizing Reasoning and Acting in Language Models.
[6] Sarthi, P., Abdullah, S., Tuli, A., Khanna, S., Goldie, A., & Manning, ChristopherD. (2024). RAPTOR: Recursive Abstractive Processing for Tree-Organized Retrieval.
[7] Yan, S.-Q., Gu, J.-C., Zhu, Y., & Ling, Z.-H. (n.d.). Corrective Retrieval Augmented Generation.
[8] Nelson F. Liu, Kevin Lin, John Hewitt, Ashwin Paranjape, Michele Bevilacqua, Fabio Petroni, Percy Liang; Lost in the Middle: How Language Models Use Long Contexts. Transactions of the Association for Computational Linguistics 2024.
[9] Arora, D., Kini, A., Sayak, R., Chowdhury, N., Natarajan, G., Sinha, A., & Sharma, S. (n.d.). GAR-MEETS-RAG PARADIGM FOR ZERO-SHOT INFORMATION RETRIEVAL.
[10] Wei, J., Wang, X., Schuurmans, D., Bosma, M., Chi, E., Le, Q., & Zhou, D. (n.d.). Chain of Thought Prompting Elicits Reasoning in Large Language Models.
[11] Jiang, H., Wu, Q., Lin, C.-Y., Yang, Y., & Qiu, L. (n.d.). LLMLingua: Compressing Prompts for Accelerated Inference of Large Language Models.
[12] Joshi, H., Cambronero, J., Gulwani, S., Le, V., Radicek, I., & Verbruggen, G. (2022). Repair Is Nearly Generation: Multilingual Program Repair with LLMs.
[13] RAG原理、综述与论文应用全解析, https://blog.csdn.net/mingzai624/article/details/137343216
[14] 大模型中的RAG, https://blog.csdn.net/qq_41200212/article/details/137779616
-持续更新-