【RAG 论文】Adaptive-RAG:自适应地根据 query 难度来选择合适的 RAG 模型

论文:Adaptive-RAG: Learning to Adapt Retrieval-Augmented Large Language Models through Question Complexity
⭐⭐⭐⭐
Code:github.com/starsuzi/Adaptive-RAG
NAACL 2024,arXiv:2403.14403

文章目录

    • 一、论文速读
    • 二、实现细节
      • 2.1 三种难度的 user query
      • 2.2 user query 的难度分类
    • 三、实验结果及分析
      • 3.1 Adaptive-RAG 的模型效果
      • 3.2 classifier 的效果
    • 总结

一、论文速读

这篇论文提出了 Adaptive-RAG 方案,特点是在 QA 场景中,能够自适应地根据 user query 的难度选择合适的 RAG 模型来解决,比如对于直接性的 query,就可以直接让 LLM 回答,对于简单的 query,只需要一轮 retrieval 就可以让 LLM 完成回答,而对于复杂的需要 multi-hop 的 query,则需要多轮 retrieval 才能让 LLM 完成回答。

本论文指出了以下两个观察到的现象

  • 用户大多数的问题都是简单的问题,少数情况下才是需要多条推理的复杂问题
  • 简单的问题使用复杂的 RAG 模型存在开销的浪费,而复杂的问题又无法用简单的 RAG 模型来解决

为此,本论文才提出了如下的方案(最右边的 C 就是本论文提出的 Adaptive-RAG 的思路):

不同的 RAG 方案

如上图,在 C 所示的思路中,存在一个 classifier 来对 user query 做困难度分类,然后再交由三种用于处理不同复杂的 RAG 模型的其中一个来完成解决。

二、实现细节

2.1 三种难度的 user query

本工作将 user query 的难度分为了三种,并给出了三种对应的解决策略:

  1. Non Retrieval for QA:对于 Straightforward Query,不需要经过检索,直接由 LLM 回答即可。
  2. Single-step Approach for QA:对于 Simple Query,只需要经过一轮检索即可获取支持 LLM 回复的 doc
  3. Multi-step Approach for QA:对于 Complex Query,需要多步、复杂的检索才能得到答案

2.2 user query 的难度分类

我们已经定义了 user query 的难度有三类,对于一个具体的 user query,如何将其分类呢?

这里就是训练了一个小语言模型作为 classifier,输入是 user query,输出是 query 的难度。原论文使用了 T5-large 并再训练得到的 classifier。

但是,目前并没有可用的 query-complexity pairs 数据集,因此,论文介绍了该工作是如何收集到用于训练 classifier 数据集的。query-complexity paris 是借助于已有的 QA 数据集来构建,为已有的 QA 数据集的 pair 标注 complexity label 来构建本实验所需的数据集。该数据集的收集主要包括两个过程

  1. Generate silver data from predicted outcomes of models:意思是说,假如难度分成 [A, B, C] 三个等级,A 最简单,C 最困难,那么给定一个 query,首先先让 LLM 直接回答,如果 LLM 回答正确,则将 query 标记为 A;如果 LLM 经过一轮检索后生成正确答案,则将 query 标记为 B;如果 LLM 经过多轮检索后生成正确答案,则将 query 标记为 C。
  2. Utilize inductive bias in datasets:经过第一个过程,有些 query 仍然无法被标记,因为可能三种 RAG 模型都没有生成正确答案,这个时候只能利用这个过程来完成标注。这时候利用一个特点:这些 benchmark datasets 的数据都有一定的偏向性,比如一个 dataset 可能都比较偏 single-hop,而另一个 dataset 可能就都比较偏 multi-hop,对于偏 single-hop 的则直接标为 B,否则直接标为 C。

经过以上两个过程,我们的数据集就构建出来了。

三、实验结果及分析

这里作者做了不少的工作,甚至还包括了 classifier 的模型效果。

3.1 Adaptive-RAG 的模型效果

作者选用的数据集都有点旧了,single-hop 用的是 SQuAD、Natural Questions、TriviaQA,multi-hop 用的是 MuSiQue、HotpotQA、WikiMultiHopQA。

baseline 主要选择的是 No Retrieval、Self-RAG 和 Multi-step Approach:

Adaptive-RAG 效果

  • 相比于 Self-RAG,准确率等效果提升很明显,但由于需要做更多的检索和预测,耗时上有了稍微明显的提升
  • 相比于 Multi-step Approach,耗时明显降低了,至于效果也降低了一些

总体上来看,Adaptive RAG 算是有效的提升了,它以少量时间为代价,提升了最终的问答效果。

这里有个小问题,论文给出的数据中,Self-RAG 的效果也有点太差了。。

3.2 classifier 的效果

如下是论文给出的不同 size 的 classifier 的效果对比:

classifier 效果

额,,其实这算是文本分类的 classifier 模型,但效果确实不太行,整体 ACC 只有 54.52%。

另外可以看出,classifier 的模型大小对效果影响并不大(都表现一般),这就可以根据实际部署情况来决定了。

总结

论文指出的观察到的现象确实是存在的,即用户大多数的问题都是简单问题,少数情况下才是复杂的问题,本工作提出的根据 user query 的复杂程度来选择 RAG 模型能够有效的在 effectiveness 和 efficiency 之间取得一个平衡。

另外,觉得公众号 Adaptive-RAG:根据难度自适应检索方案 | 叉烧 给出的总结与反思很不错,这里做一个引用摘抄:


论文读完了,聊一下本文读完的感想,后续会有文章展开聊。

  • 多次查询确实是有问题的,有些查询可能并不需要那么多,可能是多余的甚至是反效果的,本文的自适应确实是有一定收益。
  • 新增一种划分策略的思路,可以通过难度来划分应对策略,这个不仅在处理性能上有收益,在最终效果上也有收益。
  • 分类这块,可以看到这个分类的效果确实比较差,个人感觉原因主要是在分类问题的定义上,难度和大模型、和知识库支持、和问题领域之类的差异会比较大,本身分类效果不好应该是意料之中,不过好奇是这个分类器的优化会给RAG整体效果带来多大收益仍未可知。
  • self-rag被放进来进行对比,结果发现非常拉胯,有些让人出乎意外。感觉这里有打开方式、适应场景等的问题,有展开分析的价值。

最近读的几篇论文,大都是围绕着选择适配大模型的知识的策略,内部进行组件的划分,从而提升最终的预测效果,配合目前工业界对业务落地RAG的观察,我自己能看到后续RAG在工业界形成的一种范式,原来是有模糊提到的,但是现在的信心,应该是越来越足了。

  • 检索和大模型之间是先后的关系,先检索后大模型推理,当然这个应该是显而易见的,但从整体架构而言,这点绕不开。
  • 检索横向铺开,根据不同的业务需求和资源定制不同的检索策略,因为横向,所以允许多标签,形成多路召回。
  • 检索结果出来后,进行多内容的合并、筛选和判别,选择最合适的结果送入大模型,呼应第一条里提及检索模块和大模型模块之间的先后关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828736.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++-msys2程序工作原理?

文章目录 1. 子系统:2. MinGW-w64:3. Pacman 包管理器:4. POSIX 兼容性: MSYS2 是一个为 Windows 用户设计的 Unix-like 开发环境和命令行接口,它允许用户在 Windows 上编译和运行许多原本为类 Unix 系统设计的软件。M…

使用FPGA实现逐级进位加法器

介绍 逐级进位加法器就是将上一位的输出作为下一位的进位输入,依次这样相加。下面以一个8位逐级进位加法器给大家展示。 我增加了电路结构,应该很容易理解吧。 下面我也列举了一位加法器,可以看下。 电路结构 设计文件 1位加法器 librar…

Docker 的数据管理 端口映射 容器互联 镜像的创建

目录 概念 概念 管理 Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器(DataVolumes Containers)。总结:因为容器数据是临时保存的为了安全,就要让数据保持持久化。 1&#…

OceanBase单机版安装体验

前情提要 上周OceanBase开发者大会过后,作为观察员也来体验一下OB的安装。业内有某个国产安装用了两周,这种其实有点劝退了。话说就是10年前,没搞过Oracle的人也不用两周安装一个数据库啊。今天看看OB的(一体化)安装。…

计算机网络----第十三天

DNS协议和文件传输协议 DNS: 含义:用于域名和IP地址的互相解析 DNS域名: 背景:通过IP地址访问目标主机,不便于记忆 域名的树形层次化结构: ①根域 ②顶级域:主机所处的国家/区域&#xf…

一纸歉文难挽人心,特步站在了“悬崖边”

撰稿|多客 来源|贝多财经 日前,一场马拉松赛事风波把特步推上了舆论风口。 此次事件说起来也并不复杂,在4月14日举办的2024北京半程马拉松赛最后冲刺的几百米,几位外籍选手在超过何杰后,对何杰做出回头看、摆手示意的动作&…

【Python】使用Python连接ClickHouse进行批量数据写入

有许多时候 眼泪就要流 那扇窗是让我 坚强的理由 小小的门口 还有她的温柔 给我温暖陪伴我左右 曾经的乡音 悄悄地隐藏 说不出的诺言 一直放心上 🎵 李健《异乡人》 在本教程中,我们将探讨如何使用Python连接到ClickHouse数据库&am…

谁是存储器市场下一个“宠儿”?

AI浪潮对存储器提出了更高要求,高容量、高性能存储产品重要性正不断凸显,存储产业技术与产能之争也因此愈演愈烈:NAND Flash领域,闪存堆叠层数持续提升;DRAM领域HBM持续扩产,技术不断迭代,同时3…

Spring 5源码学习

文章目录 一. 访问[spring官网], 找到Spring Framework,点击红色标记github仓库,下载对应的分支代码,本人下载5.1.x二. 安装gradle三. 调整spring-framework配置四. 开始编译五.导入idea 一. 访问[spring官网], 找到Spring Framework&#xf…

【STM32+HAL+Proteus】系列学习教程---ADC(查询、中断、DMA模式下的电压采集)

实现目标 1、学会STM32CubeMX软件关于ADC的配置 2、掌握ADC三种模式(查询、中断、DMA)编程 3、具体目标:1、将开发板单片机采集到的电压值上传至上位机串口调试助手显示。 一、ADC 概述 1、什么是ADC? ADC(Analog to Digit…

【课程发布】软考高项目十大管理ITTO宫殿记忆法新版第四版正式发布

软考高项十大管理ITTO宫殿记忆法视频课程: 平台:荔枝微课 连接:十方教育 各位软考高级信息系统项目管理师考生好,新版第四版十大管理ITTO宫殿记忆法视频课程终于发布了,之前苦等的考生终于迎来了救星,再也…

浅谈数据模型

1:事实表和维表的概述 前言:数据仓库是一种用于存储和管理大量数据的技术。其中,事实表和维表是数据仓库中的两个重要概念,首先了解一下事实表和维度表 1.事实表:是指用于存储测量“事实数据”的表,事实数…

算法学习笔记Day8——回溯算法

本文解决几个问题: 回溯算法是什么?解决回溯算法相关的问题有什么技巧?回溯算法代码是否有规律可循? 一、介绍 1.回溯算法是什么? 回溯算法就是个多叉树的遍历问题,关键在于在前序和后序时间点做一些操作…

Java基础入门day35

day35 js 简介 js:JavaScript,是一种解释性语言,动态类型、弱类型的计算机语言 它的解释器被称之为JavaScript引擎,作为浏览器的一部分,广泛用于客户端脚本语言,用来给html网页增加动态功能 问题描述&…

记录如何用php删除一段文字中的指定文字

在PHP中,删除一段文字中的指定文字可以通过使用str_replace()函数来实现。这个函数可以替换字符串中的某些字符或字符串,如果你想要删除特定的文字,可以将它们替换为空字符串。 以下是使用str_replace()函数删除指定文字的基本语法&#xff…

更新网站源码,接着打开网站上传图片后却看不到图片的原因

更新网站源码,然后打开网站上传图片却看不到图片的原因。 最近在修改网站源码。今天上传了一下网站源码,然后打开网站上传图片,但是图片看不到。在windows 10运行正常。初步推测是源码可能有兼容性问题,后来再考虑一下&#xff0…

Day20-Python基础学习之正则表达式和递归(完结)

正则表达式 基础 # 正则表达式 import re ​ s "python itcast" # match 从头开始匹配 头部不匹配返回None result re.match("python", s) print(result) print(result.span()) print(result.group()) ​ # search 从开头找到结尾搜索,找到…

阿里云直播推流和播流地址的生成方法PHP

最近在用阿里云的直播SDK在进行直播功能的开发,整体来说磕磕绊绊,因为里面有好多的东西,一时半会的搞不定,但是工期又有期限,所以天天熬夜,程序员真心不容易,废话不多说,今天分享这个主要就是来…

华为机试:粮油买卖

粮油买卖 | 时间限制:1秒 | 内存限制:262144K 贩卖粮油的小华在经营一段时间后,发现和旁边的商贩相比,利润较低,于是开始记录3,4月份自己经营的粮油价格,以便第二年进行参考,请你写个…

哈希表练习题

前言 本次博客将要写一写,哈希表的一些使用 哈希表主要是一个映射,比如数组就是一个哈希表 是一个整型对应另一个整型,介绍的哈希表还是要以写题目为例 第一题 242. 有效的字母异位词 - 力扣(LeetCode) 直接来看…