RAG整体分为三个阶段:初始RAG、先进的RAG、模块化RAG
一、初始RAG:遵循传统的过程,包括索引、检索和生成
1)索引:清晰和提取原始数据(PDF、HTML、Word、Markdown),之后将提取的信息转换为统一的纯文本格式。为了适应大语言模型的上下文限制,将文本分给为更小的chunks,之后通过嵌入模型将chunks编码为向量表示,并存储至向量数据集。
2)检索:收到用户的查询后,RAG系统使用与索引相同的编码模型将query转换为向量表示。之后,计算query向量和索引语料库中chunk向量之间的相似性得分。对于与query最相似的前K个chunk,系统将其进行优先化并检索。这些chunk随后用作prompt的扩展上下文。
3)生成:将提出的query和选中的文档合为一个prompt输入大语言模型。模型生成答案的方法可能会根据特定任务的标准而变化,可以是利用固有的参数知识进行回答或者将LLM的响应限制在文档中包含的信息。对于正在进行的对话,任何已有的对话历史能够集成到prompt,使模型能够有效进行多轮对话交互。
缺点:a)受到检索阶段的精确度和召回率的限制,有可能选择不对齐或不相关的chunk,错过关键信息。b)在生成响应时,模型可能生成不受检索上下文支持的内容,也可能出现不相关、有害或偏差的输出,从而降低响应的质量和可靠性。c)将检索信息与不同任务结合是一个挑战,有时会导致不连贯或杂乱的输出;从不同的源可能检索到相似的信息,从而导致重复的回复,造成系统冗余。确定各段落的意义和相关性、确保风格的一致性会进一步增加复杂度。面对复杂的问题,单一检索可能不足以获得足够的上下文信息。
二、先进的RAG:利用了前检索和后检索策略,以增强检索质量。为了解决索引问题,先进的RAG利用滑窗、细粒度分割和结合元数据来优化索引技术。此外,结合了一些优化方法来简化检索过程。
1)前检索过程:优化索引结构和原始索引。优化索引——提高被索引内容的质量,主要涉及增强数据力度、优化索引结构、增加元数据、对齐优化和混合索引。query优化——使用户的原始问题更清晰并更适合检索任务,通用方法包括query重写、query转换、query膨胀和其他方法。
2)后检索过程:检索到相关上下文后,将其高效地与query整合到一起很关键。后检索过程的主要方法包括rerank chunk和上下文压缩。a)一种关键策略是对检索到的信息进行重排序,以将最相关的内容重定位到prompt的边缘。这种概念集成到了LlamaIndex、LangChain和HayStack框架中。b)将所有相关的文件直接送入LLM可能造成信息过载,不相关的信息会冲淡关键细节。为此,后检索过程关注于选择关键信息、强调关键部分和缩短要处理的上下文信息。
三、模块化RAG:增强了自适应性和通用性,采用了多种策略来改进其组件,例如增加搜索模块进行相似性搜索、通过微调优化检索器。
1)新模块:模块化RAG框架引入了额外专门的组件来增强检索和处理能力。搜索模块适用于特定场景,能够直接在多种数据源之间搜索,例如搜索引擎、数据库、知识图谱、LLM生成的代码和query语言。RAG融合采用多query策略,将用户query扩展到多种角度,利用并行向量搜索和智能重排序来同时挖掘显性和变化的知识。记忆模块利用LLM的记忆引导检索,通过迭代自增强将文本与数据分布更加对齐。Routing模块在不同数据源之间为query选择最优路径。预测模块旨在通过直接使用LLM生成上下文,减少冗余和噪声,以确保相关性和准确性。任务自适应模块使RAG适用于多个下游任务,包括zero-shot输入的自动提示检索、通过few-shot query生成制造任务特定的检索器。
2)新模式:允许模块替换或重配置,以解决特定挑战。这类方法的特点是简单的“检索”和“阅读”机制,超越了固定结构的初始和先进的RAG框架。此外,模块化RAG通过集成新的模块或调整交互流来扩展灵活性,增强跨不同任务间的适用性。
重写-检索-阅读模型利用LLM的能力通过重写模块和LM反馈机制更新重写模型,以优化检索query。生成-阅读方法使用LMM生成的内容替代传统的检索方法,Recite-Read从模型权重方面强调检索,增强模型能力来处理知识密集任务。混合检索策略集成关键词、语义和向量搜索来迎合不同的query。此外,采用子query和假设文档嵌入(HyDE)旨在通过关注生成的答案和真实文档之间的嵌入相似度提升检索相关性。