LLMコード補完(エルエルエムコードホカン)
LLMがエディタ上でリアルタイムにコードの続きを予測・提案する機能。Fill-in-the-Middle学習により、カーソル位置の前後文脈から最適なコード断片を生成する。
LLMコード補完とは
LLMコード補完は、開発者がコードを書いている最中にLLMがリアルタイムで次に書くべきコードを予測し、ゴーストテキスト(薄い灰色の文字)として表示する機能です。従来のIDE補完(IntelliSense等)がAPIリファレンスから候補を列挙するのに対し、LLM補完はコードの文脈・パターン・意図を理解して複数行にわたる実装を提案します。
従来のIDE補完との違い
| 比較項目 | 従来のIDE補完 | LLMコード補完 |
|---|---|---|
| 補完単位 | メソッド名・プロパティ名 | 数行〜数十行のコードブロック |
| 文脈理解 | 型情報・スコープ内変数 | プロジェクト全体の意図・パターン |
| 対応範囲 | 言語の静的解析可能な部分 | コメント・文字列・設定ファイルも含む |
| 精度根拠 | 型システム(確定的) | 確率的予測(幻覚の可能性あり) |
| レイテンシ | 即座(ローカル解析) | 100〜500ms(API呼び出し) |
Fill-in-the-Middle(FIM)
コード補完で最も重要な学習手法がFIMです。通常のLLMはテキストを左から右に生成しますが、FIMでは「前のコード(Prefix)」と「後のコード(Suffix)」を与えて「中間(Middle)」を予測するよう学習します。
これにより、既存コードの途中にカーソルを置いた状態での補完が可能になります。関数の途中に新しいロジックを挿入するケースや、既存のif文にelse節を追加するケースで威力を発揮します。
レイテンシと体験設計
コード補完はタイピングに追従する必要があるため、レイテンシが最重要の品質指標です。
| レイテンシ | 体験 |
|---|---|
| 50ms以下 | タイピングと同時に表示。思考の邪魔にならない |
| 100〜200ms | わずかに遅延を感じるが実用的 |
| 300〜500ms | 入力してから表示まで待つ感覚がある |
| 500ms以上 | ストレスを感じる。キーストローク中に前の候補が残る |
レイテンシ最適化手法
- 投機的デコーディング: 小さなドラフトモデルが高速に候補を出し、大きなモデルが検証
- キャッシング: 直前の補完結果を部分的に再利用
- プレフェッチ: カーソル移動やファイル切替時に先行してリクエスト
- ローカル推論: Supermaven(独自モデル)やContinue(Ollama統合)でオンプレミス実行
コンテキストウィンドウの活用
補完精度を左右するのはモデルに渡すコンテキストの質です。
含めるべきコンテキスト
- 現在のファイル: カーソル前後のコード(FIM形式)
- インポート文: 使用中のライブラリ・フレームワーク情報
- 関連ファイル: 同ディレクトリのファイル、型定義ファイル
- 最近編集したファイル: 開発者の作業文脈を反映
- LSP情報: 型推論結果、定義ジャンプ先
含めるべきでないコンテキスト
- ビルド出力やログ(ノイズ)
- node_modules等の外部依存(トークン浪費)
- バイナリファイル
補完の受け入れ率と品質指標
| 指標 | 業界平均 | 優良ライン |
|---|---|---|
| 受け入れ率(Acceptance Rate) | 25〜30% | 35%以上 |
| 持続率(Persistence Rate) | 60〜70% | 75%以上 |
| 文字節約率(Characters Saved) | 30〜40% | 50%以上 |
「持続率」は受け入れた補完が30秒後も編集されずに残っている割合で、補完品質の実質的な指標です。
FAQ
Q1: コード補完と チャットベース生成はどう使い分けますか?
1〜10行の定型パターン(ループ・条件分岐・API呼び出し)はインライン補完が効率的です。新しいファイルの作成や複雑なロジック実装はチャットで指示する方が精度が高くなります。
Q2: ローカルモデルでのコード補完は実用的ですか?
7B〜15Bパラメータのモデル(Qwen2.5-Coder-14B等)をGPU搭載マシンでローカル推論すれば、プライバシーを保ちつつ実用的な補完が可能です。レイテンシは100〜300msでクラウドAPIと同等です。
Q3: 補完を受け入れた後にバグが入ることはありますか?
あります。LLMの補完は確率的予測であり、存在しないメソッド呼び出しや型不一致のコードを生成することがあります。TypeScriptの型チェックやリンターとの併用が推奨されます。