Adaptive-RAG:根据难度自适应检索方案
RAG领域的论文最近真是让人眼花缭乱,今天聊一篇关于“自适应”RAG的工作。核心想法其实很直观:不同难度的问题,RAG系统不应该用同一套策略去应对。简单到常识性的问题,直接问大模型就行,根本用不着检索;中等难度的问题,简单检索一次就能搞定;而那些需要多步推理、涉及多重知识的复杂问题,才需要反复检索。所以,这篇论文搭建了一个能根据问题复杂度自动调整策略的自适应RAG系统。
- 论文:Adaptive-RAG: Learning to Adapt Retrieval-Augmented Large Language Models through Question Complexity。
- 链接:https://arxiv.org/abs/2403.14403
- GitHub(目前没代码,说是会尽快放):https://github.com/starsuzi/Adaptive-RAG
- 参考链接:https://zhuanlan.zhihu.com/p/691008957
目录:
- 核心方案
- 实验
- 补充讨论
核心方案
整体思路

整篇论文的核心思路可以用一张图说清楚。不同难度的问题,处理方式天然不同:一些常识性简单问题,压根不需要检索,直接问大模型就能答对;中等难度的问题,检索一次就能拿到支持文档;而那些需要多重推理、依赖多种知识的复杂问题,得查好几次才能得到正确答案。所以,一视同仁地做检索然后返回,显然不是最优解。
因此,作者把问题分成了三档:
- :不需要检索,直接返回。
简单(Non Retrieval for QA)
- :只需要简单检索就能获得支持文档。
中等(Single-step Approach for QA)
- :需要多步、复杂的检索才能得到答案。
困难(Multi-step Approach for QA)
这三档划分背后,核心考量其实是资源(检索耗时和反复检索带来的时间消耗)与最终结果正确性之间的权衡。
整体架构上,相比普通RAG,这里就是增加了一个策略划分的插件,把问题先拆解。所以关键点就两个:问题怎么拆,以及拆完之后不同档位的操作有什么区别。对于后者,上面的定义已经给出了答案——根据难度进行不同次数的检索。那么剩下的问题就是:问题难度的划分工作怎么做。
难度划分问题
现在把视角转到难度划分上,需要回答两个问题:
- query的简单、中等、复杂,在问题定义层面是怎么区分的?
- 在模型层面,用什么方法进行划分?训练集和测试集从哪来?
问题层面的定义和测试集的构造是放在一起的。论文通过举例给出了标注策略:
- 使用非检索方案就能得到正确结果的query,标为简单。
- 单步检索和多步检索都能得到结果的,出于节省成本优先考虑单步,所以标为中等。
- 只有多步检索才能答对的,标为困难。
- 默认情况下,单步检索数据集下的数据默认都是中等;多步检索数据集下没预测对的默认是困难。
这个方法里应该暗含了一些人工标注,但能整理出来已经不错了。
至于分类模型,文中提到使用小语言模型。实验部分具体用的是T5-Large,包括学习率、停止条件、学习器等细节都有交代。
有关实验
实验这块作者做了不少工作,尤其是关于分类模型的效果,之前的两篇论文都没做好,这次算是让人眼前一亮。重点聊几个关注到的点。
首先是实验数据。这几篇读下来,发现这里用的数据集都比较老,比如SQuAD v1.1、Natural Questions、TriviaQA等,基本上是20年前的数据了,只有MuSiQue稍微新一点。对比CRAG里用的PopQA、Biography、PubHealth(都是23年左右的),确实显得有些陈旧。当然,可能是出于对问题难易程度的考量,作者认为这些数据集不适合,具体原因没有深挖。
至于效果,理所当然地好。作者把Self-RAG作为关键的baseline进行对比,效果提升比较明显。当然,因为比Self-RAG做了更多的检索和预测,耗时确实增加了。但相比那些多次检索的模型(比如“Multi-step Approach”),耗时就明显降低了。总体看下来,Adaptive RAG算是有有效提升——以少量时间代价换来了更好的问答效果。
这里想小小质疑一下Self-RAG的效果。从结果看,Self-RAG的表现差得也太大了,几乎是垫底的存在。不知道是什么原因,感觉值得进一步探索。
至于分类器的效果,作者还是大胆给出了数据。说实话,确实不太好看。放在一般的文本分类任务里,基本就是不可用的水平——整体ACC只有50多。比较让人震惊的是,这么差的分类效果居然还能让整个RAG系统有收益。说明这个系统对“有没有分类”是敏感的,但对分类结果的精确度没那么敏感。
作者在分类效果评估上也比较严谨,对不同大小的模型做了综合评估。从表格可以看到,模型大小对效果影响不大,总之就是很差。
补充讨论
论文读完了,聊聊几点感想:
- 多次查询确实有问题——有些查询并不需要那么多步,甚至可能是多余的、反效果的。本文的自适应思路确实能带来收益。
- 新增了一种划分策略的思路:通过难度来划分应对策略。这不仅在处理性能上有收益,在最终效果上也有收益。
- 分类这块,效果确实比较差。个人感觉原因主要在于分类问题的定义本身——难度跟大模型能力、知识库支持、问题领域等因素差异很大,分类效果不好也算意料之中。不过好奇的是:这个分类器的优化究竟能给RAG整体效果带来多大收益?目前还不清楚。
- Self-RAG被拿进来对比,结果非常拉胯,有些出乎意外。感觉这里有打开方式、适应场景等问题,有进一步展开分析的价值。
最近读的几篇论文,大都是围绕“如何选择适配大模型的知识”来展开的,内部进行组件划分,从而提升最终预测效果。结合目前工业界对RAG业务落地的观察,能看到后续RAG在工业界可能形成的一种范式。这个范式原来只是模糊被提及,但现在信心越来越足了:
- 检索和大模型之间是先后关系——先检索,后大模型推理。这一点显而易见,但从整体架构来看,绕不开。
- 检索横向铺开,根据不同的业务需求和资源定制不同的检索策略。因为是横向的,所以允许多标签,形成多路召回。
- 检索结果出来后,进行多内容的合并、筛选和判别,选择最合适的结果送入大模型。呼应第一条里检索模块和大模型模块之间的先后关系。
关于这个结构的合理性和实践细节,不是这篇论文的重点,后续再展开聊。