SELF-RAG: Learning to Retrieve, Generate, and Critique Through Self-reflection

更多文章,请关注微信公众号:NLP分享汇

原文链接:ICLR2024:能够自我反思的SELF-RAG


下面介绍的这篇论文是最近被ICLR 2024 accepted oral,作者来自University of Washington & Allen Institute for AI & IBM Research AI。

论文标题:SELF-RAG: Learning to Retrieve, Generate, and Critique Through Self-reflection

论文链接:https://arxiv.org/pdf/2310.11511

代码和模型:https://selfrag.github.io/

背景

大语言模型(LLMs)尽管功能强大,但它们生成的响应常常包含事实性错误,这是因为它们只依赖于模型内部的参数知识。

现有方法的局限性:检索增强生成(RAG)是一种通过检索相关知识来增强语言模型输入的方法,它减少了知识密集型任务中的事实错误。然而,RAG方法在检索和整合检索到的文档时存在不区分情况的问题,可能会导致生成的回答质量下降,或者引入不相关或偏题的文档。

论文介绍了一种新的框架,自反思检索增强生成(SELF-RAG),旨在通过检索和自我反思提高LLMs生成文本的质量和事实准确性。SELF-RAG训练一个任意的语言模型,使其能够根据需求适应性地检索文档,并生成和反思检索到的文档以及自身的生成内容,这是通过特殊的token—reflection tokens来实现的。

SELF-RAG的关键特点:

  • 按需检索:SELF-RAG只在必要时检索文档,提高了模型的多功能性。

  • 自我反思:通过生成reflection tokens,模型能够在推理阶段控制自己的行为,以适应不同的任务需求。

  • 可控性:在推理阶段,SELF-RAG能够根据reflection tokens来定制其行为,使其能够满足多样化的任务要求。

SELF-RAG概览

图片

图1 Overview of SELF-RAG

SELF-RAG如何通过检索、批评和生成文本来增强整体生成质量、事实性和可验证性。图1左侧部分展示了检索增强生成(RAG)的传统方法,它不区分检索的必要性,统一检索固定数量的文档,并且不会重新审视生成质量。右侧部分展示了SELF-RAG的工作流程:

Step1:检索(Retrieve on demand)

在第一步中,SELF-RAG根据输入提示(prompt)和前面的生成内容,决定是否需要通过检索来增强持续生成的内容。如果模型确定检索将会有帮助,它会输出一个检索标记(retrieval token),以按需调用检索模型(Retriever Model)。

Step2:生成(Generate segment in parallel)

在第二步中,SELF-RAG会并行处理多个检索到的文档,评估它们的相关性,并生成相应的任务输出。这一步骤可能涉及生成多个候选的输出片段。

Step3:批评(Critique outputs and select best segment)

在第三步中,SELF-RAG生成批评标记(critique tokens),以批评自身的输出,并在事实性和整体质量方面选择最佳片段。批评过程涉及评估检索到的文档的相关性(ISREL),输出片段的支持度(ISSUP),以及整体的实用性(ISUSE)。

举例说明:
  • 以“美国各州名称的由来”为例,SELF-RAG首先确定是否需要检索信息。

  • 确定需要检索后,模型检索并评估检索到的文档的相关性,并生成关于州名来源的输出。

  • 然后,模型生成critique tokens,以自我评估生成的输出在事实性和质量方面的表现。

四种reflection tokens

图片

表1 Four types of reflection tokens used in SELF-RAG

Retrieve(检索)
输入:输入 x 和前一步的输出 y

输出:是一个决策标记,决定何时需要进行检索。

  • yes:表示继续生成需要事实基础,需要检索相关文档。

  • no:表示当前生成不需要检索文档,可能是因为序列不需要事实基础或可能不会通过知识检索得到增强。

  • continue:表示模型可以继续使用之前检索到的证据。

ISREL(相关性)

输入:输入 x,检索到的文档 d

输出:评估检索到的文档 d 对于解决输入 x 是否提供了有用的信息。

  • relevant:表示文档 d 对于回答输入 x 是相关的。

  • irrelevant:表示文档 d 对于回答输入 x 是不相关的。

ISSUP(支持度)
输入:输入 x,当前的输出 y,以及检索到的文档 d
输出:评估输出 y 中的信息是否得到了文档 d 的支持。
  • fully supported: 输出 y 中的所有可验证陈述都得到了文档 d 的支持。
  • partially supported: 输出 y 中的部分信息得到了文档 d 的支持,但不是全部。
  • no support: 输出 y 中的信息没有得到文档 d 的支持,或者与文档相矛盾。
ISUSE(实用性)
输入:输入 x 和当前的输出 y
输出:评估输出 y 对于输入 x 的整体实用性和信息价值。5个等级。

算法实现

图片

图2 SELF-RAG算法伪代码

输入:输入提示 x 和前一步的生成 y<t(如果有的话)。

输出:下一个输出片段 yt

步骤:

if 检索决策:模型M预测是否需要检索(Retrieve)。这是通过模型根据当前的输入和前一步的生成来决定的。

  • 执行检索 (如果Retrieve == "Yes"):使用检索器 R 根据当前的输入 x 和前一步的生成 yt-1 来检索相关的文本段落 D

  • 生成和评估

    • 对于每个检索到的文档 d ∈ D,模型预测其与输入 x 的相关性 ISREL

    • 同时,模型生成下一个响应片段 yt 并预测该片段是否得到文档 d 的支持 ISSUP

  • 批评和选择最佳片段

    • 模型生成批评标记 ISUSE 来评估整体的响应片段的实用性。

    • 根据 ISRELISSUP 和 ISUSE 的预测,模型对每个片段进行评分并选择最佳片段。

else 不执行检索:(如果Retrieve == "No"):

  • 模型直接预测下一个输出片段 yt 给定输入 x

  • 模型预测该片段的实用性 ISUSE

输出选择

  • 根据上述步骤中的评分和批评,选择最终的输出片段 yt

RetrieveISRELISSUPISUSE 是反思标记(reflection tokens),它们帮助模型在生成文本时进行自我评估和自我调整。推理过程中,模型会动态决定是否需要检索信息,并基于检索到的信息和自我反思的结果生成文本。该算法允许模型灵活地调整检索频率和生成文本的行为,以适应不同的下游应用和用户偏好。

SELF-RAG训练

训练批评模型(Critic Model)
数据收集:为了训练批评模型,研究者们需要收集关于反思标记的数据。手动标注这些数据成本较高,因此他们使用高级的LLM(如GPT-4)生成这些反馈,然后将其知识蒸馏到内部批评模型C中。
Critic学习:收集到训练数据后,批评模型C使用标准的有条件的语言模型目标进行训练,即最大化似然函数来预测反思标记。
训练生成模型(Generator Model)
数据收集:生成模型M的训练数据是通过增强原始输出y,使用检索和批评模型来创建的。对于每个输出片段yt,运行批评模型C来评估是否需要额外的段落来增强生成。
生成学习:使用标准的语言模型目标训练生成模型M,学习预测目标输出以及反思标记。在训练期间,检索到的文本块会被遮蔽(mask out),并且原始词汇表V会扩展以包含一组反思标记。

图片

图3 SELF-RAG training examples

图3在论文中提供了SELF-RAG训练的示例,展示了该框架如何在实际场景中工作。该图通过两个不同的示例来阐释SELF-RAG的训练过程,一个不需要检索,另一个需要检索。

实验结果

图片

表2 Overall experiment results on six tasks

表2展示了SELF-RAG在六个不同任务上的性能结果,并与一系列基线模型进行了比较。这些任务包括封闭集合任务(如PubHealth和ARC Challenge)、短形式生成任务(如PopQA和TriviaQA-unfiltered)、以及长形式生成任务(如传记生成和ALCE-ASQA)。表中列出了不同模型在各个任务上的表现,包括准确率(acc)、事实得分(FS)、情感得分(em)、流畅度(rg)、MAUVE、引用精确度(prec)和引用召回率(rec)等指标。

表中的结果表明,SELF-RAG在多个任务上显著优于基线模型,包括在开放域问答、推理和事实验证任务上的表现。特别是在ALCE-ASQA任务上,SELF-RAG在引用精确度和引用召回率方面取得了显著提升,显示出其在长形式生成任务中的优势。此外,表中还展示了SELF-RAG在不同训练数据规模下的性能,以及通过调整检索阈值来平衡检索频率和准确性的实验结果。这些分析有助于理解SELF-RAG模型的性能特点和潜在的应用场景。

图片

图4 Analysis on SELF-RAG

图4(a): SELF-RAG关键组件的消融研究 (Ablation Studies)

这部分展示了对SELF-RAG模型中关键组件进行消融研究的结果。消融研究是为了识别模型中哪些部分对于最终性能最为关键。

  • Training No Retriever R:没有检索组件的模型。

  • Training No Critic C:没有批评组件的模型。

  • Test No retrieval:在测试时不进行检索的模型。

  • Test Hard constraints:使用硬约束进行检索的模型。

  • Test Retrieve top1:只使用检索到的顶部一个文档的模型。

  • Test Remove ISSUP:在批评引导的束搜索中移除ISSUP分数的模型。

图4(b): 推理时自定义效果的影响 (Customization)

这部分探讨了在推理时调整不同批评类型(Critique token type)权重对模型性能的影响。

  • 权重对ISSUP的影响:ISSUP批评类型评估输出由文本段落支持的程度。通过改变ISSUP的权重,可以观察到模型在引用精确度(Citation Precision)和流畅度(Mauve)上的表现变化。

  • 引用精确度和流畅度:随着ISSUP权重的增加,模型更倾向于生成由证据支持的内容,可能会提高引用精确度但降低流畅度。

图4(c): 检索频率与模型性能之间的关系 (Retrieval)

这部分分析了检索频率如何影响模型在特定任务上的性能。

  • 检索阈值(Retrieval Threshold):改变检索触发的阈值,观察模型检索频率和准确率之间的关系。

  • 检索频率:检索频率的变化,可能通过不同的阈值δ来控制。

  • 准确率(Accuracy):随着检索频率的变化,模型在PubHealth和PopQA任务上的准确率表现。

图片

图5 Training scale and Human analysis

图5展示了SELF-RAG模型在不同规模的训练数据下的性能表现。包括使用不同数量的训练样本(例如5k、10k、20k、50k)来训练模型,并测量模型在特定任务上(如PopQA、PubHealth、ASQA)的性能(例如准确率、事实得分等)。包含了人类评估的结果,评估SELF-RAG生成的输出以及预测的反思标记的可靠性。这可能涉及到对模型输出的合理性(S&P)、相关性、支持度等指标的评估。

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

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

相关文章

leetcode:最近的请求次数

class RecentCounter { public:RecentCounter() {cou 0;}int ping(int t) {q.push(t);while(!q.empty()){auto Front q.front();if(t-Front>3000)q.pop();else break;}return q.size();} private:int cou;queue<int> q; }; 仅个人做法&#xff0c;非最优解

postgressql——事务提交会通过delayChkpt阻塞checkpoint(9)

事务提交会通过delayChkpt阻塞checkpoint Postgresql事务在事务提交时&#xff08;执行commit的最后阶段&#xff09;会通过加锁阻塞checkpoint的执行&#xff0c;尽管时间非常短&#xff0c;分析为什么需要这样做&#xff1a; 首先看提交堆栈 #1 0x0000000000539175 in Co…

VueRoute url参数

版本 4.x 获取query参数 使用$router.query&#xff0c;可以获取参数对应的json对象。 获取url参数 需要在路由配置中定义。使用$router.param获取。

Django表单革命:打造安全、高效、用户友好的Web应用

Django表单处理&#xff0c;听起来是不是有点枯燥&#xff1f;别急&#xff0c;阿佑将带你领略Django表单的艺术之美。我们将以轻松幽默的语言&#xff0c;一步步引导你从表单的创建到管理&#xff0c;再到验证和自定义&#xff0c;让你在不知不觉中掌握Django表单的精髓。文章…

stm32寄存器开发

在stm32开发中&#xff0c;利用寄存器和标准库一起使用会比较方便。 有些寄存器在使用前要先清零以GPIO控制器配置为例PA8 GPIOA->CRH & ~(15<<0);//清零 15的2进制是1111 相当于把1111从最右边开始左移了0位 作用是把GPIOA的CRH寄存器的最后4位置零 GPIOA-&…

支付宝支付(沙盒支付)

后端页面代码 Controller RequestMapping("/pay") public class PayController {private String orderId;Autowiredprivate OrdersService ordersService;Value("${appId}")private String appId;Value("${privateKey}")private String private…

奇安信 网神SecGate 3600防火墙 (相关问题整理)

本文所有问题&#xff0c;基于实际项目中出的问题&#xff0c;设备&#xff1a;网神SecGate 3600防火墙 会话记录 数据中心>会话>会话监控&#xff0c;终端发起SYN请求&#xff0c;就能看到记录&#xff0c;无需完全建立TCP连接 默认安全策略 防火墙的安全策略中&…

CAD二次开发(7)- 实现Ribbon选项卡,面板,功能按钮的添加

1. 创建工程 2. 需要引入的依赖 如图&#xff0c;去掉依赖复制到本地 3. 代码实现 RibbonTool.cs 实现添加Ribbon选项卡&#xff0c;添加面板&#xff0c;以及给面板添加下拉组合按钮。 using Autodesk.Windows; using System; using System.Collections.Generic; using S…

Ubuntu18.04安装pwntools报错解决方案

报错1&#xff1a;ModuleNotFoundError: No module named ‘setuptools_rust’ 报错信息显示ModuleNotFoundError: No module named setuptools_rust&#xff0c;如下图所示 解决方案&#xff1a;pip install setuptools_rust 报错2&#xff1a;pip版本低 解决方案&#xff…

天气数据集-Jena Climate dataset

天气数据集-Jena Climate dataset 1.数据集基本信息 Dataset Name: mpi_saale_2021b.csv Size: 26495 rows; 1 year (2021), 10 min 气象学、农业、环境科学 开源机构: Max Planck Institute for Biogeochemistry 2.数据特征 2.1 特征简介 数据共有31个特征&#xff0c;…

LabVIEW与欧陆温控表通讯的实现与应用:厂商软件与自主开发的优缺点

本文探讨了LabVIEW与欧陆温控表通讯的具体实现方法&#xff0c;并对比了使用厂商提供的软件与自行开发LabVIEW程序的优缺点。通过综合分析&#xff0c;帮助用户在实际应用中选择最适合的方案&#xff0c;实现高效、灵活的温控系统。 LabVIEW与欧陆温控表通讯的实现与应用&#…

Linux项目编程必备武器!

本文目录 一、更换源服务器二、下载man开发手册(一般都自带&#xff0c;没有的话使用下面方法下载) 一、更换源服务器 我们使用apt-get等下载命令下载的软件都是从源服务器上获取的&#xff0c;有些软件包在某个服务器上存在&#xff0c;而另一个服务器不存在。所以我们可以添加…

力扣 20. 有效的括号

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的…

Typescript高级: 深入理解in与in keyof

概述 in 和 keyof 是两个非常重要的操作符&#xff0c;它们允许开发者对对象的键&#xff08;key&#xff09;进行更精细化的操作和约束in 关键词 in关键词则在TypeScript的类型上下文中有特定的用途&#xff0c;它用于映射类型和类型查询当与keyof一起使用时&#xff0c;in可…

派生类中调用基类的__init__()方法

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在派生类中定义__init__()方法时&#xff0c;不会自动调用基类的__init__()方法。例如&#xff0c;定义一个Fruit类&#xff0c;在__init__()方法中创…

【安卓基础】-- 消息机制 Handler

目录 消息机制 Handler面试问题 消息机制 Handler 对handler机制的基本作用、用法、时序流程进行介绍&#xff0c;针对handler机制中的内存泄漏问题讲解&#xff1a;一篇读懂Android Handler机制 Android-Handler机制详解 全面解析 | Android之Handler机制 需要掌握的&#x…

通过非欧几何体改变 AI 嵌入

目录 一、说明 二、LLM嵌入的形势 三、了解一些背景信息 3.1 什么是嵌入&#xff1f; 3.2 为什么嵌入在 NLP 中很重要&#xff1f; 3.3 复数Complex 几何的角色 3.4 C主动学习 3.5 角度嵌入 &#xff08;AE&#xff09;&#xff1a;解锁稳健排序 3.6 RotatE&#xff1a;将关系…

浅谈序列化

序列化的基本概念 序列化&#xff08;Serialization&#xff09;是将对象的状态转换为字节流的过程&#xff0c;而反序列化&#xff08;Deserialization&#xff09;则是将字节流恢复为对象的过程。这一过程允许对象能够被保存到文件、传输通过网络、保存到数据库或其他数据存…

如何高效地向Redis 6插入亿级别的数据

如何高效地向Redis插入亿级别的数据 背景不可用的方案可用方案:利用管道插入其他命令&#xff1a;参考&#xff1a; 背景 上一条记录&#xff1b;80G的存储&#xff1b;10几个文件&#xff0c;如何快速导入是一个大问题&#xff0c;也是一个很棘手的问题&#xff1b;如下将给出…

day-37 最大正方形

思路 动态规划&#xff0c;这题主要得弄明白状态转换方程&#xff0c;dp[i][j]表示以&#xff08;i,j&#xff09;为右下角的最大正方形 解题方法 1.首先将第一行和第一列初始化&#xff0c;当对应位置的matrix为’0’时&#xff0c;dp数组对应位置也为零&#xff0c;否则为1 …