当前先进的大语言模型在回答问题时依然会存在胡说八道的现象,而检索增强生成(RAG)方法通过将相关的检索段落与语言模型的输入结合,可以减少在知识密集型任务中的事实错误。然而,这些方法可能会影响语言模型的通用性,引入不必要或离题的段落,导致生成的回答质量较低。此外,由于 RAG 检索段落时不考虑事实基础是否有帮助,生成的结果也不能保证与检索到的相关段落一致。
自我反思检索增强生成(Self-Reflective Retrieval-Augmented Generation,SELF-RAG)是一种通过检索和自我反思提高 LLM 质量和事实准确性的框架,而不损害 LLM 的原始创造力和多功能性。本文将详细介绍 SELF-RAG 框架。
概述
SELF-RAG 允许语言模型 根据检索到的段落生成信息,并且通过自我批判生成的内容来生成特殊 token。这些特殊的 token 称之为 reflection token(反思 token),表示是否需要检索或确认输出的相关性、或完整性。相比之下,常规的 RAG 方法会无差别地检索段落,且不确保引用来源的是否完全支持输入。
图片
具体而言,SELF-RAG 首先确定是否通过在继续生成时使用检索到的段落来帮助生成,如果是,它会输出一个检索标记,调用一个检索模型(第一步)。接下来,SELF-RAG 同时处理多个检索到的段落,评估它们的相关性,然后生成相应的任务输出(第二步)。然后生成评论标记,对自己的输出进行批评并选择最佳输出(第三步),评价标准是事实准确性和整体质量。接下来将进一步介绍 SELF-RAG 的几个重要概念与算法。
反思 token
给定输入 x,SELF-RAG 会训练语言模型 M 顺序生成文本 y,且 y 由多个段落组成,记为 y=[y_1,...,y_t],其中,y_t 表示第 t 个段落的 token 序列,y_t 中的生成 token 包括原始文本和反思 token。
而反思 token 主要有 4 种,分别为 Retrieve,IsRel,IsSup,IsUse,其含义分别如下:
图片
按需检索(Retrieve)
表示对于给定输入,判断是否需要额外检索信息。
比如:
- 问题 x :提供保持健康的三个秘诀
- 输出:yes
- 原因:因为可能有一些可靠的资源来解释不同行为对健康的影响。因此检索文档有助于提高对此查询的响应。
再比如:
- 问题 x :描述一次你不得不做出艰难决定的经历
- 输出:no
- 原因:因为这个问题询问的是一些个人经验,因此不需要寻找一些外部文档。
相关性(IsRel)
表示对于给定输入,检索出的信息是否提供了有用信息来解决输入问题。
比如:
- 问题 x :竞选美国众议院的年龄
- 检索信息 d :宪法规定了在美国参议院任职的三项资格:年龄(至少三十岁);美国公民身份(至少九年);以及参议员在选举时所代表的州的居住权。
- 输出:Irrelevant
- 原因:这些检索信息仅讨论了竞选美国参议院议员的年龄,而不是讨论众议院议员的年龄。
支撑性(IsSup)
评估检索信息中提供的信息是否完全支持输出,输出为 “Fully supported, partially supported, no support”。
比如:
- 问题 x :解释 embedding 在自然语言处理中的使用
- 检索信息 d :embedding 是自然语言处理 (NLP) 中一组语言建模和特征学习技术的统称,其中词汇表中的单词或短语被映射到实数向量。单词和短语嵌入用作底层输入表示时,已被证明可以提高 NLP 任务的性能,例如句法解析、情感分析、下一个标记预测以及类比检测。
- 回答 y :词嵌入对于情感分析、文本分类、预测序列中的下一个词以及理解同义词和类比等任务非常有用。
- 输出:Fully supported
- 原因:输出句子讨论了词嵌入的应用,证据提到了所有应用句法解析、情感分析、下一个标记预测以及类比检测作为应用。因此,评分应为 “Fully supported”。
有用性(IsUse)
表示回答是否对问题有用,输出为 “5,4,3,2,1”,5 为非常有用,1 为几乎不切题或完全不相关。
比如:
- 问题 x :“2023 年英国现任首相是谁?”
- 回答 y :“鲍里斯·约翰逊 (Boris Johnson) 于 2019 年至 2022 年担任英国首相。”
- 输出:2
- 原因:虽然输出提供了关于 2019 年至 2022 年英国首相的事实正确的陈述,但该指令询问 2023 年的首相是谁,因此它没有回答该指令。因此,评分为2。
SELF-RAG 训练
图片
给定一组输入输出数据 D={X, Y},Generator 模型 M,Critic 模型 C。
- 用预训练的语言模型 LM 对 C 进行初始化;
- 对 {X, Y} 进行采样得到训练数据
- 对采样数据中每一对 (x, y):
通过 GPT-4 收集 reflection token r;
将 {(x, y, r)} 添加到 D{critic} 中;
- 用下一个 token 预测损失更新 C;
- 用预训练的语言模型 LM 对 M 进行初始化;
- 对 (X, Y) 中的每一对 (x, y):
运行 C 得到 reflection token r;
将 (x, y, r) 添加到 D{gen} 中;
基于 D_{gen} 用下一个 token 预测损失更新 M;
训练评论者模型
评论者模型数据生成
手动标记每个段落的反思 token 是不现实的,而我们可以使用像 GPT-4 这样的最先进的大语言模型来生成反思 token。通过引导 GPT-4 生成反思 token,可以将其知识提炼到内部的评论者模型 C 中,从而创建了监督数据。如下图所示:
图片
对每组反思 token,从原始训练数据中随机采样。由于每组反思 token 有自己的定义和输入,我们会针对性使用不同的 prompt。
这里以 Retrieve 为例,通过使用类型特定的指令来引导 GPT-4,比如给定一条指令,在原始任务输入 x 和输出 y 上进行少量示范,判断从网络中找到一些外部文档是否有助于生成更好的响应,以生成适当的反思 token:p(r|I,x,y) 。
评论者模型训练
生成数据 D{critic} 后,使用预训练语言模型 LM 初始化评论者模型 C,并用 D{critic} 对其进行训练。其目标函数为(对每对 reflection token 来说):
图片
初始模型可以是任意的预训练语言模型 LM,评论者模型在大多数 reflection token 类别上都与基于 GPT-4 的预测达成了超过 90% 的一致性。
训练生成器模型
生成器模型的数据生成
给定一个输入输出对 (x,y),使用检索和评论者模型来扩充原始输出 y,从而创建监督数据,精确地模拟 SELF-RAG 推理时的过程。整个过程如下:
图片
对 y_t,运行批评者模型 C 来评估需要额外的检索信息来帮助增强生成。如果需要,则加上 Retrieve=Yes token,并且使用 R 来获取前 K 个信息段落 D。对每个段落来说,C 会进一步评估相关性并预测 IsRel。如果某个段落是相关的,则 C 会进一步评估该段落是否支持模型的输出,并预测 IsSup。评论 token IsRel 和 IsSup 会被附加到检索的段落或输出后面。在最后的输出 y 中,C 会预测整体效用 token IsUSE,并将带有反思 token 和原始输入对的扩充输出添加到 D_{gen}。
生成器模型训练
通过使用精选的增强语料库,以及 reflection token D{gen} 来训练生成器模型 M。目标函数为:
图片
与评判模型 C 训练不同,生成器 M 学习预测目标输出以及 reflection tokens。训练期间,将检索到的文本块(由 <p> 和 </p> 标记)进行遮挡以进行损失计算,这意味着模型在计算损失时不考虑这些检索到的文本块。原始词汇 V 通过一组 reflection tokens(如 <Critique> 和 <Retrieve>)进行扩展,这表示这些 tokens 被加入到词汇中,使模型能够使用这些特定的 tokens 来生成输出。
SELF-RAG 推理
最后再来介绍一下 SELF-RAG 的推理过程。如下图所示:
图片
对于每个输入 x 和前一代生成的 y{<t},模型解码检索 token 以评估检索的效用。如果不需要检索,模型将直接预测下一段输出,这与标准的语言模型行为一致。如果需要检索,模型会生成:一个评估检索段落的相关性的反思 token、下一个回答段落、以及评估回答段落是否被检索信息支持的反思 token。最后,一个评估整体效用的新的反思 token。每生成一个回答,SELF-RAG 都会并行处理多个段落,并且使用其自动生成的反思 token 来控制生成的输出。
生成反思 token 以自我评估输出使得在推理阶段 SELF-RAG 更加可控,能够调整其行为以满足多样的任务要求。对于要求事实准确性的任务,目标是使模型更频繁地检索段落,以确保输出与现有证据紧密对齐。相反,在更为开放的任务中,例如撰写个人经历文章,重点转向更少的检索,优先考虑整体创造力或效用。接下来,将介绍在推理过程中如何实施控制以满足这些不同目标的方法。
基于阈值的自适应检索
SELF-RAG 可以动态决定何时检索文本段落,这是通过预测 Retrieve token 来完成的。此外,框架还允许设定一个阈值。具体而言,如果生成的 token 是 Retrieve=Yes,且在所有输出 token 中的标准化值超过了指定的阈值,则触发检索。
基于评判 tokens 的树解码
在每个段落步骤 t 中,当需要检索时,基于硬性或软性条件,R 检索 K 个段落,并且生成器模型 M 并行处理每个段落并输出 K 个不同的候选值。我们进行段落级的 Beam Search(使用 Beam 大小为 B)以获取每个时间戳 t 的前 B 个段落,并在生成结束时返回最佳序列。
每个段落 y_t 相对于段落 d 的分数通过评论者模型的评分 S 进行更新,该评分是每个评论 token 类型的标准化概率的线性加权和。对于每个评论 token 组 G(例如 IsREL),我们将其在时间戳 t 的分数表示为 s^G_t,然后按以下方式计算段落分数:
图片
其中,
图片
代表最理想的反射 token 的生成概率
图片
其中 N_G 个不同的令牌表示 G 的不同可能值。
权重 wG 为可以调整的超参,以自定义模型在推理期间的行为。另外,通过调整这些权重,可以强调某些期望的行为并降低其他行为。