VertexAIのコンテキストキャッシュを利用してトークン数を削減しよう!

 2024.12.17 XIMIX 北脇

        

はじめに

VertexAI StudioのGeminiではマルチモーダルを利用して音声や動画ファイルをプロンプトに入れて実行することもあるかと思います。しかし、音声や動画ファイルはかなり多くのトークンを利用します。複数回音声や動画ファイルを使い回すたびに大量のトークンを利用してしまい、そのたびに料金がかかってしまいます。
そういった課題を解決するために「コンテキストキャッシュ」という機能を利用することでトークン数を削減することが可能となります。
今回はコンテキストキャッシュの具体的な使い方についてご紹介します。

コンテキストキャッシュとは

コンテキストキャッシュは、繰り返し利用される大規模なテキストや音声、動画をキャッシュに保存し、再利用することでコストを削減する機能です。大量のコンテンツをキャッシュに保存することで、プロンプトリクエストで同じコンテンツを再度利用する際に多くのトークンを消費する必要がなくなります。
コンテキストキャッシュの最小サイズは32,768トークンであり、mp3などの音声やmp4形式の動画などを指定できます。コンテキストキャッシュは、広範なシステム指示を持つチャットボット、長時間の動画ファイルの分析、頻繁なコードリポジトリの分析などに適しています。キャッシュ保存により、全体的な運用コストが削減されるため、頻繁に使用されるデータを効率的に扱うことができます。

実装例

それではコンテキストキャッシュの使い方を説明します。まずはコンテキストキャッシュを利用しない例です。
import datetime
import vertexai

from vertexai.preview.generative_models import GenerativeModel
from vertexai.generative_models import Part

vertexai.init(project="{プロジェクトID}", location="asia-northeast1")

model = GenerativeModel(
    "gemini-1.5-flash-002",
)
generation_config = {
    "max_output_tokens": 8192,
    "top_p": 1,
    "temperature": 0,
}

audio = Part.from_uri(
    mime_type="audio/mp3",
  uri="{GCSのファイルパス}",
)

start_time = datetime.datetime.now()
response = model.generate_content([audio, "音声ファイルには2つのおとぎ話が含まれています。どんな話かそれぞれ簡潔に説明してください。"])

print(response.usage_metadata)
end_time = datetime.datetime.now()
elapsed_time = end_time - start_time
print(f'処理時間: {elapsed_time}')
出力結果は下記になります。
prompt_token_count: 39142
candidates_token_count: 362
total_token_count: 39504

処理時間: 0:00:11.569370

次にコンテキストキャッシュを利用したやり方をご紹介します。赤字部分が追記箇所です。
import datetime
import vertexai

from vertexai.preview.generative_models import GenerativeModel
from vertexai.preview import caching
from vertexai.generative_models import Part

vertexai.init(project="ci2-kitawaki-study", location="asia-northeast1")

generation_config = {
    "max_output_tokens": 8192,
    "top_p": 1,
    "temperature": 0,
}

audio = Part.from_uri(
    mime_type="audio/mp3",
    uri="gs://dev-minutes/fairyTale.wav",
)

'''
キャッシュ処理
'''
cache = caching.CachedContent.create(
    model_name="gemini-1.5-flash-002",
    display_name="fairy tale", # キャッシュを識別するための表示名
    contents=[audio],
    ttl=datetime.timedelta(minutes=10),
)

start_time = datetime.datetime.now()
model = GenerativeModel.from_cached_content(cached_content=cache)
response = model.generate_content(["音声ファイルには2つのおとぎ話が含まれています。どんな話かそれぞれ簡潔に説明してください。"])

print(response.usage_metadata)
end_time = datetime.datetime.now()
elapsed_time = end_time - start_time
print(f'処理時間: {elapsed_time}')
出力結果は下記になります。
prompt_token_count: 39142
candidates_token_count: 273
total_token_count: 39415
cached_content_token_count: 39121

処理時間: 0:00:09.039997

「cached_content_token_count」が追加されていることがわかります。これは入力トークンのうちキャッシュから利用されたトークン数になります。音声ファイルがキャッシュされて利用されていることがわかります。

料金

具体的に料金がどの程度変わるのか確認します。1時間の音声の料金で比較します。

  • コンテキストキャッシュなしの場合
    • 1秒当たり$0.000004 × 3600秒 = $0.0144
  • コンテキストキャッシュあり
    • キャッシュに入力された料金:$0.000001 × 3600秒 = $0.0036
    • キャッシュ保存時間    :$0.000025 × 600秒 = $0.015
    • 合計           :$0.0036 + $0.015 = $0.0186

コンテキストキャッシュありのほうが料金が高くなってしまいました。
このように1度だけ利用するようなケースではコンテキストキャッシュを利用すると割高となってしまいます。ですが、複数回利用する場合は、コンテキストキャッシュの場合は「キャッシュに入力された料金」し掛からないため、割安になります。
プロンプトとして10回音声を利用する場合の比較をしていきましょう。

  • コンテキストキャッシュなしの場合
    • $0.0144 × 10回 = $0.144
  • コンテキストキャッシュありの場合
    • $0.0036 × 10回 + $0.015 = $0.051
このようにコンテキストキャッシュを利用した場合は3倍近く料金が安くなりました。

まとめ

本ブログでは、VertexAIの「コンテキストキャッシュ」機能を活用して、トークン数を削減しコストを効果的に削減する方法について紹介しました。
コンテキストキャッシュは、繰り返し利用される大規模なテキストや音声、動画をキャッシュに保存することで、再利用の際に消費するトークン数を削減できる便利な機能です。特に、音声や動画ファイルのように大量のトークンを消費するコンテンツを頻繁に利用する場合に有効です。また、料金面においても、コンテキストキャッシュを利用すると1回だけの利用では割高になるものの、複数回利用する場合には総コストを大きく削減できることが示されました。
このように、VertexAIのコンテキストキャッシュを活用することで、音声や動画ファイルを含むプロンプトを効率的に利用し、コストを削減することが可能です。複数回利用するケースでは、特に有効な手段となりますので、ぜひ活用してみてください。

 

Google Cloud、Google Workspace に関するご相談はXIMIXへ!

Google Cloud、Google Workspaceに関する お問い合わせはこちら


VertexAIのコンテキストキャッシュを利用してトークン数を削減しよう!

BACK TO LIST