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…

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

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

支付宝支付(沙盒支付)

后端页面代码 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与欧陆温控表通讯的实现与应用&#…

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

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

通过非欧几何体改变 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;将关系…

day-37 最大正方形

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

【工具】探索 DOU:每用户数据使用量

缘分让我们相遇乱世以外 命运却要我们危难中相爱 也许未来遥远在光年之外 我愿守候未知里为你等待 我没想到为了你我能疯狂到 山崩海啸没有你根本不想逃 我的大脑为了你已经疯狂到 脉搏心跳没有你根本不重要 &#x1f3b5; 邓紫棋《光年之外》 什么是 DOU…

重学java 55. 集合 Set接口

我救自己万万次&#xff0c;铮铮劲草&#xff0c;绝不动摇 —— 24.6.2 一、Set集合介绍 Set和Map密切相关的 Map的遍历需要先变成单列集合&#xff0c;只能变成set集合 二、HashSet集合的介绍和使用 1.概述 HashSet是Set接口的实现类 2.特点 a、元素唯一 b、元素无序 c、无索引…

开源VS闭源:大模型之争,究竟谁更胜一筹?

随着人工智能技术的快速发展&#xff0c;大模型作为其中的核心组件&#xff0c;已经引起了业界的广泛关注。在大模型的研发过程中&#xff0c;开源与闭源成为了两个备受争议的话题。究竟开源与闭源谁更好&#xff1f;本文将从多个角度进行深入分析&#xff0c;为大家揭示真相。…

重载运算符C++---学习笔记

一、笔记 1. 重载运算符基础知识 重载运算符进行的运算和普通数的加减运算不同之处在于重载运算符的操作数为一个一个自定义的对象&#xff0c;所以相应的要对普通的运算符如-*%/的调用方法进行重写&#xff0c;重载的本质还是函数调用 2. 重载运算符的语法 重载运算符的语…

Kubernetes-使用集群CA证书给用户颁发客户端证书访问Api-Server

一、官网地址 证书和证书签名请求 | Kubernetes 二、Demo 一、创建测试文件夹 cd ~ mkdir add_k8s_user_demo cd add_k8s_user_demo 二、创建符合X509标准的证书 openssl genrsa -out myuser.key 2048 openssl req -new -key myuser.key -out myuser.csr -subj "/CNmy…

自动微分技术在 AI for science 中的应用

本文简记我在学习自动微分相关技术时遇到的知识点。 反向传播和自动微分 以 NN 为代表的深度学习技术展现出了强大的参数拟合能力&#xff0c;人们通过堆叠固定的 layer 就能轻松设计出满足要求的参数拟合器。 例如&#xff0c;大部分图神经网络均基于消息传递的架构。在推理…

带交互的卡尔曼滤滤波|一维滤波|源代码

背景 一维卡尔曼滤波的MATLAB例程&#xff0c;​背景为温度估计。 代码介绍 运行程序后&#xff0c;可以自己输入温度真实值&#xff1a; 以20℃为例&#xff0c;得到如下的估计值​&#xff1a; 滤波前的值和滤波后的值分别于期望值&#xff08;真实值&#xff09;作差…

基于Jenkins+Kubernetes+GitLab+Harbor构建CICD平台

1. 实验环境 1.1 k8s环境 1&#xff09;Kubernetes 集群版本是 1.20.6 2&#xff09;k8s控制节点&#xff1a; IP&#xff1a;192.168.140.130 主机名&#xff1a;k8s-master 配置&#xff1a;4C6G 3&#xff09;k8s工作节点 节点1&#xff1a; IP&#xff1a;192.1…