プロンプトキャッシング
プロンプトキャッシングは、プロンプト内の特定のプレフィックスから再開できるようにすることで、API使用を最適化する強力な機能です。このアプローチにより、繰り返しのタスクや一貫した要素を持つプロンプトの処理時間とコストが大幅に削減されます。
以下は、cache_control
ブロックを使用してMessages APIでプロンプトキャッシングを実装する例です:
この例では、「高慢と偏見」の全文がcache_control
パラメータを使用してキャッシュされています。これにより、この大きなテキストを複数のAPI呼び出しで再利用でき、毎回再処理する必要がなくなります。ユーザーメッセージのみを変更することで、キャッシュされたコンテンツを活用しながら本に関するさまざまな質問をすることができ、より速いレスポンスと効率性の向上につながります。
プロンプトキャッシングの仕組み
プロンプトキャッシングを有効にしてリクエストを送信すると:
- システムは、指定されたキャッシュブレークポイントまでのプロンプトプレフィックスが最近のクエリからすでにキャッシュされているかどうかを確認します。
- 見つかった場合、キャッシュされたバージョンを使用し、処理時間とコストを削減します。
- 見つからない場合、完全なプロンプトを処理し、レスポンスが開始されるとプレフィックスをキャッシュします。
これは特に以下の場合に役立ちます:
- 多くの例を含むプロンプト
- 大量のコンテキストや背景情報
- 一貫した指示を持つ繰り返しタスク
- 長いマルチターン会話
デフォルトでは、キャッシュの有効期間は5分です。キャッシュされたコンテンツが使用されるたびに、追加コストなしでキャッシュが更新されます。
プロンプトキャッシングはプレフィックス全体をキャッシュします
プロンプトキャッシングは、プロンプト全体 - tools
、system
、およびmessages
(この順序で)を、cache_control
で指定されたブロックまで含めて参照します。
価格設定
プロンプトキャッシングでは新しい価格体系が導入されています。以下の表は、サポートされている各モデルの100万トークンあたりの価格を示しています:
Model | Base Input Tokens | 5m Cache Writes | 1h Cache Writes | Cache Hits & Refreshes | Output Tokens |
---|---|---|---|---|---|
Claude Opus 4 | $15 / MTok | $18.75 / MTok | $30 / MTok | $1.50 / MTok | $75 / MTok |
Claude Sonnet 4 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
Claude Sonnet 3.7 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
Claude Sonnet 3.5 | $3 / MTok | $3.75 / MTok | $6 / MTok | $0.30 / MTok | $15 / MTok |
Claude Haiku 3.5 | $0.80 / MTok | $1 / MTok | $1.6 / MTok | $0.08 / MTok | $4 / MTok |
Claude Opus 3 | $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 |
注意:
- 5分間のキャッシュ書き込みトークンは、基本入力トークン価格の1.25倍
- 1時間のキャッシュ書き込みトークンは、基本入力トークン価格の2倍
- キャッシュ読み取りトークンは、基本入力トークン価格の0.1倍
- 通常の入力および出力トークンは標準料金で価格設定されています
プロンプトキャッシングの実装方法
サポートされているモデル
プロンプトキャッシングは現在、以下のモデルでサポートされています:
- Claude Opus 4
- Claude Sonnet 4
- Claude Sonnet 3.7
- Claude Sonnet 3.5
- Claude Haiku 3.5
- Claude Haiku 3
- Claude Opus 3
プロンプトの構造化
静的コンテンツ(ツール定義、システム指示、コンテキスト、例)をプロンプトの先頭に配置します。cache_control
パラメータを使用して、キャッシングのための再利用可能なコンテンツの終わりをマークします。
キャッシュプレフィックスは次の順序で作成されます:tools
、system
、そしてmessages
。
cache_control
パラメータを使用して、最大4つのキャッシュブレークポイントを定義でき、異なる再利用可能なセクションを別々にキャッシュすることができます。各ブレークポイントでは、システムは自動的に前の位置でのキャッシュヒットを確認し、見つかった場合は最も長い一致するプレフィックスを使用します。
キャッシュの制限
キャッシュ可能な最小プロンプト長は:
- Claude Opus 4、Claude Sonnet 4、Claude Sonnet 3.7、Claude Sonnet 3.5、Claude Opus 3では1024トークン
- Claude Haiku 3.5とClaude Haiku 3では2048トークン
これより短いプロンプトは、cache_control
でマークされていてもキャッシュできません。この数より少ないトークンをキャッシュするリクエストは、キャッシングなしで処理されます。プロンプトがキャッシュされたかどうかを確認するには、レスポンスの使用状況フィールドを参照してください。
同時リクエストの場合、キャッシュエントリは最初のレスポンスが開始された後にのみ利用可能になることに注意してください。並列リクエストのキャッシュヒットが必要な場合は、最初のレスポンスを待ってから後続のリクエストを送信してください。
現在、「ephemeral」はサポートされている唯一のキャッシュタイプであり、デフォルトでは5分間の有効期間があります。
キャッシュ可能なもの
リクエスト内のほとんどのブロックはcache_control
でキャッシング用に指定できます。これには以下が含まれます:
- ツール:
tools
配列内のツール定義 - システムメッセージ:
system
配列内のコンテンツブロック - テキストメッセージ:ユーザーとアシスタントの両方のターンの
messages.content
配列内のコンテンツブロック - 画像とドキュメント:ユーザーターンの
messages.content
配列内のコンテンツブロック - ツールの使用とツール結果:ユーザーとアシスタントの両方のターンの
messages.content
配列内のコンテンツブロック
これらの要素はそれぞれcache_control
でマークして、リクエストのその部分のキャッシングを有効にすることができます。
キャッシュできないもの
ほとんどのリクエストブロックはキャッシュできますが、いくつかの例外があります:
-
思考ブロックは
cache_control
で直接キャッシュすることはできません。ただし、思考ブロックは以前のアシスタントターンに表示されるとき、他のコンテンツと一緒にキャッシュすることができます。このようにキャッシュされると、キャッシュから読み取られるときに入力トークンとしてカウントされます。 -
サブコンテンツブロック(引用など)自体は直接キャッシュできません。代わりに、トップレベルのブロックをキャッシュします。
引用の場合、引用の参照元となるトップレベルのドキュメントコンテンツブロックをキャッシュできます。これにより、引用が参照するドキュメントをキャッシュすることで、引用を効果的にプロンプトキャッシングで使用できます。
-
空のテキストブロックはキャッシュできません。
キャッシュパフォーマンスの追跡
以下のAPIレスポンスフィールドを使用してキャッシュパフォーマンスを監視します。これらはレスポンスのusage
内(またはストリーミングの場合はmessage_start
イベント内)にあります:
cache_creation_input_tokens
:新しいエントリを作成する際にキャッシュに書き込まれたトークンの数。cache_read_input_tokens
:このリクエストのためにキャッシュから取得されたトークンの数。input_tokens
:キャッシュから読み取られたり、キャッシュの作成に使用されなかった入力トークンの数。
効果的なキャッシングのためのベストプラクティス
プロンプトキャッシングのパフォーマンスを最適化するには:
- システム指示、背景情報、大きなコンテキスト、または頻繁なツール定義など、安定した再利用可能なコンテンツをキャッシュします。
- 最高のパフォーマンスを得るために、キャッシュされたコンテンツをプロンプトの先頭に配置します。
- 異なるキャッシュ可能なプレフィックスセクションを分離するために、キャッシュブレークポイントを戦略的に使用します。
- キャッシュヒット率を定期的に分析し、必要に応じて戦略を調整します。
異なるユースケースの最適化
シナリオに合わせてプロンプトキャッシング戦略を調整します:
- 会話エージェント:特に長い指示やアップロードされたドキュメントを含む拡張会話のコストとレイテンシーを削減します。
- コーディングアシスタント:プロンプト内にコードベースの関連セクションまたは要約バージョンを保持することで、オートコンプリートとコードベースQ&Aを改善します。
- 大規模ドキュメント処理:レスポンスのレイテンシーを増加させることなく、画像を含む完全な長文形式の資料をプロンプトに組み込みます。
- 詳細な指示セット:Claudeのレスポンスを微調整するために、広範な指示、手順、および例のリストを共有します。開発者はしばしばプロンプトに1つか2つの例を含めますが、プロンプトキャッシングを使用すると、20以上の多様で高品質な回答の例を含めることでさらに良いパフォーマンスを得ることができます。
- エージェントツールの使用:各ステップが通常新しいAPI呼び出しを必要とする、複数のツール呼び出しと反復的なコード変更を含むシナリオのパフォーマンスを向上させます。
- 書籍、論文、ドキュメント、ポッドキャストの文字起こし、その他の長文形式のコンテンツとの対話:ドキュメント全体をプロンプトに埋め込み、ユーザーが質問できるようにすることで、あらゆる知識ベースを活性化させます。
一般的な問題のトラブルシューティング
予期しない動作が発生した場合:
- キャッシュされたセクションが同一であり、呼び出し間で同じ場所にcache_controlでマークされていることを確認します
- 呼び出しがキャッシュの有効期間内(デフォルトでは5分)に行われていることを確認します
- 呼び出し間で
tool_choice
と画像の使用が一貫していることを確認します - 少なくとも最小数のトークンをキャッシュしていることを確認します
- システムはキャッシュブレークポイント前の位置で以前にキャッシュされたコンテンツを使用しようとしますが、プロンプトの前の部分でのキャッシュルックアップを保証するために追加の
cache_control
パラメータを使用することができます。これは、非常に長いコンテンツブロックのリストを持つクエリに役立つ場合があります
プロンプトのどこかでのtool_choice
の変更や画像の有無の変更はキャッシュを無効にし、新しいキャッシュエントリを作成する必要があることに注意してください。
思考ブロックを使ったキャッシング
拡張思考をプロンプトキャッシングと一緒に使用する場合、思考ブロックには特別な動作があります:
他のコンテンツと一緒の自動キャッシング:思考ブロックはcache_control
で明示的にマークすることはできませんが、ツール結果を含む後続のAPI呼び出しを行うと、リクエストコンテンツの一部としてキャッシュされます。これは一般的に、ツールの使用中に思考ブロックを会話を続けるために戻す場合に発生します。
入力トークンのカウント:思考ブロックがキャッシュから読み取られると、使用状況メトリクスで入力トークンとしてカウントされます。これはコスト計算とトークン予算管理に重要です。
キャッシュ無効化パターン:
- ツール結果のみがユーザーメッセージとして提供される場合、キャッシュは有効なままです
- ツール結果以外のユーザーコンテンツが追加されると、キャッシュは無効になり、以前のすべての思考ブロックが削除されます
- このキャッシング動作は、明示的な
cache_control
マーカーがなくても発生します
ツール使用の例:
ツール結果以外のユーザーブロックが含まれると、それは新しいアシスタントループを指定し、以前のすべての思考ブロックはコンテキストから削除されます。
詳細については、拡張思考のドキュメントを参照してください。
キャッシュのストレージ共有
-
組織の分離:キャッシュは組織間で分離されています。異なる組織は、同一のプロンプトを使用していても、キャッシュを共有することはありません。
-
完全一致:キャッシュヒットには、cache controlでマークされたブロックまでのすべてのテキストと画像を含む、100%同一のプロンプトセグメントが必要です。
-
出力トークン生成:プロンプトキャッシングは出力トークン生成に影響を与えません。受け取るレスポンスは、プロンプトキャッシングが使用されていない場合と同じになります。
1時間キャッシュ期間(ベータ)
5分が短すぎると感じる場合、Anthropicは1時間のキャッシュ期間も提供しています。
拡張キャッシュを使用するには、リクエストにベータヘッダーとしてextended-cache-ttl-2025-04-11
を追加し、次のようにcache_control
定義にttl
を含めます:
レスポンスには次のような詳細なキャッシュ情報が含まれます:
現在のcache_creation_input_tokens
フィールドは、cache_creation
オブジェクト内の値の合計に等しいことに注意してください。
1時間キャッシュを使用するタイミング
定期的なケイデンスで使用されるプロンプト(つまり、5分ごとよりも頻繁に使用されるシステムプロンプト)がある場合は、引き続き5分キャッシュを使用してください。これは追加料金なしで更新され続けます。
1時間キャッシュは以下のシナリオで最適です:
- 5分よりも頻度が低いが、1時間ごとよりも頻繁に使用される可能性があるプロンプトがある場合。例えば、エージェント側のエージェントが5分以上かかる場合や、ユーザーとの長いチャット会話を保存していて、そのユーザーが次の5分以内に応答しない可能性がある場合など。
- レイテンシーが重要で、フォローアップのプロンプトが5分を超えて送信される可能性がある場合。
- キャッシュヒットはレート制限から差し引かれないため、レート制限の利用率を向上させたい場合。
5分と1時間のキャッシュはレイテンシーに関して同じように動作します。一般的に、長いドキュメントでは最初のトークンまでの時間が改善されます。
異なるTTLの混在
同じリクエスト内で1時間と5分の両方のキャッシュコントロールを使用できますが、重要な制約があります:より長いTTLを持つキャッシュエントリは、より短いTTLの前に表示する必要があります(つまり、1時間のキャッシュエントリは5分のキャッシュエントリの前に表示する必要があります)。
TTLを混在させる場合、プロンプト内の3つの課金位置を決定します:
- 位置
A
:最高のキャッシュヒット(またはヒットがない場合は0)でのトークン数。 - 位置
B
:A
の後の最高の1時間cache_control
ブロックでのトークン数(存在しない場合はA
に等しい)。 - 位置
C
:最後のcache_control
ブロックでのトークン数。
A
が最高のキャッシュヒットであるため、B
および/またはC
がA
より大きい場合、それらは必然的にキャッシュミスになります。
以下に対して課金されます:
A
のキャッシュ読み取りトークン。(B - A)
の1時間キャッシュ書き込みトークン。(C - B)
の5分キャッシュ書き込みトークン。
以下に3つの例を示します。これは3つのリクエストの入力トークンを示しており、それぞれ異なるキャッシュヒットとキャッシュミスがあります。それぞれ、色付きのボックスに示されているように、結果として異なる計算価格があります。
プロンプトキャッシングの例
プロンプトキャッシングを始めるのに役立つように、詳細な例とベストプラクティスを含むプロンプトキャッシングクックブックを用意しました。
以下に、さまざまなプロンプトキャッシングパターンを示すいくつかのコードスニペットを含めました。これらの例は、さまざまなシナリオでキャッシングを実装する方法を示し、この機能の実用的な応用を理解するのに役立ちます:
大規模コンテキストキャッシングの例
大規模コンテキストキャッシングの例
この例は基本的なプロンプトキャッシングの使用法を示しており、ユーザーの指示をキャッシュせずに、法的合意書の全文をプレフィックスとしてキャッシュしています。
最初のリクエストの場合:
input_tokens
:ユーザーメッセージのみのトークン数cache_creation_input_tokens
:法的文書を含むシステムメッセージ全体のトークン数cache_read_input_tokens
:0(最初のリクエストではキャッシュヒットなし)
キャッシュの有効期間内の後続のリクエストの場合:
input_tokens
:ユーザーメッセージのみのトークン数cache_creation_input_tokens
:0(新しいキャッシュ作成なし)cache_read_input_tokens
:キャッシュされたシステムメッセージ全体のトークン数
ツール定義のキャッシング
ツール定義のキャッシング
この例では、ツール定義のキャッシングを示しています。
cache_control
パラメータは最後のツール(get_time
)に配置され、すべてのツールを静的プレフィックスの一部として指定しています。
これは、get_weather
およびその他のget_time
の前に定義されたツールを含むすべてのツール定義が単一のプレフィックスとしてキャッシュされることを意味します。
このアプローチは、毎回再処理することなく複数のリクエストで再利用したい一貫したツールセットがある場合に役立ちます。
最初のリクエストの場合:
input_tokens
:ユーザーメッセージのトークン数cache_creation_input_tokens
:すべてのツール定義とシステムプロンプトのトークン数cache_read_input_tokens
:0(最初のリクエストではキャッシュヒットなし)
キャッシュの有効期間内の後続のリクエストの場合:
input_tokens
:ユーザーメッセージのトークン数cache_creation_input_tokens
:0(新しいキャッシュ作成なし)cache_read_input_tokens
:キャッシュされたすべてのツール定義とシステムプロンプトのトークン数
マルチターン会話の継続
マルチターン会話の継続
この例では、マルチターン会話でプロンプトキャッシングを使用する方法を示しています。
各ターンで、会話を段階的にキャッシュできるように、最後のメッセージの最後のブロックにcache_control
をマークします。システムは自動的に検索し、フォローアップメッセージの以前にキャッシュされた最長のプレフィックスを使用します。つまり、以前にcache_control
ブロックでマークされたブロックは、後でこれでマークされていなくても、5分以内にヒットした場合はキャッシュヒット(およびキャッシュの更新!)と見なされます。
さらに、cache_control
パラメータがシステムメッセージに配置されていることに注意してください。これは、キャッシュから削除された場合(5分以上使用されなかった場合)、次のリクエストでキャッシュに追加されるようにするためです。
このアプローチは、同じ情報を繰り返し処理することなく、進行中の会話でコンテキストを維持するのに役立ちます。
これが適切に設定されている場合、各リクエストの使用状況レスポンスで以下が表示されるはずです:
input_tokens
:新しいユーザーメッセージのトークン数(最小限になります)cache_creation_input_tokens
:新しいアシスタントとユーザーのターンのトークン数cache_read_input_tokens
:前のターンまでの会話のトークン数
FAQ
キャッシュの有効期間はどれくらいですか?
キャッシュの有効期間はどれくらいですか?
キャッシュの最小有効期間(TTL)は5分です。この有効期間は、キャッシュされたコンテンツが使用されるたびに更新されます。
いくつのキャッシュブレークポイントを使用できますか?
いくつのキャッシュブレークポイントを使用できますか?
プロンプト内で最大4つのキャッシュブレークポイント(cache_control
パラメータを使用)を定義できます。
プロンプトキャッシングはすべてのモデルで利用可能ですか?
プロンプトキャッシングはすべてのモデルで利用可能ですか?
いいえ、プロンプトキャッシングは現在、Claude Opus 4、Claude Sonnet 4、Claude Sonnet 3.7、Claude Sonnet 3.5、Claude Haiku 3.5、Claude Haiku 3、およびClaude Opus 3でのみ利用可能です。
プロンプトキャッシングは拡張思考とどのように連携しますか?
プロンプトキャッシングは拡張思考とどのように連携しますか?
キャッシュされたシステムプロンプトとツールは、思考パラメータが変更されても再利用されます。ただし、思考の変更(有効化/無効化または予算の変更)は、メッセージコンテンツを含む以前にキャッシュされたプロンプトプレフィックスを無効にします。
拡張思考に関する詳細情報(ツールの使用やプロンプトキャッシングとの相互作用を含む)については、拡張思考のドキュメントを参照してください。
プロンプトキャッシングを有効にするにはどうすればよいですか?
プロンプトキャッシングを有効にするにはどうすればよいですか?
プロンプトキャッシングを有効にするには、APIリクエストに少なくとも1つのcache_control
ブレークポイントを含めます。
プロンプトキャッシングを他のAPI機能と一緒に使用できますか?
プロンプトキャッシングを他のAPI機能と一緒に使用できますか?
はい、プロンプトキャッシングはツールの使用やビジョン機能などの他のAPI機能と一緒に使用できます。ただし、プロンプト内の画像の有無を変更したり、ツール使用設定を変更したりするとキャッシュが破壊されます。
プロンプトキャッシングは価格設定にどのように影響しますか?
プロンプトキャッシングは価格設定にどのように影響しますか?
プロンプトキャッシングでは、キャッシュ書き込みは基本入力トークンよりも25%高く、キャッシュヒットは基本入力トークン価格のわずか10%の費用がかかる新しい価格体系が導入されています。
キャッシュを手動でクリアできますか?
キャッシュを手動でクリアできますか?
現在、キャッシュを手動でクリアする方法はありません。キャッシュされたプレフィックスは、非アクティブ状態が最低5分続くと自動的に期限切れになります。
キャッシング戦略の効果をどのように追跡できますか?
キャッシング戦略の効果をどのように追跡できますか?
APIレスポンスのcache_creation_input_tokens
およびcache_read_input_tokens
フィールドを使用して、キャッシュのパフォーマンスを監視できます。
キャッシュを破壊する可能性があるものは何ですか?
キャッシュを破壊する可能性があるものは何ですか?
キャッシュを破壊する可能性がある変更には、コンテンツの変更、画像の有無の変更(プロンプトのどこでも)、およびtool_choice.type
の変更が含まれます。これらの変更のいずれかを行うと、新しいキャッシュエントリを作成する必要があります。
プロンプトキャッシングはプライバシーとデータ分離をどのように処理しますか?
プロンプトキャッシングはプライバシーとデータ分離をどのように処理しますか?
プロンプトキャッシングは、強力なプライバシーとデータ分離対策を備えて設計されています:
-
キャッシュキーは、キャッシュコントロールポイントまでのプロンプトの暗号化ハッシュを使用して生成されます。これは、同一のプロンプトを持つリクエストのみが特定のキャッシュにアクセスできることを意味します。
-
キャッシュは組織固有です。同じ組織内のユーザーは、同一のプロンプトを使用する場合、同じキャッシュにアクセスできますが、同一のプロンプトであっても、キャッシュは異なる組織間で共有されません。
-
キャッシングメカニズムは、各ユニークな会話やコンテキストの整合性とプライバシーを維持するように設計されています。
-
プロンプト内のどこでも
cache_control
を使用することは安全です。コスト効率を高めるには、高度に可変な部分(例:ユーザーの任意の入力)をキャッシングから除外する方が良いでしょう。
これらの対策により、プロンプトキャッシングはパフォーマンス上の利点を提供しながら、データのプライバシーとセキュリティを維持します。
Batches APIでプロンプトキャッシングを使用できますか?
Batches APIでプロンプトキャッシングを使用できますか?
はい、Batches APIリクエストでプロンプトキャッシングを使用することは可能です。ただし、非同期バッチリクエストは同時に任意の順序で処理される可能性があるため、キャッシュヒットはベストエフォートベースで提供されます。
1時間キャッシュはキャッシュヒットの改善に役立ちます。最もコスト効率の良い使用方法は次のとおりです:
- 共通のプレフィックスを持つメッセージリクエストのセットを収集します。
- この共通プレフィックスと1時間のキャッシュブロックを持つ単一のリクエストだけでバッチリクエストを送信します。これは1時間キャッシュに書き込まれます。
- これが完了したら、残りのリクエストを送信します。完了したことを知るためにジョブを監視する必要があります。
これは通常、バッチリクエストが5分から1時間の間に完了するのが一般的であるため、5分キャッシュを使用するよりも優れています。私たちはこれらのキャッシュヒット率を改善し、このプロセスをより簡単にする方法を検討しています。
Pythonで「AttributeError: 'Beta' object has no attribute 'prompt_caching'」というエラーが表示されるのはなぜですか?
Pythonで「AttributeError: 'Beta' object has no attribute 'prompt_caching'」というエラーが表示されるのはなぜですか?
このエラーは通常、SDKをアップグレードした場合や古いコード例を使用している場合に表示されます。プロンプトキャッシングは現在一般提供されているため、ベータプレフィックスは不要になりました。以下の代わりに:
単に以下を使用してください:
「TypeError: Cannot read properties of undefined (reading 'messages')」というエラーが表示されるのはなぜですか?
「TypeError: Cannot read properties of undefined (reading 'messages')」というエラーが表示されるのはなぜですか?
このエラーは通常、SDKをアップグレードした場合や古いコード例を使用している場合に表示されます。プロンプトキャッシングは現在一般提供されているため、ベータプレフィックスは不要になりました。以下の代わりに:
単に以下を使用してください: