AI・機械学習
上級

LLMコードインフィリング(エルエルエムコードインフィリング)

コードの前後の文脈(プレフィックスとサフィックス)を入力として、中間部分を生成する技術。Fill-in-the-Middle(FIM)とも呼ばれ、コード補完の中核テクニックである。

0 回閲覧
0 いいね

LLMコードインフィリングとは

LLMコードインフィリング(LLM Code Infilling)は、コードの前後の文脈を与えて中間部分を生成する技術であり、Fill-in-the-Middle(FIM)とも呼ばれる。通常のコード生成がプレフィックス(先行テキスト)から続きを生成する左から右への自己回帰生成であるのに対し、インフィリングはプレフィックスとサフィックス(後続テキスト)の両方を条件として中間部分を生成する点が特徴的である。

この技術は、コード補完、コードリファクタリング、ドキュメント生成、型アノテーション挿入など幅広い応用を持つ。StarCoder、Code Llama、DeepSeek-Coder など主要なコード生成モデルの多くが FIM 学習を取り入れている。

FIM 学習の仕組み

データ変換

FIM 学習では、通常のコードデータを以下のように変換して学習に使用する。

  1. コードテキストをランダムな位置で3つの部分に分割する
  2. 分割した部分を特殊トークンで区切り、順序を入れ替える
  3. モデルはこの変換されたデータで通常の言語モデル学習を行う
FIM モードトークン順序特徴
PSM (Prefix-Suffix-Middle)<PRE> prefix <SUF> suffix <MID> middle最も一般的なモード
SPM (Suffix-Prefix-Middle)<SUF> suffix <PRE> prefix <MID> middleサフィックス重視の生成

FIM Rate

学習データのうち何割を FIM 形式に変換するかを FIM Rate と呼ぶ。StarCoder では 50%、Code Llama では 90% の FIM Rate が採用されている。FIM Rate が高すぎると通常の左から右への生成性能が低下するため、適切なバランスが重要である。

モデルFIM RateFIM モード最大コンテキスト長
StarCoder250%PSM16,384
Code Llama90%PSM + SPM100,000
DeepSeek-Coder50%PSM16,384
Qwen2.5-Coder50%PSM131,072

インフィリングの技術的課題

双方向コンテキストの統合

プレフィックスとサフィックスの情報を効果的に統合することが最大の課題である。Transformer の自己注意機構は双方向の情報を自然に処理できるが、自己回帰生成時には左から右への因果的マスクが適用されるため、サフィックス情報の利用方法に工夫が必要となる。

生成の停止条件

インフィリングではサフィックスの開始位置で生成を停止する必要がある。しかし、モデルがサフィックスの一部を重複生成してしまう問題(オーバーシュート)が発生することがある。サフィックスの先頭トークンとの一致を検出して停止する手法が一般的に用いられる。

コンテキストウィンドウの配分

プレフィックスとサフィックスにそれぞれどの程度のトークン数を割り当てるかも重要な設計判断である。一般にプレフィックスの方が生成品質への影響が大きいため、プレフィックスに多くのトークンを配分する戦略が取られることが多い。

応用例

コード補完

最も直接的な応用であり、開発者がカーソル位置の前後のコードを文脈としてインフィリングを実行する。IDE プラグインはバッファ内のコードを自動的にプレフィックスとサフィックスに分割してモデルに送信する。

ドキュメント生成

関数シグネチャ(プレフィックス)と関数本体(サフィックス)の間にドキュメントコメントを挿入する用途でもインフィリングが活用される。

型アノテーション挿入

TypeScript の型推論や Python の型ヒント挿入にもインフィリングが応用できる。変数宣言のプレフィックスと代入式のサフィックスの間に型アノテーションを生成する。

コードリファクタリング

関数の前後のインターフェースを保持しつつ、内部実装を書き換えるリファクタリング操作をインフィリングとしてモデル化できる。

ベンチマークと評価

ベンチマーク評価対象主な指標備考
HumanEval Infilling単一行・複数行の穴埋めExact MatchOpenAI が提案
CrossCodeEvalクロスファイルの穴埋めEdit Similarityリポジトリレベル評価
RepoBenchリポジトリレベルの補完Exact Match実プロジェクトから構築
FIM Benchmark (SantaCoder)FIM の基本性能pass@kBigCode が提案

よくある質問(FAQ)

Q1: FIM 学習を行うとモデルの通常の生成性能は低下するか?

適切な FIM Rate(50%程度)であれば、通常の左から右への生成性能はほとんど低下しないことが実証されている。StarCoder の研究では、FIM Rate 50% で HumanEval のスコアが 0.2% 未満の低下に留まった。ただし、FIM Rate を 90% 以上に設定すると通常の生成性能に影響が出る場合がある。

Q2: インフィリングはどのような場面で通常の補完より優れるか?

既存コードの中間に新しいロジックを挿入する場面、関数の途中にエラーハンドリングを追加する場面、コメントやドキュメントを後から挿入する場面で特に優れた性能を発揮する。サフィックスの情報により、生成されるコードが後続のコードと整合するため、手動調整の手間が大幅に削減される。

Q3: PSM と SPM のどちらの FIM モードが優れているか?

一般的には PSM(Prefix-Suffix-Middle)の方が性能が高いとされている。これは、自然なコードの読み順(上から下)に近い配置であるため、モデルが文脈を理解しやすいと考えられている。ただし、Code Llama の研究では PSM と SPM の両方で学習することで相補的な効果が得られることも示されている。