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

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.mzph.cn/news/901328.shtml

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

相关文章

Python 基础语法汇总

Python 语法 │ ├── 基本结构 │ ├── 语句(Statements) │ │ ├── 表达式语句(如赋值、算术运算) │ │ ├── 控制流语句(if, for, while) │ │ ├── 定义语句(def…

一文详解ffmpeg环境搭建:Ubuntu系统ffmpeg配置nvidia硬件加速

在Ubuntu系统下安装FFmpeg有多种方式,其中最常用的是通过apt-get命令和源码编译安装。本文将分别介绍这两种方式,并提供安装过程。 一、apt-get安装 使用apt-get命令安装FFmpeg是最简单快捷的方式,只需要在终端中输入以下命令即可: # 更新软件包列表 sudo apt-get updat…

Android 14 、15动态申请读写权限实现 (Java)

在 Android 14、15 中&#xff0c;Google 进一步优化了存储权限系统&#xff0c;特别是写权限的管理。以下是完整的 Java 实现方案&#xff1a; 1. AndroidManifest.xml 声明权限 <!-- Android 14 存储权限 --> <uses-permission android:name"android.permiss…

小刚说C语言刷题——第23讲 字符数组

前面&#xff0c;我们学习了一维数组和二维数组的概念。今天我们学习一种特殊的数组&#xff0c;字符数组。 1.字符数组的概念 字符数组就是指元素类型为字符的数组。字符数组是用来存放字符序列或者字符串的。 2.字符数组的定义及语法 char ch[5]; 3.字符数组的初始化及赋…

用AI生成系统架构图

DeepSeek+Drawio+SVG绘制架构图-找到一种真正可行实用的方法和思路 1、使用DeepSeek生成SVG文件,导入drawio工具的方法 🔥 问题根源分析 错误现象: • 导入时报错包含 data:image/SVG;base64 和 %20 等 URL 编码字符 • 代码被错误转换为 Base64 格式(适用于网页嵌入,但…

免费干净!付费软件的平替款!

今天给大家分享一款超棒的电脑录屏软件&#xff0c;简直不要太好用&#xff01;它的界面特别干净&#xff0c;没有一点儿广告&#xff0c;看起来特别清爽。 电脑录屏 无广告的录屏软件 这个软件超方便&#xff0c;根本不用安装&#xff0c;打开就能直接用。 它功能也很强大&am…

【XCP实战】AUTOSAR架构下XCP从0到1开发配置实践

目录 前言 正文 1.CAN功能开发 1.1 DBC的制作及导入 1.2 CanTrcv模块配置 1.3 Can Controller模块配置 1.4 CanIf模块配置 2.XCP模块集成配置配置 2.1.XCP模块配置 2.2.XCP模块的Task Mapping 2.3.XCP模块的初始化 3.在链接文件中定义标定段 4.编写标定相关的测试…

Vitis: 使用自定义IP时 Makefile错误 导致编译报错

参考文章: 【小梅哥FPGA】 Vitis开发中自定义IP的Makefile路径问题解决方案 Vitis IDE自定义IP Makefile错误&#xff08;arm-xilinx-eabi-gcc.exe: error: *.c: Invalid argument&#xff09;解决方法 Vitis 使用自定义IP时: Makefile 文件里的语句是需要修改的&#xff0c;…

Python中NumPy的统计运算

在数据分析和科学计算领域&#xff0c;Python凭借其丰富的库生态系统成为首选工具之一&#xff0c;而NumPy作为Python数值计算的核心库&#xff0c;凭借其高效的数组操作和强大的统计运算功能&#xff0c;广泛应用于机器学习、信号处理、统计分析等场景。本文将系统介绍NumPy在…

C语言程序环境和预处理详解

本章重点&#xff1a; 程序的翻译环境 程序的执行环境 详解&#xff1a;C语言程序的编译链接 预定义符号介绍 预处理指令 #define 宏和函数的对比 预处理操作符#和##的介绍 命令定义 预处理指令 #include 预处理指令 #undef 条件编译 程序的翻译环境和执行环…

智能工厂调度系统设计方案研究报告

一、系统架构设计 1.1 物理部署架构 设备层&#xff1a;部署大量搭载多传感器阵列的 AGV 智能循迹车&#xff0c;这些传感器包括激光雷达、视觉相机、超声波传感器等&#xff0c;用于感知周围环境信息&#xff0c;实现自主导航与避障功能&#xff1b;在每个工序节点处设置 RF…

全新突破 | 更全面 · 更安全 · 更灵活

xFile 高可用存储网关 2.0 重磅推出&#xff0c;新增多空间隔离功能从根源上防止数据冲突&#xff0c;保障各业务数据的安全性与独立性。同时支持 NFS、CIFS、FTP 等多种主流文件协议&#xff0c;无需繁琐的数据拷贝转换&#xff0c;即可与现有系统无缝对接&#xff0c;降低集成…

C# js 判断table中tr否存在相同的值

html 中如&#xff1a; 实现&#xff1a;table数据表格中&#xff0c;点击删除按钮时&#xff0c;验证相同子订单号条数是否大于1&#xff0c;大于允许删除。保证数据表格中只有唯一的一条子订单号数据。 <table style"width: 100%; background-color: #fff;" ce…

操作系统基础:07 我们的任务

课程回顾与后续规划 上节课我们探讨了操作系统的历史。了解历史能让我们明智&#xff0c;从操作系统的发展历程中&#xff0c;我们总结出两个核心的里程碑式图像&#xff1a;多进程&#xff08;多任务切换&#xff09;图像和文件操作图像 。Unix和Windows等系统的成功&#xf…

16.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--微服务的部署与运维

部署与运维是微服务架构成功实施的关键环节。一个良好的部署与运维体系能够保障微服务的高可用性、可扩展性和可靠性。在这一阶段&#xff0c;重点包括微服务的容器化与编排、API 网关的实现以及日志与监控体系的建设。 一、容器化与编排 1.1 使用 Docker 容器化微服务 容器…

MCP基础学习计划详细总结

MCP基础学习计划详细总结 1.MCP概述与基础 • MCP&#xff08;Model Context Protocol&#xff09;&#xff1a;由Anthropic公司于2024年11月推出&#xff0c;旨在实现大型语言模型&#xff08;LLM&#xff09;与外部数据源和工具的无缝集成。 • 核心功能&#xff1a; • 资…

NoSQL入门指南:Redis与MongoDB的Java实战

一、为什么需要NoSQL&#xff1f; 在传统SQL数据库中&#xff0c;数据必须严格遵循预定义的表结构&#xff0c;就像把所有物品整齐摆放在固定尺寸的货架上。而NoSQL&#xff08;Not Only SQL&#xff09;数据库则像一个灵活的储物间&#xff0c;允许存储各种类型的数据&#x…

Java 列表初始化全解析:7种方式详解与最佳实践

文章目录 **引言****1. 传统逐个添加元素****特点****注意事项** **2. Arrays.asList() 构造函数****特点****注意事项** **3. 双括号初始化&#xff08;匿名内部类&#xff09;****特点****注意事项** **4. Java 9 List.of()&#xff08;不可变列表&#xff09;****特点****注…

最大公约数和最小倍数 java

在Java中&#xff0c;计算两个数的最大公约数&#xff08;Greatest Common Divisor, GCD&#xff09;和最小公倍数&#xff08;Least Common Multiple, LCM&#xff09;是常见的编程问题。以下是具体的实现方法和代码示例。 --- ### **1. 最大公约数 (GCD)** 最大公约数是指…

数据库——视图

一、视图的定义与核心特性 1.基本概念 (1)视图(View)是基于一个或多个底层表(或视图)的虚拟表,其本身不存储数据,仅保存查询语句的定义。当用户查询视图时,数据库会动态执行其封装的SQL语句,生成结果集。 (2)本质:视图是底层表的逻辑映射,结构与表相同(由行和列…