LLM プレフィックスキャッシング(エルエルエム プレフィックスキャッシング)
複数の LLM 推論リクエスト間で、共通するプロンプトプレフィックス部分の KV キャッシュを共有・再利用する技術。同一システムプロンプトを使う複数ユーザーのリクエストを効率化する。
LLM プレフィックスキャッシングとは
LLM プレフィックスキャッシングは、複数の推論リクエストが共通のプロンプトプレフィックス(先頭部分)を持つ場合に、そのプレフィックスに対応する KV キャッシュを一度だけ計算してメモリに保持し、後続リクエストで再利用する最適化技術です。チャットボット、RAG パイプライン、コード生成アシスタントなど、同一のシステムプロンプトや Few-shot 例を多数のリクエストで共有するユースケースで大きな効果を発揮します。
動作の仕組み
プレフィックスキャッシングは、プロンプトをプレフィックス(共通部分)とサフィックス(可変部分)に分離して処理します。
初回リクエスト: プレフィックス全体の Prefill を実行し、各 Attention 層の KV テンソルをキャッシュプールに格納します。プレフィックスのハッシュ値をキーとして管理します。
後続リクエスト: プレフィックスのハッシュを計算し、キャッシュプールを検索します。ヒットした場合、プレフィックス部分の Prefill をスキップし、サフィックス部分のみを処理します。
| 要素 | 説明 | 例 |
|---|---|---|
| プレフィックス | 複数リクエストで共通する先頭部分 | システムプロンプト + Few-shot 例 |
| サフィックス | リクエストごとに異なる末尾部分 | ユーザーの質問文 |
| キャッシュキー | プレフィックスの同一性判定に使うハッシュ | SHA-256 of token IDs |
推論エンジンでの実装
vLLM
vLLM は Automatic Prefix Caching (APC) 機能を提供しています。--enable-prefix-caching フラグで有効化でき、リクエストのプレフィックスをブロック単位(通常 16 トークン)でハッシュし、一致するブロックのKVキャッシュを再利用します。PagedAttention と組み合わせることで、メモリ効率の高いプレフィックス共有を実現します。
SGLang RadixAttention
SGLang は RadixAttention と呼ばれる独自のプレフィックスキャッシュ管理を実装しています。LRU(Least Recently Used)eviction ポリシーで管理された Radix Tree にプレフィックスの KV キャッシュを格納し、最長プレフィックスマッチで検索します。複数のプロンプトテンプレートを同時に効率よくキャッシュできる点が特徴です。
TensorRT-LLM
NVIDIA の TensorRT-LLM も KV キャッシュのプレフィックス再利用をサポートしています。Inflight Batching と組み合わせて、異なるリクエストのプレフィックスKVキャッシュを物理メモリ上で共有できます。
ユースケースと効果
チャットボット: 数千文字のシステムプロンプト(ペルソナ設定、制約条件、出力フォーマット等)を全リクエストで共有。数百ユーザーの同時リクエストで Prefill コストを 90% 以上削減。
RAG パイプライン: 検索したドキュメントチャンクが同一の場合(同じ質問への再質問等)、ドキュメント部分のキャッシュが再利用される。
Few-shot 推論: 20〜50 例の Few-shot プロンプトを共有。例の追加・削除がない限りキャッシュは有効。
コード補完: リポジトリのコンテキスト(ファイル構造、関連コード)をプレフィックスとしてキャッシュし、カーソル位置ごとの補完リクエストを高速化。
Prompt Caching との関係
API プロバイダが提供する Prompt Caching(Anthropic、Google、OpenAI)は、プレフィックスキャッシングの一形態です。違いはレイヤーにあります。
- プレフィックスキャッシング: 推論エンジン(vLLM、SGLang 等)レベルの最適化。自分でモデルをホスティングする場合に利用
- Prompt Caching: API サービスレベルの最適化。クラウド API を利用する場合に利用
どちらも内部的には KV キャッシュのプレフィックス共有という同じ原理に基づいています。
FAQ
Q: プレフィックスが完全一致でなくても部分的にキャッシュヒットしますか?
はい、多くの実装ではブロック単位(16〜128 トークン)でキャッシュを管理するため、プレフィックスの先頭から一致する部分まではキャッシュヒットし、不一致が発生したブロック以降のみ再計算されます。
Q: プレフィックスキャッシングのメモリオーバーヘッドは?
キャッシュプール自体が GPU メモリを消費するため、キャッシュに割り当てるメモリと、同時バッチ処理に使えるメモリのトレードオフがあります。vLLM では --gpu-memory-utilization パラメータで全体のメモリ使用率を制御し、その中で動的にキャッシュとバッチ処理にメモリを配分します。
Q: 複数の異なるシステムプロンプトを同時にキャッシュできますか?
はい、各プレフィックスは独立したキャッシュエントリとして管理されるため、複数のシステムプロンプトを同時にキャッシュできます。ただし GPU メモリは有限なので、キャッシュエントリが増えると LRU eviction が発生し、使用頻度の低いプレフィックスから追い出されます。