コードの前後の文脈(プレフィックスとサフィックス)を入力として、中間部分を生成する技術。Fill-in-the-Middle(FIM)とも呼ばれ、コード補完の中核テクニックである。
LLMコードインフィリング(LLM Code Infilling)は、コードの前後の文脈を与えて中間部分を生成する技術であり、Fill-in-the-Middle(FIM)とも呼ばれる。通常のコード生成がプレフィックス(先行テキスト)から続きを生成する左から右への自己回帰生成であるのに対し、インフィリングはプレフィックスとサフィックス(後続テキスト)の両方を条件として中間部分を生成する点が特徴的である。
この技術は、コード補完、コードリファクタリング、ドキュメント生成、型アノテーション挿入など幅広い応用を持つ。StarCoder、Code Llama、DeepSeek-Coder など主要なコード生成モデルの多くが FIM 学習を取り入れている。
FIM 学習では、通常のコードデータを以下のように変換して学習に使用する。
| FIM モード | トークン順序 | 特徴 |
|---|---|---|
| PSM (Prefix-Suffix-Middle) | <PRE> prefix <SUF> suffix <MID> middle | 最も一般的なモード |
| SPM (Suffix-Prefix-Middle) | <SUF> suffix <PRE> prefix <MID> middle | サフィックス重視の生成 |
学習データのうち何割を FIM 形式に変換するかを FIM Rate と呼ぶ。StarCoder では 50%、Code Llama では 90% の FIM Rate が採用されている。FIM Rate が高すぎると通常の左から右への生成性能が低下するため、適切なバランスが重要である。
| モデル | FIM Rate | FIM モード | 最大コンテキスト長 |
|---|---|---|---|
| StarCoder2 | 50% | PSM | 16,384 |
| Code Llama | 90% | PSM + SPM | 100,000 |
| DeepSeek-Coder | 50% | PSM | 16,384 |
| Qwen2.5-Coder | 50% | PSM | 131,072 |
プレフィックスとサフィックスの情報を効果的に統合することが最大の課題である。Transformer の自己注意機構は双方向の情報を自然に処理できるが、自己回帰生成時には左から右への因果的マスクが適用されるため、サフィックス情報の利用方法に工夫が必要となる。
インフィリングではサフィックスの開始位置で生成を停止する必要がある。しかし、モデルがサフィックスの一部を重複生成してしまう問題(オーバーシュート)が発生することがある。サフィックスの先頭トークンとの一致を検出して停止する手法が一般的に用いられる。
プレフィックスとサフィックスにそれぞれどの程度のトークン数を割り当てるかも重要な設計判断である。一般にプレフィックスの方が生成品質への影響が大きいため、プレフィックスに多くのトークンを配分する戦略が取られることが多い。
最も直接的な応用であり、開発者がカーソル位置の前後のコードを文脈としてインフィリングを実行する。IDE プラグインはバッファ内のコードを自動的にプレフィックスとサフィックスに分割してモデルに送信する。
関数シグネチャ(プレフィックス)と関数本体(サフィックス)の間にドキュメントコメントを挿入する用途でもインフィリングが活用される。
TypeScript の型推論や Python の型ヒント挿入にもインフィリングが応用できる。変数宣言のプレフィックスと代入式のサフィックスの間に型アノテーションを生成する。
関数の前後のインターフェースを保持しつつ、内部実装を書き換えるリファクタリング操作をインフィリングとしてモデル化できる。
| ベンチマーク | 評価対象 | 主な指標 | 備考 |
|---|---|---|---|
| HumanEval Infilling | 単一行・複数行の穴埋め | Exact Match | OpenAI が提案 |
| CrossCodeEval | クロスファイルの穴埋め | Edit Similarity | リポジトリレベル評価 |
| RepoBench | リポジトリレベルの補完 | Exact Match | 実プロジェクトから構築 |
| FIM Benchmark (SantaCoder) | FIM の基本性能 | pass@k | BigCode が提案 |
適切な FIM Rate(50%程度)であれば、通常の左から右への生成性能はほとんど低下しないことが実証されている。StarCoder の研究では、FIM Rate 50% で HumanEval のスコアが 0.2% 未満の低下に留まった。ただし、FIM Rate を 90% 以上に設定すると通常の生成性能に影響が出る場合がある。
既存コードの中間に新しいロジックを挿入する場面、関数の途中にエラーハンドリングを追加する場面、コメントやドキュメントを後から挿入する場面で特に優れた性能を発揮する。サフィックスの情報により、生成されるコードが後続のコードと整合するため、手動調整の手間が大幅に削減される。
一般的には PSM(Prefix-Suffix-Middle)の方が性能が高いとされている。これは、自然なコードの読み順(上から下)に近い配置であるため、モデルが文脈を理解しやすいと考えられている。ただし、Code Llama の研究では PSM と SPM の両方で学習することで相補的な効果が得られることも示されている。