🚀 AnthropicのPrompt Cachingが「自動」になった — キャッシュ設定がゼロ行に
はじめに
AnthropicのPrompt Cachingは、繰り返し送信するプロンプトをキャッシュすることでAPIコストを大幅に削減する機能だ。これまで使うには、各content blockにcache_controlを個別に指定する必要があった。しかし新しく追加されたAutomatic Cachingモードにより、リクエストのトップレベルに1行追加するだけでシステムが自動的に最適なキャッシュポイントを決定してくれるようになった。
📋 従来のPrompt Cachingの問題点
従来のPrompt Cachingでは、キャッシュのブレークポイントを開発者が手動で指定する必要があった。具体的には、システムプロンプトやツール定義などの各content blockにcache_controlを個別に設定しなければならなかった。
{
"model": "claude-sonnet-4-20250514",
"system": [
{
"type": "text",
"text": "あなたは親切なアシスタントです...",
"cache_control": {"type": "ephemeral"}
}
],
"tools": [
{
"name": "get_weather",
"cache_control": {"type": "ephemeral"},
"input_schema": {...}
}
],
"messages": [...]
}
この方式にはいくつかの課題があった:
- 設定が煩雑 — キャッシュしたい箇所ごとに
cache_controlを追加する必要がある - ブレークポイントの設計が必要 — どこにキャッシュを置くべきか開発者が判断しなければならない
- マルチターン会話での管理が困難 — 会話が進むにつれてキャッシュ戦略を見直す必要がある
- ミスがコストに直結 — 設定を間違えるとキャッシュが効かず、想定より高い請求になる
⚡ 自動キャッシュの仕組み
新しいAutomatic Cachingでは、リクエストのトップレベルにcache_controlを1つ置くだけだ。システムが自動的に最後のキャッシュ可能ブロックにブレークポイントを適用する。
{
"model": "claude-sonnet-4-20250514",
"cache_control": {"type": "ephemeral"},
"system": "あなたは親切なアシスタントです...",
"messages": [
{"role": "user", "content": "こんにちは"}
]
}
たったこれだけ。従来のように各ブロックに個別指定する必要はない。システムが以下を自動的に判断する:
- どのcontent blockをキャッシュ対象にするか
- ブレークポイントをどこに置くか
- 会話の成長に合わせてブレークポイントをどう移動させるか
💬 マルチターン会話での効果
Automatic Cachingの真価はマルチターン会話で発揮される。会話が長くなるにつれて、過去のメッセージ履歴が自動的にキャッシュされる。システムプロンプトやツール定義だけでなく、会話履歴全体がキャッシュ対象になるため、ターンを重ねるほどキャッシュヒット率が上がる。
会話が成長すると、自動ブレークポイントが前に移動し、新しいメッセージだけを都度処理する仕組みだ。これを開発者が手動で管理するのは非常に面倒だったが、自動モードなら意識する必要がない。
💰 コスト削減の具体例
Prompt Cachingがヒットした場合、キャッシュされた入力トークンの料金は通常の10%になる。つまり90%のコスト削減だ。
例えば、10,000トークンのシステムプロンプト+ツール定義を使うチャットボットを考えてみよう。1回あたり$0.03の入力コストがかかるとすると、キャッシュヒット時は$0.003になる。1日1,000リクエストなら、1日あたり$27の節約になる。
マルチターン会話では、会話が長くなるほど効果が大きい。50ターンの会話で、システムプロンプト5,000トークン+過去メッセージ累積20,000トークンがキャッシュされていれば、毎ターン25,000トークン分のコストを90%カットできる。
🐍 コード例(Python)
自動キャッシュ(推奨)
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
cache_control={"type": "ephemeral"}, # これ1行でOK
system="あなたは親切な日本語アシスタントです。",
messages=[
{"role": "user", "content": "Prompt Cachingについて教えて"}
]
)
print(response.content)
マルチターン会話での使用
import anthropic
client = anthropic.Anthropic()
messages = []
for user_input in ["こんにちは", "天気は?", "明日は?"]:
messages.append({"role": "user", "content": user_input})
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
cache_control={"type": "ephemeral"}, # 会話履歴が自動キャッシュされる
system="あなたは親切なアシスタントです。",
messages=messages
)
assistant_msg = response.content[0].text
messages.append({"role": "assistant", "content": assistant_msg})
print(f"User: {user_input}")
print(f"Assistant: {assistant_msg}\n")
curlでの自動キャッシュ
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-20250514",
"max_tokens": 1024,
"cache_control": {"type": "ephemeral"},
"system": "あなたは親切な日本語アシスタントです。",
"messages": [
{"role": "user", "content": "Prompt Cachingについて教えて"}
]
}'
🎯 いつ明示的キャッシュを使うべきか
Automatic Cachingはほとんどのユースケースで十分だが、以下のようなfine-grained制御が必要な場合は従来の明示的キャッシュ(各content blockにcache_controlを設定)を使うべきだ:
- 複数の独立したキャッシュ境界が必要な場合 — システムプロンプトとツール定義を別々にキャッシュ管理したい時
- 特定のブロックだけキャッシュから除外したい場合 — キャッシュ対象を精密に制御したい時
- キャッシュの有効期限をブロックごとに管理したい場合
明示的キャッシュは引き続き利用可能で、自動キャッシュと混在させることもできる。迷ったら自動キャッシュから始めて、パフォーマンスを計測しながら必要に応じて明示的キャッシュに切り替えるのがおすすめだ。
🔒 Zero Data Retention(ZDR)対応
Automatic CachingはZero Data Retention(ZDR)環境でも利用可能だ。ZDRが有効な場合でも、キャッシュの仕組み自体は動作する。データ保持ポリシーに準拠しながら、コスト削減の恩恵を受けられる。これはエンタープライズ用途や、厳格なコンプライアンス要件があるプロジェクトで特に重要だ。
まとめ
AnthropicのAutomatic Cachingは、Prompt Cachingの利用ハードルを大幅に下げる機能だ。これまでキャッシュの設計に頭を悩ませていた開発者は、cache_controlを1行追加するだけで自動的に最適なキャッシュが適用される。マルチターン会話でのコスト削減効果は特に大きく、プロダクション環境でのコスト管理が大きく改善されるはずだ。
- ✅ 設定は1行 —
"cache_control": {"type": "ephemeral"}をトップレベルに追加するだけ - ✅ マルチターン会話で自動的にキャッシュが効く
- ✅ キャッシュヒット時は入力コストの90%オフ
- ✅ ZDR環境でも利用可能
- ✅ fine-grained制御が必要な時は従来の明示的キャッシュも引き続き利用可能