プロンプトキャッシュの“よくあるミス”が必要以上に70%高くつかせる理由

Dev.to / 2026/4/30

💬 オピニオンDeveloper Stack & InfrastructureSignals & Early TrendsTools & Practical Usage

要点

  • この記事では、ClaudeやGPT-4oを使う多くのチームが、プロンプトをキャッシュ割引のために設計できておらず、その結果として必要以上にトークン単価が高くなっていると主張しています。
  • プロンプトキャッシュはプロンプト先頭の先頭バイト列をハッシュ照合する仕組みであり、日時やユーザー名、セッションIDなどの動的要素を先頭や途中に入れてしまうとキャッシュヒットせず、通常の“新規トークン”料金が適用されます。
  • 対策として推奨されるのは、キャッシュ可能なプレフィックスを静的に保ち、リクエストごとに変わる情報はユーザートーンやメッセージ配列の末尾(“テール”)に移すという、アーキテクチャ上の修正です。
  • 実運用例としてProjectDiscovery(Nucleiの開発)では、作業メモリやランタイムコンテキストをプレフィックスからメッセージ末尾へ移すことで、全体でLLMコストを59%削減し、直近10日では最大70%まで下げ、キャッシュヒット率を8%未満から74%に改善したと報告されています。
  • プロンプトが大きく、エージェントのステップ数やツール呼び出し回数が多い場合、小さなプロンプト構成の選択がコスト差として大きく積み上がる点を強調しています。

あなたの支払いを本来より70%多くしてしまう「プロンプトキャッシングのありがちなミス」

ここに具体的な主張があります。ClaudeまたはGPT-4oの上に構築しているほとんどのチームは、必要以上に、トークンあたり3〜10倍の金額を支払っているというのです。その理由はモデルの選定でもリクエスト量でもありません。原因は「プロンプトの作り方」です。

プロンプトキャッシングは、AnthropicのAPIでは2024年8月から、OpenAIでは2024年10月から利用可能になっています。経済性は微妙ではありません。Anthropicでは、キャッシュ読み取りのコストが「100万トークンあたり$0.30」で、新規トークンは「100万トークンあたり$3.00」、つまり90%の削減です。OpenAIの自動キャッシングはおおむね50%オフで動作します。もしアプリケーションが「数百トークン以上」のシステムプロンプトを送っている場合(そして、ほとんどは送っています)、その割引を取得できているか、できていないかのどちらかです。この2つの結果を分ける境界線は、ほとんどのチームが意図的に下したことのない、たった1つのアーキテクチャ上の判断にあります。

なぜ多くのアプリケーションは、実際には割引を取りきれないのか

プレフィックスキャッシングは、プロンプトの先頭のバイト列をハッシュ化して、保存されたバージョンと突き合わせることで機能します。先頭のバイト列が一致する場合、キャッシュ読み取り価格を支払います。一致しない場合は、通常料金を支払い、プロバイダが次回呼び出しに備えて新しいプレフィックスを保存します。

私が何度も見てきたミスは、チームがダイナミックなコンテンツをシステムプロンプトの先頭、あるいは途中に挿し込んでしまうことです。ユーザー名、セッションID、タイムスタンプ、現在の日付などを、です。これは小さなことのように見えます。「今日は2026年4月30日です。{user_name}を支援します…」のように、システムプロンプトが毎回その日付で始まるなら、そのプロンプトは完全にキャッシュ不可です。なぜなら、プレフィックスがリクエストごとに変わってしまうからです。ツール定義、ペルソナ、手順ごとの指示を丁寧にプロンプトエンジニアリングで書き込むために、あなたは15,000トークンを費やしたのに、それは一度も再利用されません。

解決策は微妙ではなく、アーキテクチャ上のものです。先頭には静的コンテンツ、末尾には動的コンテンツ。リクエストごとに変わるすべての要素は、ユーザートーン、またはメッセージ配列の末尾に入れるべきで、プレフィックスに入れてはいけません。

本番環境ではどのように見えるか

Nucleiの背後にあるセキュリティツール企業ProjectDiscoveryは、2025年初頭に詳細なポストモーテムを公開し、LLMコストを全体で59%削減する方法(測定期間の直近10日間のウィンドウでは70%に到達)を明らかにしました。彼らのエージェント型システムはClaudeで動いており、エージェントごとのシステムプロンプトは20,000トークンを超えます。平均的なタスクは26ステップで、40回のツール呼び出しを行います。この規模では、プロンプト構築のミスがそのまま悪い形で積み重なります。

彼らの当初のキャッシュヒット率は8%未満でした。彼らが「リロケーション(relocation)トリック」と呼ぶ手法──作業メモリと実行時のコンテキストを、キャッシュ可能なプレフィックスからメッセージ末尾へ移すこと──を導入すると、キャッシュヒット率は一夜で74%まで跳ね上がりました。ログの1ケースでは、あるタスクが入力トークン67.5百万トークンを処理し、キャッシュヒット率は91.8%だったと示されています。これは限界的な改善ではなく、まったく別のコスト構造です。

実装には、明示的なキャッシュ破断ポイントが3つ含まれていました。1つ目は、静的なシステムプロンプトの末尾で、ユーザー間で共有される1時間のTTLです。2つ目は、最後の静的ツール定義です。3つ目は、直近の会話履歴のスライディングウィンドウで、5分のTTLです。安定したテンプレート変数によって、システムプロンプト内の実値を置き換え、ユーザーが異なってもバイト列が同一になるプロンプトを維持しました。アーキテクチャ自体は複雑ではありませんが、プロンプトを「リクエスト時に毎回作り直す1本の文字列」としてではなく、「静的な背骨に動的な腕がつく構造」を持つものとして考える必要があります。

研究が裏付けること

Tsinghua大学とMicrosoftの研究者による2026年1月の論文「Don't Break the Cache」では、OpenAI、Anthropic、Googleにまたがって、マルチターンのベンチマークを用いた500のエージェントセッションを評価しました。10,000トークンのシステムプロンプトと、1セッションあたり最大50回のツール呼び出しを使用しています。測定されたコスト削減幅は、プロバイダと戦略に応じて41〜80%で、二次的な効果として「最初のトークンまでの時間(time-to-first-token)」が13〜31%改善したことも確認されています。

論文の中心的な発見は、ProjectDiscoveryが運用上で見つけたことと一致しています。フルコンテキストのキャッシングは逆説的にレイテンシを増やしうるのです。なぜなら、コンテキストの途中に現れる動的なツール結果がキャッシュエントリを無効化してしまうからです。すべてのプロバイダで勝ち筋となった戦略は、動的なコンテンツをプロンプトの末尾に置くこと。途中には置かないことでした。戦略的なキャッシュブロック配置──単にキャッシングを有効化するだけではなく──これが、キャッシュヒット率10%のチームと75%のチームを分けています。

まだこれを計測していない場合、何をすべきか

まずは今日、リクエストロギングにキャッシュヒット率を追加してください。AnthropicもOpenAIも、APIレスポンスでキャッシュ使用に関するメタデータを返します。Anthropicは、usageオブジェクト内でcache_creation_input_tokenscache_read_input_tokensを直接提供します。これらの項目を記録していないなら、すべての呼び出しでフル価格を支払っているかどうかを確認できません。つまり、ほぼ確実に支払っています。

計測を始めたら、システムプロンプトの構築を監査してください。リクエスト間で変わる項目(ユーザーID、現在の日付、セッション状態など)がないか探し、それを末尾へ移します。関数呼び出しを使っている場合は、ツール定義が静的で、動的なコンテンツより前に現れるようにしてください。マルチターンの履歴を持つエージェントシステムを構築しているなら、Anthropic上でキャッシュ破断ポイントを明示するか、メッセージ配列の最初の数ターンがセッション間で安定するように構造化してください。

数字は本当です。本番環境の規模──1日あたり数千万トークン──において、キャッシュヒット率8%と75%の差は、別会社の請求書のように見える月額コストになります。そこに到達するためのエンジニアリングは数時間の作業です。実際の勝因は、あなたがどのモデルを選んだかでは決してありません。

返却形式: {"translated": "翻訳されたHTML"}