Retrieval-Augmented Generation for Large Language Models: A Survey
基本信息
博客贡献人
猪八戒
作者
Yunfan Gao, Yun Xiong, Xinyu Gao 等
单位
同济大学上海智能自主系统研究所、复旦大学计算机科学学院上海数据科学重点实验室、同济大学设计与创新学院
摘要
大语言模型(LLM)展示了令人印象深刻的能力,但却遇到了诸如幻觉、过时的知识和不透明、无法追踪的推理过程等挑战。检索-增强生成(RAG)已经通过整合来自外部数据库的知识而成为一种很有前途的解决方案。这提高了生成的准确性和可信度,特别是对于知识密集型任务,并允许持续的知识更新和特定领域信息的集成。RAG 协同地将 LLM 的内在知识与外部数据库的庞大的、动态的存储库结合起来。这篇综述论文提供了对 RAG 进展的详细调查,包括 Naive RAG、Advanced RAG 和 Modular RAG。仔细地研究了 RAG 框架的基础,提供了对 RAG 系统的进展的深刻理解。最后,描述了目前面临的挑战,并指出未来的研发途径。
1. Naive RAG
RAG 的定义:
在大语言模型时代,RAG的具体定义是指在回答问题或生成文本时,首先从大量文档中检索相关信息。随后,它利用这些检索到的信息来生成响应或文本,从而提高预测的质量。
Naive RAG遵循传统的过程,即索引、检索、生成:
索引(Indexing):首先清理和提取不同格式的原始数据,如PDF、HTML、Word,将其转换为统一的纯文本格式。然后为了适应大语言模型的上下文长度限制,文本被分割成更小的、可理解的 Chunk 。接下来使用嵌入模型将块编码为向量,并存储在向量数据库中。
检索(Retrieval):在收到用户查询后,RAG 系统首先使用在索引阶段使用的相同的编码方式将查询编码为向量。然后计算查询向量和索引语料库中的块向量之间的相似性得分。接下来对与查询相似最大的前K个块进行优先排序和检索。
生成(Generation):根据用户提出的查询和检索中选择出的多个块,设计出 prompt,输出到大语言模型中给出最终的回答。
RAG的优点:
- RAG通过将答案与外部知识联系起来,减少语言模型中的幻觉问题,并使生成的回答更加准确可靠。
- 使用检索技术可以识别最新信息。保持了响应的及时性和准确性。
- 透明度是RAG的一个优势。通过引用来源,用户可以验证答案的准确性,增加对模型输出的信任。
- 在安全和隐私管理方面,RAG凭借其在数据库中内置的角色和安全控制,可以更好地控制数据使用。相比之下,微调后的模型可能缺乏对谁可以访问哪些数据的明确管理。
- RAG的可扩展性更强。它可以处理大规模数据集,而无需更新所有参数和创建训练集,使其更经济高效。
Naive RAG的缺点:
-
检索挑战:低精度的检索系统可能导致不相关信息的选择,造成关键信息的缺失。
-
增强过程问题:可能无法将检索到的内容很好的与 query 相结合;或检索到的内容中包含冗余和重复,可能导致生成结果中出现重复内容;或面对复杂的问题,基于原始查询的单次检索可能不足以获取足够的信息。
-
内容相关性问题:检索到的多个内容的价值可能不相同,需要辨别其对具体任务的重要性。
-
过度依赖:LLM 可能会过度依赖检索到的内容,而忽略本身已经学习的知识。
2. Advanced RAG
Advanced RAG增加了 Pre-Retrieval 和 Post-Retrieval 模块:
Pre-Retrieval 模块:
这一阶段的重点是优化索引和优化查询。优化索引的目标是提高被索引内容的质量。这包括以下策略:增强数据粒度、优化索引结构、添加元数据、对齐优化和混合检索。而优化查询的目标是使用户的原始问题更清晰,更适合于检索任务。常见的方法包括查询转换、查询重写、查询扩展等。
-
增强数据粒度:旨在提升文本的标准化、一致性、事实准确性和上下文丰富性。如删除不相关的信息和特殊字符、消除实体和数据中的歧义、消除重复或冗余信息、更新过时文档、添加另一层相关领域的上下文等。
-
添加元数据:将元数据(如日期)添加到 Chunk 中进行过滤,以提高检索效率。
-
混合检索:主要是指充分利用关键词检索、语义检索、向量检索等其他检索技术来提升检索丰富度。
Post-Retrieval 模块:
由于检索到的内容比较多,重要性也各不相同,如果一味地和 query 合并可能会超过 LLM 上下文限制,同时增加计算开销,也可能引入噪声,导致生成质量不佳。此时,通常需要对检索到的内容进一步处理:
-
重排序(Re-Ranking):这是搜索领域的常见手段,如传统搜索通常是按相关性、质量等进行排序输出;而在 LLM 生成领域要考虑检索到文档的多样性,以及 LLM 对 Prompt 中内容所在位置的敏感度等,比如 LostInTheMiddleRanker 将最佳文档交替地放在上下文窗口的开头和结尾。
-
提示压缩(Prompt Compression):检索到的文档中的噪声会对 RAG 性能产生不利影响,可以重点压缩不相关的上下文,突出关键段落,减少整体上下文长度。也可以用专门的模型对文档进行压缩、总结、过滤等。
3. Modular RAG
模块化 RAG 源于传统的 RAG 框架,其集成不同功能的子模块,提供了很大的灵活性。其主要是增加了一些新的模块,并构建了一些新的范式。
新的模块:
-
Search:与 Naive/Advanced RAG 中查询和语料库之间的相似性检索不同,搜索模块针对特定场景进行定制,在此过程中使用LLM生成的代码、查询语言(如SQL)或其他自定义工具对(额外的)语料库进行直接搜索。
-
Memory:利用LLM本身的记忆能力来指导检索,其原理包括找到与当前输入最相似的记忆,来辅助当前的生成。
-
Demonstrate:使用标记过的问答对来实现一种弱监督形式,该弱监督以编程方式注释在搜索和预测中调用的转换。
-
Predict:检索的数据中可能包含噪声和冗余信息,Predict 用于使用 LLM 生成相应的确定的信息而不是直接检索。
-
Fusion:通过 query 改写可以基于用户 query 生成多个 query 去检索和生成,Fusion 模块负责融合这些结果,更好地与用户对齐。
-
Routing:用户任务可能比较复杂,此时往往需要多个步骤完成,Routing 模块就是负责任务拆解和分流,比如有多个检索数据源,Routing 负责挑选对应的数据源。
新的范式:
Naive RAG 和 Advanced RAG 也可以理解为模块化 RAG 的某种范式,当前的研究集中在两个方面:
-
增加或替换模块:比如在 “Retrieve-Read” 的基础上增加 query 改写。
-
调整模块 Pipeline:比如 DSP 和 ITER-RETGEN。
4. RAG vs Fine-tuning
5. RAG 优化
5.1 索引优化
5.1.1 Chunk 优化
在构建离线索引时通常会将文档分为不同的 Chunk,而 Chunk 的大小有多方面影响,比如,如果 Chuck 过大,则可能超过后续 LLM 的上下文窗口大小;如果 Chunk 过小,则可能导致相关信息被分割开来,影响检索质量。常用的平衡 Chunk 大小的策略为Small2Big,该方法以句子作为检索单元,其前面和后面的句子作为上下文提供给LLMs。
常见的 Chunk 优化策略有:
-
滑动窗口:直接按照某个固定大小切割文档可能导致关键内容被分到两个不同 Chunk 中,从而影响检索质量,此时可以采用有重叠的切割方案。
-
精炼:有些时候文档内容会比较冗余,此时可以考虑对文档进行总结,减少冗余信息。
5.1.2 Metadata
可以从原始文档中提取元数据,或人工构建元数据,包括时间、类型、文档标题等,实现信息过滤。举例来说,在检索过程中,通过为文档的时间戳分配不同的权重,可以实现具有时间感知能力的 RAG 。
5.1.3 结构化索引
- 层次索引技术,通过构建文件与 Chunk 的层次关系,帮助快速遍历数据,协助 RAG 系统对 Chunk 的提取。例如,可以先对整个文档进行总结归纳,基于总结构建一级索引,文档的 Chunk 构建二级索引,检索时先从总结索引中检索。
- 图索引技术通过将文档构建为知识图谱,获取了文档内容与结构之间的相关性,如 KGP。
5.2 检索源优化
RAG 的关键是通过额外的语料库来增强 LLM 的生成质量,数据源可以分为非结构化数据(如文本)、半结构化数据(如 PDF 文档)、结构化数据(如知识图谱),它们也往往需要不同的处理手段。如 G-Retriever 引入了知识图谱,使用 GNN 与 LLM、RAG 进行结合。
5.3 Query 优化
Query 优化是检索系统中提升检索结果准确性非常有必要的阶段,通过这些手段,系统可以更好的理解用户意图并提供更准确的结果。通常包含如下手段:
-
Query 改写:对用户输入 query 进行修改或重写,通常只调整 query 结构、添加或删除关键词,或者通过近义词替换来扩展检索范围。
-
Query 纠错:通常是指尝试修正用户 query 中可能的拼写或语法错误。
-
Query Clarification:通常是指修正或分解用户 query 中不明确或模糊的内容,使系统更好地理解并执行相应的检索,有助于避免歧义。
5.4 Embedding 优化
Embedding 优化主要包括:
-
使用合适的 embedding 模型:检索任务通常是判断两段内容是否相关,相似任务是判断两段内容是否相似,相关的内容不一定相似。因此随意挑选一个文本模型用于提取 embedding 不一定合适,学习的目标也不一定相同。
-
针对任务进行微调:embedding 模型的训练语料和实际检索的语料分布可能并不相同,此时在对应语料上进行 finetuning 可以显著提升检索到的内容的相关性。
-
Adapter:在提取 query embedding 后进一步让 embedding 经过 Adapter,再计算 query 与 Chunk 向量之间的相似度,以便实现与 Chunk 更好的对齐。
6. RAG 未来研究方向
- RAG 与长上下文问题:随着 LLM 可输入 token 长度的不断增加,需要对未来 RAG 的存在意义和价值进行探索。
- RAG 鲁棒性问题:RAG 在检索过程中存在的噪声或矛盾信息会严重影响输出质量,这种情况被称为“错误信息可能比根本没有信息更糟糕”。
- RAG 与微调的协同工作:探索RAG与微调的结合策略,包括顺序的、交替的方式。
- RAG 的工程实践:解决不同领域中使用 RAG 时遇到的挑战。
总结
这篇综述论文首先概述了 RAG 框架的三点基础,即检索、生成和增强技术。然后提供了对 RAG 进展的详细调查,包括 Naive RAG、Advanced RAG 和 Modular RAG。接下来给出了 RAG 的一些优化方式。最后指出了 RAG 的未来研究方向。
启发
- 图片没有使用复杂的色彩和结构,就达到了很好的视觉效果;
- 以图形化的方式介绍了RAG的发展和现有方法,非常直观。
BibTex
@article{gao2023retrieval,
title={Retrieval-augmented generation for large language models: A survey},
author={Gao, Yunfan and Xiong, Yun and Gao, Xinyu and Jia, Kangxiang and Pan, Jinliu and Bi, Yuxi and Dai, Yi and Sun, Jiawei and Wang, Haofen},
journal={arXiv preprint arXiv:2312.10997},
year={2023}
}