در یک گردش کاری معمولی هوش مصنوعی، ممکن است همان توکن های ورودی را بارها و بارها به یک مدل ارسال کنید. Gemini API دو مکانیسم کش متفاوت ارائه می دهد:
- کش ضمنی (به طور خودکار در مدل های Gemini 2.5 فعال می شود، بدون ضمانت صرفه جویی در هزینه)
- کش صریح (در اکثر مدل ها به صورت دستی فعال می شود، تضمین صرفه جویی در هزینه)
ذخیره سازی آشکار در مواردی مفید است که می خواهید صرفه جویی در هزینه را تضمین کنید، اما با برخی کار توسعه دهنده اضافه شده است.
ذخیره سازی ضمنی
کش ضمنی به طور پیش فرض برای همه مدل های Gemini 2.5 فعال است. اگر درخواست شما به حافظه پنهان برسد، ما به طور خودکار در هزینه صرفه جویی می کنیم. برای فعال کردن این کار نیازی به انجام کاری نیست. از 8 مه 2025 قابل اجرا است. حداقل تعداد توکن ورودی برای ذخیره متنی 1024 برای 2.5 Flash و 4096 برای 2.5 Pro است.
برای افزایش احتمال ضربه پنهان ضمنی:
- سعی کنید مطالب بزرگ و رایج را در ابتدای درخواست خود قرار دهید
- سعی کنید در مدت زمان کوتاهی درخواست هایی با پیشوند مشابه ارسال کنید
میتوانید تعداد نشانههایی را که در حافظه پنهان بازدید کردهاند را در قسمت usage_metadata
شی پاسخ ببینید.
ذخیره سازی آشکار
با استفاده از ویژگی cache صریح Gemini API، میتوانید یک بار مقداری از محتوا را به مدل ارسال کنید، نشانههای ورودی را در حافظه پنهان نگه دارید و سپس برای درخواستهای بعدی به نشانههای کش شده مراجعه کنید. در حجمهای معین، استفاده از توکنهای ذخیرهسازی شده هزینه کمتری نسبت به ارسال مکرر در یک مجموعه توکنها دارد.
هنگامی که مجموعه ای از نشانه ها را در حافظه پنهان ذخیره می کنید، می توانید انتخاب کنید که چه مدت می خواهید کش وجود داشته باشد قبل از اینکه نشانه ها به طور خودکار حذف شوند. این مدت زمان ذخیره سازی، زمان زندگی (TTL) نامیده می شود. اگر تنظیم نشود، TTL به طور پیش فرض روی 1 ساعت است. هزینه ذخیره سازی به اندازه توکن ورودی و مدت زمانی که می خواهید توکن ها باقی بمانند بستگی دارد.
این بخش فرض میکند که Gemini SDK را نصب کردهاید (یا curl را نصب کردهاید) و یک کلید API را پیکربندی کردهاید، همانطور که در شروع سریع نشان داده شده است.
با استفاده از حافظه پنهان محتوا تولید کنید
مثال زیر نحوه تولید محتوا با استفاده از یک دستورالعمل سیستم و فایل ویدئویی ذخیره شده را نشان می دهد.
ویدیوها
import os
import pathlib
import requests
import time
from google import genai
from google.genai import types
client = genai.Client()
# Download video file
url = 'https://storage.googleapis.com/generativeai-downloads/data/SherlockJr._10min.mp4'
path_to_video_file = pathlib.Path('SherlockJr._10min.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(file=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-2.0-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)
فایل های PDF
from google import genai
from google.genai import types
import io
import httpx
client = genai.Client()
long_context_pdf_path = "https://www.nasa.gov/wp-content/uploads/static/history/alsj/a17/A17_FlightPlan.pdf"
# Retrieve and upload the PDF using the File API
doc_io = io.BytesIO(httpx.get(long_context_pdf_path).content)
document = client.files.upload(
file=doc_io,
config=dict(mime_type='application/pdf')
)
model_name = "gemini-2.0-flash-001"
system_instruction = "You are an expert analyzing transcripts."
# Create a cached content object
cache = client.caches.create(
model=model_name,
config=types.CreateCachedContentConfig(
system_instruction=system_instruction,
contents=[document],
)
)
# Display the cache details
print(f'{cache=}')
# Generate content using the cached prompt and document
response = client.models.generate_content(
model=model_name,
contents="Please summarize this transcript",
config=types.GenerateContentConfig(
cached_content=cache.name
))
# (Optional) Print usage metadata for insights into the API call
print(f'{response.usage_metadata=}')
# Print the generated text
print('\n\n', 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)
ذخیره سازی آشکار با استفاده از کتابخانه OpenAI
اگر از کتابخانه OpenAI استفاده میکنید، میتوانید کش کردن صریح را با استفاده از ویژگی cached_content
در extra_body
فعال کنید.
زمان استفاده از کش صریح
ذخیره سازی متن به ویژه برای سناریوهایی که در آن یک زمینه اولیه قابل توجه به طور مکرر توسط درخواست های کوتاهتر ارجاع داده می شود، مناسب است. استفاده از کش زمینه برای موارد استفاده مانند:
- چت بات ها با دستورالعمل های سیستمی گسترده
- تجزیه و تحلیل مکرر فایل های ویدئویی طولانی
- پرس و جوهای تکراری در برابر مجموعه اسناد بزرگ
- تجزیه و تحلیل مکرر مخزن کد یا رفع اشکال
چگونه ذخیره صریح هزینه ها را کاهش می دهد
ذخیره سازی متن یک ویژگی پولی است که برای کاهش هزینه های عملیاتی کلی طراحی شده است. صورتحساب بر اساس عوامل زیر است:
- تعداد نشانههای حافظه پنهان: تعداد نشانههای ورودی ذخیرهشده در حافظه پنهان که در صورت درج در درخواستهای بعدی با نرخ کاهشیافته صورتحساب میشوند.
- مدت زمان ذخیره سازی: مقدار زمانی که توکن های ذخیره شده در حافظه پنهان ذخیره می شوند (TTL) که بر اساس مدت زمان TTL تعداد توکن های ذخیره شده صورتحساب می شود. هیچ محدودیتی برای حداقل یا حداکثر در TTL وجود ندارد.
- عوامل دیگر: هزینههای دیگری اعمال میشود، مانند نشانههای ورودی و نشانههای خروجی غیر ذخیرهسازی شده در حافظه پنهان.
برای جزئیات قیمت به روز، به صفحه قیمت گذاری Gemini API مراجعه کنید. برای یادگیری نحوه شمارش نشانهها، راهنمای توکن را ببینید.
ملاحظات اضافی
هنگام استفاده از کش زمینه، ملاحظات زیر را در نظر داشته باشید:
- حداقل تعداد توکن ورودی برای کش متنی 1024 برای 2.5 Flash و 2048 برای 2.5 Pro است. حداکثر همان حداکثر برای مدل داده شده است. (برای اطلاعات بیشتر در مورد شمارش نشانه ها، به راهنمای توکن مراجعه کنید).
- این مدل هیچ تمایزی بین نشانههای حافظه پنهان و نشانههای ورودی معمولی قائل نمیشود. محتوای ذخیره شده در حافظه پنهان پیشوندی برای درخواست است.
- هیچ محدودیت یا نرخ خاصی برای ذخیره سازی متن وجود ندارد. محدودیتهای نرخ استاندارد برای
GenerateContent
اعمال میشود و محدودیتهای رمز شامل توکنهای ذخیرهشده نیز میشود. - تعداد توکنهای ذخیرهشده در
usage_metadata
از عملیات ایجاد، دریافت و فهرست سرویس کش و همچنین درGenerateContent
هنگام استفاده از کش برگردانده میشود.