今天又看了一篇好玩的关于RAG玩法的论文,叫做 SELF-RAG: LEARNING TO RETRIEVE, GENERATE, AND CRITIQUE THROUGH SELF-REFLECTION 。 核心思想很有意思,让LLM自己对自己说的话反思反思(脑海里不由得就想起前不久某知名主播说的让我们反思的话了)。接下来我就大致介绍一下这个方法怎么让LLM进行反思的。
Self-RAG介绍
我之前的博客也介绍过关于LLM如何进行检索增强生成,也就是RAG。针对不同的场景可以有不同的策略,但其实找到一个好用的方案并不容易,在实践中,RAG方法会存在一些局限性,比如不够灵活或者内容质量不太靠谱等。
而本篇论文讲的Self-RAG 除了继承了RAG的本身能力,还引入了自我反思的机制。这一机制的核心在于使LLM能够在生成回答的同时进行自我评估和自我调整。具体来说,Self-RAG通过引入称为「反思标记」(reflection tokens)的特殊标记,使模型能够在必要时引入外部信息,并对其生成的内容进行质量评估和调整。这一创新不仅解决了传统RAG在灵活性和适应性方面的限制,还进一步提升了生成内容的准确性和事实性。
具体来说,SELF-RAG 在给定输入提示和历史记录的情况下,首先会确定用检索到的段落对继续生成是否有帮助。如果有帮助,它就会输出一个检索标记,按需调用检索模型。随后,SELF-RAG 同时处理多个检索到的段落,评估它们的相关性,然后生成相应的任务输出。然后,它生成批判标记来批判自己的输出,并从事实性和整体质量方面选择最佳输出。这一过程不同于传统的 RAG,后者无论检索的必要性如何,都会持续检索固定数量的文档进行生成,而且从不对生成质量进行二次检查。此外,SELF-RAG 还会为每个段落提供引文,并对输出是否得到段落支持进行自我评估,从而更容易进行事实验证。
当LLM学会反思
在深入探索Self-RAG之前,我们不妨先来点儿轻松的比喻:想象一下,如果你在写一封重要的邮件,写到一半突然意识到自己对某个话题不够了解。这时候,你可能会停下来,上网查一查,然后再继续写。这个过程,简单来说,就是Self-RAG在做的事情 —— 只不过,这里的“你”是一个聪明的语言模型。
自我反思的核心思想很简单:让大型语言模型(LLM)在生成文本时能够“停下来”,检查一下自己是否需要更多信息,或者自己的话是否说得够好。这就像是给模型装上了一个“内置的小编辑”,时刻准备着评估和提升其工作的质量。
这些“内置的小编辑”其实就是前面提到的反思标记。它们就像是模型内部的小信号,告诉模型:“嘿,这里可能需要再查查资料”或者“这句话说得不够准确”。通过这些小提示,模型就可以更聪明地决定何时需要外部帮助,以及如何提升自己的表述。
在传统的RAG模型中,检索像是一种习惯性动作 —— 不管用不用得上,先查再说。但在Self-RAG中,检索变得更有针对性。模型不是在每次回答问题时都去查阅资料,而是在“认为”需要时才去做。这就好比是,在写邮件时,只有当你真的不确定某个事实时,才会去Google一番。
另一个重点是自我评估。模型在生成文本的同时,会不断检查自己的工作,就像一个作家反复打磨自己的作品。这样不仅提高了生成内容的准确性,也让整个文本显得更加流畅、自然。
总之,Self-RAG就像是给LLM装上了一个智能助手,不仅帮助它在需要时寻找信息,还在生成的每一步都提供反馈和建议。这种方法不仅使LLM更加聪明,也大大提高了其生成内容的质量和可信度。
Self-RAG都干了些啥呢
既然我们已经知道了Self-RAG让LLM更像是有了一个智能助手,那么这个助手的秘密武器是什么呢?答案就是那些看似简单却聪明绝顶的“反思标记”。这些标记不仅是一个小信号,更是指引LLM“思考”方向的灯塔。
反思标记:不只是一个标记
当我们说反思标记的时候,可能会想象到它们是一些神秘的代码或者复杂的算法。其实,它们的概念要简单得多。这些标记就像是给模型的一条提示,告诉它:“这里需要检索信息”或者“这里的信息需要重新审视”。简单来说,就是给模型的生成过程加入了“思考”的步骤。
在Self-RAG框架中,反思标记有几种不同的类型,每种类型都有自己的职责。有的负责提示模型进行外部检索,有的则是用来评估生成内容的质量。这样的设置让模型能够在不同情景下做出最合适的决定,就好像有不同的小助手在不同的场合给予建议。在Self-RAG框架中,定义了几种不同类型的反思标记,具体包括:
- 检索需求(Retrieve):这类标记用于指示是否需要从外部数据源检索信息。它包括“是”(Yes)和“否”(No)的选项,以及“继续使用证据”(continue to use evidence),后者表示模型可以继续使用之前检索到的信息。
- 相关性(ISREL):这类标记用于指示检索到的信息是否与输入相关。选项包括“相关”(Relevant)和“不相关”(Irrelevant)。
- 支持度(ISSUP):这类标记用于评估检索到的信息是否支持模型的生成内容。它包括三种等级:完全支持(Fully Supported)、部分支持(Partially Supported)和无支持/矛盾(No Support / Contradictory)。
- 实用性(ISUSE):这类标记用于评估生成内容的整体实用性或效用。实用性通常使用一个五级评估标准,从1(最低)到5(最高)。
那么,这些反思标记是怎样被实现的呢?其实,这就涉及到训练模型的过程。在训练Self-RAG模型时,这些标记会作为训练数据的一部分被模型学习。通过大量的样例,模型学会在何时生成哪种类型的反思标记,从而在实际使用时能够根据具体情况生成适当的标记。
这些反思标记的加入,让LLM在生成文本时变得更加聪明和灵活。它们不仅提高了内容的准确性,还增强了模型对于复杂问题的处理能力。这就像是给LLM装上了一个小脑袋,让它在生成文本的同时,也能进行一些简单的“思考”和“判断”。
在传统的RAG框架中,检索就像是一种固定的程序:无论何时何地,先查资料再说。但在Self-RAG中,检索变得更有智慧,更具目的性。它不是机械地在每次生成文本时就查阅资料,而是在模型“认为”需要额外信息时才会启动。这就好比你在写作时,只有在遇到不确定的知识点时才去查找信息,而不是每写几句就查一次。
生成文本是LLM的基本功,但在Self-RAG中,这项技能被提升到了新的高度。在这个框架中,生成不仅仅是编织故事,更是一个包含自我反思和评估的过程。模型在生成每一部分内容时,都会考虑是否准确、是否需要更多信息,或者是否能够更好地表达。
这就引出了Self-RAG的精髓所在:将检索和生成的过程融合为一个流畅、互补的双重舞步。想象一下,LLM在生成文本的过程中,如果遇到不确定的点,它就会通过反思标记暂停,进行快速而精准的检索,然后再以新获得的信息继续生成内容。这个过程就像是跳舞时的步步为营,既优雅又高效。
通过这种融合检索与生成的方法,Self-RAG能够产生既准确又流畅的内容。这不仅仅是因为模型可以获取更多的信息,更重要的是,模型学会了如何更好地利用这些信息。这样的输出,不仅对用户更有帮助,而且读起来更自然、更像是人类的语言。
训练Self-RAG模型
训练Self-RAG的三个主要步骤包括训练批评家模型(Critic Model),训练生成器模型(Generator Model),以及Self-RAG的推理过程。以下是对这三个步骤的简略解释:
训练CRITIC MODEL
批评家模型在Sefl-RAG中 是一种专门设计用来评估和反馈生成内容质量的组件。这个模型的主要职能是为生成过程提供关键的自我评估和反思指导。
数据收集:由于手动注释每个段落的反思标记成本高昂,作者们使用像GPT-4这样的先进LLM来生成这些标记。这些标记随后被用来训练内部批评家模型(Critic Model)。不同组的反思标记有自己的定义和输入需求,因此对于每种类型的标记,使用了不同的指令提示进行训练数据的生成。
批评家模型的学习:它首先使用预训练的语言模型进行初始化,然后使用标准的条件语言建模目标进行训练,目的是最大化反思标记的似然度。训练过程使用的公式如下:
maxCE(x,y,r)∼DcriticlogpC(r∣x,y)max_C mathbb{E}_{(x,y,r) sim D_{text{critic}}} log p_C(r|x, y)
这个公式表示的是最大化在批评家模型训练数据集,其中 C 是批评家模型,D_critic 是批评家模型的训练数据集.
训练Generator Model
生成器模型(Generator Model)顾名思义,就是负责实际生成文本回答的组件。 训练生成器模型涉及几个关键步骤,目的是使其能够在生成文本时考虑由批评家模型提供的反思标记。以下是生成器模型训练过程的主要步骤:
- 生成器数据收集:生成器模型的训练开始于数据收集。给定一个输入输出对(x,y),原始输出 y 被检索和批评家模型增强,以创建模拟SELF-RAG推理过程的监督数据。对于输出 y 中的每个段落 y_t,批评家模型(Critic Model)评估是否需要额外的文本段落来增强生成内容。如果需要检索,将添加检索特殊标记
Retrieve = Yes
,并由检索器检索顶部的文档。所有这些反思标记被添加到输出 y 的末尾,形成增强的输出数据. - 生成器模型的学习:生成器模型 M 在经过增强的语料库 D_gen 上进行训练,使用标准的下一个词预测目标。这个目标是训练模型预测目标输出以及反思标记,以此来模拟SELF-RAG的推理过程。公式如下:
maxME(x,y,r)∼DgenlogpM(y,r∣x)max_M mathbb{E}_{(x,y,r) sim D_{text{gen}}} log p_M(y, r|x)
训练过程中,会屏蔽检索文本块(在训练数据中用 <p>
和 </p>
标记)来计算损失,并将原始词汇表扩展到包含一组反思标记。与批评家模型的训练不同,生成器模型不仅学习预测目标输出,还学习预测反思标记。训练过程中会屏蔽检索文本块,并将原始词汇表扩展到包含反思标记的集合。
Self-RAG 推理
训练好模型后,模型如何使用训练好的能力来生成文本的阶段。在推理阶段,Self-RAG利用它的生成器模型(Generator Model)和批评家模型(Critic Model)来动态决定何时检索信息、如何整合这些信息,并自我评估其生成内容。以下是Self-RAG推理过程的关键步骤和特点:
- 自我评估生成输出:生成反思标记让Self-RAG在推理阶段变得可控,使其能够根据不同任务需求调整行为。对于要求事实准确性的任务,模型会更频繁地检索文本段落,以确保输出与可用证据紧密对齐。而对于更开放式的任务,如撰写个人经历的文章,重点则转移到更少的检索和优先考虑整体创造性或效用分数。
- 自适应检索与阈值:Self-RAG通过预测
Retrieve
标记动态决定何时检索文本段落。如果生成Retrieve = Yes
标记的概率超过设定的阈值,则触发检索。 - 树形解码与批评标记:当需要检索时,检索器 R 检索 K 篇文档,生成器 M 并行处理每篇文档,并输出 K 个不同的延续候选项。通过段落级别的束搜索(beam size = B),在每个时间戳 t 获得前 B 个段落延续,并在生成结束时返回最佳序列。每个段落 y_t 根据文档 d 的评分更新,该评分是每个批评标记类型的归一化概率的线性加权和。
关于具体的训练过程在论文的附录里有详细的介绍,我也看得比较粗糙,感兴趣的可以去看看原文哈。
总结
实验部分我就简单地介绍一下就不细讲了,总的来说就是对该框架以及多种基线模型在一系列下游任务上进行了评估,考察了生成输出的整体正确性、事实性和流畅性。对于实验的结果,主要在性能、事实性等表现上相对于其他有监督的微调 LLM 或者现有的 RAG策略要更好。
这篇论文相当于给本人最近的学习又整了点新的思路,不过这个思路倒是有个明显的缺陷,就是需要更复杂的训练和推理过程,如果想要更实时的效果,可能会有不小的影响。