プロンプトキャッシングは、プロンプト内の特定のプレフィックスから再開することで、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-sonnet-4-5",
"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."
}
]
}'
# Call the model again with the same inputs up to the cache checkpoint
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の順)を参照します。
プロンプトキャッシングは新しい価格体系を導入しています。以下の表は、サポートされている各モデルのトークンあたりの価格を示しています:
| Model | Base Input Tokens | 5m Cache Writes | 1h Cache Writes | Cache Hits & Refreshes | Output Tokens |
|---|---|---|---|---|---|
| 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 |
上記の表は、プロンプトキャッシングの以下の価格乗数を反映しています:
プロンプトキャッシングは現在以下でサポートされています:
静的コンテンツ(ツール定義、システム指示、コンテキスト、例)をプロンプトの最初に配置します。cache_controlパラメータを使用して、キャッシング用の再利用可能なコンテンツの終わりをマークします。
キャッシュプレフィックスは以下の順序で作成されます:tools、system、messages。この順序は、各レベルが前のレベルの上に構築される階層を形成します。
静的コンテンツの終わりに1つのキャッシュブレークポイントを使用でき、システムは自動的にキャッシュされたブロックの最長マッチングシーケンスを見つけます。これがどのように機能するかを理解することは、キャッシング戦略を最適化するのに役立ちます。
3つの核となる原則:
キャッシュキーは累積的です:cache_controlでブロックを明示的にキャッシュすると、キャッシュハッシュキーは会話内のすべての前のブロックを順序付けてハッシュすることで生成されます。これは、各ブロックのキャッシュがそれより前のすべてのコンテンツに依存することを意味します。
逆順シーケンシャルチェック:システムは明示的なブレークポイントから逆方向に作業して、各前のブロックを逆順でチェックすることで、キャッシュヒットをチェックします。これにより、可能な限り最長のキャッシュヒットが得られます。
20ブロックルックバックウィンドウ:システムは各明示的なcache_controlブレークポイントの前の最大20ブロックのみをチェックします。20ブロックをチェックしてもマッチが見つからない場合、チェックを停止し、次の明示的なブレークポイント(存在する場合)に移動します。
例:ルックバックウィンドウの理解
30個のコンテンツブロックを持つ会話を考えてください。ここで、cache_controlをブロック30にのみ設定します:
前のブロックに変更がなくブロック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個以上のコンテンツブロックを持ち、それより前のコンテンツを変更する場合、追加の明示的なブレークポイントをそのコンテンツに近い場所に追加しない限り、キャッシュヒットは得られません。
最小キャッシュ可能プロンプト長は:
より短いプロンプトは、cache_controlでマークされていても、キャッシュできません。このトークン数未満をキャッシュするリクエストは、キャッシングなしで処理されます。プロンプトがキャッシュされたかどうかを確認するには、応答使用フィールドを参照してください。
並行リクエストの場合、キャッシュエントリは最初の応答が開始された後にのみ利用可能になることに注意してください。並行リクエストのキャッシュヒットが必要な場合は、最初の応答を待ってから後続のリクエストを送信してください。
現在、「ephemeral」が唯一サポートされているキャッシュタイプであり、デフォルトでは5分の有効期限があります。
キャッシュブレークポイント自体はコストを追加しません。 以下の場合にのみ課金されます:
より多くのcache_controlブレークポイントを追加しても、コストは増加しません。実際にキャッシュされて読み取られるコンテンツに基づいて同じ金額を支払います。ブレークポイントは、どのセクションを独立してキャッシュできるかを制御するだけです。
リクエスト内のほとんどのブロックは、cache_controlでキャッシング用に指定できます。これには以下が含まれます:
tools配列内のツール定義system配列内のコンテンツブロックmessages.content配列内のコンテンツブロック(ユーターンとアシスタントターンの両方)messages.content配列内のコンテンツブロックmessages.content配列内のコンテンツブロック(ユーターンとアシスタントターンの両方)これらの各要素は、cache_controlでマークしてそのリクエスト部分のキャッシングを有効にできます。
ほとんどのリクエストブロックはキャッシュできますが、いくつかの例外があります:
シンキングブロックはcache_controlで直接キャッシュできません。ただし、シンキングブロックは前のアシスタントターンに表示される場合、他のコンテンツと一緒にキャッシュできます。この方法でキャッシュされると、キャッシュから読み取られるときに入力トークンとしてカウントされます。
サブコンテンツブロック(引用など)自体はcache_controlで直接キャッシュできません。代わりに、トップレベルのブロックをキャッシュしてください。
引用の場合、引用のソース資料として機能するトップレベルのドキュメントコンテンツブロックをキャッシュできます。これにより、引用をキャッシュするドキュメントをキャッシュすることで、プロンプトキャッシングを引用で効果的に使用できます。
空のテキストブロックはキャッシュできません。
キャッシュされたコンテンツへの変更は、キャッシュの一部またはすべてを無効にする可能性があります。
プロンプトの構造化で説明されているように、キャッシュは階層に従います:tools → system → messages。各レベルでの変更は、そのレベルとそれ以降のすべてのレベルを無効にします。
以下の表は、異なるタイプの変更によってキャッシュのどの部分が無効になるかを示しています。✘はキャッシュが無効になることを示し、✓はキャッシュが有効なままであることを示します。
| 変更内容 | ツールキャッシュ | システムキャッシュ | メッセージキャッシュ | 影響 |
|---|---|---|---|---|
| ツール定義 | ✘ | ✘ | ✘ | ツール定義(名前、説明、パラメータ)を変更すると、キャッシュ全体が無効になります |
| ウェブ検索トグル | ✓ | ✘ | ✘ | ウェブ検索を有効/無効にするとシステムプロンプトが変更されます |
| 引用トグル | ✓ | ✘ | ✘ | 引用を有効/無効にするとシステムプロンプトが変更されます |
| ツール選択 | ✓ | ✓ | ✘ | tool_choiceパラメータへの変更はメッセージブロックのみに影響します |
| 画像 | ✓ | ✓ | ✘ |
これらのAPI応答フィールドを使用してキャッシュパフォーマンスを監視します。応答内のusage内(またはストリーミングの場合はmessage_startイベント):
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プロンプトキャッシングパフォーマンスを最適化するには:
シナリオに合わせてプロンプトキャッシング戦略をカスタマイズします:
予期しない動作が発生している場合:
cache_controlでマークされていることを確認しますtool_choiceと画像の使用が呼び出し間で一貫していることを確認しますcache_controlパラメータが必要な場合がありますtool_useコンテンツブロック内のキーが安定した順序を持っていることを確認します。一部の言語(例:Swift、Go)はJSON変換中にキー順序をランダム化し、キャッシュを破壊しますtool_choiceへの変更またはプロンプト内のどこかに画像が存在/不在の場合、キャッシュが無効になり、新しいキャッシュエントリを作成する必要があります。キャッシュ無効化の詳細については、キャッシュを無効にするものを参照してください。
拡張シンキングをプロンプトキャッシングと一緒に使用する場合、シンキングブロックには特別な動作があります:
他のコンテンツと一緒に自動キャッシング:シンキングブロックはcache_controlで明示的にマークできませんが、後続のAPI呼び出しでツール結果を使用する場合、リクエストコンテンツの一部としてキャッシュされます。これは通常、ツール使用中にシンキングブロックを会話に戻して続行する場合に発生します。
入力トークンカウント:シンキングブロックがキャッシュから読み取られる場合、使用メトリクスの入力トークンとしてカウントされます。これはコスト計算とトークン予算設定に重要です。
キャッシュ無効化パターン:
cache_controlマーカーがなくても発生しますキャッシュ無効化の詳細については、キャッシュを無効にするものを参照してください。
ツール使用の例:
リクエスト1:ユーザー:「パリの天気は?」
応答:[thinking_block_1] + [tool_use block 1]
リクエスト2:
ユーザー:[「パリの天気は?」]、
アシスタント:[thinking_block_1] + [tool_use block 1]、
ユーザー:[tool_result_1、cache=True]
応答:[thinking_block_2] + [text block 2]
# リクエスト2はリクエストコンテンツをキャッシュします(応答ではなく)
# キャッシュには以下が含まれます:ユーザーメッセージ、thinking_block_1、tool_use block 1、tool_result_1
リクエスト3:
ユーザー:[「パリの天気は?」]、
アシスタント:[thinking_block_1] + [tool_use block 1]、
ユーザー:[tool_result_1、cache=True]、
アシスタント:[thinking_block_2] + [text block 2]、
ユーザー:[テキスト応答、cache=True]
# 非ツール結果ユーザーブロックは新しいアシスタントループを指定します
# すべての前のシンキングブロックが削除されます
# このリクエストは、シンキングブロックが存在しなかったかのように処理されます非ツール結果ユーザーブロックが含まれる場合、新しいアシスタントループを指定し、すべての前のシンキングブロックがコンテキストから削除されます。
詳細については、拡張シンキングドキュメントを参照してください。
組織の分離:キャッシュは組織間で分離されています。異なる組織は、同一のプロンプトを使用していても、キャッシュを共有することはありません。
完全一致:キャッシュヒットには、キャッシュコントロールでマークされたブロックまでを含む、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つのリクエストの入力トークンを示しており、各リクエストは異なるキャッシュヒットとキャッシュミスを持っています。各リクエストは、結果として異なる計算された価格を持ち、カラーボックスで表示されています。
プロンプトキャッシングを始めるのに役立つように、詳細な例とベストプラクティスを含むプロンプトキャッシングクックブックを用意しました。
以下に、様々なプロンプトキャッシングパターンを紹介するコードスニペットをいくつか含めました。これらの例は、異なるシナリオでキャッシングを実装する方法を示し、この機能の実用的な応用を理解するのに役立ちます。
| $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 |
| プロンプト内のどこかに画像を追加/削除するとメッセージブロックに影響します |
| シンキングパラメータ | ✓ | ✓ | ✘ | 拡張シンキング設定(有効/無効、予算)への変更はメッセージブロックに影響します |
| 拡張シンキングリクエストに渡される非ツール結果 | ✓ | ✓ | ✘ | 拡張シンキングが有効な場合、非ツール結果がリクエストで渡されると、以前にキャッシュされたすべてのシンキングブロックがコンテキストから削除され、それらのシンキングブロックに続くコンテキスト内のメッセージがキャッシュから削除されます。詳細については、シンキングブロックでのキャッシングを参照してください。 |
これは、キャッシングを効果的に使用する場合、input_tokensは通常、総入力よりはるかに小さいため、コストとレート制限の両方を理解するために重要です。