Geminiのコンテキストキャッシュ

Geminiコンテキストキャッシュは、繰り返し使用する入力トークンを保存して再利用できる機能 Google AIです。GoogleがGemini APIで提供している機能で、コストと遅延の削減を目的としています。

## 主な特徴
2つのタイプ
### 暗黙的キャッシュ(Implicit caching): 自動的に有効化され、キャッシュヒットが発生すると自動的にコスト削減が提供される Google機能で、2025年5月から利用可能になりました
### 明示的キャッシュ(Explicit caching): 開発者が手動でキャッシュを作成・管理する方法で、より細かい制御が可能

コスト削減効果
Gemini 2.5以降のモデルでは、キャッシュされたトークンに対して通常の入力トークンコストの10%のみを支払う Google Cloud仕組みです。

使用例
– 長い動画やドキュメントに対して複数の質問をする場合
– 大量のシステムプロンプトを繰り返し使用する場合
– チャットボットで製品情報や詳細なペルソナ設定を維持する場合
– 大規模なコードベースを分析する場合

制限事項
– デフォルトの有効期限(TTL)は1時間 Google AI
– モデルごとに最小トークン数の要件がある
– キャッシュされたコンテンツはプロンプトのプレフィックスとして機能

この機能により、同じ大量のコンテキスト情報を何度も送信する必要がなくなり、APIの使用がより効率的で経済的になります。

$ pip3 install google-generativeai

import google.generativeai as genai
import os
from dotenv import load_dotenv
load_dotenv()

# 設定
genai.configure(api_key=os.environ.get("GEMINI_API_KEY"))

# モデルを直接初期化(キャッシュなし)
model = genai.GenerativeModel('gemini-2.5-flash')

# 長い文書(毎回送信される)
long_document = """
製品名: スマートウォッチ Pro X

特徴:
- 心拍数モニタリング機能
- GPS内蔵
- 防水性能(50m)
- バッテリー持続時間: 最大7日間
"""

print("📝 通常の方法(キャッシュなし)でGeminiを使用\n")

# 質問1
print("❓ 質問1: バッテリー持続時間は?")
response1 = model.generate_content(
    f"{long_document}\n\nバッテリーは何日持ちますか?"
)
print(f"💬 回答: {response1.text}\n")

# 質問2(毎回long_documentを送信する必要がある)
print("❓ 質問2: 防水性能は?")
response2 = model.generate_content(
    f"{long_document}\n\nこの製品は防水ですか?"
)
print(f"💬 回答: {response2.text}\n")

print("="*60)
print("💡 キャッシュとの違い:")
print("  - キャッシュなし: 毎回long_documentを送信(コスト高)")
print("  - キャッシュあり: 1度だけ送信、以降は再利用(コスト削減)")
print("\n⚠️  無料枠ではキャッシュに厳しい制限があるため、")
print("    実用的にはこちらの方法を使う必要があるかもしれません。")

$ python3 gemini_without_cache.py
📝 通常の方法(キャッシュなし)でGeminiを使用

❓ 質問1: バッテリー持続時間は?
WARNING: All log messages before absl::InitializeLog() is called are written to STDERR
E0000 00:00:1769337671.150316 345042 alts_credentials.cc:93] ALTS creds ignored. Not running on GCP and untrusted ALTS is not enabled.
💬 回答: バッテリーは**最大7日間**持ちます。

❓ 質問2: 防水性能は?
💬 回答: はい、この製品は防水です。

特徴に「防水性能(50m)」と記載されています。

============================================================
💡 キャッシュとの違い:
– キャッシュなし: 毎回long_documentを送信(コスト高)
– キャッシュあり: 1度だけ送信、以降は再利用(コスト削減)

⚠️ 無料枠ではキャッシュに厳しい制限があるため、
実用的にはこちらの方法を使う必要があるかもしれません。

import os
import google.generativeai as genai
from google.generativeai import caching
import datetime
import os

from dotenv import load_dotenv
load_dotenv()

# 設定
genai.configure(api_key=os.environ.get("GEMINI_API_KEY"))

# 1. キャッシュ作成(長い文書を1回だけ保存)
cache = caching.CachedContent.create(
    model="gemini-1.5-flash",  # バージョン番号なし
    contents=["これは長い文書です。" * 1000],  # 繰り返し使うコンテンツ
    ttl=datetime.timedelta(minutes=30),
)

# 2. キャッシュを使ってモデル初期化
model = genai.GenerativeModel.from_cached_content(cache)

# 3. 質問(キャッシュが自動で使われる)
response = model.generate_content("この文書を要約してください")
print(response.text)

# 4. 別の質問(同じキャッシュを再利用 = コスト削減!)
response2 = model.generate_content("文書のキーワードを3つ教えてください")
print(response2.text)

# 5. 削除
cache.delete()

Gemini APIのコンテキストキャッシュ(Context Caching)は、原則として「有料(従量課金制)プラン」のみの機能となっています。