Bağlamı önbelleğe alma

Tipik bir yapay zeka iş akışında, bir modele aynı giriş jetonlarını tekrar tekrar iletebilirsiniz. Gemini API bağlam önbelleğe alma özelliğini kullanarak bazı içerikleri modele bir kez aktarabilir, giriş jetonlarını önbelleğe alabilir ve ardından sonraki istekler için önbelleğe alınan jetonlara başvurabilirsiniz. Belirli hacimlerde, önbelleğe alınmış jetonları kullanmak aynı jeton grubunu tekrar tekrar iletmek yerine daha düşük maliyetlidir.

Bir jeton grubunu önbelleğe aldığınızda, jetonlar otomatik olarak silinmeden önce önbelleğin ne kadar süre boyunca var olmasını istediğinizi seçebilirsiniz. Bu önbelleğe alma süresine geçerlilik süresi (TTL) denir. Ayarlanmazsa TTL varsayılan olarak 1 saat olur. Önbelleğe alma maliyeti, giriş jetonu boyutuna ve jetonların ne kadar süreyle kalmasını istediğinize bağlıdır.

Bağlam önbelleğe alma hem Gemini 1.5 Pro hem de Gemini 1.5 Flash'ı destekler.

Bağlam önbelleğe alma ne zaman kullanılır?

Bağlam önbelleğe alma, özellikle önemli bir başlangıç bağlamının daha kısa istekler tarafından tekrar tekrar referans verildiği senaryolara uygundur. Aşağıdaki gibi kullanım alanları için bağlama dayalı önbelleğe alma özelliğini kullanabilirsiniz:

  • Kapsamlı sistem talimatları içeren chatbot'lar
  • Uzun video dosyalarının tekrarlı analizi
  • Büyük doküman kümelerine yönelik yinelenen sorgular
  • Sık sık kod deposu analizi veya hata düzeltme

Önbelleğe alma maliyetleri nasıl azaltır?

Bağlam önbelleğe alma, genel operasyon maliyetlerini azaltmak için tasarlanmış ücretli bir özelliktir. Faturalandırma aşağıdaki faktörlere göre yapılır:

  1. Önbelleğe alınan jeton sayısı: Sonraki istemlere dahil edildiğinde daha düşük bir oranda faturalandırılan, önbelleğe alınan giriş jetonlarının sayısı.
  2. Depolama süresi: Önbelleğe alınan jetonların depolandığı süre (TTL). Önbelleğe alınan jeton sayısının TTL süresine göre faturalandırılır. TTL için minimum veya maksimum sınır yoktur.
  3. Diğer faktörler: Önbelleğe alınmamış giriş jetonları ve çıkış jetonları gibi diğer ücretler geçerlidir.

Güncel fiyatlandırma ayrıntıları için Gemini API fiyatlandırma sayfasına bakın. Jetonları nasıl sayacağınızı öğrenmek için Jeton kılavuzuna göz atın.

Bağlam önbelleğe alma özelliğini kullanma

Bu bölümde, bir Gemini SDK'sı (veya curl) yüklediğiniz ve hızlı başlangıç bölümünde gösterildiği gibi bir API anahtarı yapılandırdığınız varsayılmaktadır.

Önbelleği kullanarak içerik oluşturma

Aşağıdaki örnekte, önbelleğe alınmış bir sistem talimatı ve video dosyası kullanılarak nasıl içerik oluşturulacağı gösterilmektedir.

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)

Önbellekleri listeleme

Önbelleğe alınmış içeriği almak veya görüntülemek mümkün değildir ancak önbelleğe alınmış meta verileri (name, model, display_name, usage_metadata, create_time, update_time ve expire_time) alabilirsiniz.

Yüklenen tüm önbellekleri meta verileriyle birlikte listelemek için CachedContent.list() kullanın:

for cache in client.caches.list():
  print(cache)

Adını bildiğiniz bir önbellek nesnesinin meta verilerini almak için get özelliğini kullanın:

client.caches.get(name=name)

Önbelleği güncelleme

Önbelleğe yeni bir ttl veya expire_time ayarlayabilirsiniz. Önbelleğe alma ile ilgili başka bir şeyin değiştirilmesi desteklenmez.

Aşağıdaki örnekte, client.caches.update() kullanılarak bir önbelleğin ttl değerinin nasıl güncelleneceği gösterilmektedir.

from google import genai
from google.genai import types

client.caches.update(
  name = cache.name,
  config  = types.UpdateCachedContentConfig(
      ttl='300s'
  )
)

Süre sonu saatini ayarlamak için datetime nesnesi veya ISO biçimli bir tarih/saat dizesi (2025-01-27T16:02:36.473528+00:00 gibi dt.isoformat()) kabul edilir. Saatiniz bir saat dilimi içermelidir (datetime.utcnow() saat dilimi eklemez, datetime.now(datetime.timezone.utc) saat dilimi ekler).

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
  )
)

Önbelleği silme

Önbelleğe alma hizmeti, içeriği önbellekten manuel olarak kaldırmak için bir silme işlemi sağlar. Aşağıdaki örnekte bir önbelleğin nasıl silineceği gösterilmektedir:

client.caches.delete(cache.name)

Göz önünde bulundurulacak diğer noktalar

Bağlam önbelleğe alma özelliğini kullanırken aşağıdaki hususları göz önünde bulundurun:

  • Bağlam önbelleğe alma için minimum giriş jetonu sayısı 32.768'dir ve maksimum değer, belirli modelin maksimum değeriyle aynıdır. (Jeton sayma hakkında daha fazla bilgi için Jeton rehberi başlıklı makaleyi inceleyin.)
  • Model, önbelleğe alınmış jetonlar ile normal giriş jetonları arasında herhangi bir ayrım yapmaz. Önbelleğe alınan içerik, istem için bir ön ektir.
  • Bağlam önbelleğe alma işleminde özel bir ücret veya kullanım sınırı yoktur. GenerateContent için standart ücret sınırları geçerlidir ve jeton sınırları, önbelleğe alınmış jetonları içerir.
  • Önbelleğe alınan jetonların sayısı, önbelleğe alma hizmetinin oluşturma, alma ve listeleme işlemlerinden usage_metadata içinde ve önbelleğe alma işlemi sırasında GenerateContent içinde döndürülür.