AUTO-RAG: AUTONOMOUS RETRIEVAL-AUGMENTED GENERATION FOR LARGE LANGUAGE MODELS

news2025/4/16 3:09:55

Auto-RAG:用于大型语言模型的自主检索增强生成

单位:中科院计算所

代码: https://github.com/ictnlp/Auto-RAG

拟解决问题:通过手动构建规则或者few-shot prompting产生的额外推理开销。

贡献:提出一种以LLM决策为中心的自主迭代检索模型

Abstract

迭代检索是指模型在生成过程中不断查询检索器,以增强检索到的知识的相关性,从而提高检索增强生成 (RAG) 的性能的过程。现有工作通常采用小样本提示或手动构建的规则来实现迭代检索。这引入了额外的推理开销,并忽视了大型语言模型 (LLM) 卓越的推理能力。在本文中,我们介绍了 Auto-RAG,这是一种以 LLM 强大的决策能力为中心的自主迭代检索模型。Auto-RAG 与检索器进行多轮对话,系统地规划检索并优化查询以获取有价值的知识。此过程一直持续,直到收集到足够的外部信息,此时结果将呈现给用户。为此,我们开发了一种在迭代检索中自主合成基于推理的决策指令的方法,并对最新的开源 LLM 进行了微调。实验结果表明,Auto-RAG 能够与检索器进行自主迭代交互,有效利用 LLM 卓越的推理和决策能力,从而在六个基准中取得优异的表现。进一步分析表明,Auto-RAG 可以根据问题的难度和检索到的知识的效用自主调整迭代次数,而无需任何人工干预。此外,Auto-RAG 以自然语言表达迭代检索过程,增强可解释性,同时为用户提供更直观的体验。

Introduction

为了解决检索内容中的噪声(回答中会有很多不相干的内容)以及复杂查询(问题简单,但却要检索很多内容。如:行军路线)。已经提出了迭代检索(Feng et al., 2023; Chen et al., 2024; Asai et al., 2023) (Yu 等, 2024, p. 1)。当前的迭代过程大多依赖few-shot prompting和人力构建规则,忽视了大语言模型的推理能力。

因此引入Auto-RAG,下图展示了其如何解决复杂多跳问题的一个具体示例。

Related Work

检索增强生成的引入是为了解决:

  1. LLM对长尾知识保留不足;

  2. 模型参数中嵌入过时知识。

检索器缺陷(主要是检索内容的噪音)解决:

  1. 改进查询公式“(Ma et al., 2023)” (Yu 等, 2024, p. 3)

  2. 增强检索器“(Karpukhin et al., 2020; Chen et al., 2023)” (Yu 等, 2024, p. 3)

  3. 改进生成器“(Yoran et al., 2023; Yu et al., 2023)” (Yu 等, 2024, p. 3)

  4. 后检索优化“(Yu et al., 2024; Xu et al., 2023)” (Yu 等, 2024, p. 3)

任务复杂性的增加导致单词检索难度增大。

  • ITER-RETGEN将输入问题与上一次迭代生成的输出连接起来,以形成下一次迭代的新查询。(仅仅反映现有知识,没有明确LLM的信息需求)

  • FLARE使用下一个生成的句子作为查询,根据检索结果对前一个句子进行提炼。尽管这种方法更精确地识别了 LLM 的信息需求,但其有效性在很大程度上取决于精心制作的few-shot prompt,需要不断检索和改进,从而导致大量的人工工作和推理成本增加。

  • Self-RAG训练 LLM 反思检索和生成的内容。然而,Self-RAG 只在训练期间学会机械地预测反射标记,而没有培养推理能力,这进一步限制了这种方法的有效性。

与上述方法相比,Auto-RAG 充分释放了 LLM 在迭代检索过程中基于推理的自主决策的潜力。Auto-RAG 使 LLM 能够通过推理自主决定何时检索以及检索什么。与其他迭代检索方法相比,Auto-RAG 提供了卓越的性能和更高的效率。

Method

Reasoning-based iterative retrieval

$(X,Y)→[X,R_0​,(Q_t​,D_t​,R_t​)_{1≤t≤T}​,A]$

例子:

原始输入

  • X: "诸葛亮北伐时蜀军是如何行军的?"

初始推理
  • R₀: 模型先根据已有知识进行第一步推理,例如:

    “诸葛亮北伐是三国时期蜀汉对曹魏的军事行动,总共有数次。这需要进一步确认是哪一次北伐。”

迭代过程(每一轮表示一次信息检索与推理)
  • 在数据合成期间,2WikiMultihopQA 的 T 设置为 10,Natural Questions设置为 5。

第 1 次迭代:
  • Q₁: 从 R₀ 中抽取的信息需求,例如:

    “诸葛亮第一次北伐的时间、出发地和目标区域?”

  • D₁: 检索到的文档段落,比如:

    “第一次北伐发生在建兴六年(228年),诸葛亮从汉中出发,经由祁山攻打陈仓。”

  • R₁: 新的推理内容:

    “第一次北伐路线是从汉中出发,经祁山,目标是陈仓。”


🔄 第 2 次迭代:
  • Q₂: 进一步需要的信息:

    “蜀军途径哪些地点?是否有记载他们在哪些地方驻扎或作战?”

  • D₂: 检索到的新段落:

    “北伐军在途中经过武都、阴平,派遣马谡驻守街亭,街亭失守导致退兵。”

  • R₂: 新的推理内容:

    “行军路线包括汉中 → 祁山 → 武都 → 阴平 → 街亭,但因街亭失守,北伐失败。”


注:如果前一次迭代的推理 Rt−1 包含信息需求4,则查询 Qt 将被采纳(标准:预定义了 “however”、“no information”、“find” 和 “refine” 等术语来表示模型的信息需求。如果输出中出现任何上述内容,则表示需要额外信息),检索器将为 Qt 提供文档 Dt。

🎯 最终答案:
  • A: 综合所有推理得出最终结论:

    “诸葛亮第一次北伐时,蜀军从汉中出发,沿祁山、武都、阴平一线北上,目标是陈仓,派遣马谡驻守街亭,但因街亭失守导致北伐失败。”

Reasoning based planning and query refinement

推理范式

  1. Retrieval Planning

  2. Information Extraction

  3. Answer Inference

需要注意的是,在最初收到用户的问题时,通常会省略步骤 2和 3。此外,如果发现检索到的信息完全不相关,则步骤2也被排除在外。这种调整使 LLM 能够根据实际情况做出明智的判断,而不仅仅是模仿演示和产生幻觉。用于引出推理的提示在附录 C.1 中给出。

通过适当的推理过程,LLM 可以根据用户输入和以前的检索计划迭代优化查询,不断适应新的信息要求。为了生成足够多样化的查询集,而不受 few-shot prompt中出现的查询样式的限制,我们采用了更灵活的提示方法,如附录 C.5 所示(这个模板很合适)。

Data Filtering & Formatting

Data Filtering(Algorithm 1)

🔁 执行 Algorithm 1


第 1 步:初始化

DInst = []


第 2 步:对数据集 D 中每对 (X, Y) 遍历,这里我们只有一对。

第 3 步:语言模型 M 进行首次推理

R0 = M.predict_reasoning(X)

输出示例:

“诸葛亮北伐多次,需要先明确是第几次,才能判断路线。”


第 4 步:设置轮次计数

t = 1


第 5~18 步:迭代推理和检索(最多 T 次)

我们设 T = 2,进行两轮迭代。


🔁 第一次迭代(t = 1)

Step 6:生成多个查询 Qgen

Qgen = M.generate_queries(X, R0)

输出示例:

["诸葛亮第一次北伐发生在哪一年?", "诸葛亮北伐是从哪里出发的?"]


Step 7~11:尝试找一个 query 能检索出包含“部分答案”的文档
  • R.retrieve() 找到:

d = "第一次北伐发生在建兴六年(228年),从汉中出发,经祁山攻魏。"

识别出包含部分答案(“汉中 → 祁山”),满足条件:

Qt = "诸葛亮北伐是从哪里出发的?" Dt = d


Step 15:语言模型根据前面内容生成本轮推理

R1 = M.reason(X, R0, [(Qt, Dt)], Qt, Dt)

输出:

“诸葛亮第一次北伐是从汉中出发,经祁山北上,这是行军的初始部分。”


Step 16:判断是否还有信息需求

模型发现还需知道是否经过其他地点,所以继续迭代。

t = 2


🔁 第二次迭代(t = 2)

Step 6:基于前一轮推理生成新 query

Qgen = M.generate_queries(X, R1)

输出:

["诸葛亮北伐过程中是否经过街亭?", "蜀军在哪些地方战斗或驻扎?"]


Step 8~11:检索文档

例如:

d = "蜀军派马谡驻守街亭,街亭失守导致全军撤退。"

识别出是部分答案(街亭事件)。

Qt = "诸葛亮北伐过程中是否经过街亭?" Dt = d


Step 15:生成新的推理

R2 = M.reason(X, R0, [(Q1, D1, R1)], Qt, Dt)

输出:

“街亭是北伐途中的关键战役地点,蜀军在此失败,决定了整个北伐的结局。”


Step 16:判断是否还需检索

此时 R2 包含完整的信息,模型判断无需再提问,跳出循环。


Step 19:生成最终回答

A = M.answer(X, R0, [(Q1, D1, R1), (Q2, D2, R2)])

输出:

“诸葛亮第一次北伐路线为汉中 → 祁山 → 街亭。街亭失守后,北伐失败撤退。”


Step 20:验证是否和真实答案匹配

if A == Y: # 或通过相似度度量近似判断

✅ 匹配,加入训练集。


最终输出:

DInst.append([X, R0, (Q1, D1, R1), (Q2, D2, R2), A])


🧾 总结输出结果格式:

{ "X": "诸葛亮北伐时蜀军是如何行军的?", "R0": "诸葛亮北伐多次,需要明确是哪次。", "Iterations": [ { "Q": "诸葛亮北伐是从哪里出发的?", "D": "第一次北伐发生在建兴六年(228年),从汉中出发,经祁山攻魏。", "R": "北伐路线从汉中出发,经祁山北上。" }, { "Q": "诸葛亮北伐过程中是否经过街亭?", "D": "蜀军派马谡驻守街亭,街亭失守导致全军撤退。", "R": "街亭是北伐途中的关键战役地点,蜀军在此失败后撤退。" } ], "A": "诸葛亮第一次北伐路线为汉中 → 祁山 → 街亭。街亭失守后,北伐失败撤退。" }

Data Formatting

类似于一个多轮对话生成

Training

有监督

Inference

为了避免无休止的推理而无法生成答案采用Algorithm2,在到达一定迭代次数的时候获取参数知识

Experiment

数据集:Natural Questions & 2WikiMultihopQA

推理过程:Qwen1.5-32B-Chat

重写查询:Llama-3-8B-Instruct

没有Baseline,选取zero-shot模型的Naive RAG作为Baseline。对比结果见

“Table 1: Main results on six benchmarks. Auto-RAG consistently outperforms all baselines.” (Yu 等, 2024, p. 7)

Analysis

不同数量文档和不同迭代次数上AutoRAG的表现。可以看出(a)(b)数据集是单跳数据集终止的轮数较快,而Hotpot问题终止的轮数叫慢,体现模型的自适应性很强。

如图 4 所示,在每次迭代中提供不同数量的文档对整体 QA 性能有一定的影响。在这三项任务中,每次迭代提供三个文档会产生出色的结果,这表明为 Auto-RAG 提供适当大小的文档是有益的。我们还将 AutoRAG 与无检索方法 (Naive Gen) 和标准 RAG 进行了比较。Auto-RAG 在每次迭代的不同文档计数上始终优于它们。值得注意的是,Auto-RAG 表现出比 Standard RAG 更小的性能波动,证明了其对猎犬的卓越稳健性。

消融实验表明推理模块确实有用,few-shot也要比zero-shot要好

数据规模越大越好,收敛也更快。

表现整体更好,检索速度较慢,轮数也适中。

Conclusion

在本文中,我们介绍了 Auto-RAG,这是一种以 LLM 强大的决策能力为中心的自主迭代检索模型。Auto-RAG 通过多轮对话与检索器交互,系统地规划检索和优化查询以获取有价值的知识,直到获得足够的外部信息,此时结果将呈现给用户。为此,我们开发了一种在迭代检索中自主合成基于推理的决策指令的方法,并对最新的开源 LLM 进行了微调。分析结果表明,Auto-RAG 不仅取得了出色的性能,而且保留了高度的可解释性,为用户提供了更直观的体验。

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

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

相关文章

基础贪心算法集合2(10题)

目录 1.单调递增的数字 2.坏了的计算器 3.合并区间 4.无重叠区间 5. 用最少数量的箭引爆气球 6.整数替换 解法1:模拟记忆化搜索 解法2位运算贪心 7.俄罗斯套娃信封问题 补充.堆箱子 8.可被3整除的最大和 9.距离相等的条形码 10.重构字符串 1.单调递增的数字…

空间信息可视化——WebGIS前端实例(二)

技术栈:原生HTML 源代码:CUGLin/WebGIS: This is a project of Spatial information visualization 5 水质情况实时监测预警系统 5.1 系统设计思想 水安全是涉及国家长治久安的大事。多年来,为相应国家战略,诸多地理信息领域的…

Vue3微前端架构全景解析:模块联邦与渐进式集成

一、微前端核心模式 1.1 主应用与微应用通讯机制 1.2 架构模式对比 维度iFrame方案Web Components模块联邦组合式微前端样式隔离完全隔离Shadow DOM构建时CSS作用域动态样式表通信复杂度困难(postMessage)自定义事件依赖共享Props传递依赖共享不共享按需加载自动共享显式声明…

多模态大语言模型arxiv论文略读(十九)

MLLMs-Augmented Visual-Language Representation Learning ➡️ 论文标题:MLLMs-Augmented Visual-Language Representation Learning ➡️ 论文作者:Yanqing Liu, Kai Wang, Wenqi Shao, Ping Luo, Yu Qiao, Mike Zheng Shou, Kaipeng Zhang, Yang Yo…

【蓝桥杯选拔赛真题101】Scratch吐丝的蜘蛛 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析

目录 scratch吐丝的蜘蛛 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 四、程序编写 五、考点分析 六、推荐资料 1、scratch资料 2、python资料 3、C++资料 scratch吐丝的蜘蛛 第十五届青少年蓝桥杯s…

游戏引擎学习第221天:(实现多层次过场动画)

资产: intro_art.hha 已发布 在下载页面,你会看到一个新的艺术包。你将需要这个艺术包来进行接下来的开发工作。这个艺术包是由一位艺术家精心制作并打包成我们设计的格式,旨在将这些艺术资源直接应用到游戏中。它包含了许多我们会在接下来的直播中使用…

前端基础之《Vue(4)—响应式原理》

一、什么是响应式 1、响应式英文reactive 当你get/set一个变量时&#xff0c;你有办法可以“捕获到”这种行为。 2、一个普通对象和一个响应式对象对比 &#xff08;1&#xff09;普通对象 <script>// 这种普通对象不具备响应式var obj1 {a: 1,b: 2} </script>…

Go学习系列文章声明

本次学习是基于B站的视频&#xff0c;【Udemy高分热门付费课程】Golang&#xff1a;完整开发者指南&#xff08;基础知识和高级特性&#xff09;中英文字幕_哔哩哔哩_bilibili 本人会尝试输出视频中的内容&#xff0c;如有错误欢迎指出 next page: Go installation process

Go:程序结构

文章目录 名称声明变量短变量声明指针new 函数变量的生命周期 赋值多重赋值可赋值性 类型声明包和文件导入包初始化 作用域 名称 命名规则&#xff1a; 通用规则&#xff1a;函数、变量、常量、类型、语句标签和包的名称&#xff0c;开头须是字母&#xff08;Unicode 字符 &a…

Python 二分查找(bisect):排序数据的高效检索

二分查找&#xff1a;排序数据的高效检索 第二天清晨&#xff0c;李明早早来到了图书馆。今天他的研究目标是bisect模块&#xff0c;特别是其中的bisect_left和bisect_right函数。这些函数实现了二分查找算法&#xff0c;用于在已排序的序列中高效地查找元素或确定插入位置。 …

【数据结构】堆排序详细图解

堆排序目录 1、什么是堆&#xff1f;1.1、什么是大顶堆1.2、什么是小顶堆 2、堆排序的过程3、堆排序的图解3.1、将数组映射成一个完全二叉树3.2、将数组转变为一个大顶堆3.3、开始进行堆排序 4、堆排序代码 1、什么是堆&#xff1f; 堆的定义&#xff1a;在一棵完全二叉树中&a…

CST1016.基于Spring Boot+Vue高校竞赛管理系统

计算机/JAVA毕业设计 【CST1016.基于Spring BootVue高校竞赛管理系统】 【项目介绍】 高校竞赛管理系统&#xff0c;基于 DeepSeek Spring AI Spring Boot Vue 实现&#xff0c;功能丰富、界面精美 【业务模块】 系统共有两类用户&#xff0c;分别是学生用户和管理员用户&a…

安卓性能调优之-掉帧测试

掉帧指的是某一帧没有在规定时间内完成渲染&#xff0c;导致 UI 画面不流畅&#xff0c;产生视觉上的卡顿、跳帧现象。 Android目标帧率&#xff1a; 一般情况下&#xff0c;Android设备的屏幕刷新率是60Hz&#xff0c;即每秒需要渲染60帧&#xff08;Frame Per Second, FPS&a…

GPT-SoVITS:5 步实现 AI 语音克隆

在 AI 技术高速迭代的今天&#xff0c;语音合成早已突破”机械朗读“的局限 —— 从短视频创作者的虚拟配音、游戏角色的个性化声线&#xff0c;到智能客服的自然交互&#xff0c;GPT-SoVITS正凭借其强大的多模态融合能力&#xff0c;成为实现”AI 声音克隆“与“情感化语音生成…

记录:安装 Docker Desktop 时直接设置安装路径及容器存储路径

近期学用 deepseek 本地知识库的构建&#xff0c;准备尝试几个不同的 RAG 工具&#xff0c;结果基本都需要 Docker 支持&#xff0c;故又重新拾起 Docker 来安装&#xff0c;刚好看到个不用目录链接就可以直接设置安装路径的方法&#xff0c;就记录一下&#xff0c;以免以后忘…

算法训练之贪心

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

Vagrant 安装指南:从零开始搭建开发环境

Vagrant 是一款强大的虚拟化工具&#xff0c;能够帮助开发者快速创建和管理轻量级的、可复制的开发环境。它通过与 VirtualBox、VMware 或 Hyper-V 等虚拟机提供程序结合使用&#xff0c;让你在本地轻松运行虚拟机。本文将详细介绍如何在 Windows、macOS 和 Linux 系统上安装 V…

APIGen-MT:高效生成多轮人机交互Agent数据的两阶段框架

APIGen-MT&#xff1a;高效生成多轮人机交互数据的两阶段框架 引言 随着人工智能技术的飞速发展&#xff0c;AI代理&#xff08;Agent&#xff09;已从简单的聊天机器人发展为能够执行复杂现实任务的系统&#xff0c;例如管理金融交易、安排预约和处理客户服务等。然而&#x…

【NLP】 21. Transformer整体流程概述 Encoder 与 Decoder架构对比

1. Transformer 整体流程概述 Transformer 模型的整个处理流程可以概括为从自注意力&#xff08;Self-Attention&#xff09;到多头注意力&#xff0c;再加上残差连接、层归一化、堆叠多层的结构。其核心思想是利用注意力机制对输入进行并行计算&#xff0c;从而避免传统 RNN …

《Vue Router实战教程》21.扩展 RouterLink

欢迎观看《Vue Router 实战&#xff08;第4版&#xff09;》视频课程 扩展 RouterLink RouterLink 组件提供了足够的 props 来满足大多数基本应用程序的需求&#xff0c;但它并未尝试涵盖所有可能的用例&#xff0c;在某些高级情况下&#xff0c;你可能会发现自己使用了 v-sl…