🚀 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": [...]
}

この方式にはいくつかの課題があった:

⚡ 自動キャッシュの仕組み

新しいAutomatic Cachingでは、リクエストのトップレベルcache_controlを1つ置くだけだ。システムが自動的に最後のキャッシュ可能ブロックにブレークポイントを適用する。

{
  "model": "claude-sonnet-4-20250514",
  "cache_control": {"type": "ephemeral"},
  "system": "あなたは親切なアシスタントです...",
  "messages": [
    {"role": "user", "content": "こんにちは"}
  ]
}

たったこれだけ。従来のように各ブロックに個別指定する必要はない。システムが以下を自動的に判断する:

💬 マルチターン会話での効果

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行追加するだけで自動的に最適なキャッシュが適用される。マルチターン会話でのコスト削減効果は特に大きく、プロダクション環境でのコスト管理が大きく改善されるはずだ。