プロンプトキャッシングは、プロンプト内の特定のプレフィックスからの再開を可能にすることで、API使用を最適化する強力な機能です。このアプローチにより、反復的なタスクや一貫した要素を持つプロンプトの処理時間とコストが大幅に削減されます。
以下は、cache_control ブロックを使用してMessages APIでプロンプトキャッシングを実装する方法の例です:
curl https://api.anthropic.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-6",
"max_tokens": 1024,
"system": [
{
"type": "text",
"text": "You are an AI assistant tasked with analyzing literary works. Your goal is to provide insightful commentary on themes, characters, and writing style.\n"
},
{
"type": "text",
"text": "<the entire contents of Pride and Prejudice>",
"cache_control": {"type": "ephemeral"}
}
],
"messages": [
{
"role": "user",
"content": "Analyze the major themes in Pride and Prejudice."
}
]
}'
# キャッシュチェックポイントまでの同じ入力でモデルを再度呼び出す
curl https://api.anthropic.com/v1/messages # rest of input{"cache_creation_input_tokens":188086,"cache_read_input_tokens":0,"input_tokens":21,"output_tokens":393}
{"cache_creation_input_tokens":0,"cache_read_input_tokens":188086,"input_tokens":21,"output_tokens":393}この例では、「高慢と偏見」の全文が cache_control パラメータを使用してキャッシュされています。これにより、この大きなテキストを毎回再処理することなく、複数のAPI呼び出しで再利用できます。ユーザーメッセージのみを変更することで、キャッシュされたコンテンツを活用しながら本についてさまざまな質問をすることができ、より高速な応答と効率の向上につながります。
プロンプトキャッシングを有効にしてリクエストを送信すると:
これは特に以下の場合に有用です:
デフォルトでは、キャッシュの有効期間は5分です。キャッシュされたコンテンツが使用されるたびに、追加コストなしでキャッシュが更新されます。
5分では短すぎる場合、Anthropicは追加コストで1時間のキャッシュ期間も提供しています。
詳細については、1時間キャッシュ期間を参照してください。
プロンプトキャッシングは完全なプレフィックスをキャッシュします
プロンプトキャッシングは、cache_control で指定されたブロックを含むまでの、tools、system、messages(この順序で)のプロンプト全体を参照します。
プロンプトキャッシングは新しい料金体系を導入しています。以下の表は、サポートされている各モデルの100万トークンあたりの価格を示しています:
| Model | Base Input Tokens | 5m Cache Writes | 1h Cache Writes | Cache Hits & Refreshes | Output Tokens |
|---|---|---|---|---|---|
| Claude Opus 4.6 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| Claude Opus 4.5 | $5 / MTok | $6.25 / MTok | $10 / MTok | $0.50 / MTok | $25 / MTok |
| Claude Opus 4.1 | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Opus 4 | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Sonnet 4.5 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Sonnet 4 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Sonnet 3.7 (deprecated) | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
| Claude Haiku 4.5 | $1 / MTok | $1.25 / MTok | $2 / MTok | $0.10 / MTok | $5 / MTok |
| Claude Haiku 3.5 | $0.80 / MTok | $1 / MTok | $1.6 / MTok | $0.08 / MTok | $4 / MTok |
| Claude Opus 3 (deprecated) | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
| Claude Haiku 3 | $0.25 / MTok | $0.30 / MTok | $0.50 / MTok | $0.03 / MTok | $1.25 / MTok |
上記の表は、プロンプトキャッシングの以下の料金乗数を反映しています:
これらの乗数は、Batch APIディスカウント、ロングコンテキスト料金、データレジデンシーなどの他の料金修正と累積されます。詳細については料金を参照してください。
プロンプトキャッシングは現在以下のモデルでサポートされています:
静的コンテンツ(ツール定義、システム指示、コンテキスト、例)をプロンプトの先頭に配置します。cache_control パラメータを使用して、再利用可能なコンテンツの終わりをキャッシング用にマークします。
キャッシュプレフィックスは次の順序で作成されます:tools、system、次に messages。この順序は、各レベルが前のレベルの上に構築される階層を形成します。
静的コンテンツの最後に1つのキャッシュブレークポイントを使用するだけで、システムは自動的にキャッシュされたブロックの最長一致シーケンスを見つけます。この仕組みを理解することで、キャッシング戦略を最適化できます。
3つの基本原則:
キャッシュキーは累積的:cache_control でブロックを明示的にキャッシュすると、キャッシュハッシュキーは会話内のすべての前のブロックを順次ハッシュすることで生成されます。つまり、各ブロックのキャッシュは、それ以前のすべてのコンテンツに依存します。
逆方向の順次チェック:システムは、明示的なブレークポイントから逆方向に作業し、各前のブロックを逆順にチェックすることでキャッシュヒットを確認します。これにより、可能な限り最長のキャッシュヒットが得られます。
20ブロックのルックバックウィンドウ:システムは、各明示的な cache_control ブレークポイントの前の最大20ブロックのみをチェックします。一致なしで20ブロックをチェックした後、チェックを停止し、次の明示的なブレークポイント(存在する場合)に移動します。
例:ルックバックウィンドウの理解
30のコンテンツブロックがある会話で、ブロック30にのみ cache_control を設定した場合を考えてみましょう:
前のブロックに変更なしでブロック31を送信した場合:システムはブロック30をチェック(一致!)。ブロック30でキャッシュヒットが得られ、ブロック31のみが処理される必要があります。
ブロック25を変更してブロック31を送信した場合:システムはブロック30 → 29 → 28... → 25(一致なし)→ 24(一致!)と逆方向にチェックします。ブロック24は変更されていないため、ブロック24でキャッシュヒットが得られ、ブロック25-30のみが再処理される必要があります。
ブロック5を変更してブロック31を送信した場合:システムはブロック30 → 29 → 28... → 11(チェック#20)と逆方向にチェックします。一致を見つけることなく20回チェックした後、チェックを停止します。ブロック5は20ブロックのウィンドウを超えているため、キャッシュヒットは発生せず、すべてのブロックが再処理される必要があります。ただし、ブロック5に明示的な cache_control ブレークポイントを設定していた場合、システムはそのブレークポイントからチェックを続行します:ブロック5(一致なし)→ ブロック4(一致!)。これにより、ブロック4でキャッシュヒットが可能になり、編集可能なコンテンツの前にブレークポイントを配置すべき理由を示しています。
重要なポイント:キャッシュヒットの可能性を最大化するために、常に会話の最後に明示的なキャッシュブレークポイントを設定してください。さらに、編集される可能性のあるコンテンツブロックの直前にブレークポイントを設定して、それらのセクションが独立してキャッシュされるようにしてください。
以下の場合、最大4つのキャッシュブレークポイントを定義できます:
重要な制限:キャッシュブレークポイントの前に20を超えるコンテンツブロックがあり、それらの20ブロックより前のコンテンツを変更した場合、そのコンテンツに近い追加の明示的なブレークポイントを追加しない限り、キャッシュヒットは得られません。
キャッシュ可能な最小プロンプト長は以下の通りです:
短いプロンプトは、cache_control でマークされていてもキャッシュできません。このトークン数未満をキャッシュするリクエストは、キャッシングなしで処理されます。プロンプトがキャッシュされたかどうかを確認するには、レスポンスのusageフィールドを参照してください。
並行リクエストの場合、キャッシュエントリは最初のレスポンスが開始された後にのみ利用可能になることに注意してください。並行リクエストでキャッシュヒットが必要な場合は、後続のリクエストを送信する前に最初のレスポンスを待ってください。
現在、「ephemeral」が唯一サポートされているキャッシュタイプで、デフォルトで5分の有効期間を持ちます。
キャッシュブレークポイント自体にはコストがかかりません。 課金されるのは以下のみです:
cache_control ブレークポイントを追加してもコストは増加しません。実際にキャッシュされ読み取られるコンテンツに基づいて同じ金額が課金されます。ブレークポイントは、どのセクションを独立してキャッシュできるかを制御するだけです。
リクエスト内のほとんどのブロックは、cache_control でキャッシング用に指定できます。これには以下が含まれます:
tools 配列内のツール定義system 配列内のコンテンツブロックmessages.content 配列内のコンテンツブロック(ユーザーターンとアシスタントターンの両方)messages.content 配列内のコンテンツブロック(ユーザーターン)messages.content 配列内のコンテンツブロック(ユーザーターンとアシスタントターンの両方)これらの各要素は、リクエストのその部分のキャッシングを有効にするために cache_control でマークできます。
ほとんどのリクエストブロックはキャッシュできますが、いくつかの例外があります:
思考ブロックは cache_control で直接キャッシュできません。ただし、思考ブロックは、以前のアシスタントターンに表示される場合、他のコンテンツと一緒にキャッシュできます。この方法でキャッシュされた場合、キャッシュから読み取られるときに入力トークンとしてカウントされます。
サブコンテンツブロック(引用など)自体は直接キャッシュできません。代わりに、トップレベルのブロックをキャッシュしてください。
引用の場合、引用のソース資料として機能するトップレベルのドキュメントコンテンツブロックをキャッシュできます。これにより、引用が参照するドキュメントをキャッシュすることで、引用とプロンプトキャッシングを効果的に使用できます。
空のテキストブロックはキャッシュできません。
キャッシュされたコンテンツの変更は、キャッシュの一部またはすべてを無効にする可能性があります。
プロンプトの構造化で説明したように、キャッシュは tools → system → messages の階層に従います。各レベルでの変更は、そのレベルとそれ以降のすべてのレベルを無効にします。
以下の表は、異なるタイプの変更によってキャッシュのどの部分が無効になるかを示しています。✘はキャッシュが無効になることを示し、✓はキャッシュが有効なままであることを示します。
| 変更内容 | ツールキャッシュ | システムキャッシュ | メッセージキャッシュ | 影響 |
|---|---|---|---|---|
| ツール定義 | ✘ | ✘ | ✘ | ツール定義(名前、説明、パラメータ)の変更はキャッシュ全体を無効にします |
| Web検索の切り替え | ✓ | ✘ | ✘ | Web検索の有効化/無効化はシステムプロンプトを変更します |
| 引用の切り替え | ✓ | ✘ | ✘ | 引用の有効化/無効化はシステムプロンプトを変更します |
| ツール選択 | ✓ | ✓ | ✘ | tool_choice パラメータの変更はメッセージブロックにのみ影響します |
| 画像 | ✓ | ✓ | ✘ | プロンプト内の任意の場所での画像の追加/削除はメッセージブロックに影響します |
| 思考パラメータ | ✓ | ✓ | ✘ | 拡張思考設定(有効化/無効化、バジェット)の変更はメッセージブロックに影響します |
| 拡張思考リクエストに渡される非ツール結果 | ✓ | ✓ | ✘ | 拡張思考が有効な状態で非ツール結果がリクエストに渡されると、以前にキャッシュされたすべての思考ブロックがコンテキストから削除され、それらの思考ブロックに続くコンテキスト内のメッセージがキャッシュから削除されます。詳細については、思考ブロックでのキャッシングを参照してください。 |
レスポンス内の usage(ストリーミングの場合は message_start イベント)にある以下のAPIレスポンスフィールドを使用してキャッシュパフォーマンスを監視します:
cache_creation_input_tokens:新しいエントリを作成する際にキャッシュに書き込まれたトークン数。cache_read_input_tokens:このリクエストのためにキャッシュから取得されたトークン数。input_tokens:キャッシュから読み取られなかった、またはキャッシュの作成に使用されなかった入力トークン数(つまり、最後のキャッシュブレークポイント以降のトークン)。トークンの内訳の理解
input_tokens フィールドは、リクエスト内の最後のキャッシュブレークポイントの後にあるトークンのみを表します。送信したすべての入力トークンではありません。
合計入力トークンを計算するには:
total_input_tokens = cache_read_input_tokens + cache_creation_input_tokens + input_tokens空間的な説明:
cache_read_input_tokens = ブレークポイント前のすでにキャッシュされたトークン(読み取り)cache_creation_input_tokens = ブレークポイント前の現在キャッシュされているトークン(書き込み)input_tokens = 最後のブレークポイント後のトークン(キャッシュ対象外)例: 100,000トークンのキャッシュされたコンテンツ(キャッシュから読み取り)、0トークンの新しくキャッシュされるコンテンツ、50トークンのユーザーメッセージ(キャッシュブレークポイント後)があるリクエストの場合:
cache_read_input_tokens:100,000cache_creation_input_tokens:0input_tokens:50これは、キャッシングを効果的に使用している場合、input_tokens は通常、合計入力よりもはるかに小さくなるため、コストとレート制限の両方を理解する上で重要です。
プロンプトキャッシングのパフォーマンスを最適化するには:
シナリオに合わせてプロンプトキャッシング戦略を調整します:
予期しない動作が発生した場合:
tool_choice と画像の使用が呼び出し間で一貫していることを確認しますcache_control パラメータが必要になる場合がありますtool_use コンテンツブロック内のキーが安定した順序を持っていることを確認します。一部の言語(例:Swift、Go)はJSON変換時にキーの順序をランダム化し、キャッシュを破壊しますtool_choice の変更やプロンプト内の任意の場所での画像の有無の変更は、キャッシュを無効にし、新しいキャッシュエントリの作成が必要になります。キャッシュの無効化の詳細については、キャッシュを無効にするものを参照してください。
拡張思考をプロンプトキャッシングと一緒に使用する場合、思考ブロックには特別な動作があります:
他のコンテンツと一緒の自動キャッシング:思考ブロックは cache_control で明示的にマークすることはできませんが、ツール結果を使用して後続のAPI呼び出しを行う際に、リクエストコンテンツの一部としてキャッシュされます。これは、会話を続行するために思考ブロックを返すツール使用時に一般的に発生します。
入力トークンのカウント:思考ブロックがキャッシュから読み取られると、使用量メトリクスで入力トークンとしてカウントされます。これはコスト計算とトークンバジェットにとって重要です。
キャッシュ無効化パターン:
cache_control マーカーがなくても発生しますキャッシュの無効化の詳細については、キャッシュを無効にするものを参照してください。
ツール使用の例:
Request 1: User: "What's the weather in Paris?"
Response: [thinking_block_1] + [tool_use block 1]
Request 2:
User: ["What's the weather in Paris?"],
Assistant: [thinking_block_1] + [tool_use block 1],
User: [tool_result_1, cache=True]
Response: [thinking_block_2] + [text block 2]
# Request 2はリクエストコンテンツをキャッシュします(レスポンスではありません)
# キャッシュには以下が含まれます:ユーザーメッセージ、thinking_block_1、tool_use block 1、tool_result_1
Request 3:
User: ["What's the weather in Paris?"],
Assistant: [thinking_block_1] + [tool_use block 1],
User: [tool_result_1, cache=True],
Assistant: [thinking_block_2] + [text block 2],
User: [Text response, cache=True]
# 非ツール結果のユーザーブロックにより、すべての思考ブロックが無視されます
# このリクエストは、思考ブロックが存在しなかったかのように処理されます非ツール結果のユーザーブロックが含まれると、新しいアシスタントループが指定され、以前のすべての思考ブロックがコンテキストから削除されます。
より詳細な情報については、拡張思考ドキュメントを参照してください。
2026年2月5日より、プロンプトキャッシングは組織レベルの分離ではなくワークスペースレベルの分離を使用します。キャッシュはワークスペースごとに分離され、同じ組織内のワークスペース間のデータ分離が確保されます。この変更はClaude APIとAzureに適用されます。Amazon BedrockとGoogle Vertex AIは組織レベルのキャッシュ分離を維持します。複数のワークスペースを使用している場合は、この変更を考慮してキャッシング戦略を見直してください。
組織の分離:キャッシュは組織間で分離されています。異なる組織は、同一のプロンプトを使用しても、キャッシュを共有することはありません。
完全一致:キャッシュヒットには、キャッシュコントロールでマークされたブロックを含むまでのすべてのテキストと画像を含む、100%同一のプロンプトセグメントが必要です。
出力トークンの生成:プロンプトキャッシングは出力トークンの生成に影響しません。受け取るレスポンスは、プロンプトキャッシングが使用されなかった場合に得られるものと同一です。
5分では短すぎる場合、Anthropicは追加コストで1時間のキャッシュ期間も提供しています。
拡張キャッシュを使用するには、cache_control 定義に ttl を含めます:
"cache_control": {
"type": "ephemeral",
"ttl": "5m" | "1h"
}レスポンスには以下のような詳細なキャッシュ情報が含まれます:
{
"usage": {
"input_tokens": ...,
"cache_read_input_tokens": ...,
"cache_creation_input_tokens": ...,
"output_tokens": ...,
"cache_creation": {
"ephemeral_5m_input_tokens": 456,
"ephemeral_1h_input_tokens": 100,
}
}
}現在の cache_creation_input_tokens フィールドは、cache_creation オブジェクト内の値の合計に等しいことに注意してください。
定期的な頻度で使用されるプロンプト(5分以上の頻度で使用されるシステムプロンプトなど)がある場合は、追加料金なしで更新され続ける5分キャッシュを引き続き使用してください。
1時間キャッシュは以下のシナリオで最適に使用されます:
5分キャッシュと1時間キャッシュは、レイテンシーに関して同じ動作をします。長いドキュメントでは一般的に最初のトークンまでの時間が改善されます。
同じリクエストで1時間と5分の両方のキャッシュコントロールを使用できますが、重要な制約があります:TTLが長いキャッシュエントリは、短いTTLの前に表示される必要があります(つまり、1時間のキャッシュエントリは5分のキャッシュエントリの前に表示される必要があります)。
TTLを混合する場合、プロンプト内の3つの課金位置を決定します:
A:最も高いキャッシュヒットのトークン数(ヒットがない場合は0)。B:A の後の最も高い1時間 cache_control ブロックのトークン数(存在しない場合は A と等しい)。C:最後の cache_control ブロックのトークン数。B および/または C が A より大きい場合、A が最も高いキャッシュヒットであるため、必然的にキャッシュミスになります。
課金される内容:
A のキャッシュ読み取りトークン。(B - A) の1時間キャッシュ書き込みトークン。(C - B) の5分キャッシュ書き込みトークン。以下に3つの例を示します。これは3つのリクエストの入力トークンを示しており、それぞれ異なるキャッシュヒットとキャッシュミスがあります。結果として、色付きのボックスに示されているように、それぞれ異なる計算された料金になります。
プロンプトキャッシュの使い方を理解していただくために、詳細な例とベストプラクティスを含むプロンプトキャッシュクックブックを用意しています。
以下に、さまざまなプロンプトキャッシュパターンを紹介するコードスニペットをいくつか掲載しています。これらの例は、さまざまなシナリオでキャッシュを実装する方法を示しており、この機能の実用的な活用方法を理解するのに役立ちます:
Was this page helpful?