一句话定义
填充中间(Fill-in-the-Middle,FIM)是一种训练目标:把一段文本从中间切开,让模型同时看着前文和后文,把中间缺掉的那一段补出来。
为什么需要专门练这个
语言模型默认的训练方式是"预测下一个词":给它前文,让它猜后面接什么。这对聊天、写文章够用,但对写代码不够。
设想你在编辑器里改代码,光标停在函数中间,你想补两行。你不仅知道上面写了什么,也知道下面要接什么——下面那行已经在调用某个变量,你把名字写错就编译不过。如果模型只能看上文,它补出来的代码常常和下文对不上:函数名拼错、括号对不齐、参数个数不对。
FIM 就是把"看得见下文"的能力练进模型里。它像玩拼图:不是从左上角一块块往下拼,而是先看清左右两边的图案,再判断中间那块长什么样。
具体怎么练
做法很朴素:拿一个文件,随机切成三段——前段 A、中段 B、后段 C,然后重排成 A → C → B 的顺序,中间插入几个特殊标记(哨兵 token),大致长这样:
```
<前缀> A <后缀> C <中间> B
```
模型顺序读入,读到 <中间> 之后开始生成 B。因为注意力机制能看见前面的 A 和 C,它就学会了"在给定前后文的条件下生成中间那一整段"。
前后缀谁先谁后有两种常见排列,效果差别不大,看实现选择。另外有个细节:如果只练 FIM,模型会变成"只会填空、不会往下写",所以实际训练通常把 FIM 样本和普通的从左往右样本按比例混着喂。
和相邻概念的区别
| 普通自回归 | 掩码语言模型(MLM) | 填充中间(FIM) | |
|---|---|---|---|
| 能看到 | 只有上文 | 上下文 | 上文 + 下文 |
| 要预测 | 下一个词 | 若干零散被挖掉的词 | 一整段连续文本 |
| 典型用途 | 对话、续写 | 分类、检索 | 代码补全、文档改写 |
掩码语言模型和 FIM 长得像,但思路不同:前者随机挖很多零散的小洞、逐个预测词,主要服务于"理解"类任务;后者挖掉一整段连续文本、要把它生成出来,服务于"补全"类任务。本质上 FIM 仍是生成式目标,只是条件里多了后文。
对实际工作的意义
做模型的人:代码大模型基本都会把 FIM 列为训练目标之一。只做从左往右预训练的模型,塞进 IDE 做行内补全会明显吃亏。FIM 的样本比例、哨兵标记怎么选,都值得当超参数认真调。
用模型的人:你在编辑器里把光标放在函数中间敲几行,补出来的代码和下面已经写好的调用严丝合缝,多半就是 FIM 在起作用。一些模型服务会专门提供 FIM 接口或对应的哨兵标记,具体格式以官方页面为准。
再往外看,"看着前后文补中间"不限于代码:改一段合同、修一句译文、填一个表格单元格,都是同一个需求。
