LLM コンテキストキャッシング(エルエルエム コンテキストキャッシング)
LLM API で同一のシステムプロンプトやプレフィックスを繰り返し送信する際に、サーバー側で処理済みの中間状態をキャッシュして再利用する技術。レイテンシとコストを大幅に削減する。
LLM コンテキストキャッシングとは
LLM コンテキストキャッシングは、大規模言語モデルの推論時に、同一のプロンプトプレフィックス(システムプロンプト、Few-shot 例、長文ドキュメントなど)を繰り返し処理する無駄を排除する最適化技術です。初回リクエストで計算した KV キャッシュ(Key-Value キャッシュ)をサーバー側に保持し、後続のリクエストでは保持済みのキャッシュから推論を再開することで、Prefill(入力トークンの処理)フェーズを大幅にスキップできます。
なぜコンテキストキャッシングが重要か
LLM の推論コストは、入力トークン数に比例する Prefill コストと、出力トークン数に比例する Decode コストで構成されます。長大なシステムプロンプト(数千〜数万トークン)を毎回処理すると、Prefill だけで大きなレイテンシとコストが発生します。
| シナリオ | 入力トークン | キャッシュなし | キャッシュあり | 削減率 |
|---|---|---|---|---|
| RAG + 長文ドキュメント | 50,000 | 5.0 秒 | 0.8 秒 | 84% |
| Few-shot 20例 | 15,000 | 1.5 秒 | 0.3 秒 | 80% |
| コード生成 + リポ全体 | 100,000 | 10.0 秒 | 1.5 秒 | 85% |
| チャットボット定型プロンプト | 3,000 | 0.3 秒 | 0.05 秒 | 83% |
主要プロバイダの実装
Anthropic Prompt Caching
Anthropic は 2024 年 8 月に Claude 向けの Prompt Caching を導入しました。cache_control パラメータでキャッシュブレークポイントを指定し、そのポイントまでの入力を最大 5 分間キャッシュします。
キャッシュヒット時の入力トークン料金は通常の 10% に割引されます。キャッシュ書き込み時は通常の 125% の料金がかかりますが、2 回目以降のヒットで元が取れる設計です。最小キャッシュサイズは 1,024 トークン(Claude 3.5 Sonnet)または 2,048 トークン(Claude 3 Opus)です。
Google Gemini Context Caching
Google は Gemini API で Context Caching 機能を提供しています。cachedContent リソースを作成し、TTL(Time To Live)を指定してキャッシュを管理します。デフォルト TTL は 1 時間で、最大 24 時間まで延長可能です。
キャッシュされたトークンの料金は通常の入力トークン料金の 25% です。ただし、キャッシュの保持自体にストレージ料金(1 時間あたり $1.00 / 100万トークン)が発生するため、利用頻度が低い場合はコスト増になる可能性があります。
OpenAI Prompt Caching
OpenAI は 2024 年 10 月に自動的な Prompt Caching を導入しました。API リクエストのプレフィックスが 1,024 トークン以上で一致する場合、自動的にキャッシュが適用されます。明示的なキャッシュ制御パラメータはなく、完全にサーバー側で透過的に処理されます。
キャッシュヒット時の入力トークン料金は通常の 50% です。キャッシュの有効期限は非公開ですが、5〜10 分程度と推定されています。
コスト最適化のベストプラクティス
プロンプト構造の最適化: キャッシュ効率を最大化するため、変化しない部分(システムプロンプト、Few-shot 例)をプロンプトの先頭に配置し、リクエストごとに変化する部分(ユーザー入力)を末尾に配置します。
バッチリクエスト: 同一プレフィックスを使う複数のリクエストを短時間に集中させることで、キャッシュヒット率を高めます。キャッシュ TTL 内(通常 5〜60 分)にリクエストを発行できるようスケジューリングします。
キャッシュサイズの閾値意識: プロバイダごとに最小キャッシュサイズが異なります。Anthropic は 1,024 トークン、OpenAI は 1,024 トークンが閾値です。これを下回るプレフィックスではキャッシュが効かないため、短すぎるシステムプロンプトには効果がありません。
コスト試算: キャッシュ書き込みコスト × 1 回 + キャッシュヒットコスト × (N-1) 回 < 通常コスト × N 回 が成り立つ N を計算します。多くの場合 N=2(2 回目のリクエスト)で損益分岐点を超えます。
FAQ
Q: プロンプトを少しでも変更するとキャッシュは無効になりますか?
キャッシュはプレフィックスマッチで動作するため、プロンプトの先頭部分が一致していればキャッシュヒットします。末尾のユーザー入力を変更してもキャッシュは有効です。ただし、システムプロンプトの途中を変更すると、その位置以降のキャッシュは無効になります。
Q: コンテキストキャッシングはマルチターン会話で使えますか?
はい、特に効果的です。マルチターン会話では会話履歴が蓄積されるため、前回までのターンがキャッシュされていれば、新しいターンの追加分だけを Prefill すれば済みます。Anthropic ではベータ機能として会話ターンのキャッシュをサポートしています。
Q: キャッシュはリージョンをまたいで共有されますか?
通常は共有されません。キャッシュは同一リージョン・同一クラスタ内でのみ有効です。グローバルに展開するアプリケーションでは、各リージョンで個別にキャッシュが構築されるため、リージョンごとにウォームアップが必要です。