Kontext-Caching

In einem typischen KI-Workflow übergeben Sie möglicherweise immer wieder dieselben Eingabetokens an ein Modell. Mit der Kontext-Caching-Funktion der Gemini API können Sie Inhalte einmal an das Modell übergeben, die Eingabetokens im Cache speichern und dann bei nachfolgenden Anfragen auf die im Cache gespeicherten Tokens verweisen. Bei bestimmten Volumina ist die Verwendung von gecachten Tokens kostengünstiger als die wiederholte Weitergabe desselben Token-Korpus.

Wenn Sie eine Reihe von Tokens im Cache speichern, können Sie festlegen, wie lange der Cache vorhanden sein soll, bevor die Tokens automatisch gelöscht werden. Diese Cachedauer wird als Gültigkeitsdauer (TTL) bezeichnet. Wenn sie nicht festgelegt ist, wird standardmäßig eine TTL von 1 Stunde verwendet. Die Kosten für das Caching hängen von der Größe des Eingabetokens und davon ab, wie lange die Tokens gespeichert bleiben sollen.

Das Kontext-Caching wird sowohl von Gemini 1.5 Pro als auch von Gemini 1.5 Flash unterstützt.

Wann Kontext-Caching verwendet werden sollte

Kontext-Caching eignet sich besonders für Szenarien, bei denen in kürzeren Anfragen wiederholt auf eine hohe anfängliche Kontextmenge verwiesen wird. Ziehen Sie die Verwendung von Kontext-Caching für Anwendungsfälle wie diese in Betracht:

  • Chatbots mit ausführlichen Systemanweisungen
  • Wiederholte Analyse langer Videodateien
  • Wiederkehrende Abfragen großer Dokumentgruppen
  • Häufige Analyse des Code-Repositorys oder Fehlerkorrektur

So senken Sie mit Caching die Kosten

Kontext-Caching ist eine kostenpflichtige Funktion, mit der sich die Gesamtbetriebskosten senken lassen. Die Abrechnung erfolgt anhand der folgenden Faktoren:

  1. Anzahl der Cache-Tokens: Die Anzahl der im Cache gespeicherten Eingabetokens, für die ein ermäßigter Tarif für die Nutzung in nachfolgenden Prompts gilt.
  2. Speicherdauer: Die Zeit, über die hinweg im Cache gespeicherte Tokens erhalten werden (TTL). Die Abrechnung erfolgt basierend auf der TTL-Dauer der Anzahl der im Cache gespeicherten Tokens. Es gibt keine Mindest- oder Höchstwerte für die TTL.
  3. Andere Faktoren: Es fallen weitere Gebühren an, z. B. für nicht im Cache gespeicherte Eingabe- und Ausgabetokens.

Aktuelle Preisdetails finden Sie auf der Preisseite der Gemini API. Weitere Informationen zum Zählen von Tokens finden Sie im Token-Leitfaden.

Kontext-Caching verwenden

In diesem Abschnitt wird davon ausgegangen, dass Sie ein Gemini SDK (oder curl) installiert und einen API-Schlüssel konfiguriert haben, wie in der Kurzanleitung gezeigt.

Inhalte mithilfe eines Caches generieren

Im folgenden Beispiel wird gezeigt, wie Inhalte mit einer im Cache gespeicherten Systemanleitung und Videodatei generiert werden.

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)

Caches auflisten

Es ist nicht möglich, im Cache gespeicherte Inhalte abzurufen oder anzusehen. Sie können jedoch Cache-Metadaten (name, model, display_name, usage_metadata, create_time, update_time und expire_time) abrufen.

Verwenden Sie CachedContent.list(), um Metadaten für alle hochgeladenen Caches aufzulisten:

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

Wenn Sie die Metadaten für ein Cacheobjekt abrufen möchten und den Namen kennen, verwenden Sie get:

client.caches.get(name=name)

Cache aktualisieren

Sie können für einen Cache eine neue ttl oder expire_time festlegen. Andere Änderungen am Cache werden nicht unterstützt.

Im folgenden Beispiel wird gezeigt, wie die ttl eines Caches mit client.caches.update() aktualisiert wird.

from google import genai
from google.genai import types

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

Zum Festlegen des Ablaufdatums wird entweder ein datetime-Objekt oder ein im ISO-Format formatierter Datetime-String (dt.isoformat(), z. B. 2025-01-27T16:02:36.473528+00:00) akzeptiert. Die Zeit muss eine Zeitzone enthalten. datetime.utcnow() enthält keine Zeitzone, datetime.now(datetime.timezone.utc) hingegen schon.

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

Cache löschen

Der Caching-Dienst bietet einen Löschvorgang zum manuellen Entfernen von Inhalten aus dem Cache. Im folgenden Beispiel wird gezeigt, wie ein Cache gelöscht wird:

client.caches.delete(cache.name)

Weitere Überlegungen

Beachten Sie bei der Verwendung des Kontext-Cachings Folgendes:

  • Die Mindestanzahl der Eingabetokens für das Kontext-Caching beträgt 32.768, die Maximalzahl entspricht der maximalen Anzahl für das jeweilige Modell. Weitere Informationen zum Zählen von Tokens finden Sie im Token-Leitfaden.
  • Das Modell unterscheidet nicht zwischen im Cache gespeicherten Tokens und regulären Eingabetokens. Im Cache gespeicherte Inhalte sind einfach ein Präfix für den Prompt.
  • Für das Kontext-Caching gelten keine speziellen Raten- oder Nutzungslimits. Es gelten die Standardlimits für GenerateContent. Tokenlimits umfassen auch gecachte Tokens.
  • Die Anzahl der im Cache gespeicherten Tokens wird im usage_metadata von den Vorgängen „create“, „get“ und „list“ des Cache-Dienstes zurückgegeben. Sie wird auch in GenerateContent zurückgegeben, wenn der Cache verwendet wird.