CLAUDE LABEN
CONFERENCE — 年次開発者会議「Code w/ Claude」が6/22から開催。Claudeを作るチームと直接対話できる場が設けられましたLIMITS — Claude Codeのレート上限が倍増、OpusのAPI上限も引き上げ。安定して規模を出しやすくなりましたDESIGN — Claude Designが更新。デザインシステム整合・Claude Code同期強化・キャンバス直接編集に対応しましたSANDBOX — Claude Managed Agentsが自前サンドボックス+プライベートMCPサーバー接続に対応しましたMODEL — Claude Fable 5は100万トークン文脈・常時アダプティブ思考・128K出力を備えますLINEUP — 主力はOpus 4.8・Sonnet 4.6・Haiku 4.5。用途に応じて使い分けられますCONFERENCE — 年次開発者会議「Code w/ Claude」が6/22から開催。Claudeを作るチームと直接対話できる場が設けられましたLIMITS — Claude Codeのレート上限が倍増、OpusのAPI上限も引き上げ。安定して規模を出しやすくなりましたDESIGN — Claude Designが更新。デザインシステム整合・Claude Code同期強化・キャンバス直接編集に対応しましたSANDBOX — Claude Managed Agentsが自前サンドボックス+プライベートMCPサーバー接続に対応しましたMODEL — Claude Fable 5は100万トークン文脈・常時アダプティブ思考・128K出力を備えますLINEUP — 主力はOpus 4.8・Sonnet 4.6・Haiku 4.5。用途に応じて使い分けられます
記事一覧/API & SDK
API & SDK/2026-06-24上級

ツール定義を一行直しただけで、キャッシュが丸ごと作り直しになりました — cache_control ブレークポイントの置き場所

ヒット率が突然ゼロに張り付いた原因は、揮発するブロックを安定したブロックより上流に置いていたことでした。prefix キャッシュのカスケード失効の仕組みと、安定→揮発でブロックを並べ替え、4つしかない cache_control ブレークポイントをどこに置くかを実装と判断表で整理します。

claude-api71prompt-caching10cost-optimization21context-management4performance4

プレミアム記事

ある朝、個人開発で続けている Dolice Labs の4サイトの自動投稿パイプラインの API コストを見直していて手が止まりました。リクエスト本数も投入トークン数もほとんど変わっていないのに、cache_read_input_tokens がほぼゼロに張り付いていたのです。前週まではプレフィックスの大半がキャッシュから読まれていたはずでした。

直前にやった変更は一つだけ、思い当たりました。ツール定義の description を一行だけ手直ししていたのです。日本語の言い回しを整えただけのつもりでした。けれどその一行が、その下にぶら下がっていた system プロンプトも few-shot 例も、丸ごとキャッシュの作り直しに追い込んでいました。プロンプトキャッシュは「ブロック単位」で効くものではなく「先頭からの連続した一致(prefix)」で効くものだ、という当たり前の事実を、コストの数字で思い出させられた朝でした。

この記事は、その「カスケード失効」がなぜ起きるのか、そしてブロックの並び順とブレークポイントの置き場所をどう設計すれば、揮発する部分を直しても安定した部分のキャッシュが生き残るのかを、実装と判断表でまとめたものです。

prefix キャッシュは「ブロック」ではなく「先頭からの一致」で効く

prompt caching を理解するうえで一番誤解しやすいのが、ここだと感じています。cache_control を付けたブロックだけが独立してキャッシュされるわけではありません。実際には、リクエストの先頭から cache_control ブレークポイントまでの連続したプレフィックス全体が一つのキャッシュエントリになります。

リクエストは決まった順序で連結されます。toolssystemmessages の順です。キャッシュの照合は毎回この連結された列の先頭から行われ、「前回と完全に一致する最長のプレフィックス」までがキャッシュから読まれます。途中で一文字でも違えば、その地点から後ろは一致しなくなり、新しく書き直し(cache creation)になります。

私のケースで起きていたのはまさにこれでした。tools は最上流にあります。そのツール定義を一行直したことで、tools の途中で前回との一致が途切れ、その後ろに続く system も messages も「一致しないプレフィックス」になってしまったわけです。下流のブロックの中身は一切変えていないのに、上流が動いた瞬間に全部が巻き添えになる。これがカスケード失効です。

逆に言えば、揮発するものを下流に、安定したものを上流に置くだけで、この巻き添えはほとんど防げます。

usage の4つの数字を正しく読む

並べ替えの効果を判断するには、usage を正しく読めることが前提になります。私が毎回確認しているのは次の4つです。

フィールド意味おおまかな課金感
cache_creation_input_tokens新しくキャッシュに書き込んだトークン通常入力より割高(5分TTLで約1.25倍、1時間TTLで約2倍)
cache_read_input_tokensキャッシュから読めたトークン通常入力の約0.1倍と安い
input_tokensキャッシュ対象外の素の入力通常価格
output_tokens生成された出力出力価格

健全な状態では、2回目以降のリクエストで cache_read_input_tokens が大きく、cache_creation_input_tokens が小さい(変わった末尾だけ)はずです。私の障害時は逆で、毎回 cache_creation_input_tokens が膨らみ cache_read_input_tokens がほぼゼロでした。「creation が毎回出続けている」のは、上流のどこかが毎回変わっているサインだと考えて、まず疑うようにしています。

def cache_health(usage) -> dict:
    created = usage.cache_creation_input_tokens or 0
    read = usage.cache_read_input_tokens or 0
    fresh = usage.input_tokens or 0
    cacheable = created + read
    # キャッシュ可能だった分のうち、実際に読めた割合
    read_ratio = read / cacheable if cacheable else 0.0
    return {
        "read_ratio": round(read_ratio, 3),
        "created": created,
        "read": read,
        "uncached": fresh,
    }

read_ratio が 2回目以降も低いままなら、TTL 切れ(時間の問題)か、上流の揮発(並び順の問題)のどちらかです。本数を増やしても下がらず、間隔を詰めると改善するなら TTL 側。間隔に関係なく下がりっぱなしなら、並び順側を疑います。

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

この記事の続きを読む

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

この記事で得られること
上流のブロックが1つ変わると下流のキャッシュが全て失効する「カスケード失効」の仕組みを、usage の cache_creation_input_tokens と cache_read_input_tokens の読み方とあわせて把握できます
安定→揮発(tools → system → 大きな定数 → 動的参照 → 会話履歴)でブロックを並べ替え、最大4つのブレークポイントをどこに spend するかの判断表を持ち帰れます
並べ替え後にヒット率の回帰を検出する最小スクリプト(cache_read 比率の閾値監視)を、無人パイプラインに組み込める形で示します
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API & SDK2026-06-24
毎朝のバッチでプロンプトキャッシュが毎回ミスしていた — 1時間TTLを延命するウォーミング間隔と損益分岐の出し方
数時間おきに走る定期実行では、1時間TTLのプロンプトキャッシュでも毎回コールドミスします。中身を変えずにTTLを延命するウォーミングの間隔をTTLから逆算し、読み取りコストを織り込んだ損益分岐を式で出す方法を、4サイトの自動生成パイプラインの実測とともにまとめました。
API & SDK2026-06-21
検索結果を二度運ばない — response_inclusion で消費済みブロックを応答から外す設計
dynamic filtering を有効にしたエージェントで出力トークンが膨らむ原因は、code execution が消費し終えた検索結果ブロックが応答に二重で乗ることにあります。response_inclusion を excluded にして安全に外せる条件と、full を保つべき条件を実装と判断表で整理しました。
API & SDK2026-05-29
Claude API のプロンプトキャッシュを 5m と 1h で二段に分ける — TTL を分けるとコストは下がり運用は安定する
Anthropic API の cache_control には 5 分と 1 時間という 2 種類の TTL があります。これを「静的な前提情報は 1h、可変な few-shot は 5m」と二段に分けて運用する設計を、私の本番ワークロードで観測した数値とともに整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →