◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/API & SDK
⬡ API & SDK/2026-06-23上級

Claude API のプロンプトキャッシュが本番で静かにヒットしなくなるとき — TTLと節約額の実測メモ

プロンプトキャッシュは導入直後だけ効いて、本番では知らぬ間にヒットしなくなることがあります。完全一致プレフィックスを静かに壊す5つの要因、5分と1時間TTLの選び方、節約額を推測でなく実測に変える計装、変更頻度の階段で置くブレークポイント設計までを運用目線でまとめました。

prompt-caching15cost-optimization28api39production87observability15

✦ プレミアム記事

プロンプトキャッシュを入れた初日のダッシュボードは、たいてい気持ちのいい数字になります。cache_read_input_tokens がきれいに伸び、入力コストがすっと下がる。問題はその次の週です。トラフィックの形が少し変わった、システムプロンプトに動的な値を一行混ぜた、デプロイでツール定義の順序が入れ替わった——どれも単独では些細なのに、キャッシュヒット率は静かに落ちていきます。しかも cache_read_input_tokens を毎回見ている人は少ないので、コストが元に戻っていることに月末の請求で気づく、ということが起こります。

私は Dolice Labs として4つの技術ブログを個人開発で回していて、その自動運用でこの機能をかなり酷使してきました。「効いていると思い込んでいたが、実は半分しかヒットしていなかった」という経験を何度かしています。本稿は機能の紹介ではなく、本番でヒット率を保つために何を監視し、どこで TTL を切り替え、節約額をどう実測するか、という運用の話です。

キャッシュが効く条件は「完全一致のプレフィックス」だけ

最初に押さえておきたいのは、プロンプトキャッシュが照合しているのは「意味の近さ」ではなく「バイト列としての完全一致するプレフィックス」だという点です。system・tools・messages を先頭から順に見ていき、キャッシュブレークポイントまでが一字一句同じなら、その区間がキャッシュ読み取り料金(通常入力の約10%)で処理されます。逆に言えば、先頭から数えて一文字でも違えば、そのブレークポイント以降はすべてキャッシュミスになります。

この「先頭一致」という性質が、本番でヒット率が落ちる原因のほとんどを説明します。プレフィックスのどこかに、リクエストごとに変わる値が紛れ込んでいるのです。

# ❌ ヒット率が出ない典型例:システムプロンプトに動的な値が混入
system = [
    {
        "type": "text",
        # 現在時刻を毎回埋め込むと、プレフィックスが毎回変わりキャッシュは絶対にヒットしない
        "text": f"あなたはサポートAIです。現在時刻は {datetime.now()} です。\n\n## ナレッジベース\n...",
        "cache_control": {"type": "ephemeral"},
    }
]
 
# ✅ 動的な値は messages 側(ブレークポイントより後ろ)へ追い出す
system = [
    {
        "type": "text",
        "text": "あなたはサポートAIです。\n\n## ナレッジベース\n...",  # 安定部分だけ
        "cache_control": {"type": "ephemeral"},
    }
]
messages = [
    {"role": "user", "content": f"(現在時刻: {datetime.now()})直近の障害状況を教えてください"},
]

タイムスタンプは分かりやすい例ですが、実際にはもっと気づきにくい形で混入します。ユーザー名やセッションIDをシステムプロンプトに差し込んでいる、A/Bテストでプロンプトを出し分けていて分岐がプレフィックスの先頭にある、ナレッジベースを動的に組み立てていて配列の順序が安定していない——こうしたものはコードを読んだだけでは「変わっている」と気づきにくく、ログを取って初めて見えてきます。

プレフィックスを静かに壊す5つの要因

これまで自分がはまった、あるいは原因調査で見つけた「プレフィックスを壊す要因」を整理しておきます。

要因何が起きるか気づきにくさ
動的な値の混入(時刻・ID・乱数)毎回ミス。キャッシュが一切効かない高
ツール定義の順序ゆらぎ辞書をループで組むと順序が変わりミス高
ナレッジベースの非決定的な連結set やdictの反復順序で末尾が変わる高
TTL切れ(無アクセス放置)5分超の間隔で毎回書き込みからやり直し中
モデル文字列やbetaヘッダーの差し替えキャッシュ名前空間が変わり再書き込み中

順序ゆらぎは特に厄介です。Python の辞書は挿入順を保つので問題は出にくいのですが、set から list を作る、複数のソースを dict でマージしてから JSON 化する、といった処理を挟むと、実行ごとに微妙に並びが変わることがあります。プレフィックスは「内容が同じ」では足りず「並びまで同じ」でなければならないので、キャッシュ対象を組み立てる箇所では明示的にソートしておくのが安全です。これは見落としやすい落とし穴で、明示的な並び替えを一行入れておくだけで回避できます。

# ツール定義・ナレッジ片など、キャッシュ対象を組み立てる箇所は順序を固定する
def build_cacheable_tools(tool_specs: dict[str, dict]) -> list[dict]:
    # キー順でソートして、実行のたびに同じ並びになることを保証する
    return [tool_specs[name] for name in sorted(tool_specs)]
✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦プレフィックスを静かに壊す5つの要因と、ログから崩れを検知する具体的な指標
✦5分TTLと1時間TTLをトラフィック間隔で選ぶ判断基準とコスト試算
✦「90%削減したはず」を推測でなく usage から実測する計装コード
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⬡ API & SDK2026-04-29
Claude API のセマンティックキャッシュを本番投入する — 類似プロンプト判定としきい値設計、汚染防止
類似プロンプトへの応答を再利用するセマンティックキャッシュをClaude APIの本番に組み込む設計を一気通貫で解説します。embeddingと類似度しきい値の決め方、マルチテナント分離、キャッシュ汚染を防ぐガード層、フォールバックと劣化モード、プロンプトキャッシュとの重ね方、効果を測る観測性の指標まで踏んだ地雷とともに紹介します。
⬡ API & SDK2026-04-26
Claude API のプロンプトキャッシュで月額コストを半分にした実装メモ
長文のシステムプロンプトを毎リクエスト送る本番ワークロードでは、プロンプトキャッシュの設計次第で月額コストが大きく変わります。ヒット率の計測から始める手順、TTLの選択、トークン下限と4ブロック上限、toolsを1つ足してヒット率が0になった失敗談に加え、ヒット率から入力コストを逆算する計算と損益分岐(5分TTLで約22%、1時間TTLで約53%)まで、半年の運用実例でまとめました。
⬡ API & SDK2026-04-23
Claude API の tool_choice で無駄な推論を減らす — 4モードの使い分けとコスト最適化パターン
Claude API の tool_choice パラメータは、ツール呼び出しの挙動とコストの両方を左右します。auto / any / tool / none の4モードを実運用で使い分けるパターンを、動くコードとともに整理します。