技术动态 | 模块化(Modular)RAG 和 RAG Flow
随着RAG技术的演进,RAG整体的流程变动更加丰富和自由。具体表现在以下几个方面:在检索增强数据源上,不再局限于传统的纯⽂本⽂档为为代表的非结构化数据。越来越多的研究引⼊了半结构化数据(例如,PDF、HTML和LaTex)、结构化数据(例如三元组、KG、以及结构化查询语句)。经过预处理结构数据更进⼀步提供检索的逻辑性和可验证性,降低模型幻觉。此外,以检索LLM⾃身代替外部知识源的方法逐渐兴起。通过
随着RAG技术的演进,RAG整体的流程变动更加丰富和自由。具体表现在以下几个方面:
在检索增强数据源上,不再局限于传统的纯⽂本⽂档为为代表的非结构化数据。越来越多的研究引⼊了半结构化数据(例如,PDF、HTML和LaTex)、结构化数据(例如三元组、KG、以及结构化查询语句)。经过预处理结构数据更进⼀步提供检索的逻辑性和可验证性,降低模型幻觉。此外,以检索LLM⾃身代替外部知识源的方法逐渐兴起。通过进⼀步挖掘LLM的能⼒,以减少对外部知识源的依赖。
在检索增强技术上,RAG的思想正更多和其他术进行融合,增强的手段越发丰富。例如,微调技术和RAG的协同使⽤。例如利⽤通过微调的⽅式对检索器和⽣成器单独进⾏微调或协同微调。增加Adapter模块来对齐Query之间Chunk 之间的语义差异。增加下游任务⽆关\任务特定的检索适配器。除了微调,研究⼈员借鉴了RLHF的思想,通过RL,以更强⼤的LLM(GPT-4)作为监督信号来增强检索能⼒。
在检索增强流程上,RAG系统不再局限于,先检索再⽣成。可以迭代的进⾏多轮检索增强,⽤检索出来的内容指导⽣成,⽤⽣成的内容进⼀步指导检索。另⼀⽅⾯,可以利⽤LLM或⾃主判断是否需要检索。以提⾼回答问题的效率。
模块化RAG
可以看到,上述RAG的快速发展早已经突破传统的链式 RAG 范式,展示出了模块化的特点。但是当前的对RAG范式的梳理和抽象还没有跟上技术的快速发展。
因此,我们⽴⾜当前RAG的技术发展特点和趋势,整合了Naive RAG和Advanced RAG的发展范式,提出了Modular RAG范式。Modular RAG是具有⾼度扩展的范式,它将RAG系统拆分为Molule Type - Module-Operator的三层结构。
每⼀个Module Type 代表了RAG系统中的⼀个核⼼流程,Module Type中包含多个功能模块,每个功能模块内部⼜包括多个具体的算⼦。整个RAG系统变成多个模块和对应算⼦之间的排列和组合,我们将其称为RAG Flow。在FLow中,在每个模块类型中可以选择不同⼀个或多个功能模块,⽽每个功能模块内部⼜可以选择⼀或多个算⼦。
Modular RAG和之前范式的关系
Modular RAG中以多层级模块化的形式组织了RAG系统。Adavanced RAG 则是模块化的RAG特例形式,进⼀步的Naive RAG本身也是Advanced RAG的特例。三个范式之间是继承与发展的关系。
Modular RAG下的机遇
Modular RAG的好处是显⽽易⻅的,将当前RAG的技术整合到⼀个范式中,提供了更加全⾯且更⾼维度的视⻆,可以让研究⼈员快速把握当前研究发展的全貌和趋势,构建⼀个RAG的思维地图。通过模块之间编排,相关的技术和⽅法被清晰的汇总,RAG系统的设计和构建变得更加便利,更容易定位到问题环节。
对于研究⼈员。研究⼈员可以在全⾯了解RAG当前的发展的基础上,更好地识别当前RAG各个模块中的缺陷,聚焦研究内容,提出新的模块类型、模块和算⼦。
对于开发⼈员。⼀⽅⾯开发研究⼈员可以借鉴当前经过验证的RAG Flow Pattern,快速上⼿。另⼀⽅⾯开发⼈员可以根据特定的数据情况、使⽤场景、下游任务以及其他需要去定制化地编排不同的RAG模块和算⼦,定义新的Flow和 Flow Pattern。
RAG Flow
在定义了模块化RAG的”模块类型“,”模块“和”算⼦“。不同模块和和算⼦的编排就组成了RAG Flow。这就为我们看待RAG系统提供了新的视⻆。
我们将从三个⽅⾯审深⼊探讨RAG Flow的设计思路,总结了7个典型的 RAG Flow模式、7个特定的 RAG 流实现以及3个最佳的⾏业案例。
微调阶段模式
1. 检索器微调
直接微调。
添加可训练的Adapter 模块
LSR(LM-supervised Retrieval)
LLM Reward RL
2. 生成器微调
对⽣成器的微调,主要的⽅法包括:
直接微调。
GPT-4蒸馏。
基于反馈的强化学习(RLHF)
3. 协同微调
在RAG系统中同时对检索器和⽣成器进⾏微调,这也是Modular RAG的特点之⼀。需要注意是,系统微调强调的是让检索器和⽣成器之间的配合。分别对检索器和⽣成器微调严格上属于前两者的组合,并不是属于协同。
⼀个典型的实现如RA-DIT。分别对LLM和检索器进⾏微调。LM-ft组件通过更 新LLM来最⼤化给定检索增强指令情况下正确答案的可能性。R-ft组件通过更 新检索器来最⼩化检索器分数分布与LLM偏好之间的KL散度。
推理阶段模式
1. Sequential
线性的结构的RAG Flow,模块线性的组织成流⽔线,如果拥有Pre-Retrieval 和Post-Retrieval 两个Module Type,则是典型的Advanced RAG 范式,如果去掉则是典型的Naive RAG范式。
Sequential是⽬前使⽤最多的RAG Pipeline,其中在最常使⽤的搭配如下,在检索前增加Query Rewrite,在检索后增加Rerank的算⼦。例如QAnything。
Rewrite-Retrieve-Read也是典型的序列结构。其中jQuery Rewrite模块是⼀个⼩型的可训练的语⾔模型,并通过最终LLM的输出结果作为奖励.在强化学习的背景下,重写器优化被形式化为⼀个⻢尔科夫决策过程。检索器选⽤了稀疏编码器BM25。
2. Conditional
条件结构的RAG Flow,根据不同的条件选择不同的RAG路线。通常由⼀个Routing模块进⾏路由,判断依据包括通常包括Query的关键词或语义。路由到不同的路线,通常根据问题的类型,适⽤的场景路由到不同的Flow中。例如当⽤户提问到严肃的问题,政治问题或是娱乐问题,对⼤模型幻觉的容忍度是不同的。不同路由分⽀通常在检索源、检索流程、配置信息、模型选择和Prompt上进⾏差异化。
⼀个Conditional RAG的经典Implementation 是semantic Router。
3. Branching
分⽀结构的RAG Flow。不同于Conditional中是要在多条分⽀中选择⼀条,Branching则是有多个分⽀并⾏。从结构上可以分成两类:
检索前分⽀ (Multi-Query, Parallel Retrieval)。对原始Query进⾏扩展,得到多个⼦Query,然后对每⼀个⼦Query分别进⾏检索,检索后就可以选择⽴即根据⼦问题和对应检索来的内容⽣成答案,也可以只使⽤拓展检索出来的内容最后合并到统⼀上下⽂中进⾏⽣成。
检索后分⽀ (Single Query, Parallel Generation)。保持原来的Query,检索到多个⽂档块后,并⾏使⽤原始Query和每⼀个⽂档块进⾏⽣成,最后将⽣成的结果合并到⼀起。
REPLUG就是⼀个典型的检索后分⽀的分结构,根据每⼀个分⽀预测token的概率,通过Weighted possibilityEnsemble 将不同的分⽀聚合,并通过最后⽣成结果作作为反馈微调检索器Contriever。
4. Loop
具有环状结构的RAG Flow,这也是的Modular RAG的⼀个重要特点,检索和推理步骤相互影响的。通常包括⼀个Judge模块,⽤于控制流程。具体⼜可以分成迭代、递归和主动检索三种。
5. Iterative Retrieval
有时候单次检索和⽣成的并不能很好的解决⼀些需要⼤量知识的复杂的问题。因此可以使⽤迭代的⽅式进⾏RAG,通常来说迭代检索都有⼀个固定的迭代次数。迭代检索⼀个典型的案例是是ITER-RETGEN。
在每次迭代中,ITER-RETGEN利⽤前⼀次迭代的模型输出作为特 定上下⽂,帮助检索更相关的知识,这可能有助于改进模型⽣成。循序的终⽌通过预设的迭代次数来判断。
6. Recursive Retrieval
不同于迭代检索,递归检索的特点是有明显依赖上⼀步并不断深⼊的检索。通常有判断机制作为递归检索的出口。在RAG系统中,递归检索的通常要搭配Query Transformation,每次检索时依赖于新改写后的Query。
⼀个典型的递归检索实现例如ToC。从初始问题(Ambiguous Question,AQ) ,通过递归执⾏RAC(递归澄清⽅法,Retrieval-Augmented Clarification)逐步插⼊⼦节点到澄清树中,在每个扩展步骤中,根据当前查询重新对段落进⾏重新排名并⽣成⼀个(Disambiguous Question,DQ)。树的探索在达到了最⼤数量的有效节点或最⼤深度时结束。构建了澄清树后,TOC收集所有有效节点并⽣成⼀个全⾯的⻓⽂本答案来回答AQ。
7. Adaptive (Active) Retrieval
随着RAG的发展,逐步超越被动的检索的⽅式,出现了⾃适应的检索(也被称作主动检索),这⼀⽅⾯也是受益于LLM的强⼤能⼒。在核⼼思想上与LLM Agent相似。
RAG系统可以主动判断的检索时机,以及判断时候结束整个流程,输出最终的结果。根据判断的依据,⼜可以分成和Prompt-base和Tuning-base。
Prompt-base.通过Prompt Engineering的⽅式让LLM对流程进⾏控制。⼀个典型的实现案例是FLARE。它的核⼼思想是LM应该仅在缺乏所需知识时进⾏检索,以避免被动检索增强的LM中出现不必要或不适当的检索。FLARE迭代地⽣成下⼀个临时句⼦,并检查是否包含低概率标记。如果是这样,系统将检索相关⽂档并重新⽣成句⼦。
Tuning-base.对LLM进⾏微调使其⽣成特殊的token,以此来触发检索或⽣成。这种思想可以追溯到Toolformer中,通过⽣成特俗的内容,来辅助调⽤⼯具。在RAG系统中则是⽤于控制检索和⽣成两个步骤。⼀个典型的案例是Self-RAG。具体⽽⾔,
(1)给定⼀个输⼊提示,和前⾯的⽣成结果,⾸先预测特殊token “Retrieve"判断是否通过检索段落对继续的⽣成进⾏增强是有帮助。
(2)如果有帮助,调⽤检索模型。模型会⽣成⼀个critique token来评估检索段的相关 性, 下⼀个响应⽚段,和⼀个批判令牌来评估响应⽚段中的信息是否得到了检索段的⽀持。
(3)最后, ⼀个新的批判令牌评估响应的整体效⽤。模型会并⾏处理这些内容,并选择最佳结果作为最终的输出。
最佳行业案例
前⽂接受了很多论⽂中的具体Flow实现,论⽂的特点决定了他们的⽅法更多的是从细节出发,解决具体的细节问题。⽽RAG是更是⼀个在⼯业领域⼤放异彩的技术,下⾯我们将从RAG Flow的⻆度介绍⼏个⾏业最佳的RAG实践,看看在真实应⽤场景下应该如何构建RAG Flow。
OpenAI
从OpenAI Demo day 的演讲整理所得,并不能完全代表OpenAI的实际操作。在提升RAG的成功案例中,OpenAI团队从45%的准确率开始,尝试了多种⽅法并标记哪些⽅法最终被采⽤到⽣产中。他们尝试了假设性⽂档嵌⼊(HyDE)和精调嵌⼊等⽅法,但效果并不理想。通过尝试不同⼤⼩块的信息和嵌⼊不同的内容部分,他们将准确率提升到65%。通过Reranking和对不同类别问题特别处理的⽅法,他们进⼀步提升到85%的准确率。最终,通过提示⼯程、查询扩展和其他⽅法的结合,他们达到了98%的准确率。团队强调了模型精调和RAG结合使⽤时的强⼤潜⼒,尤其是在没有使⽤复杂技术的情况下,仅通过简单的模型精调和提示⼯程就接近了⾏业领先⽔平。
Baichuan
基于百川的宣传资料整理(查看原⽂)。针对⽤户⽇益复杂的问题,百川借鉴了Meta的CoVe技术,将复杂Prompt拆分为多个独⽴且可并⾏检索的搜索友好型查询。利⽤⾃研的TSF(Think-Step Further)技术来推断和挖掘⽤户输⼊背后更深层的问题,以更精准、全⾯地理解⽤户意图。在检索步骤中,百川智能⾃研了Baichuan-TextEmbedding向量模型。同时引⼊稀疏检索和 rerank 模型(未披露),形成向量检索与稀疏检索并⾏的混合检索⽅式,⼤幅提升了⽬标⽂档的召回率。此外还引⼊了self-Critique让⼤模型基于 Prompt、从相关性和可⽤性等⻆度对检索回来的内容⾃省,进⾏⼆次查看,从中筛选出与 Prompt 最匹配、最优质的候选内容。
Databricks
Databricks作为⼤数据领域中领先的服务商,在RAG设计上依然保持了⾃⼰特点和优势(查看原⽂)。⽤户输⼊问题,通过从事先处理好的⽂本向量索引⾥⾯获取问题相关信息,加上提示词⼯程,⽣成回答。上半部分Unstructured Data pipeline就输主流的RAG⽅法,并没有特殊之处。
下半部分为Structured Data Pipeline,是 Databricks 特征⼯程处理流程,也是Databricks RAG最⼤的特点。Databricks从⾃身专业的⼤数据⻆度出发,从原来的准确度较⾼的数据存储中进⾏额外的检索,充分发挥⾃身在Real Time Data Serving 上的优势。可以看到Databricks在GenAI时代的策略是助具有⼴泛市场需求的RAG应⽤,将⾃身强⼤的Lakehouse数据处理能与⽣成式AI技术深度融合,构建出⼀体化解决⽅案。
更多信息⻅可以参考我们的Github:
https://github.com/Tongji-KGLLM/RAG-Survey
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)