Buforowanie kontekstu

W typowym przepływie pracy związanym z AI można wielokrotnie przekazywać te same tokeny wejściowe do modelu. Korzystając z funkcji buforowania kontekstu w interfejsie Gemini API, możesz przekazać modelowi pewną treść, zapisać w pamięci podręcznej tokeny wejściowe, a następnie odwoływać się do tych tokenów w kolejnych żądaniach. Przy pewnych wolumenach korzystanie z tokenów w pamięci podręcznej jest tańsze niż wielokrotne przekazywanie tego samego zbioru tokenów.

Gdy przechowujesz w pamięci podręcznej zestaw tokenów, możesz określić, jak długo ma ona istnieć, zanim tokeny zostaną automatycznie usunięte. Czas buforowania jest nazywany czasem życia danych (TTL). Jeśli nie jest ustawiony, domyślny czas życia wynosi 1 godzinę. Koszt buforowania zależy od rozmiaru tokena wejściowego i tego, jak długo mają być przechowywane.

Buforowanie kontekstu obsługuje modele Gemini 1.5 Pro i Gemini 1.5 Flash.

Kiedy używać buforowania kontekstu

Kontekstowe buforowanie sprawdza się szczególnie w sytuacjach, w których znaczny kontekst początkowy jest wielokrotnie odwoływany do krótszych żądań. Zastanów się nad użyciem buforowania kontekstu w przypadku:

  • Czatboty z rozbudowanymi instrukcjami systemowymi
  • Wielokrotne analizowanie długich plików wideo
  • Cykliczne zapytania dotyczące dużych zbiorów dokumentów
  • częsta analiza repozytorium kodu lub poprawianie błędów;

Jak buforowanie zmniejsza koszty

Pamięć podręczna kontekstu to płatna funkcja, która ma na celu obniżenie ogólnych kosztów operacyjnych. Płatności są ustalane na podstawie następujących czynników:

  1. Cache token count (Liczba tokenów pamięci podręcznej): liczba tokenów wejściowych w pamięci podręcznej, które są rozliczane według niższej stawki, gdy są uwzględniane w kolejnych promptach.
  2. Czas przechowywania: czas przechowywania tokenów w pamięci podręcznej (TTL). Opłata jest obliczana na podstawie czasu TTL liczby tokenów w pamięci podręcznej. Nie ma minimalnej ani maksymalnej wartości TTL.
  3. Inne czynniki: obowiązują inne opłaty, np. za tokeny wejściowe i wyjściowe, które nie są przechowywane w pamięci podręcznej.

Aktualne informacje o cenach znajdziesz na tej stronie dotyczącej cen Gemini API. Więcej informacji o liczeniu tokenów znajdziesz w przewodniku po tokenach.

Jak korzystać z pamięci podręcznej kontekstu

W tej sekcji zakładamy, że masz zainstalowany pakiet SDK Gemini (lub masz zainstalowany curl) oraz skonfigurowany klucz interfejsu API zgodnie z instrukcjami w artykule Szybki start.

Generuj treści z wykorzystaniem pamięci podręcznej

Ten przykład pokazuje, jak generować treści za pomocą instrukcji systemu z poziomu pamięci podręcznej i pliku wideo.

import os
import google.generativeai as genai
from google.generativeai import caching
import datetime
import time

# Get your API key from https://aistudio.google.com/app/apikey
# and access your API key as an environment variable.
# To authenticate from a Colab, see
# https://github.com/google-gemini/cookbook/blob/main/quickstarts/Authentication.ipynb
genai.configure(api_key=os.environ['API_KEY'])

# Download video file
# curl -O https://storage.googleapis.com/generativeai-downloads/data/Sherlock_Jr_FullMovie.mp4

path_to_video_file = 'Sherlock_Jr_FullMovie.mp4'

# Upload the video using the Files API
video_file = genai.upload_file(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 = genai.get_file(video_file.name)

print(f'Video processing complete: {video_file.uri}')

# Create a cache with a 5 minute TTL
cache = caching.CachedContent.create(
    model='models/gemini-1.5-flash-001',
    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=datetime.timedelta(minutes=5),
)

# Construct a GenerativeModel which uses the created cache.
model = genai.GenerativeModel.from_cached_content(cached_content=cache)

# Query the model
response = model.generate_content([(
    'Introduce different characters in the movie by describing '
    'their personality, looks, and names. Also list the timestamps '
    'they were introduced for the first time.')])

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)

Wyświetlanie pamięci podręcznej

Nie można pobrać ani wyświetlić treści z pamięci podręcznej, ale można pobrać metadane z pamięci podręcznej (name, model, display_name, usage_metadata, create_time, update_time i expire_time).

Aby wyświetlić metadane wszystkich przesłanych pamięci podręcznych, użyj CachedContent.list():

for c in caching.CachedContent.list():
  print(c)

Aktualizowanie pamięci podręcznej

Możesz ustawić nowy ttl lub expire_time dla pamięci podręcznej. Zmiana innych ustawień pamięci podręcznej nie jest obsługiwana.

Ten przykład pokazuje, jak zaktualizować ttl pamięci podręcznej za pomocą CachedContent.update().

import datetime

cache.update(ttl=datetime.timedelta(hours=2))

Usuwanie pamięci podręcznej

Usługa buforowania umożliwia ręczne usuwanie treści z pamięci podręcznej. Poniższy przykład pokazuje, jak usunąć pamięć podręczną za pomocą CachedContent.delete().

cache.delete()

Uwagi dodatkowe

Gdy korzystasz z pamięci podręcznej kontekstu, pamiętaj o tych kwestiach:

  • Minimalna liczba tokenów wejściowych do przechowywania w pamięci podręcznej w kontekście to 32 768, a maksymalna jest taka sama jak maksymalna liczba tokenów dla danego modelu. Więcej informacji o liczeniu tokenów znajdziesz w przewodniku po tokenach.
  • W modelu nie ma rozróżnienia między tokenami w pamięci podręcznej a zwykłymi tokenami wejściowymi. Treść w pamięci podręcznej jest po prostu prefiksem promptu.
  • Nie ma żadnych specjalnych limitów szybkości ani limitów użycia w przypadku buforowania kontekstu. Obowiązują standardowe limity szybkości dla GenerateContent, a limity tokenów obejmują tokeny buforowane.
  • Liczba tokenów zapisanych w pamięci podręcznej jest zwracana w funkcji usage_metadata podczas operacji tworzenia, pobierania i wyświetlania listy usług pamięci podręcznej, a także w GenerateContent, gdy używasz pamięci podręcznej.