📚 はてなブックマーク新着レポート

Prompt Cachingを完全に理解してLLMコストを爆裂に下げる

🔗 元記事: https://zenn.dev/ubie_dev/articles/ade17afebabaa9
🔖 はてなブックマーク: https://b.hatena.ne.jp/ao41/20260826#bookmark-4779765826984598113
🕒 ブックマーク日時: 2026-08-25 15:03:09 (UTC) / 2026-08-27 00:03:09 (JST)
👥 はてブ数: 149ユーザー | タグ: あとで読む

📌 この記事、一言でいうと

Ubie(ユビー)のエンジニアによる、LLMプロバイダ各社のPrompt Caching(プロンプトキャッシュ)の仕組みと実践的な使い方の解説記事。キャッシュヒットで入力トークンコストが最大90%オフになる仕組みを、「どうプロンプトを設計すればキャッシュが効くか」を良い例・悪い例の図解付きで徹底解説。OpenAI / Gemini / Claudeそれぞれの実装差と料金差、さらにBigQueryで実際の会話ログからコスト削減率を試算するSQLまで紹介している、実務寄りのガチ記事。

📖 記事概要・背景

Ubieのモバイルアプリ(iOS / Android)では、身体の悩みを相談できる医療AIエージェントをtoC向けに提供している。toCでLLMプロダクトを提供する上でコスト最適化は重要な課題であり、その中核技術のひとつがPrompt Caching。まだ試していない場合は50%規模のコスト削減余地が眠っている可能性があるという。

💡 Prompt Cachingとは

⚠️ よくある勘違い
Prompt Cachingはあくまで「入力トークン」をキャッシュするだけで出力には無関係。「Aというプロンプトで毎回Bが出力される」ようになるものではなく、「Aというプロンプトの再利用が安く速くなる」だけ。一般的なアプリケーションのキャッシュ(レスポンスの再利用)とはメンタルモデルが異なるので注意。

🎯 キャッシュが効くコンテキスト設計(最重要ポイント)

Prompt Cachingは入力の「先頭一致」でキャッシュヒットする。つまり設計原則は「変化しにくいプロンプトを先頭に配置する」こと。

✅ 良い例①: 固定システムプロンプト

GOOD固定のシステムプロンプト + 毎回変わるユーザープロンプトの構成。2回目以降のリクエストでは先頭のシステムプロンプトが前回と一致するためキャッシュが効く。

✅ 良い例②: マルチターン会話

GOOD会話履歴を保持するマルチターン会話では、2回目以降は「前回までの入力(=会話履歴)」が先頭一致するためキャッシュがヒット。マルチターン会話はターンごとに履歴分の入力が増えて非線形にコストが増加するが、キャッシュで大幅圧縮できる。LLM出力を再帰的に入れ直すシナリオ(LLM-as-a-Judgeでフィードバックしてリトライ等)全般に有効。

❌ 悪い例: 動的なシステムプロンプト

BADシステムプロンプトに現在時刻などの動的値を埋め込むと、毎回システムプロンプトの中身が変わり先頭一致が崩れる。結果、その後の会話履歴部分までキャッシュが効かなくなる。マルチターン会話ではシステムプロンプトをセッション中に変更しないことが重要。

✅ 良い例③: 動的な入力はTool Useで

GOOD動的な値(リアルタイム時刻など)を埋め込みたい場合は、システムプロンプト直書きではなくツール実行で取得させる。ツール実行結果はプロンプトの後ろに積み上がるため、履歴のキャッシュを壊さずに動的な入力ができる。「いかに過去の履歴を破壊しないか」という視点でプロンプトを積み上げるのがコツ。

⚙️ プロバイダ別の実装方法とコスト

プロバイダ キャッシュ方式 条件・注意点 コスト
OpenAI 自動(デフォルトで有効) キャッシュ対象プロンプトが1024トークン超である必要。コード変更不要でただプロンプトを送るだけで効く 書き込み: 追加コストなし
ヒット時: 入力が90%オフ(gpt-5ファミリー)
Gemini 暗黙的キャッシュ(デフォルト有効)+ 明示的キャッシュ 暗黙的キャッシュは何度かリクエストしないと効かないことがあり、内部はブラックボックス。チューニングしたい場合は明示的キャッシュで事前にキャッシュ作成可能 暗黙的: 書き込み追加コストなし、ヒット時90%オフ(Gemini 2.5)
明示的: 保持期間に応じストレージコスト発生
Claude 手動(自動キャッシュなし) プロンプトの該当ブロックに cache_control: { type: "ephemeral" } を明示指定。指定ブロックより前がキャッシュ対象。デフォルトTTL 5分(設定で1時間) 書き込み: 通常の1.25倍
読み込み: 0.1倍
→ なんでもキャッシュすると逆に高くなる可能性あり

📝 実装メモ: 記事ではLangChain(@langchain/openai / @langchain/anthropic)でのTypeScript実装例が紹介されている。Claudeだけは自動キャッシュがないので cache_control の付け忘れに注意。

📊 コスト削減効果のシミュレーション方法

実際の会話ログ(session_id, input_token_size, output_token_size, created_at)が溜まっているテーブルに対して、BigQueryの分析クエリでキャッシュ導入時のコスト削減率を事前試算できる。クエリのロジックは次の通り:

  1. セッションごとにLLM呼び出しを時系列順に並べる(ROW_NUMBER
  2. LAG 関数で前回呼び出しとのトークン差分・日時差分を取得
  3. 前回との日時差がTTL(5分)以内ならキャッシュ有効と判定
  4. 初回・TTL切れ時は全量キャッシュ書き込み、TTL内なら差分のみ書き込み+前回分を読み込みとして計上
  5. キャッシュ書き込み1.25倍 / 読み込み0.1倍のコスト係数(Claude Haiku 4.5の価格を例に)で月次の削減額・削減率を集計

記事の結論: 「すでにログが取れている場合はサクッと試算できるので試してみてください。思ったより減ります」とのこと。

✨ まとめ・アクションアイテム

この記事は Ubie Tech Advent Calendar 2025 の記事。医療AIをtoCで提供するUbieならではの実務的なコスト最適化ノウハウが詰まった一冊。