Provence:用于检索增强生成的高效且稳健的上下文剪枝

社区文章 发布于2025年1月28日

image/png

已被 ICLR 2025 接受

论文:https://arxiv.org/abs/2501.16214

模型:https://huggingface.co/naver/provence-reranker-debertav3-v1

缩写:*Pruning and Reranking Of retrieVEd relevaNt ContExts*(检索到的相关上下文的剪枝和重排序)

在 Naver Labs Europe 开发

Provence 是一种训练轻量级**上下文剪枝模型**的方法,用于检索增强生成,特别针对问答进行了优化。给定用户问题和检索到的段落,Provence**会从段落中删除与用户问题不相关的句子**。这可以**加速生成**并**减少上下文噪声**,以即插即用的方式适用于**任何 LLM 或检索器**。

image/png

以下是我们训练 Provence 的概况(更多细节见下文)

image/png

我们使用 LLM(用于上下文剪枝)或预训练的重排序器(用于重排序分数)创建用于训练的合成目标,并根据合成数据调整预训练的重排序器,以便最终的统一模型可以执行高效的上下文剪枝和重排序。该模型的简化版本(不带重排序的独立上下文剪枝器)可以通过调整预训练的 Deberta 模型(或任何基于 BERT 的模型)在 LLM 生成的剪枝目标上进行训练。将上下文剪枝和重排序统一到一个模型中,既不损害重排序性能,也不损害上下文剪枝性能。

Provence 的主要特点(检索到的相关上下文的剪枝和重排序)

  • **Provence 将段落中的所有句子和用户问题一起编码**:这使得能够捕获句子之间的共指,并提供更准确的上下文剪枝。
  • **Provence 根据阈值自动检测要保留的句子数量**。我们发现,默认的阈值在各种领域都适用,但可以进一步调整阈值以更好地满足特定用例的需求。
  • **Provence 是高效的**:Provence 提供了一个基于 DeBERTa 的紧凑模型,它可以作为**独立上下文剪枝器**或**统一的重排序+上下文剪枝模型**。在后一种情况下,我们将上下文剪枝整合到重排序中,这是现代 RAG 管道中已经存在的阶段。重排序+剪枝的统一使得上下文剪枝在 RAG 管道中几乎**零成本**!
  • **Provence 在各个领域都具有鲁棒性**,并且**开箱即用,适用于任何 LLM 和检索器**。

下面我们将更详细地讨论这些功能,以及模型训练和评估结果。

检索增强生成

我们首先讨论独立上下文剪枝模型的情况。

典型的 RAG 管道包括三个步骤

image/png

这里 (1) 检索 + (2) 重排序* 提供了一组与给定问题相关的段落或上下文,(3) 生成则依靠提供的上下文和内部 LLM 能力提供最终答案。

* 检索和重排序之间的区别将在下文讨论。

**上下文剪枝**通常在步骤 (3) 之前应用,即它对相关上下文进行后处理。上下文剪枝的目的是减少上下文的长度,这将加速生成,并减少上下文噪声。

以下是带有上下文剪枝的最终 RAG 管道的详细视图

image/png

我们如何训练独立 Provence

image/png

**数据**:MS-Marco,常用于训练检索模型。我们使用文档级版本并将文档分割成随机长度(1-10 句)的段落,以确保最终模型对上下文长度的鲁棒性。

**步骤 1**:从 MS-Marco 中检索与训练问题相关的段落

**步骤 2**:提示 LLama-3-8B 为每个问题-段落对选择相关句子。这将用作上下文剪枝的合成标签。

image/png

**步骤 3**:调整预训练的 Deberta-v3 模型

  • 模型输入:问题和段落的串联
  • 模型输出:逐词二进制掩码,在合成标签中标记为相关的句子中的词为 1,所有其他词为 0
  • 这个模型被称为 *交叉编码器*,因为它将段落与问题一起编码。

image/png

在推理时,我们使用阈值对模型预测进行二值化,并剪枝预测为 0 多于 1 的句子。由于句子级目标,模型预测自然会聚类在每个句子内,即在大多数情况下,一个句子内的模型预测会彼此接近。

Provence 的特性

现有的上下文剪枝器**独立**编码句子,失去了句子之间共指的信息。在下面的例子中,如果没有前面的句子(它们是关于南瓜的),高亮显示的句子就不清楚,如果句子是独立处理的,可能会被错误地剪枝掉。相反,**Provence 使用交叉编码器架构将所有句子一起编码,并正确处理此类情况**。

image/png

另一个重要特性是 **Provence 自动检测所提供上下文中的相关句子数量**。现有的剪枝器通常需要将要保留的句子数量作为超参数提供,这是一种不切实际的设置。以下示例表明相关句子的数量取决于特定的问题-上下文对

image/png

最后,**Provence 速度快**:Provence 依赖轻量级的基于 DeBERTa 的架构,而不是数十亿参数的 LLM,并且将上下文剪枝视为提取性标注任务,而不是缓慢的自回归生成范式。下图展示了独立 Provence 和其他压缩器之间的效率比较,以及获得的生成加速

image/png

此外,我们建议将上下文剪枝纳入重排序中,使上下文剪枝在 RAG 管道中零成本。现在让我们讨论这部分。

在 Provence 中统一上下文剪枝和重排序

如上所述,一个典型的、高性能的 RAG 管道由三个组件组成

image/png

**重排序**步骤在学术 RAG 设置中经常被忽视(正如我们在我们的 Bergen 工作中所讨论的),但在强大的信息检索系统中它是必不可少的一步,也是高性能生产搜索管道的关键部分(例如,参见这篇博文)。

第一阶段**检索**为了效率独立编码查询和段落,即段落离线预编码,当用户提出问题时,只有问题被编码并执行快速搜索。第二阶段**重排序**在第一阶段的结果之上运行(因此段落数量少得多,例如 50 个),并**将每个上下文与问题一起编码**,即使用**交叉编码器**。这提供了信息量更大的嵌入,并显着改善了搜索结果。

**在 Provence 中,我们建议通过上下文剪枝功能来增强重排序器。** 这是可能的,因为

  • 两个模型都是交叉编码器,即它们具有相同的输入格式:[BOS] 符号 + 问题 + 段落
  • 模型的输出空间不重叠:重排序分数输出到 [BOS] 位置,上下文剪枝掩码输出到段落词元位置
  • 重排序和上下文剪枝的目标是相关的,这意味着这些任务可能会在彼此之间进行知识迁移。

image/png

通过这种统一,上下文剪枝在 RAG 管道中变得零成本,因为它被整合到现有的 RAG 步骤中!

以下是我们将重排序 + 上下文剪枝统一后的 RAG 管道示意图

image/png

**我们如何训练联合模型**:我们从现有的重排序模型开始训练,例如我们案例中的 Deberta-v3-reranker,并添加自蒸馏正则化器,以促进重排序能力的保留。

image/png

在上述步骤 1 和 2 的基础上,我们增加步骤 2a 并修改步骤 3

**步骤 2a:**保存预训练重排序器中每个问题-段落对的重排序分数。这些分数将用作重排序训练目标。

**步骤 3:**调整预训练重排序器,使其具有两个预测头:一个用于从“BOS”嵌入预测重排序分数,另一个用于从上下文标记的嵌入预测二进制剪枝掩码。训练损失是上下文剪枝损失和重排序自蒸馏损失的加权和。

评估结果

我们将 Provence 与现有上下文剪枝器进行比较,例如那些独立处理句子的剪枝器(抽取式 RECOMPDSLR),将上下文剪枝视为生成任务的剪枝器(例如抽象式 RECOMP),以及执行词元级剪枝的剪枝器(LLMLingua 系列,这是与我们正交的研究方向)。

在所有图中,两个轴上的指标都是越高越好,即模型需要趋近**右上角**。

我们发现 Provence 在所有领域都持续优于其他方法,并保持在**帕累托前沿**。此外,**Provence 是唯一一个在性能损失极小甚至没有损失的情况下执行上下文剪枝的模型**。

image/png

Provence 自动检测上下文中的相关句子数量

Provence 的一个重要显著特点是,在推理时,它**自动检测给定上下文中的相关句子数量**,因为这个数量可以从零到所有句子不等。这一特性源于合成标注,其中也包含不同数量的相关句子。

所选句子的数量受到应用于模型预测以获得二进制掩码的阈值的影响。在上面呈现的所有结果图中,Provence 由两个点表示:一个剪枝阈值为 0.1,另一个剪枝阈值为 0.5。

我们观察到

  • 所选的阈值在所有领域都表现良好,这意味着**用户可以使用默认阈值**;
  • 剪枝阈值 0.1 导致更保守的剪枝,性能下降极小或没有下降,而剪枝阈值 0.5 导致更高的压缩率。

用户可以进一步调整阈值以更好地满足特定用例的需求!

在下图中,我们展示了**Provence 选择的句子数量与“真实”句子数量高度相关**。“真实”句子数量为零对应于使用随机选择的上下文回答问题,所有更高的值都来自 LLM 生成的标注。

image/png

Provence 在上下文相关信息位置方面的鲁棒性

我们还进行了一项**大海捞针实验**,使用人工构建的上下文。具体来说,我们编写了一些以关键词为导向的问题,例如:问题:“训练好的模型叫什么?” -> 针:“训练好的模型叫 Provence”,并将“针”句放在维基百科中随机选择的上下文中的不同位置。

我们考虑了单句“针”(上例)和双句“针”。将单句“针”重构为双句“针”的例子:“训练好的模型叫什么?” -> 双句“针”:“我们训练了一个模型。它叫做 Provence。”模型需要检测出回答问题需要这两个句子。

在下图中,我们展示了 Provence 在几乎所有情况下都选择了正确的“针”句,除了最左边和最右边的位置偶尔会出现下降,因为这些位置在数据中(因此在实践中)很少相关。

image/png

我们在论文中提供了**更多实验**,例如关于训练管道各个部分的消融研究,或者**展示 Provence 的结果在各种检索器/重排序器/生成器/段落长度下都是相似的**!

总结

  • Provence 是一种高效的即插即用型 RAG 上下文剪枝器,能够移除与用户问题不相关的上下文句子,且性能损失极小甚至没有。
  • Provence 的两个主要组成部分是 (1) 将上下文剪枝视为序列标注,以及 (2) 将上下文剪枝和重排序器统一到一个模型中;
  • Provence 自动检测给定上下文中的相关句子数量,在各种领域表现良好,并且可以与任何 LLM 或检索器一起使用。

论文:https://arxiv.org/abs/2501.16214

模型:https://huggingface.co/naver/provence-reranker-debertav3-v1

社区

注册登录 以发表评论