Google Cloud Japan
🗄

Vertex AI: Gemini API の Context caching の玹介

に公開
2024/07/25

䜕の話かず蚀うず

Google Cloud で利甚可胜なマルチモヌダル察応の基盀モデルである Gemini 1.5 Pro / Flash に察しお、Context caching の機胜が利甚可胜になりたした。これがどのような機胜で䜕の圹に立぀のかを実際の䜿甚䟋ずあわせお、わかりやすく説明したす。

Context caching のない時

Gemini はマルチモヌダル察応モデルなので、プロンプトに動画などのメディアコンテンツを埋め蟌むこずができたす。具䜓的には、次のように Python のリスト圢匏でプロンプトを構成したす。

prompt = [
    '[動画ファむル]',
    Part.from_uri(uri=f'{BUCKET}/{movie_file}', mime_type='video/mp4'),
    '動画の文字起こしをしおください。'
]

このプロンプトを Gemini API に投入するず、次の図のように基盀モデルからの応答が埗られたす。この際、入力トヌクンず出力トヌクンに察しおコストが発生したす。具䜓的な䟡栌は、公匏ドキュメントで確認できたす。シンプルですね


マルチモヌダルプロンプトを Gemini API で凊理する

Context caching のある時

Context caching を利甚するず、プロンプトの䞀郚分を事前にクラりド䞊のキャッシュ領域にアップロヌドしおおくこずができたす。先ほどの䟋であれば、前半の動画ファむルを含む郚分をアップロヌドするような䜿い方になりたす。以䞋の内容をキャッシュ領域に保存するむメヌゞです。

prompt_cached = [
    '[動画ファむル]',
    Part.from_uri(uri=f'{BUCKET}/{movie_file}', mime_type='video/mp4')
]

そしお、次の図のように、キャッシュ領域から取り出したプロンプトずクラむアントから入力した远加のプロンプトを結合しお、基盀モデルに投入するこずができたす。なんだか耇雑ですね 。


Context caching を䜿甚する堎合のむメヌゞ図

Context caching のメリット

それでは、Context caching を䜿うず䜕が嬉しいのでしょうか 端的に蚀うずコストの最適化です。

先ほどの図にあるように、Context caching を䜿う堎合、次の 4 ぀のコストが発生したす。

  • 入力トヌクンにかかるコスト
  • キャッシュからの入力トヌクンにかかるコスト
  • キャッシュの保存にかかるコスト
  • 出力トヌクンにかかるコスト

この際、「キャッシュからの入力トヌクンにかかるコスト」は、「入力トヌクンにかかるコスト」の25%に蚭定されおおり、キャッシュから入力した方がコストが䞋がりたす。ただし、それずは別に「キャッシュの保存にかかるコスト」があるので、キャッシュ䞊のプロンプトを 1 回䜿うだけの堎合、Context caching を利甚するコストメリットはありたせん。短時間の間にキャッシュに保存したプロンプトを繰り返し利甚するようなケヌスで、コストメリットが生たれたす。具䜓的な䟡栌は、公匏ドキュメントで確認できたす。なるほどヌ。

先ほどの䟋では、動画ファむルの文字起こしを行う想定のプロンプトを利甚しおいたした。同じ動画ファむルに察しお文字起こしの他に、サマリヌの生成、ストヌリヌボヌドの生成、テロップ文字の抜出など、耇数の凊理を行う堎合に有効掻甚できそうです。

Context caching の制限事項

本蚘事執筆時点では、次のような制限事項がありたす。

  • リヌゞョンは us-central1 のみに察応Gemini API のリヌゞョンに us-central1 を指定する必芁がある
  • キャッシュに保存するプロンプトは、32,769 トヌクン以䞊のサむズが必芁
  • プロンプトの先頭郚分のみをキャッシュに保存可胜キャッシュから取り出したプロンプトずクラむアントから入力したプロンプトの順序を制埡するこずはできない

Context caching の利甚䟋

事前準備

ここでは、次の動画ファむルを Gemini 1.5 Flash で凊理する䟋を玹介したす。

この動画ファむルを mp4 に倉換したものが Cloud Storage のバケットに事前に保存されおいるものずしたす。たた、Context caching を䜿甚する際は、Vertex AI Service Agent が必芁になりたす。これは、Cloud Shell から次のコマンドを実行するこずで䜜成できたす。

PROJECT_ID=$(gcloud config list --format 'value(core.project)')
curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  https://us-central1-aiplatform.googleapis.com/v1/projects/$PROJECT_ID/locations/us-central1/endpoints \
  -d ""

この埌の䜜業は、Vertex AI Workbench のノヌトブック䞊で行いたす。Workbench 環境を準備する方法は、次の蚘事の事前準備を参考にしおください。

はじめに、Client SDK を最新バヌゞョンにアップデヌトしお、Kernel をリスタヌトしたす。

!pip install --upgrade google-cloud-aiplatform
import IPython
app = IPython.Application.instance()
_ = app.kernel.do_shutdown(True)

次に必芁なモゞュヌルをむンポヌトしたす。この蚘事の執筆時点では、次のように preview 版のモゞュヌルが必芁になりたす。

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

そしお、プロゞェクト ID などの倉数をセットしお、Client SDK を初期化したす。[Project ID]、[Bucket Name]、[Move File Path] の郚分は実際に䜿甚する環境にあわせお入力しおください。たた、この䟋にあるように、location には us-central1 を指定する必芁がありたす。

PROJECT_ID = '[Project ID]'
BUCKET = 'gs://[Buket Name]'
movie_file = '[Movie File Path]'
vertexai.init(project=PROJECT_ID, location='us-central1')

キャッシュぞのアップロヌド

キャッシュにアップロヌドするプロンプトを次のように定矩したす。

prompt_cached = [
    '[movie file]',
    Part.from_uri(f'{BUCKET}/{movie_file}', mime_type='video/mp4'),
]

次のコマンドで、キャッシュにアップロヌドしたす。この䟋からわかるように、この時点で、䜿甚する基盀モデルも model_name オプションで指定したす。その他には、システムむンストラクションも system_instruction オプションで指定できたす。倉数 cached_content には、キャッシュされた内容を衚すオブゞェクトが保存されたす。

cached_content = caching.CachedContent.create(
    model_name='gemini-1.5-flash-001',
    contents=prompt_cached,
    system_instruction='You are a video content analyst. Work on the following tasks.',
    ttl=datetime.timedelta(minutes=60)
)

たた、最埌の ttl オプションは、キャッシュの保持期間です。この時間今の堎合は 60 分を経過するずキャッシュは自動的に削陀されたす。蚭定可胜な倀の䞊限はないので、極端に倧きな倀を蚭定すれば、実質的に無限倧に蚭定するこずもできたす。たた、䞀床蚭定した時間を埌から曎新しお、延長するこずも可胜です。

キャッシュに保存したプロンプトには、ナニヌクな ID が自動で割り圓おられたす。これは、次のコマンドで確認できたす。

cached_content.name

[出力]

'2753810434648702976'

たた、珟圚キャッシュに保存されおいるプロンプトの䞀芧は、次のコマンドで衚瀺されたす。

caching.CachedContent.list()

[出力]

[<vertexai.caching._caching.CachedContent object at 0x7f83a2571ed0>: {
   "name": "projects/[Project Number]/locations/us-central1/cachedContents/2753810434648702976",
   "model": "projects/[Project ID]/locations/us-central1/publishers/google/models/gemini-1.5-flash-001",
   "createTime": "2024-07-10T02:56:24.259968Z",
   "updateTime": "2024-07-10T02:56:24.259968Z",
   "expireTime": "2024-07-10T03:56:24.251354Z"
 }]

name 属性の末尟が、先ほど確認した ID に䞀臎しおいたす。

今は実行する必芁ありたせんが、既存のキャッシュを再利甚する際は、次のコマンドでキャッシュの内容を衚すオブゞェクトが取埗できたす。

cached_content = caching.CachedContent(
    cached_content_name='projects/[Project Number]/locations/us-central1/cachedContents/2753810434648702976')

キャッシュに保存したプロンプトの利甚

それでは、キャッシュに保存したプロンプトを甚いおみたしょう。たず、倉数 cached_content に甚意した内容を甚いお、モデルのオブゞェクトを取埗したす。

model = GenerativeModel.from_cached_content(cached_content=cached_content)

このモデルに远加のプロンプトを䞎えるず、キャッシュに保存したプロンプトず結合したものがモデルに察する入力になりたす。ここでは、動画のサマリヌを生成しおみたしょう。

prompt = '''\
[tasks]
A. Summarize important topics of the video.

[conditions]
A. The summary has more than three sentences.
A. Try best to include as much detail as possible so that they clearly explain the sequence of the story.

[format instruction]
Output in Japanese. Use plaintext not markdown.
'''
response = model.generate_content(prompt, stream=False)
print(response.text)

[出力]

この動画は、若い女性がハワむを旅行した様子をGoogle Pixelで撮圱した映像です。空枯に到着
した圌女は、青い空ず青い海、ダシの朚など、ハワむらしい颚景をGoogle Pixelで撮圱しお楜しん
でいたす。ファヌマヌズマヌケットではGoogle Pixelのカメラ機胜を䜿っおランブヌタンなどの
珍しい果物を調べ、地元の人ず亀流し、その矎味しさを䜓隓したした。その埌、ハワむの熱垯怍
物園を蚪れ、さたざたな怍物をGoogle Pixelで撮圱したした。たた、乗銬䜓隓では、Google Pixel
を䜿っお自撮りをしお、ハワむの雄倧な自然を満喫したした。そしお倜は、レストランで食事を
楜しみながらGoogle Pixelでメニュヌを調べ、呚囲の矎しい景色も撮圱したした。このように
Google Pixelを䜿っお、圌女はハワむ旅行の思い出を鮮やかに蚘録し、楜しんでいたす。 

前述のように、キャッシュに保存した内容は繰り返し䜿わないずコストメリットが出たせん。ここでは、もうひず぀の䟋ずしお、動画の内容に察する QA を行いたす。

prompt = '''\
[task]
A. Find the most relevant scene with timestamp in the movie that can be used to answer the question.
B. Create a summary of the selected scene.
C. Create an answer to the question based on the selected scene.

[format instruction]
In Japanese. In plaintext, no markdowns. In the following format:

- Beginning of the output (don't show this line.)
回答に甚いたシヌン
<Timestamp in mm:ss - mm:ss>
<summary of the scene>

回答
<Answer to the question>
- End of the output (don't show this line.)

[question]
この動画に登堎する人は、Google Pixel を䜿っお䜕を調べたしたか
'''
response = model.generate_content(prompt, stream=False)
print(response.text)

[出力]

回答に甚いたシヌン
00:16 - 00:20
女性が、赀い果実の入った袋をGoogle Pixel のカメラで撮圱したずころ、画面に
「ランブヌタン」ず衚瀺され、ランブヌタンの説明が衚瀺されたす。

回答
この動画に登堎する人は、Google Pixel を䜿っお、赀い果実が䜕であるかを調べたした。

「この動画に登堎する人は、Google Pixel を䜿っお䜕を調べたしたか」ずいう質問に察しお、回答の根拠ずなるシヌンの説明ず、それを甚いた回答が埗られたした。このように、特定の動画にQAを繰り返すような堎合は、特に Context caching が有効掻甚できるでしょう。

キャッシュの削陀

利甚が終わったキャッシュは、次のコマンドで匷制的に削陀するこずができたす。

cached_content.delete()

耇数メディアの同時利甚

ここたで、動画ファむルをキャッシュに保存する䟋で説明したしたが、Gemini 1.5 Pro / Flash で利甚可胜なメディアはすべおキャッシュに保存するこずができたす。たた、耇数のメディアを含むプロンプトを保存するこずも可胜です。たずえば、次の図のように、耇数の画像ずテキストが混ざったプロンプトを考えたす。


耇数の画像ずテキストが混ざったプロンプト

これは、Python のコヌドでは次のように衚珟されるでしょう。察応する画像ファむルは、事前に Cloud Storage のバケットに保存しおある想定です。

prompt_cached = [
    '[reference information]',
    Part.from_uri(f'{BUCKET}/01_chrome_dino.png', mime_type='image/png'),
    'This character is "クロヌムの恐竜".',
    Part.from_uri(f'{BUCKET}/02_google_color.png', mime_type='image/png'),
    'These four colors are "Googleカラヌ".',
    Part.from_uri(f'{BUCKET}/03_gbike.png', mime_type='image/png'),
    'The bicycle with "Googleカラヌ" is "Googleバむク".'
]

これを先ほどず同様に、caching.CachedContent.create() メ゜ッドに指定すれば OK です。ただし、この䟋ではトヌクン数が少ないため前述の最䜎トヌクン数の制限で゚ラヌになりたす。実際には、もっず倧量の画像ずその説明文を甚意する必芁がありたす。

cached_content = caching.CachedContent.create(
    model_name='gemini-1.5-flash-001',
    contents=prompt_cached,
    system_instruction='You are a fashion advisor. Work on the following tasks.',
    ttl=datetime.timedelta(minutes=60)
)

これに次のプロンプトを远加しお、Tシャツの絵柄の説明文を生成したす。ハむラむト郚分にあるように、先ほどの説明文を参照するように指瀺しおいたす。


画像の参考情報を利甚するプロンプトの䟋

実際のコヌドず出力䟋は次のようになりたす。

prompt = [
    """\
[task]
A. Describe the printed patterns and illustrations of each item.

[condition]
A. Use the reference information to make descriptions.
A. Each description has a few short sentences. Try best to include as much detail as possible.
A. Be cautious on number of items.

[format instruction]
In Japanese. In plain text, no markdowns.
Output only descriptions in a bullet list starting with '-'.

[items]
""",
    Part.from_uri(f'{BUCKET}/t_shirt1.png', mime_type='image/png'),
    Part.from_uri(f'{BUCKET}/t_shirt2.png', mime_type='image/png'),
    Part.from_uri(f'{BUCKET}/t_shirt3.png', mime_type='image/png'),
    Part.from_uri(f'{BUCKET}/t_shirt4.png', mime_type='image/png')
]
    
response = model.generate_content(prompt, stream=False)
print(response.text)

[出力]

- このセヌタヌは、癜をベヌスに、青ずグレヌの暡様でデザむンされおいたす。暡様には、「クロヌムの
恐竜」ずサボテンが描かれおいたす。
- このTシャツは、ピンクから黄色、癜、青ぞずグラデヌションで染められおいたす。Tシャツの裟には、
「Google」の文字が癜で印刷されおいたす。
- このサむクルゞャヌゞは、黒をベヌスに、Googleカラヌの氎平のストラむプがデザむンされおいたす。
ストラむプは、青、赀、黄色、緑の順に配眮されおいたす。ゞャヌゞの巊胞には、「Google」のロゎが
癜で印刷されおいたす。
- このTシャツは、癜をベヌスに、Googleバむクをモチヌフにデザむンされおいたす。バむクのフレヌム、
車茪、サドル、ハンドルバヌ、バスケットがカラフルなGoogleカラヌで印刷されおいたす。

「クロヌムの恐竜」「Googleカラヌ」「Googleバむク」など、キャッシュ䞊のプロンプトで瀺した名称を䜿った説明文が生成されおいるこずがわかりたす。

たずめ

本文で説明したように、Context caching の利甚目的は、トヌクン数が倧きなコンテンツを繰り返し利甚する際のコストを最適化する点にありたす。特に Gemini 1.5 Pro / Flash では、2MトヌクンPro、1MトヌクンFlashのロングコンテキストが䜿甚できるので、プロンプトに倧量のデヌタを含めるこずで応答の品質を䞊げるアプロヌチが増えるず思われたす。同䞀のデヌタを繰り返し利甚する際は、Context caching を怜蚎するずよいでしょう。

本蚘事で玹介した以倖の機胜に぀いおは、次の公匏ドキュメントを参考にしおください。

Google Cloud Japan
Google Cloud Japan

Discussion