【RAG 论文】Self-RAG:引入自我反思的大模型 RAG 框架

论文:Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection
⭐⭐⭐⭐⭐
地址:https://selfrag.github.io/

文章目录

    • 论文速读
    • 实现细节
      • 1. 问题的形式化概述
      • 2. Self-RAG 的 inference 过程
      • 3. Self-RAG 的训练
        • 3.1 Critic Model 的训练 ⭐
        • 3.2 LLM Generator 的训练
      • 4. Self-RAG 在 inference 阶段的可以施加的控制
        • 4.1 带阈值的自适应检索
        • 4.2 带批判标记的树状解码
    • 实验结果
      • 任务和数据集
      • 实验结果
    • 总结

论文速读

以往 RAG 的缺点:以往的 RAG 方案是不加区分地检索文档并使用固定数量的几个文档,而不管问题是否需要检索,以及检索的文档是否有用。

本工作提出了“自我反思检索-增强生成”(Self-RAG)的框架,通过检索增强和自我反思来提高 LLM 生成文本的质量和事实性。

Self-RAG 框架包括两个模型:

  • LLM Generator:就像 GPT 一样做 next token prediction
  • Critic Model:用来对 LLM 的行为进行评判(不在 inference 阶段起作用,只用于训练阶段)

在 Self-RAG 的文字生成中,我们可以认为模型是一个文本段一个文本段地生成。在 LLM 每次准备生成一个文本段前,都会让判断一下“是否需要检索”,如果不需要检索,那让 Generator 就像 standard LM 一样继续 next token prediction 直到生成出一个文本段;而如果需要检索的话,就先让 Retriver 进行检索得到多个外部候选文档,接下来并行的针对每个候选文档把 prompt + document 输入给 LLM 让其生成一个“回答问题”的候选文本段,然后再评判检索的候选文档与问题是否相关以及 LLM 的生成回答是否合适,这样每个检索到的外部候选文档以及对应的候选生成文本段都可以得到一个评分,根据评分排序,从多个 LLM 输出的候选文本段中选出一个最合适的作为这一轮输出的文本段。重复上面步骤继续得到下一个文本段,一直循环直到回答结束。整个过程的图示如下:

RAG vs. Self-RAG

右边的就是 Self-RAG,整个流程就是我们上面解释的那一段。

具体详细的介绍可以参考后面的“inference 阶段”的介绍

为了实现“检索”和“自我反思”,引入了特殊标记 reflection tokens,也就是上图中那些带颜色的方块,分为如下两类:

  1. retrieval token:指示了是否需要进行检索,有如下三种取值:
    • yes:表示接下来需要进行检索,因此会下面会触发 Retriver 来检索相关的文档
    • no:表示接下来不需要检索,因此接下来会像标准的 LM 一样做 next token prediction
    • continue:代表模型可以继续使用之前检索到的信息片段。这通常发生在一个检索到的段落包含丰富的事实信息,可以用于生成多个文本段的情况下。在这种情况下,模型不需要检索新的信息片段,而是继续利用已有的检索结果来生成文本。
  2. critique token:用来评估检索的结果和 LLM 生成的文本的好坏,具体来说,ctrique token 又分成了三类:
    • IS_REL:根据问题 x 和检索到的文档 d,指示了 d 是否为解决 x 提供了有用的信息。取值集合:{relevant, irrelevant}
    • IS_SUP:根据问题 x、检索到的文档 d、LLM 生成的回答 y,指示了 y 是否被文档 d 支持了。取值集合:{fully supported, partially supported, no support}
    • IS_USE:根据问题 x 和 LLM 生成的回答 y,指示了 y 是否对 x 有用。取值集合:{5, 4, 3, 2, 1}

这些 reflection token 的值其实就是通过 Critic Model 评判出来的。原论文对这些 reflection token 的解释如下:

reflection token

从上面的介绍可以看出,Self-RAG 有如下的优点:

  • 按需检索:没有说固定要检索多少个文档,而是根据具体问题来决定是否检索、检索多少次、对检索的文档是否使用。
  • 对 LLM 生成的质量进行二次检查:每次 LLM 生成一个文本段结束后,Critic Model 都会对其生成内容进行检测并评分,每一轮会从多个候选文本段中选出一个最合适的作为本论生成的文本段。
  • 为生成的每个段落提供引文:因为我们是每次检索后生成一个文本段,这样就很容易地匹配一个文本段的参考文档,进而可以为用户生成引文。

如下是 Self-RAG 的 input 与 output 的示例:

self-rag 示例

实现细节

1. 问题的形式化概述

形式上,将用户的问题输入记为 x x x,我们训练一个 LLM Generator M M M 去顺序生成含有多个文本段的文本输出 y = [ y 1 , y 2 , … , y T ] y = [y_1, y_2, \dots, y_T] y=[y1,y2,,yT],其中 y T y_T yT 表示第 t 个文本段,每个文本段是一个 tokens 的序列。

2. Self-RAG 的 inference 过程

原文使用下面这个算法清晰地列出了 Self-RAG 的 inference 过程:

Self-RAG inference

简单来说就是,目前有输入 x x x 和已经生成的多个文本段 y 1 , … , y t − 1 y_1, \dots, y_{t-1} y1,,yt1,接下来要生成文本段 y t y_t yt,inference 的步骤如下:

  • 首先让 LLM Genertor 去生成 retrieval token 的值,如果:
    • if retrieval token == no:表示 Genertaor LLM 只需要向 standard LM 一样去 next prediction token 来生成出一个文本段 y t y_t yt
    • if retrieval token == yes:让 Retriever 去做检索,检索出多个候选文档,针对每个候选文档,都生成一个候选文本段,并由 LLM 生成 critique token 来作为评判每个候选文档与问题的相关性和候选文本段是否合适的结果,之后根据 critique token 计算出 score 来并排序,选出一个最好的候选文本段作为这一轮的生成结果
  • 得到一个生成的文本段后,重复以上步骤来得到下一个文本段,直至结束,所有生成的文本段拼在一起就是最终输出的回答。

3. Self-RAG 的训练

以往的语料中没有本论文提到的 reflection token 这种特殊标记,而 LLM Generator 的训练却需要这种标记作为训练语料(因为在 inference 阶段,这些 reflection token 都是由 LLM Generator 生成的),所以我们需要额外训练一个 Critic Model,这个 model 专门根据 input 来生成 reflection token,从而标记语料,在语料中插入 reflection token。

所以,总共需要训练两个模型:Critic Model C C C 和 LLM Generator M M M

3.1 Critic Model 的训练 ⭐

Critic Model 就是被训练用于根据 input 生成 reflection token,不同的 reflection token 有不同的定义和 input,如下图:

reflection token

训练 Critic Model 的数据从哪来呢?其实在本文工作中,这些数据是 GPT-4 生成的,因为论文说对于一个场景下 reflection token 的取值,GPT-4 与人类有着高度一致的答案,所以这里就是针对每种 reflection token 专门设计了一种 prompt,借助于 In-Context learning,给出一些 few-shot 的 exemplars 后,让 GPT-4 根据 input 输出它所认为的 reflection token。

针对每个 reflection token 都设定一个专门的 prompt,这块是整个数据准备的关键

比如下图是通过指令让 GPT-4 生成 retrieval token 的示例:

retrieval token 的 prompt

按照上面的方式,就可以准备出来用于训练 Critic Model 的数据了。Critic model 被初始化为一个预训练的语言模型,然后在收集到的带有 reflection token 的数据上进行训练。训练的目标是最大化预测反思标记的准确性

论文评估了训练完成后的 Critic model 预测 reflection token 的表现,发现其与 GPT-4 的表现很接近了。将 GPT-4 的预测结果作为 ground-true prediction,那我们训练的 Critic Model 的准确率可以达到下面的水平:

Critic Model 的表现

所以,接下来我们就可以使用 Critic Model 来为还没有添加 reflection token 的语料库插入上 reflection token,得到新的带有 reflection token 的训练数据,并用于训练 LLM Generator

下图是使用 Critic Model 在原生语料库上插入 reflection token 的过程示例:

插入特殊标记

  • 针对每个文本段,运行 C C C 来判断是否需要检索增强,并添加上 retrieval token
  • 如果需要检索,就使用 Retriever 检索出 top K 的 passages D D D,对每一个 passage, C C C 进一步评估得到 critique token 并附加到原文本中
3.2 LLM Generator 的训练

LLM Generator 的训练所用的语料就是目前我们已有的所有带有 reflection token 的语料库,包括用于训练 Critic Model 的那部分和 Critic Model 新创建的那部分。

在 LLM Generator M M M 的学习中,与 Critic Model C C C 的训练目标不同, M M M 是学习预测文本输出和 reflection token,所以在训练过程的计算损失时会屏蔽掉检索到的文本块,并且会使用把我们扩展的 reflection token 扩展到原始词汇表中。

4. Self-RAG 在 inference 阶段的可以施加的控制

在 inference 阶段,Self-RAG 通过生成反射标记来自我评估输出结果,从而使其行为适应不同的任务要求。在不同的任务背景下,我们对模型的输出往往有着不同的期待:

  • 对于要求事实准确性的任务,目标是让模型更频繁地检索段落,以确保输出结果与可用证据密切吻合。
  • 在开放性较强的任务中,如撰写个人经历文章,重点则转向减少检索次数,优先考虑整体创造性或实用性得分。

所以,Self-RAG 支持在 inference 过程中施加控制来满足这些不同的目标:

4.1 带阈值的自适应检索

Self-RAG 根据生成的 retrieval token 的值来动态决定是否进行检索。而我们可以控制 P ( r e t r i e v a l _ t o k e n ) P(retrieval\_token) P(retrieval_token) 概率的阈值来控制模型是更倾向于检索增强生成(会更加事实准确)还是更倾向于直接生成(会更加具有创造力)

Self-RAG 是根据下面的判断条件来决定 retrieval token 的取值:

retrievel token 概率

所以这个阈值越高,模型就越倾向于直接生成,反之则倾向于检索增强生成。

4.2 带批判标记的树状解码

在 inference 时,检索阶段会检索到多个候选文档,针对每个文档,LLM Generator 都会尝试一个新的可能的文本生成路径,就像树干分出多个树枝一样。每个树枝代表一个可能的文本生成方向。最终模型会对这些不同生成路径进行评估,选出得分最高的路径来继续生成文本。

这里每个生成路径的“得分”是根据这个路径的 critique token 按照一定权重计算出来的。为了满足不同任务的需求,可以在推理时调整 critique token 的权重。例如,如果任务需要更高的事实准确性,可以增加支持程度(IS_SUP)的权重,使模型更倾向于选择那些有强证据支持的文本路径。

实验结果

任务和数据集

该工作在一系列下游任务上对 SELF-RAG 和各种 baseline 进行了评估,用旨在评估整体正确性、事实性和流畅性的指标对输出进行了整体评估。

  • 封闭集任务包括两个数据集,即关于公共卫生的事实验证数据集(PubHealth)和根据科学考试创建的多选推理数据集(ARC-Challenge),使用准确率作为评估指标,并对测试集进行报告。
  • 两个开放域问题解答(QA)数据集:PopQA和TriviaQA-unfiltered,其中系统需要回答有关事实知识的任意问题。
  • 长式生成任务包括传记生成任务和长式质量保证任务ALCE-ASQA,使用FactScore来评估传记,并使用基于MAUVE的官方指标正确性、流畅性以及引用精度和召回率来评估ASQA。

实验结果

下图列出了各种对比效果:

实验结果
从实验结果可以得出如下结论:

  • 在 PubHealth 和 ARC-Challenge 上,有检索功能的基线与没有检索功能的基线相比,性能提升并不明显。
  • 大多数带检索的基线模型在提高引用准确率方面都很吃力。
  • 在实际精确度的度量上,SELF-RAG7B 偶尔会优于 13B,这是因为较小的 SELF-RAG 通常倾向于生成精确且较短的输出。
  • Llama2-FT7B 是在与 SELF-RAG 相同的指令-输出对上训练的基准 LM,不进行检索或自我反省,仅在测试时进行检索增强,它落后于 SELF-RAG。这一结果表明,SELF-RAG 的收益并非完全来自训练数据,并证明了 SELF-RAG 框架的有效性。

总结

这个工作提出的 Self-RAG 框架,通过在 next token prediction 加入了新的特殊标记(reflection token)来让 LLM 决定是否检索、评价自己的文本段落生成,从而使用“检索增强生成”的思路提高 LLM 的质量和事实性。

其实现思路与 ToolFormer 十分类似,可以结合起来看。

参考阅读:

  • 也看引入自我反思的大模型RAG检索增强生成框架:SELF-RAG的数据构造及基本实现思路 | 老刘 NLP

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

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

相关文章

beats蓝牙耳机怎么查看日志?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

上位机图像处理和嵌入式模块部署(树莓派4b和类muduo网络编程)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 既然是linux编程,那么自然少不了网络编程。在linux平台上面,有很多的网络编程库可以选择,大的有boost、qt&…

第二部分 Python提高—GUI图形用户界面编程(五)

事件处理 文章目录 鼠标和键盘事件多种事件绑定方式汇总组件对象的绑定组件类的绑定 一个GUI 应用整个生命周期都处在一个消息循环(event loop) 中。它等待事件的发生,并作出相应的处理。 Tkinter 提供了用以处理相关事件的机制. 处理函数可被绑定给各个控件的各种…

飞书API(4):筛选数据的三种思路

截止到上一篇,终于通过飞书 API 完整获取到飞书多维表的数据。但是,有些场景,比如数据源会出现脏数据,毕竟如果是运营过程多人协作维护的数据,要想保持数据完美简直是天方夜谭!再比如我们不需要完整的数据&…

ChatGPT研究论文提示词集合3-【数据收集】、【数据分析】和【解释与讨论】

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 目录 1.数据收集 2.数据分析 3.讨论与解释 4.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程,精心准备一套学术研究各个流程的提示词集合。总共14个步…

都2024 年了,可以卸载的VS Code 插件

在 VS Code 中,庞大的插件市场提供了丰富多样的扩展功能,以增强编码体验和效率。然而,如果你安装了很多插件,就可能会导致: 性能下降:过多的插件可能导致 VS Code 的启动速度变慢,特别是在启动或…

详解QDialogButtonBox的使用

示例图片 QDialogButtonBox 是 Qt 提供的一个方便的组件,用于在对话框中集中管理一组标准按钮,如“确定”、“取消”、“保存”、“关闭”等。它简化了按钮的布局、信号连接以及按钮行为的统一处理,使得对话框的开发更为简洁和规范。以下将…

【GlobalMapper精品教程】075:将影像的颜色赋予点云实现点云真彩色

文章目录 一、加载点云与影像数据二、将影像色彩赋予点云三、保存色彩点云四、注意事项一、加载点云与影像数据 加载本实验数据(data075.rar)中的影像、点云数据,并用Globalmapper提供的卷帘工具(快速浏览图像)查看: 启动卷帘工具,左右拖动实现卷帘效果: 影像VS点云:…

Coggle数据科学 | Coggle 4月竞赛学习:多模态图文问答

本文来源公众号“Coggle数据科学”,仅用于学术分享,侵权删,干货满满。 原文链接:Coggle 4月竞赛学习:多模态图文问答 Part1 内容介绍 在自然语言处理领域,大型语言模型(LLM)如GPT…

4月18号总结

java学习 网络编程 1.网络分层 网络分层是将网络通信划分为不同的逻辑层次,每一层负责特定的功能,从而实现网络通信的模块化和标准化。常用的网络分层模型包括OSI(开放系统互联)模型和TCP/IP模型。 特点和作用: 分…

UI5 快速入门教程

环境准备 node >16.8 ,VSCode,官方网址 开始 创建一个根文件夹,根文件中创建一个package.json文件 {"name": "quickstart-tutorial","private": true,"version": "1.0.0","author":…

[python数据处理系列]详解独热编码与标签编码的区别及在Pandas中的实现

目录 一、独热编码与标签编码的区别 二、创建数据集 三、独热编码实现 (一) 自动将所有分类变量进行独热编码 (二) 对指定列进行独热编码 (三) 对进行独热编码的列采用布尔型表示 四、查看数据类型 五、对数据进行独热编码后,数据变成了什么类型 一、独热编码…