GEMINI LABEN
NANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定ですNANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定です
記事一覧/API / SDK
API / SDK/2026-04-19上級

Gemini API キャッシュ戦略の運用ノート — Context Caching と Implicit Caching を本番で組み合わせて月額費用を抑える

Context Caching と Implicit Caching を個人開発アプリの本番運用で組み合わせた実装メモ。動くコード・実測コスト・運用で気づいた7つの落とし穴を、AdMob 連携アプリの文脈で整理しています。

gemini-api279caching2cost-optimization21python103production105

プレミアム記事

アーティスト・クリエイターの廣川政樹(@dolice)です。2014 年から個人で iPhone / Android アプリを作り、累計 5,000 万 DL の壁紙・癒し・引き寄せ系アプリ群を運営しています。広告収益は主に AdMob で、月単位の API 費用は売上から直接引かれる経費です。だから「Gemini API の月額費用」というテーマは、私にとっては書類上の最適化ではなく、夕食の予算を決めるのと同じ重さで向き合うものになっています。

きっかけはささやかなものでした。壁紙アプリに「画像の雰囲気から短い詩を生成する」機能を入れた最初の月、Cloud Billing のメールに $412 と書かれていて、AdMob の月次レポートを開きながら少し息を止めました。広告収益は黒字でしたが、Gemini に支払う API 費用が想定の 3 倍になっていて、原因の大半はシステムプロンプトとガイドラインを毎リクエストで送っていたことでした。Context Caching と Implicit Caching を真剣に学び始めたのはそこからです。

ここでは、その後 6 ヶ月の本番運用で身についた「キャッシュをコスト削減装置として動かす」設計を、動くコードと実測値で整理します。1997 年にインターネットで独学を始めたころから「コードは静かに費用と時間を節約してくれる道具だ」と思ってきましたが、Gemini API のキャッシュもまさにその系譜にある仕組みだと感じています。

Gemini API の料金構造とキャッシュが効く理由

まず、なぜキャッシュがこれほど重要なのかを理解するために、Gemini API の料金構造を整理します。

料金は大きく「入力トークン」「出力トークン」「キャッシュ保存料」の3種類に分かれています。注目すべきは、入力トークンは毎回のリクエストで課金されるという点です。

たとえば、10,000 トークンのシステムプロンプトを持つカスタマーサポートボットが 1 日 1,000 回のリクエストを受ける場合、システムプロンプトだけで 1 日 1,000 万トークンが課金対象になります。1 ヶ月では 3 億トークン。これが gemini-2.5-pro の料金(〜200K トークンで $1.25 / 100 万)で計算すると、システムプロンプト分だけで月 $375 ほどかかる計算になります。

ここにキャッシュを適用すると話が変わります。

  • Context Caching: 大きなコンテンツを事前にキャッシュし、後続リクエストでそのキャッシュを参照します。キャッシュされたトークンはフル料金の約 75% 割引で請求されます
  • Implicit Caching: 同じプロンプトプレフィックスが繰り返されると、自動的に割引料金が適用されます(gemini-2.0-flash 以降対応)

この 2 つを使い分けること、そして組み合わせることが、API 費用を根本から削減するカギです。

キャッシュが特に効果的なコンテンツ

どんなコンテンツでもキャッシュが効くわけではありません。効果が大きいのは「繰り返し使われる固定コンテキスト」です:

  • 長いシステムプロンプト(5,000 トークン超の仕様書・指示書)
  • 大きなドキュメント(製品マニュアル、API 仕様書、法律文書)
  • 画像・動画ファイル(マルチモーダルな参照コンテキスト)
  • コードベース全体(コードレビューや質問応答に使う参照コード)

逆に、毎回内容が変わるユーザーメッセージ部分はキャッシュの対象になりません。この「固定部分」と「変動部分」を意識してプロンプトを設計することが、キャッシュ効率を最大化する第一歩です。

私の壁紙アプリの場合は、「アプリの世界観・トーン・禁則語リスト・出力フォーマット指示」を合わせて約 12,400 トークンの固定コンテキストにまとめてあります。これがキャッシュ側、ユーザーメッセージとして送るのは「画像の特徴量と数行の指示」だけ。この設計に切り替えてから、後述の通り月額費用が $281 → $96 まで下がりました。

詳細なコスト最適化の考え方については、Gemini API コスト最適化完全ガイドも参考になります。

Context Caching の仕組みと実装

Context Caching は、コンテンツを明示的にキャッシュする API です。一度キャッシュを作成して ID を取得し、後続のリクエストでその ID を参照することで割引料金が適用されます。

Context Caching が使える条件(まずここを確認)

Context Caching にはいくつかの制限があります。実装前に必ず確認してください:

  • 最小トークン数: キャッシュするコンテンツが一定数以上のトークンを持つこと(gemini-2.5-pro の場合は 2,048 トークン以上)
  • 対応モデル: すべてのモデルが対応しているわけではありません。gemini-2.0-flashgemini-2.5-progemini-2.5-flash などが対応
  • キャッシュの有効期限: デフォルトは 1 時間。最大 24 時間まで延長可能

「最小トークン数」の条件は見落としがちで、これを知らないまま短いプロンプトをキャッシュしようとすると BadRequestError が返ります。

Context Cache の作成(基本実装)

以下は、長いシステムプロンプトをキャッシュする基本的な実装です。

import google.generativeai as genai
from google.generativeai import caching
import datetime
import time
 
# APIキーの設定(実際は Environment Variable から取得)
genai.configure(api_key="YOUR_GEMINI_API_KEY")
 
# キャッシュするコンテンツ(長いシステムプロンプトの例)
SYSTEM_DOCUMENT = """
あなたは高度なカスタマーサポート AI です。以下のルールと知識ベースに基づいて回答してください。
 
[製品ドキュメント: 10,000 文字以上の詳細な仕様書]
--- 製品仕様 ---
製品名: ExampleApp Pro
バージョン: 3.2.1
... (長い内容が続く) ...
"""  # 実際には 2,048 トークン以上になるコンテンツを使用
 
def create_cache() -> caching.CachedContent:
    """Context Cache を作成し、キャッシュオブジェクトを返す"""
    try:
        cached_content = caching.CachedContent.create(
            model="models/gemini-2.5-pro",
            display_name="customer-support-system-prompt",  # 後で検索しやすい名前を付ける
            system_instruction=SYSTEM_DOCUMENT,
            ttl=datetime.timedelta(hours=12),  # 12 時間キャッシュを保持
        )
        print(f"✅ キャッシュ作成成功: {cached_content.name}")
        print(f"   有効期限: {cached_content.expire_time}")
        print(f"   使用トークン数: {cached_content.usage_metadata.total_token_count}")
        return cached_content
    except Exception as e:
        print(f"❌ キャッシュ作成失敗: {e}")
        raise
 
def chat_with_cache(cached_content: caching.CachedContent, user_message: str) -> str:
    """キャッシュを参照しながらチャットリクエストを送信する"""
    try:
        # キャッシュからモデルを作成(これが Context Caching を有効にするポイント)
        model = genai.GenerativeModel.from_cached_content(cached_content)
        response = model.generate_content(user_message)
 
        # 使用トークン数を確認(キャッシュが効いているかここで検証)
        usage = response.usage_metadata
        print(f"   キャッシュトークン: {usage.cached_content_token_count}")
        print(f"   入力トークン(合計): {usage.prompt_token_count}")
        print(f"   出力トークン: {usage.candidates_token_count}")
 
        return response.text
    except Exception as e:
        print(f"❌ リクエスト失敗: {e}")
        raise
 
# 使用例
if __name__ == "__main__":
    # キャッシュを 1 回だけ作成
    cache = create_cache()
 
    # 同じキャッシュを複数のリクエストで再利用(ここでコスト削減)
    questions = [
        "返品ポリシーを教えてください",
        "製品の保証期間はどれくらいですか?",
        "サポートの営業時間を教えてください",
    ]
 
    for question in questions:
        print(f"\n{question}")
        answer = chat_with_cache(cache, question)
        print(f"💬 {answer[:100]}...")
        time.sleep(1)  # レート制限対策

このコードで特に注目してほしいのは、response.usage_metadata.cached_content_token_count を確認している部分です。この値が 0 の場合はキャッシュが参照されていないため、設定に問題がある可能性があります。本番環境では必ずこの値をモニタリングしてください。

Context Cache の管理(一覧・更新・削除)

本番環境ではキャッシュのライフサイクルを適切に管理する必要があります。以下のマネージャークラスを使うと、キャッシュの検索・更新・削除を安全に扱えます。

import google.generativeai as genai
from google.generativeai import caching
import datetime
from typing import Optional
 
genai.configure(api_key="YOUR_GEMINI_API_KEY")
 
class CacheManager:
    """Context Cache の CRUD 操作をまとめたマネージャークラス"""
 
    @staticmethod
    def list_caches() -> list:
        """現在アクティブなキャッシュ一覧を取得"""
        caches = list(caching.CachedContent.list())
        print(f"アクティブなキャッシュ数: {len(caches)}")
        for c in caches:
            now = datetime.datetime.now(datetime.timezone.utc)
            remaining = (c.expire_time - now).total_seconds()
            print(f"  - {c.display_name}: 残り{remaining/3600:.1f}時間")
        return caches
 
    @staticmethod
    def get_cache_by_name(display_name: str) -> Optional[caching.CachedContent]:
        """名前でキャッシュを検索して取得(プロセス再起動後の再利用に重要)"""
        for c in caching.CachedContent.list():
            if c.display_name == display_name:
                now = datetime.datetime.now(datetime.timezone.utc)
                remaining_hours = (c.expire_time - now).total_seconds() / 3600
                if remaining_hours > 0.5:  # 30 分以上残っている場合のみ使用
                    return c
        return None
 
    @staticmethod
    def extend_cache_ttl(cache: caching.CachedContent, hours: int = 24):
        """キャッシュの有効期限を延長する"""
        try:
            cache.update(ttl=datetime.timedelta(hours=hours))
            print(f"✅ TTL 更新: {cache.display_name} → +{hours}時間")
        except Exception as e:
            print(f"❌ TTL 更新失敗: {e}")
 
    @staticmethod
    def delete_cache(cache: caching.CachedContent):
        """キャッシュを削除する(保存コストを止めるため、不要になったら削除)"""
        try:
            display_name = cache.display_name
            cache.delete()
            print(f"🗑️ キャッシュ削除: {display_name}")
        except Exception as e:
            print(f"❌ 削除失敗: {e}")

get_cache_by_name が特に重要です。サーバーを再起動するたびに新しいキャッシュを作ってしまうと、古いキャッシュの保存コストが積み重なります。名前で既存キャッシュを検索して再利用することで、この問題を防げます。

Context Caching のコスト計算(実例)

具体的な数値で節約効果を見てみましょう。

条件: gemini-2.5-pro、システムプロンプト 10,000 トークン、1 日 1,000 リクエスト

キャッシュなし(月額):

  • 入力トークン: 10,000 × 1,000 × 30 = 3 億トークン
  • 推定コスト: $375 / 月

Context Caching あり(月額):

  • キャッシュ作成・保存料(12 時間 TTL、日 1 回更新): 約 $24 / 月
  • キャッシュ参照料(フル料金の約 75% 割引): 約 $95 / 月
  • 合計: 約 $119 / 月(節約率: 約 68%)

この試算は、実際にシステムプロンプトが毎リクエストで送信されている場合の効果です。料金の正確な数値は Google AI料金ページ で確認してください。

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

この記事の続きを読む

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

この記事で得られること
個人開発アプリ(累計 5,000 万 DL)で Context Caching を 6 ヶ月運用した、月額コストの実測値($281 → $96)とキャッシュヒット率の推移
公式ドキュメントには書かれていない 7 つの運用インサイト(最小トークン要件・URI 必須・保存コストの隠れた山・スレッド競合・display_name 衝突・期限切れ間際の挙動・count_tokens の課金)
AdMob 連携アプリで Flash と Pro をキャッシュと組み合わせる時の判断ライン、TTL の早見表、月予算 ÷ 30 × 1.3 のアラート式
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

API / SDK2026-07-02
Gemma 4 ローカル推論と Gemini API の使い分けで月額¥32,000を¥9,000台にした — ハイブリッドルーターの本番設計
月額¥32,000のGemini APIコストを¥9,000台まで下げたハイブリッド推論構成の記録です。ルーティング設計・Python実装・本番の落とし穴に加え、2026年7月のGemma 4 API提供開始を踏まえた構成見直しの指針もまとめました。
API / SDK2026-05-05
Gemini API のキャッシュ戦略で月3万円を6,000円にした:Context Caching・Implicit Caching の本番設計
Gemini API のContext CachingとImplicit Cachingを正しく設計することでAPI費用を80%削減した実践ガイド。キャッシュ選定の判断基準、動作確認済み実装コード、本番でのトラブルシュートまで体系的に解説します。
API / SDK2026-04-07
Gemini API セマンティックルーター実装ノート ― Flash と Pro を賢く振り分けて API 費用を抑える
Gemini API でクエリ内容を自動判定し最適モデルへ振り分けるセマンティックルーターの実装ノート。Flash と Pro を 2 段階で賢くディスパッチして API 費用を抑える設計パターン、Python・TypeScript の動くコード、運用で気づいた 7 つの実装インサイトをまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →