FIM与传统生成差异大,哪种更好用?

219 阅读2分钟

各位专业人士,大家好!本次将对 Fill-in-the-Middle(FIM)技术展开深度剖析。作为该领域的研究者,认为有必要向广大从业者进行专业科普。

一、核心概念

Fill-in-the-Middle(填中)是专门为大语言模型设计的上下文生成范式,它突破了传统从左到右单向生成的限制。其核心在于使模型能够在给定的前缀(prefix)和后缀(suffix)之间,生成符合逻辑的中间内容(middle)。

二、与传统生成方式的对比

以下表格对比了不同的生成方式:

生成方式输入结构典型应用场景技术挑战
左到右生成[前缀] → 生成后续文本续写长距离依赖建模
填空生成[前缀][后缀] → 填洞完形填空局部语义一致性
FIM生成[前缀] [后缀]代码补全双向上下文理解

不同生成方式差异显著,每种方式都有其独特特点与难点,专业人员能够清晰辨别。

三、关键技术实现

1. 数据格式处理

以下是原始的 Python 代码:

def add(a, b):
    return a + b

经过 FIM 格式化(P - M - S 结构)后变为:

<FIMPREFIX>def add(a, b):<FIMSUFFIX>return a + b<FIMMIDDLE>
<FIMEND>

2. 特殊标记设计

以下是几个重要的特殊标记:

  • <FIMPREFIX>:前缀起始标记;
  • <FIMMIDDLE>:待生成内容起始标记;
  • <FIMSUFFIX>:后缀起始标记;
  • <FIMEND>:生成终止标记。

3. 注意力掩码改造

通过下图可更直观地看出传统注意力掩码与 FIM 注意力掩码的区别。

graph LR
A[前缀Token] --> C[中间Token]
B[后缀Token] --> C
C --> D[预测Token]

对比传统注意力掩码(左)与 FIM 注意力掩码(右) ,差异一目了然。

四、训练策略创新

1. 动态上下文分割

采用随机选择分割点的方法,约有 p ~ 50% 的概率在函数体内部进行分割。且 gap 长度可变,会遮蔽 20% - 80% 的内容。

2. 双向上下文建模

包括三个关键部分:

  • 前缀编码器:负责捕获左侧上下文特征;
  • 后缀编码器:提取右侧约束条件;
  • 交叉注意力:建立前后语义关联。

3. 课程学习策略

在训练阶段进行如下调整:

训练阶段调整
if epoch < 5:
gapratio = 0.3

若存在表述不精准之处,望各位谅解。期望本次深度科普能使各位对 FIM 技术有更清晰的认知。