该模块可作为开发物件之一
0 概念澄清
RAG指的是一系列方法论,其概念更加抽象。检索强化语言模型(Retrieval-Augmented LM) 则是经外部知识强化后的语言模型,其概念具体到可以指定物件。
其中,在该文章语境下,RALM的检索功能被定义为语言模型的一部分,而RAG则允许检索功能被放置在任何位置,包括但不限于语言模型内部和外部挂载模块。为作区分,之后的部分将明确标注检索强化生成技术的作用位置,即模型内和模型外
1 文献目标
1.1 概览
问题
- 模型外的RAG技术会消耗更多token,长文本效果更明显
- 难以提取长文本上下文
- 无关文本干扰模型 解决方案:
- 在预置和模型之间插入信息压缩模块。该文献提出了两种信息压缩模块。
“预置”是指整合查询和文本块并准备输入LLM的步骤,它被定义在Naive RAG架构中的Generation操作开端。
2 具体实现
两个模块都可以用LoRA微调,推荐应用于编码-解码结构
2.1 问题定义
给定输入序列$x$,目标输出$y$和一组检索到的文档$D = [d_1, d_2, \cdots, d_n]$,压缩器的任务是:
生成一个摘要$s$,使得:
- $s$比$D$短得多
- 当$s$被预置到$x$前输入语言模型$M$时,模型生成$y$的概率最大化
- $s$的内容应该能被$D$所蕴含 压缩器的任务与花书中定义的序列生成定义相对接近,其本身超越传统的监督学习任务框架。
该文献的方法将语言模型视为黑盒并不作更改。
2.2 Extractive Compressor
原论文模型参数量110M,考虑量化后体积还能进一步缩小
Extractive Compressor将问题定义为ranking问题,即直接将句子排序、拼接并预置。Extractive Compressor使用双编码器结构,通过嵌入句子,计算相似度来衡量语料对回答问题的有用程度。
推理过程如下:
flowchart LR
subgraph A [输入预处理与编码]
A1[“文档集D<br>(多篇文档)”] --> A2[“分句”]
A2 --> A3[“句子集合S<br>(s₁, s₂, …, sₙ)”]
A4[“用户查询 x”]
end
subgraph B [句子评分与选择]
A3 -- “句子编码器<br>enc_θ(sᵢ)” --> B1[“句子向量”]
A4 -- “查询编码器<br>enc_θ(x)” --> B2[“查询向量”]
B1 --> B3(“点积/余弦相似度<br>计算得分”)
B2 --> B3
B3 --> B4[“按得分排序<br>选出Top K个句子”]
end
subgraph C [输出拼接]
B4 --> C1[“压缩后的摘要 s<br>(Top K 句子的直接拼接)”]
end
A --> B --> C
训练流程大概如下:
以下,分数指logprob输出。注意,DeepSeek API 只允许以token为单位的logprob输出,其设计本身不为回答整体确定性服务,需要额外建模
符号:
- $M$: 语言模型
- $x_i$: 第$i$个输入查询
- $S_i={s_j}_1^n$:候选句子集合,由检索产生
- $y_i$:第i个查询的目标答案
- $\epsilon$:预设阈值
- $enc_{\theta}$:Extractive Compressor
- $Score$“:logprob分数
1.从候选句子中找到使得分数最高的句子$p_i$
$$ p_i = argmax_{s_j\in S_i} \ Score(M, y_i, [s_j;x_i]) $$2.根据阈值,从文档中所有句子里筛除负面例子,其中条件为:
$$ Score(M, y_i, [s_j;x_i]) + \epsilon < Score(M, y_i, [p_i;x_i]) $$即,如果某个句子$s_j$的分数比最佳分数少$\epsilon$,则说明这个句子比最佳分数差。
将所有符合”差句子“的样本存入$L$
3.从$L$中选取数个与输入$x_i$最相似的句子,具体可用内积或者相似度,即
$$ N_i \gets artTop5_{s_j\in L}(metric(enc_{\theta}(s_j), enc_{\theta}(x_i))) $$$metric()$是距离度量。这五个句子作为负例和正例一同进行对比训练
2.3 Abstractive Compressor
Abstractive Compressor将信息压缩直接定义为生成问题,它的推理过程与常见的编码器-解码器结构推理相似
flowchart LR
subgraph A [输入预处理]
A1[“文档集D<br>(多篇文档拼接)”] --> A2[“与查询x拼接为<br>统一输入序列”]
A3[“用户查询 x”] --> A2
end
subgraph B [编码器理解与表示]
A2 --> B1[“编码器<br>enc_θ”]
B1 --> B2[“文档-查询<br>融合表示”]
end
subgraph C [解码器生成摘要]
B2 --> C1[“解码器<br>dec_θ”]
C1 --> C2[“自回归生成<br>逐词生成摘要序列”]
C2 --> C3{“是否生成<br>结束符号?”}
C3 -- 否 --> C2
C3 -- 是 --> C4[“生成摘要 s<br>(新文本序列)”]
end
subgraph D [输出与选择性增强]
C4 --> D1{“摘要是否<br>有效提升任务性能<br>(可选后验判断)”}
D1 -- 是 --> D2[“输出摘要 s<br>用于预置提示”]
D1 -- 否 --> D3[“输出空字符串<br>(选择性增强)”]
end
A --> B --> C --> D
该方法涉及大型模型使用,训练流程大致如下:
注意!目前主流的很多高性能模型(如Claude, ChatGPT等)都禁止使用其输出进行模型蒸馏和训练其他生成式模型!笔者不准备对这些厂商的模型产品使用,也不建议使用,推荐使用如DeepSeek、千问(开源版)等明确允许蒸馏的开源模型来实现!
符号:
- $\text{M}$:教师模型
- $Prompt_j$:第j个提示模板
- $x_i$:输入查询
- $D_i$:检索到的文档集合(注意,不是以句子为单位操作)
1.让高性能语言模型作为教师,为每个训练样本生成摘要
$$ s_j \gets \text{M}(Prompt_j, x_i, D_i) $$对于所有摘要,选择分数最高的作为目标摘要
2.对比”添加摘要“和”不添加摘要“的任务性能,如果摘要不能提升任务性能,则目标摘要变为空字符串,其具体对比条件如下
$$ Score(M, y_i, [s_j;x_i]) \leq Score(M, y_i, [x_i]) $$后者为不使用摘要的情况
3.使用前两步得到的数据集训练学生模型,原论文使用T5-large。