24年7月来自同济大学和复旦大学的论文 “Modular RAG: Transforming RAG Systems into LEGO-like Reconfigurable Frameworks”。
检索增强生成 (RAG) 显著增强大语言模型 (LLM) 处理知识密集型任务的能力。应用场景的需求不断增长推动了 RAG 的演进,从而集成了高级检索器、LLM 和其他互补技术,这反过来又增加了 RAG 系统的复杂性。然而,这种快速的发展正在超越基础 RAG 范式,许多方法在“检索-然后-生成”的流程下难以统一。在此背景下,本文研究了现有 RAG 范式的局限性,并介绍了模块化 RAG 框架。将复杂的 RAG 系统分解为独立的模块和专门的算子,它有助于实现高度可重构的框架。模块化 RAG 超越传统的线性架构,采用一种集成路由、调度和融合机制的更高级设计。本文基于广泛的研究,进一步确定流行的 RAG 模式——线性、条件、分支和循环,并全面分析了它们各自的实现细节。模块化 RAG 为 RAG 系统的概念化和部署提供了创新机会。最后,本文探讨了新算子和新范式的潜在出现。
大语言模型 (LLM) 已经展现出卓越的能力,但它们仍然面临着许多挑战,例如幻觉和信息更新滞后 [1]。检索增强生成 (RAG) 通过访问外部知识库,为 LLM 提供重要的上下文信息,显著提升其在知识密集型任务上的性能 [2]。目前,RAG 作为一种增强方法,已广泛应用于各种实际应用场景,包括知识问答、推荐系统、客户服务和个人助理 [3]–[6] 。
在 RAG 的初期,其核心框架由索引、检索和生成构成,这种范式被称为 Naive RAG [7]。然而,随着任务的复杂性和应用需求的不断升级,Naive RAG 的局限性变得越来越明显。其实例如图所示,它主要依赖于块的直接相似性,导致在面对复杂查询和具有很大变化的块时性能不佳。Naive RAG 的主要挑战包括:1)对查询的浅薄理解。查询和文档块之间的语义相似性并不总是高度一致的。仅依靠相似度计算进行检索缺乏对查询和文档之间关系深入探索 [8]。2)检索冗余和噪声。将所有检索的块直接输入 LLM 并不总是有益的。研究表明,过多的冗余和噪声信息可能会干扰 LLM 对关键信息的识别,从而增加产生错误和幻觉响应的风险 [9]。
为了克服上述限制,Advanced RAG 范式专注于优化检索阶段,旨在提高检索效率并加强检索块的利用率。其实例如图所示,典型的策略包括检索前处理和检索后处理。例如,使用查询重写使查询更加清晰和具体,从而提高检索的准确性[10],并使用检索结果的重排序来增强LLM识别和利用关键信息的能力[11]。
尽管高级RAG的实用性有所提高,但其能力与实际应用需求之间仍然存在差距。一方面,随着RAG技术的进步,用户期望不断提高,需求不断发展,应用设置变得更加复杂。例如,异构数据的集成以及对系统透明度、控制和可维护性的新需求。另一方面,应用需求的增长进一步推动了RAG技术的演进。
如图所示(Modular RAG系统实例),为实现更精准、高效的任务执行,现代RAG系统正在逐步集成更精细的功能,比如以知识图谱的形式组织更细化的索引库、通过查询构造方法集成结构化数据、采用微调技术使编码器能够更好地适应领域特定文档等。
在流程设计方面,目前的RAG系统已经超越了传统的线性检索-生成范式,研究者利用迭代检索[12]获取更丰富的上下文,利用递归检索[13]处理复杂查询,利用自适应检索[14]提供整体的自主性和灵活性。这种流程的灵活性大大提升了RAG系统的表达能力和适应性,使其能够更好地适应各种应用场景。然而,这也使得工作流的编排和调度变得更加复杂,给系统设计带来了更大的挑战。
具体而言,RAG目前面临以下新挑战:
复杂数据源集成。RAG不再局限于单一类型的非结构化文本数据源,而是扩展到包括各种数据类型,例如表格等半结构化数据和知识图谱等结构化数据[15]。从多个来源访问异构数据可以为系统提供更丰富的知识背景和更可靠的知识验证能力[16]。
对系统可解释性、可控性和可维护性的新需求。随着系统复杂性的增加,系统维护和调试变得更具挑战性。此外,当出现问题时,快速找出需要优化的特定组件至关重要。
组件选择和优化。RAG系统中涉及更多的神经网络,需要选择合适的组件来满足特定任务和资源配置的需求。此外,额外的组件增强了RAG的有效性,但也带来了新的协同工作要求[17]。确保这些模型按预期运行并高效协同工作以提高整体系统性能,至关重要。
工作流编排和调度。组件可能需要按特定顺序执行,在特定条件下并行处理,甚至由 LLM 根据不同的输出进行判断。合理规划工作流对于提高系统效率和实现预期结果至关重要 [18]。
Modular RAG 系统由多个独立但紧密协调的模块组成,每个模块负责处理特定的功能或任务。该架构分为三层:顶层关注 RAG 的关键阶段,每个阶段都被视为一个独立的模块;这一层不仅继承了高级 RAG 范式的主要流程,还引入了一个编排模块来控制 RAG 流程的协调;中间层由每个模块内的子模块组成,进一步细化和优化功能;底层由基本操作单元——算子组成。在Modular RAG 框架内,RAG 系统可以以计算图的形式表示,其中节点代表特定的算子。三种范式的比较如图所示。Modular RAG 是基于 RAG 先前的发展而演变的。这三种范式之间的关系是继承和发展的关系。Advanced RAG 是模块化 RAG 的一个特例,而Naive RAG 是Advanced RAG 的一个特例。
Modular RAG的优势显著,增强了RAG系统的灵活性和可扩展性,用户可以根据数据源和任务场景的需求,灵活组合不同的模块和算子。
Modular RAG的模块包括6个:索引、预检索、检索、后检索、生成和编排。
索引是将文档分割成可管理块的过程,是组织系统的关键步骤。索引面临三个主要挑战。1)内容表示不完整。块的语义信息受分割方法的影响,导致重要信息在较长的上下文中丢失或被淹没。2)块相似性搜索不准确。随着数据量的增加,检索中的噪声会增加,导致频繁与错误数据匹配,使检索系统变得脆弱和不可靠。3)参考轨迹不清晰。检索的块可能来自任何文档,没有引用轨迹,可能导致存在来自多个不同文档的块,尽管这些文档在语义上相似,但包含完全不同主题的内容。其主要工作包括:块优化(滑行窗、元数据附件和小-到-大的块)和结构组织(分层索引和知识图索引)。
Naive RAG 的主要挑战之一是它直接依赖用户的原始查询作为检索的基础。提出一个精确而清晰的问题很困难,而轻率的查询会导致检索效果不佳。此模块的主要挑战包括:1) 措辞不当的查询。问题本身很复杂,语言组织得也不好。2) 语言复杂性和歧义性。语言模型在处理具有多重含义的专业词汇或模糊缩写时通常会遇到困难。例如,它们可能无法辨别 LLM 是指大语言模型还是法律背景下的法学硕士。预检索的主要工作包括:检索扩展(Multi-query和Sub-query)、索引转换(Rewrite、HyDE和Step-back Prompting)和索引构建。
检索过程是 RAG 系统的关键。通过利用强大的嵌入模型,查询和文本可以在潜空间中高效地表示,这有助于建立问题和文档之间的语义相似性,从而增强检索。需要解决的三个主要考虑因素包括检索效率、质量以及任务、数据和模型的一致性。其主要工作包括:检索器选择(稀疏检索、致密检索和混合检索)和检索器微调(SFT、LM-监督检索和适配器)。
将检索的所有块直接输入 LLM 并不是最佳选择。对块进行后处理有助于更好地利用上下文信息。主要挑战包括:1)迷失中间:与人类一样,LLM 往往只记住长文本的开头或结尾,而忘记中间部分 [43]。2)噪声/反事实块:检索的噪声或事实矛盾的文档会影响最终的检索生成 [44]。3)上下文窗口:尽管检索了大量相关内容,但大模型中上下文信息长度的限制阻止了所有这些内容的纳入。后检索的主要工作包括:重排序(基于规则和基于模型)、压缩和选择(选择性上下文、LLM批判)。
利用 LLM 根据用户的查询和检索的上下文信息生成答案。根据任务需求选择合适的模型,考虑微调需求、推理效率和隐私保护等因素。生成的主要工作包括:生成器微调(指令、强化学习和双重微调)和验证(基于知识和基于模型)。
编排是指控制 RAG 流程的控制模块。与传统的固定流程方法不同,RAG 现在在关键时刻纳入了决策,并根据之前的结果动态选择后续步骤。这种自适应和模块化能力是模块化 RAG 的标志,使其有别于更为简单的 Naive 和 高级的 Advanced RAG 范式。其主要工作包括:路由(元数据、语义和混合)、调度(规则裁决、LLM裁决和知识引导)和融合(LLM、加权集成和倒数秩RRF)。
算子之间的协作构成了模块 M 的工作流程,称为RAG流 F =(Mφ1,…,Mφn),其中 φ 代表模块参数集。模块化RAG流可以分解为子功能图。通过控制逻辑,算子 Op 可以在预定的流水线中执行,同时在必要时执行条件、分支或循环。在最简单的情况下,图是一个线性链。
一组常见的RAG流模式,记为P。这些模式超越了各种应用领域,表现出高度的一致性和可重用性,揭示了流程设计中普遍存在的结构和行为。RAG流模式可以定义为P = {Mφ1:{Op1}→Mφ2:{Op2}→…→Mφn:{Opn}}。
1 线性模式
常见的线性 RAG 流程在检索前阶段采用查询转换模块(如重写 Rewrite 或 HyDE 算子),在检索后阶段利用重排序。重写-检索-读取 (RRR) [24] 是一种典型的线性结构。
2 条件模式
3 分支模式
包括预检索分支和后检索分支两种。
REPLUG [55] 体现了经典的后检索分支结构,其中预测每个分支中每个 token 的概率。通过加权概率集成,将不同的分支聚合起来,最终的生成结果用于通过反馈来微调检索器(称为 Contriever)。
4 循环模式
循环模式可以进一步分为迭代、递归和自适应(主动)检索方法三种。
迭代检索的一个典型案例是 ITER-RETGEN [56],它迭代检索增强生成(RAG)和生成增强检索(GAR)。检索增强生成根据所有检索到的知识输出对任务输入的响应。在每次迭代中,ITER-RETGEN 利用上一次迭代的模型输出作为特定上下文来帮助检索更多相关知识。
递归检索的典型实现,例如 ToC [13],涉及递归执行 RAC(递归增强分类),从初始模糊问题(AQ)逐渐将子节点插入分类树中。
根据裁决标准,主动(自适应)检索又可分为基于提示法 (Prompt-base) 和基于调整法 (Tuning-base) 两种。
基于提示的方法,使用提示工程来控制流程,指导 LLM。一个典型的实施示例是 FLARE [14]。
基于调整的方法涉及微调 LLM 生成特殊 token,从而触发检索或生成。此概念可以追溯到 Toolformer [50],其中特定内容的生成有助于调用工具。在 RAG 系统中,此方法用于控制检索和生成步骤。一个典型案例是 Self-RAG。
5 微调模式
微调主要有三种模式,即检索器微调、生成器微调和双重微调。