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上級

毎朝のバッチでプロンプトキャッシュが毎回ミスしていた — 1時間TTLを延命するウォーミング間隔と損益分岐の出し方

数時間おきに走る定期実行では、1時間TTLのプロンプトキャッシュでも毎回コールドミスします。中身を変えずにTTLを延命するウォーミングの間隔をTTLから逆算し、読み取りコストを織り込んだ損益分岐を式で出す方法を、4サイトの自動生成パイプラインの実測とともにまとめました。

claude-api69prompt-caching9cache-control2scheduled-jobs2cost-optimization20

プレミアム記事

import { Callout } from '@/components/ui/callout';

プロンプトキャッシュのヒット率を上げる話はよく見かけますが、私がしばらく見落としていたのは「キャッシュの寿命と、ジョブが走る間隔がかみ合っていない」という、もっと手前の問題でした。Dolice Labs の4サイトに毎日記事を生成するパイプラインは、サイトごとに数時間ずつずらして走ります。前段に共通の参照データと方針プロンプトをまとめて1万トークン以上載せているので、ここをキャッシュできれば確実に効くはずでした。ところが請求の内訳を見ると、cache_read_input_tokens がほとんど立っていません。毎回まるごと書き直していたのです。

原因は単純で、実行と実行のあいだが1時間より長く空いていたからでした。1時間TTLを指定していても、6時間おきに走るジョブには届きません。同じプレフィックスを使っていても、TTLが切れたあとの実行は新規書き込みとして課金されます。ここから先で残すのは、その時間ギャップを埋める「ウォーミング」をどの間隔で打てばよいか、そしてそれが本当に割に合うのかを、私自身の手元の数値で式に落とした過程です。個人開発で複数のジョブを抱えていると、この手の「寿命と間隔のズレ」は地味に効いてきます。

ℹ️
前提として、`cache_control` の単価は通常入力を1.0倍とすると、5分TTLの書き込みが約1.25倍、1時間TTLの書き込みが約2.0倍、キャッシュ読み取りが約0.1倍です。本稿の試算はこの倍率を使います。実際の金額はモデルとリージョンで変わるため、必ず自分の請求で検算してください。

キャッシュの寿命と「実行間隔」がかみ合っていなかった

プロンプトキャッシュは、リクエストが既存のキャッシュにヒットするたびにTTLが延びます。逆に言えば、TTLの時間内に次のアクセスが来なければ、キャッシュは静かに消えます。ここが、対話型アプリと定期実行で性質が大きく違うところでした。

対話型のチャットは、ユーザーが連続して話しかけるので、数分おきにアクセスが来ます。5分TTLでも自然に延命され続けます。一方、私のパイプラインのような定期実行は、実行間隔そのものがTTLより長いと、毎回が初回扱いになります。整理すると、次のような対応関係になります。

実行パターン典型的な実行間隔5分TTL1時間TTL
対話型チャット数秒〜数分ほぼ常にヒット常にヒット
頻発バッチ(数分おき)1〜3分多くがヒット常にヒット
時報的バッチ(毎時)60分ほぼミス境界次第で半々
分散スケジュール数時間常にミス常にミス

私が踏んだのは表の最下段です。1時間TTLにすれば安心だと思い込んでいましたが、6時間おきのジョブには1時間の寿命では届きません。まずはこの「実行間隔 > TTL」という関係に気づくことが出発点でした。

まず実測する — 書き込みと読み取りの比を実行ログに残す

推測で対策を打つ前に、いま自分のジョブがどれだけ書き直しているかを数値で押さえます。usage には書き込みと読み取りのトークン数が分かれて入るので、毎回これをログに出すだけで実態が見えます。

import json
import time
 
def log_cache_usage(resp, job_name: str) -> dict:
    u = resp.usage
    created = getattr(u, "cache_creation_input_tokens", 0) or 0
    read = getattr(u, "cache_read_input_tokens", 0) or 0
    fresh = getattr(u, "input_tokens", 0) or 0
    total_prefix = created + read
    hit_rate = (read / total_prefix) if total_prefix else 0.0
    record = {
        "ts": time.time(),
        "job": job_name,
        "cache_creation": created,   # 書き込み(高い)
        "cache_read": read,          # 読み取り(安い)
        "uncached_input": fresh,
        "prefix_hit_rate": round(hit_rate, 3),
    }
    print(json.dumps(record, ensure_ascii=False))
    return record

prefix_hit_rate が連日ゼロに近いなら、キャッシュは一度も延命できていません。私の場合、4サイトの生成ログを1週間集計したところ、ヒット率は平均0.04でした。つまり載せていた1万トークンの前段は、ほぼ毎回まるごと書き込み課金されていたわけです。ここで初めて「これは寿命の問題だ」と腹落ちしました。

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

この記事の続きを読む

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

この記事で得られること
数時間おきの定期実行で、1時間TTLでも構造的にコールドミスが起きる理由を、実行間隔とTTLの時間ギャップから把握できます
中身を変えずにキャッシュのTTLを延命するウォーミングの最小間隔を、TTLから逆算する手順とコードが手に入ります
ウォーミングの読み取りコストを織り込んだ損益分岐を式で出し、ウォームすべきか・実行をまとめるべきかを判定する関数をそのまま使えます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API & SDK2026-05-29
Claude API のプロンプトキャッシュを 5m と 1h で二段に分ける — TTL を分けるとコストは下がり運用は安定する
Anthropic API の cache_control には 5 分と 1 時間という 2 種類の TTL があります。これを「静的な前提情報は 1h、可変な few-shot は 5m」と二段に分けて運用する設計を、私の本番ワークロードで観測した数値とともに整理しました。
API & SDK2026-04-28
Claude API のプロンプトキャッシュがヒットしない時の診断手順
Claude API のプロンプトキャッシュが効いていない時、まず確認すべきは usage フィールドです。cache_read_input_tokens がゼロのまま増えない原因を、5つの典型パターンに沿って切り分けます。
API & SDK2026-04-26
Claude API のプロンプトキャッシュで月額コストを半分にした実装メモ
Claude API のプロンプトキャッシュを正しく設計すると、長文プロンプトを使う本番ワークロードは月額コストが体感で半分以下になります。実例ベースで設計のコツとつまずきどころをまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →