ในเวิร์กโฟลว์ AI ทั่วไป คุณอาจส่งโทเค็นอินพุตเดียวกันซ้ำๆ ไปยังโมเดล เมื่อใช้ฟีเจอร์การแคชบริบทของ Gemini API คุณสามารถส่งเนื้อหาบางอย่างไปยังโมเดลได้เพียงครั้งเดียว แคชโทเค็นอินพุต แล้วอ้างอิงโทเค็นที่แคชไว้สำหรับคำขอที่ตามมา เมื่อใช้โทเค็นที่แคชไว้ในปริมาณหนึ่งๆ ค่าใช้จ่ายจะต่ำกว่าการส่งชุดโทเค็นเดียวกันซ้ำๆ
เมื่อแคชชุดโทเค็น คุณจะเลือกระยะเวลาที่ต้องการให้แคชอยู่ได้ก่อนที่ระบบจะลบโทเค็นโดยอัตโนมัติ ระยะเวลาการแคชนี้เรียกว่า Time to Live (TTL) หากไม่ได้ตั้งค่า TTL ระบบจะใช้ค่าเริ่มต้นเป็น 1 ชั่วโมง ค่าใช้จ่ายในการแคชจะขึ้นอยู่กับขนาดโทเค็นอินพุตและระยะเวลาที่คุณต้องการให้โทเค็นคงอยู่
การแคชบริบทรองรับทั้ง Gemini 1.5 Pro และ Gemini 1.5 Flash
กรณีที่ควรใช้การแคชบริบท
การแคชบริบทเหมาะอย่างยิ่งกับสถานการณ์ที่มีการอ้างอิงบริบทเริ่มต้นจำนวนมากซ้ำๆ โดยคำขอที่สั้นกว่า ลองใช้แคชตามบริบทสําหรับกรณีการใช้งาน เช่น
- แชทบ็อตที่มีวิธีการของระบบอย่างละเอียด
- การวิเคราะห์ไฟล์วิดีโอที่มีความยาวซ้ำๆ
- การค้นหาที่เกิดขึ้นซ้ำกับชุดเอกสารขนาดใหญ่
- การวิเคราะห์ที่เก็บโค้ดหรือการแก้ไขข้อบกพร่องบ่อยครั้ง
วิธีที่การแคชช่วยลดค่าใช้จ่าย
การแคชบริบทเป็นฟีเจอร์แบบชำระเงินที่ออกแบบมาเพื่อลดต้นทุนการดําเนินการโดยรวม การเรียกเก็บเงินจะอิงตามปัจจัยต่อไปนี้
- จํานวนโทเค็นแคช: จํานวนโทเค็นอินพุตที่แคชไว้ ซึ่งจะเรียกเก็บในราคาที่ลดลงเมื่อรวมอยู่ในพรอมต์ต่อๆ ไป
- ระยะเวลาการจัดเก็บ: ระยะเวลาที่จัดเก็บโทเค็นที่แคชไว้ (TTL) ซึ่งจะเรียกเก็บเงินตามระยะเวลา TTL ของจำนวนโทเค็นที่แคชไว้ TTL ไม่มีขอบเขตขั้นต่ำหรือสูงสุด
- ปัจจัยอื่นๆ: ระบบจะเรียกเก็บเงินอื่นๆ เช่น สำหรับโทเค็นอินพุตและโทเค็นเอาต์พุตที่ไม่ได้แคชไว้
ดูรายละเอียดราคาล่าสุดได้ที่หน้าราคาของ Gemini API ดูวิธีนับโทเค็นได้ที่คู่มือโทเค็น
วิธีใช้การแคชบริบท
ส่วนนี้จะถือว่าคุณได้ติดตั้ง Gemini SDK (หรือติดตั้ง curl) และกำหนดค่าคีย์ API แล้ว ตามที่แสดงในบทแนะนำ
สร้างเนื้อหาโดยใช้แคช
ตัวอย่างต่อไปนี้แสดงวิธีสร้างเนื้อหาโดยใช้วิธีการและไฟล์วิดีโอที่ระบบแคชไว้
import os
import pathlib
import requests
import time
from google import genai
from google.genai import types
# Get your API key from https://aistudio.google.com/app/apikey
# Put it in a "GOOGLE_API_KEY" environment variable.
# For more details, see
# https://github.com/google-gemini/cookbook/blob/main/quickstarts/Authentication.ipynb
client = genai.Client()
# Download video file
url = 'https://storage.googleapis.com/generativeai-downloads/data/Sherlock_Jr_FullMovie.mp4'
path_to_video_file = pathlib.Path('Sherlock_Jr_FullMovie.mp4')
if not path_to_video_file.exists():
with path_to_video_file.open('wb') as wf:
response = requests.get(url, stream=True)
for chunk in response.iter_content(chunk_size=32768):
wf.write(chunk)
# Upload the video using the Files API
video_file = client.files.upload(path=path_to_video_file)
# 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 = client.files.get(name=video_file.name)
print(f'Video processing complete: {video_file.uri}')
# You must use an explicit version suffix. "-flash-001", not just "-flash".
model='models/gemini-1.5-flash-001'
# Create a cache with a 5 minute TTL
cache = client.caches.create(
model=model,
config=types.CreateCachedContentConfig(
display_name='sherlock jr movie', # used to identify the cache
system_instruction=(
'You are an expert video analyzer, and your job is to answer '
'the user\'s query based on the video file you have access to.'
),
contents=[video_file],
ttl="300s",
)
)
# Construct a GenerativeModel which uses the created cache.
response = client.models.generate_content(
model = model,
contents= (
'Introduce different characters in the movie by describing '
'their personality, looks, and names. Also list the timestamps '
'they were introduced for the first time.'),
config=types.GenerateContentConfig(cached_content=cache.name)
)
print(response.usage_metadata)
# The output should look something like this:
#
# prompt_token_count: 696219
# cached_content_token_count: 696190
# candidates_token_count: 214
# total_token_count: 696433
print(response.text)
แสดงรายการแคช
คุณไม่สามารถเรียกดูหรือดูเนื้อหาที่แคชไว้ได้ แต่สามารถเรียกข้อมูลเมตาที่แคชไว้ (name
, model
, display_name
, usage_metadata
,
create_time
, update_time
และ expire_time
)
หากต้องการแสดงรายการข้อมูลเมตาของแคชที่อัปโหลดทั้งหมด ให้ใช้ CachedContent.list()
ดังนี้
for cache in client.caches.list():
print(cache)
หากต้องการดึงข้อมูลเมตาสําหรับออบเจ็กต์แคชรายการเดียว (ในกรณีที่คุณทราบชื่อ) ให้ใช้ get
ดังนี้
client.caches.get(name=name)
อัปเดตแคช
คุณสามารถตั้งค่า ttl
หรือ expire_time
ใหม่สำหรับแคชได้ ระบบไม่รองรับการเปลี่ยนแปลงอื่นๆ เกี่ยวกับแคช
ตัวอย่างต่อไปนี้แสดงวิธีอัปเดต ttl
ของแคชโดยใช้ client.caches.update()
from google import genai
from google.genai import types
client.caches.update(
name = cache.name,
config = types.UpdateCachedContentConfig(
ttl='300s'
)
)
หากต้องการตั้งค่าเวลาหมดอายุ ระบบจะยอมรับออบเจ็กต์ datetime
หรือสตริงวันที่และเวลาในรูปแบบ ISO (dt.isoformat()
เช่น 2025-01-27T16:02:36.473528+00:00
) เวลาของคุณต้องมีเขตเวลา (datetime.utcnow()
ไม่ได้แนบเขตเวลา ส่วนdatetime.now(datetime.timezone.utc)
จะแนบเขตเวลา)
from google import genai
from google.genai import types
import datetime
# You must use a time zone-aware time.
in10min = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(minutes=10)
client.caches.update(
name = cache.name,
config = types.UpdateCachedContentConfig(
expire_time=in10min
)
)
ลบแคช
บริการแคชมีการดำเนินการลบสําหรับนําเนื้อหาออกจากแคชด้วยตนเอง ตัวอย่างต่อไปนี้แสดงวิธีลบแคช
client.caches.delete(cache.name)
ข้อควรพิจารณาเพิ่มเติม
โปรดคํานึงถึงข้อควรพิจารณาต่อไปนี้เมื่อใช้การแคชบริบท
- จํานวนโทเค็นอินพุตขั้นต่ำสําหรับการแคชบริบทคือ 32,768 และสูงสุดจะเท่ากับจํานวนสูงสุดของโมเดลนั้นๆ (ดูข้อมูลเพิ่มเติมเกี่ยวกับการนับโทเค็นได้ในคู่มือโทเค็น)
- โมเดลนี้ไม่ได้แยกความแตกต่างระหว่างโทเค็นที่แคชไว้กับโทเค็นอินพุตปกติ เนื้อหาที่แคชไว้เป็นเพียงคำนำหน้าของพรอมต์เท่านั้น
- ไม่มีการจำกัดอัตราหรือการใช้งานพิเศษในการแคชบริบท ระบบจะใช้ขีดจำกัดอัตรามาตรฐานสำหรับ
GenerateContent
และขีดจำกัดโทเค็นจะรวมโทเค็นที่แคชไว้ - ระบบจะแสดงจำนวนโทเค็นที่แคชไว้ใน
usage_metadata
จากการดำเนินการสร้าง รับ และแสดงรายการของบริการแคช และในGenerateContent
เมื่อใช้แคช