CLAUDE LABEN
VERSION — 8月10日に v2.1.227 が出ていました。新機能はなく、プラン判定と CI まわりの不具合修正が中心ですAUTO — 8月14日の既定化まで残り2日です。Pro・Max・Team で Claude Code の auto モードが既定で有効になりますCI — claude-code-action で allowed_non_write_users を指定すると GitHub ホストランナー上の Bash が全て失敗していた問題が直りましたBILLING — 期限切れトークンで開始したセッションが加入プランを取り違え、Max 利用者に使用クレジットの有効化を促していた不具合も解消していますSUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は8月17日で、残り5日ですPRICE — Sonnet 5 のプロモ価格 $2/$10 per Mtok は8月31日までで、9月1日から $3/$15 per Mtok になりますVERSION — 8月10日に v2.1.227 が出ていました。新機能はなく、プラン判定と CI まわりの不具合修正が中心ですAUTO — 8月14日の既定化まで残り2日です。Pro・Max・Team で Claude Code の auto モードが既定で有効になりますCI — claude-code-action で allowed_non_write_users を指定すると GitHub ホストランナー上の Bash が全て失敗していた問題が直りましたBILLING — 期限切れトークンで開始したセッションが加入プランを取り違え、Max 利用者に使用クレジットの有効化を促していた不具合も解消していますSUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は8月17日で、残り5日ですPRICE — Sonnet 5 のプロモ価格 $2/$10 per Mtok は8月31日までで、9月1日から $3/$15 per Mtok になります
記事一覧/API & SDK
API & SDK/2026-06-24上級

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

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

claude-api81prompt-caching13cache-control2scheduled-jobs2cost-optimization26

プレミアム記事

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-06-29
Claude API の Context Editing を入れたらエージェントが同じ調査を繰り返したとき — クリア境界とキャッシュ無効化を計測する運用メモ
Context Editing でツール結果を自動クリアしたら、エージェントが直前に読んだ内容を忘れて同じツールを呼び直し、キャッシュも毎回壊れてコストが上がった。沈黙する劣化を計測ログで切り分け、trigger・keep・clear_at_least を実測で決める運用メモです。
API & SDK2026-06-24
ツール定義を一行直しただけで、キャッシュが丸ごと作り直しになりました — cache_control ブレークポイントの置き場所
ヒット率が突然ゼロに張り付いた原因は、揮発するブロックを安定したブロックより上流に置いていたことでした。prefix キャッシュのカスケード失効の仕組みと、安定→揮発でブロックを並べ替え、4つしかない cache_control ブレークポイントをどこに置くかを実装と判断表で整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →