Active RAG -- FLARE 详解

发布时间:2024年01月21日

论文来自 Carnegie Mellon University,原文链接:https://arxiv.org/abs/2305.06983

RAG 是一种缓解 LLM 幻觉问题的方法,已有的一些方法可以通过 single-time 检索增强得到比纯参数LLM更好的返回。特别是对于短形式的知识密集型生成任务,如事实问答(QA),这类问题的信息需求在用户的输入中是明确的,仅根据输入检索一次相关知识就足够了。

与短格式生成相比,长格式生成提出了复杂的信息需求,这些需求并不总是可以非常容易从单次的输入中得到。与人类在创建论文、散文或书籍等内容时逐渐收集信息的方式类似,使用 LLM 进行长格式生成需要在整个生成过程中收集多个知识片段。

在这种情况下,作者提出 FLARE 模型,该模型迭代生成临时下一句,如果其中包含低概率标记,则将其用作检索相关文档的查询,并重新生成下一句直到语句结束。

Active RAG 原理简介

在第 t(t≥1)步时,基于用户输入 x 和先一步生成的输出来生成检查查询语句,公式如下:
在这里插入图片描述
其中 qry() 指的的是查询公式函数。在开始时(t=1),用户输入用作初始查询语句。

对于给定检索文档,LM 会用下面的公式不断生成答案,直到触发下一次检索或到达末尾:
在这里插入图片描述
其中 yt 代表在当前步骤 t 生成的 tokens,LM 的输入是检索文档,用户输入和上一次生成结果。

FLARE:Forward-Looking Active REtrieval Augmented Generation

假设条件(作者认为):

  • LLM 应当仅在不具备必要知识的情况下进行检索信息,以避免不必要或不适当的检索
  • 检索查询应该反映下次生成的意图

基于以上假设,作者提出了两种 forward-looking active RAG 方法:

  • 第一种方法 FLARE_instruct, 在必要时会提示 LM 生成检索查询,同时使用 retrieval-encouraging 指令生成答案。
  • 第二种方法 FLARE_direct,直接使用 LM 的生成结果作为搜索查询,它迭代生成下一个句子以深入了解进一步提问的主题。如果存在不确定的 token,则检索相关文档以重新生成下一句。

FLARE with Retrieval Instructions(FLARE_instruct)

对于下游任务,作者将与搜索相关的指令和示例作为 skill 1 放在开头,然后将下游任务的指令和样例作为 skill 2。对于一个给定的测试用例,要求 LM 在执行任务时结合 skill 1 和 2 来生成搜索查询。Prompt 框架样例如下图所示:
在这里插入图片描述
完整的流程的图如下所示:
在这里插入图片描述

  • 根据 Prompt 的指示回答问题
  • 当 LM 生成 “[Search(query)]”(以灰色斜体显示)时,FLARE 停止生成并使用查询项来检索相关文档。这些文档在用户输入之前就已经准备好了,以帮助生成回答。
  • 检索结束之后会继续生成直到下一个搜索查询或到达末尾。

Direct FLARE

对于 black-box LM 是无法进行微调的,作者发现一些检索指令并不是那么可靠。因此提出了一种更直接的 forward-looking active RAG 方法,即使用下一个句子来决定何时检索以及检索什么。

Confidence-based Active Retrieval 基于置信度的主动检索

如下图所示:
在这里插入图片描述

  • 在步骤t,FLARE 会在不检索的情况下生成临时的下一句话。
  • 根据生成的临时语句决定是否触发检索,以及制定查询。
    • 如果 LM 对生成的临时语句有信心,则不会检索额外信息并且将其作为输出。
    • 如果没有信心,则使用临时生成语句构建搜索语句去检索相关文档,并且重新生成下一句。

由于 LM 本身经过大量数据的训练,因此输出结果概率较低,则表明缺乏对应的信息,在这种情况就应该触发检索。

本文会设定一个阈值,当某一个 token 的概率低于阈值时则触发主动检索:
在这里插入图片描述

Confidence-based Query formulation 基于置信度的查询公式

在这里插入图片描述

核心思想:直接将临时生成的下一句作为查询语句。

作者发现使用下一个句子进行检索可以获得更好的结果,但是可能会使其中的错误信息一直存在。例如,如果 LM 产生的句子是“乔·拜登就读于宾夕法尼亚大学”,而不是他就读于特拉华大学,那么使用这个错误的句子作为查询可能会检索到错误的信息。

因此作者提出了两个方法来解决这个问题:

Masked sentences as implicit queries (将语句掩码之后的隐式查询)

将置信度低于某个阈值的 token 打上掩码。

Generated questions as explicit queries(生成的问题作为明确的查询)

针对置信度低的 token,生成明确的问题。作者开发了一种通用的方法,可以在没有额外注释的情况下生成低置信区间的问题。具体地说,首先提取所有概率低于阈值的 spans(理解为一系列 tokens)。对于每个提取的 span,利用 LM 生成一个可以被当前 span 回答的问题,具体 prompt 如下:
在这里插入图片描述
使用每个生成的问题进行检索,并将返回的文档放入一个单独的排名列表中,以帮助后续的生成步骤。

实验

对比方法

  • Previous-window:该方法每隔 l 个 token 触发一次检索,l 表示窗口大小。从上一个窗口生成的结果会作为当前检索的查询语句。
  • Previous-sentence:该方法每句话都会触发一次检索,并且使用上次的语句作为查询语句。
  • Question decomposition:该方法根据特定的 task 人工添加注释指导 LM 基于原问题生成子问题。每次子问题生成时都会触发检索。

实验设置

本文构建多个数据比较不同方法的实验效果:

  • Multihop QA: 目标是通过信息检索和推理来回答复杂的问题。
  • Commonsense reasoning:需要世界和常识性知识来产生答案。
  • Long-form QA:旨在为寻求复杂信息的问题提供全面的答案。
  • Open-domain summarization:目标是通过从开放 web 收集信息来生成关于主题的全面摘要。

实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

消融实验

Forward-looking retrieval

在这里插入图片描述
在这里插入图片描述

Active retrieval

在这里插入图片描述

Different query formulation

在这里插入图片描述
在这里插入图片描述

限制

以下两种数据集并没有很好的表现:

  • 对于输出较短的,不需要检索多条不同信息的数据集
  • 开放式问题,需要深入回答的数据集

另外在此方法中,LM 会被重复调用,增大开销

文章来源:https://blog.csdn.net/Anooyman/article/details/135729372
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。