本文主要是介绍Retrieval-Augmented Generation for Large Language Models: A Survey,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
PS: 梳理该 Survey 的整体框架,后续补充相关参考文献的解析整理。本文的会从两个角度来分析总结,因此对于同一种技术可能在不同章节下都会有提及。第一个角度是从整体框架的迭代来看(对应RAG框架章节),第二个是从RAG中不同组成部分来看(对应 Retriever,Generator 和 Augmentation in RAG)。
https://arxiv.org/abs/2312.10997
Introduction
传统上,神经网络通过微调模型来参数化知识,从而适应特定领域或专有信息。虽然这项技术产生了显著的结果,但它需要大量的计算资源,成本高昂,并且需要专门的技术专业知识,使其不太适应不断变化的信息环境。参数化知识和非参数化知识发挥着不同的作用。
- 参数知识:是通过训练LLM获得的,并存储在神经网络权重中,代表模型对训练数据的理解和概括,形成生成响应的基础。
- 非参数知识:存在于矢量数据库等外部知识源中,不直接编码到模型中,而是作为可更新的补充信息处理。
纯参数化语言模型(LLM)将从大量语料库中获取的世界知识存储在模型的参数中。其局限性如下:
- 首先很难保留训练语料库中的所有知识,尤其是不太常见和更具体的知识。
- 由于模型参数不能动态更新,参数知识很容易随着时间的推移而过时。
- 参数的扩展导致训练和推理的计算费用增加。
为了解决纯参数化模型的局限性,语言模型可以采用半参数化方法,将非参数化语料库数据库与参数化模型相集成。
检索增强生成(RAG, Retrieval-Augmented Generation) 最早由Lewis等人于2020引入,将预先训练的检索器与预先训练的seq2seq模型(生成器)相结合,并进行端到端的微调,以更可解释和模块化的方式获取知识。
在大型模型出现之前,RAG主要专注于端到端模型的直接优化。在检索端进行密集检索,例如Karpukhin等人使用基于向量的密集通道检索(DPR, Dense Passage Retrieval) ,以及在生成端训练较小的模型是常见的做法。由于总体参数较小,检索器和生成器通常都会进行同步的端到端训练或微调。
在LLM出现后,生成语言模型成为主流,在各种语言任务中表现出令人印象深刻的性能。然而,LLM仍然面临挑战,如幻觉、知识更新和数据相关问题。这影响了LLM的可靠性,使其在某些严重的任务场景中举步维艰,尤其是在需要获取大量知识的知识密集型任务中,如开放领域问答和常识推理。参数内的隐性知识可能是不完整和不充分的。在随后的研究发现,将RAG引入大型模型的上下文学习(ICL, In-Context Learning)可以缓解上述问题,具有显著且易于实施的效果。
背景知识
RAG 的定义
在大型语言模型时代,RAG的具体定义是指在回答问题或生成文本时,首先从大量文档中检索相关信息的模型。随后,它利用这些检索到的信息来生成响应或文本,从而提高预测的质量。RAG方法允许开发人员避免为每个特定任务重新训练整个大型模型。
总之,RAG系统由两个关键阶段组成:
- 利用编码模型基于问题检索相关文档,如BM25、DPR、ColBERT和类似方法
- 生成阶段:使用检索到的上下文作为条件,系统生成文本
RAG vs Fine-tuning
PS. 在某些情况下,将这两种技术相结合可以实现最佳的模型性能。
现有研究表明,与其他优化大型语言模型的方法相比,检索增强生成(RAG)具有显著的优势:
- RAG通过将答案与外部知识联系起来,减少语言模型中的幻觉问题,并使生成的回答更加准确可靠,从而提高准确性。
- 使用检索技术可以识别最新信息。与仅依赖训练数据的传统语言模型相比,RAG保持了响应的及时性和准确性。
- 透明度是RAG的一个优势。通过引用来源,用户可以验证答案的准确性,增加对模型输出的信任。
- RAG具有定制功能。通过对相关文本语料库进行索引,可以针对不同领域定制模型,为特定领域提供知识支持。
- 在安全和隐私管理方面,RAG凭借其在数据库中内置的角色和安全控制,可以更好地控制数据使用。相比之下,微调后的模型可能缺乏对谁可以访问哪些数据的明确管理。
- RAG的可扩展性更强。它可以处理大规模数据集,而无需更新所有参数和创建训练集,使其更经济高效。
- RAG产生的结果更值得信赖。RAG从最新数据中选择确定性结果,而微调模型在处理动态数据时可能会出现幻觉和不准确,缺乏透明度和可信度。
RAG 框架
Naive RAG
Naive RAG涉及传统的过程:索引、检索和生成,因此也被概括为 “Retrieve”-“Read” 框架。
Indexing
从源获取数据并为其建立 index 的管道通常处于脱机状态。数据索引的构建包括以下步骤:
- 数据索引:清理和提取原始数据,将不同的文件格式(如PDF、HTML、Word、Markdown等)转换为纯文本。
- Chunking: 这包括将加载的文本分成更小的块,因为语言模型通常对其可以处理的上下文数量有限制,因此有必要创建尽可能小的文本块。
- 嵌入和创建索引:这是通过语言模型将文本编码为矢量的过程。得到的向量将用于后续的检索过程,以计算向量和问题向量之间的相似性。嵌入模型需要很高的推理速度。由于需要对大量语料库进行编码,并在用户提问时实时对问题进行编码。
Retrieve
给定用户的输入,使用与第一阶段相同的编码模型将查询转换为向量。计算问题嵌入和文档块在语料库中的嵌入之间的相似性。基于相似性水平,选择前K个文档块作为当前问题的增强上下文信息。
Generation
给定的问题和相关文档将合并到一个新的提示中。大型语言模型的任务是根据所提供的信息回答问题,根据不同任务的需要,可以决定是允许大型模型使用其知识,还是仅基于给定信息进行回答。
Naive RAG的缺点
Naive RAG在三个领域面临主要挑战:
- 检索质量
- 主要问题是精度低,检索集中的所有块都与查询相关,这会导致潜在的幻觉和空中空投问题。
- 低召回率。当没有检索到所有相关块时,会出现这种情况,从而阻止LLM获得足够的上下文来合成答案。
- 过时的信息。即数据冗余或过时的数据可能导致不准确的检索结果。
这篇关于Retrieval-Augmented Generation for Large Language Models: A Survey的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!