← レッスンに戻る
第4章 · Claude API応用

Prompt Caching でコスト削減

Prompt Caching · 約 12 分

重要キーワード

English日本語説明
Prompt Caching プロンプトキャッシング 繰り返す入力部分の料金を割引する仕組み
cache_control キャッシュ制御 ブロックにキャッシュ対象であることを指示するフィールド
TTL 有効期限 キャッシュが保持される時間 (デフォルト 5 分)
cache hit rate ヒット率 キャッシュ読み出し / 全入力 の比率

Prompt Caching (プロンプトキャッシング)

長くて同じ内容を繰り返し送る場合、入力トークンを大幅に割引 できる仕組みです。 チャットボットの system prompt や RAG の参考資料、Tool 一覧などに最適。

キャッシュ可能な場所

使い方

res = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    system=[
        {"type": "text", "text": "あなたは社内ヘルプデスクです。"},
        {
            "type": "text",
            "text": "<長い社内ドキュメント (10,000 トークン)>",
            "cache_control": {"type": "ephemeral"},
        },
    ],
    messages=[{"role": "user", "content": "経費精算のやり方は?"}],
)

料金

TTL (有効期限)

デフォルトで 5 分。最後にアクセスされた時点で延長されます。 24 時間 TTL も指定可能 (料金は若干高い)。

"cache_control": {"type": "ephemeral", "ttl": "24h"}

設計のコツ

usage で確認

print(res.usage.cache_creation_input_tokens)   # 書き込み
print(res.usage.cache_read_input_tokens)        # 読み出し (キャッシュヒット)
print(res.usage.input_tokens)                   # それ以外の入力

Hit rate を測る

def hit_rate(usage) -> float:
    total = usage.cache_read_input_tokens + usage.cache_creation_input_tokens + usage.input_tokens
    return usage.cache_read_input_tokens / total if total else 0

60-80% 以上 を目標にしましょう。

4 ブレークポイント戦略

[system 共通プロンプト]              <- ブレークポイント 1 (永続)
[ガイドライン本文 (大きい)]            <- ブレークポイント 2
[直近 10 ターン履歴]                  <- ブレークポイント 3 (やや更新頻度高い)
[最新ターンの user]                  <- キャッシュなし

コスト削減シミュレーション

長い system (10K トークン) を 100 回呼ぶ場合: - キャッシュなし: 10K × 100 = 1M トークン入力課金 - キャッシュあり: 10K (1.25x 書き込み) + 10K × 0.1 × 99 (読み出し) ≒ 0.11M トークン課金 - → 約 89% コスト削減

試す: usage を Playground で観察

Playground でも cache_read_input_tokens の表示が可能です。同じ system を 2 回送ってみてください。

演習問題

演習 1: RAG の context にキャッシュを効かせる

FAQ 50 件 (約 10K トークン) を system に置き、ユーザー質問だけを user に渡す簡易 RAG を構築してください。 ユーザー質問を 5 回連続で送り、cache_creation_input_tokens / cache_read_input_tokens の推移を出力してください。 目標: 2 回目以降は cache_read が支配的になること。

スタータープロンプト:
Python で次の構造のスクリプトを書いてください:
1. ダミーの FAQ 50 件 (各 200 字程度) を文字列で用意
2. それを system に cache_control 付きで配置
3. user 入力を引数化して 5 回呼び出すループ
4. 各呼び出し後に usage の cache_read / cache_creation / input を表示
Anthropic SDK で claude-sonnet-4-6 を使用。
ヒントを見る

system は配列で渡し、最後のブロックに cache_control: {type: ephemeral} を付けます。usage は属性アクセス (例: res.usage.cache_read_input_tokens)。

理解度チェック

  1. Prompt Caching の最大の利点は?
    1. 入力コストが大幅に下がる
    2. 出力品質が上がる
    3. max_tokens が無制限に
    4. Vision が無料になる
  2. キャッシュヒット時の入力料金は通常の何倍?
    1. 1.0 倍
    2. 0.5 倍
    3. 0.1 倍
    4. 2.0 倍
  3. デフォルトのキャッシュ TTL は?
    1. 1 分
    2. 5 分
    3. 1 時間
    4. 24 時間
  4. キャッシュブレークポイントは最大いくつ設定できる?
    1. 1
    2. 2
    3. 4
    4. 無制限
解答と解説を見る
  1. A — キャッシュヒット時は約 90% の割引が効きます。
  2. C — 通常の 0.1 倍 (10%) になります。
  3. B — デフォルトは 5 分 (ephemeral)。アクセスごとに延長されます。
  4. C — 最大 4 つまでブレークポイントを置けます。