見出し画像

Gemini API の Context caching

以下の記事が面白かったので、簡単にまとめました。

Context caching  |  Google AI for Developers  |  Google for Developers


1. Context caching

Context caching」は、入力トークンをキャッシュして、後続リクエストでキャッシュされたトークンを参照することで、コストとレイテンシを低くおさせることができる機能です。

トークンをキャッシュに保存する時、キャッシュの保存期間「TTL」(time to live)を指定します。キャッシュの保存費用は、入力トークンのサイズとトークンの保持期間によって決まります。

「Context caching」は、「Gemini 1.5 Pro」「Gemini 1.5 Flash」の両方でサポートされています。

2. Context caching のユースケース

Context caching」は、初期コンテキストが短いリクエストによって繰り返し参照される場合に適しています。

・長いSystem Instructionを備えたチャットボット
・長い動画ファイルの繰り返し分析
・大規模なドキュメントセットに対する定期的なクエリ
・頻繁なコードリポジトリ分析・バグ修正

3. Context caching の使用料金

Context caching」の使用料金は、次の要素に基づいて決まります。

・キャッシュのトークン数
後続プロンプトに含まれる場合は割引料金で課金されます。
・キャッシュの保存期間 (TTL)
時間単位で課金されます。TTLには最小値や最大値の制限はありません。
その他の要因
キャッシュされていない入力トークンや出力トークンなどに対しても、その他の料金が適用されます。

最新の使用料金については、Gemini APIの料金ページを参照してください。トークンのカウント方法については、トークンガイドを参照してください。

4. Context caching の使い方

from google.generativeai import caching
import datetime
import time

# ファイルをダウンロード
# !wget https://storage.googleapis.com/generativeai-downloads/data/Sherlock_Jr_FullMovie.mp4

video_file_name = "Sherlock_Jr_FullMovie.mp4"

# Files APIで動画をアップロード
video_file = genai.upload_file(path=video_file_name)

# Wait for the file to finish processing
while video_file.state.name == "PROCESSING":
    print('Waiting for video to be processed.')
    time.sleep(2)
    video_file = genai.get_file(video_file.name)

print(f'Video processing complete: ' + video_file.uri)

# 5分のTTLでキャッシュを作成
cache = caching.CachedContent.create(
    model="models/gemini-1.5-flash-001",
    display_name="sherlock jr movie", # キャッシュを識別するために使用
    system_instruction="You are an expert video analyzer, and your job is to answer user's query based on the video file you have access to.",
    contents=[video_file],
    ttl=datetime.timedelta(minutes=5),
)

# 作成されたキャッシュを使用
model = genai.GenerativeModel.from_cached_content(cached_content=cache)

# モデルをクエリ
response = model.generate_content(
    ["Introduce different characters in the movie by describing their personality, looks, and names. Also list the timestamps they were introduced for the first time."]
)

print(response.usage_metadata)

# 出力は次のようになる
#
# prompt_token_count: 696226
# candidates_token_count: 351
# total_token_count: 696577
# cached_content_token_count: 696189

【注意】バージョン固定されたモデル (gemini-1.5-pro-001 など) でのみ使用できます。バージョン接尾辞を含める必要があります。

5. 追加の考慮事項

・Context cachingの入力トークン数の最小値は32,768、 最大値は指定されたモデルの最大値と同じ。
・キャッシュの保存期間 (TTL) が未設定の場合、1時間になる。
・モデルでは、キャッシュされたトークンと通常のトークンを区別しない。キャッシュされたコンテンツは、単にプロンプ​​トのプレフィックスになる。
・キャッシュサービスには、キャッシュからコンテンツを手動で削除するための削除操作が用意されている。
・有料版では、Context cachingに特別なレート制限や使用制限はない。標準のレート制限がGenerateContent適用され、トークン制限にはキャッシュされたトークンが含まれる。無料版では、「Gemini 1.5 Flash」に100万トークンのストレージ制限があり、「Gemini 1.5 Pro」ではキャッシュは利用できない。
・キャッシュされたコンテンツを取得または表示することはできないが、メタデータ ( name, display_name, model, and create, update, expire times)を取得することはできる。
・display_nameを更新し、新しいttlまたはexpire_timeを設定することは可能。その他の変更はサポートされていない。
・キャッシュされたトークン数は、usage_metadataキャッシュサービスの作成、取得、一覧表示の操作から返されるほか、 GenerateContentキャッシュの使用時にも返される。


この記事が気に入ったらサポートをしてみませんか?