Кэширование контекста

В типичном рабочем процессе ИИ вы можете снова и снова передавать в модель одни и те же входные токены. Используя функцию кэширования контекста Gemini API, вы можете один раз передать некоторый контент в модель, кэшировать входные токены, а затем обращаться к кэшированным токенам для последующих запросов. В определенных объемах использование кэшированных токенов обходится дешевле, чем повторная передача одного и того же набора токенов.

Когда вы кэшируете набор токенов, вы можете выбрать, как долго вы хотите, чтобы кеш существовал, прежде чем токены будут автоматически удалены. Эта продолжительность кэширования называется временем жизни (TTL). Если значение не установлено, значение TTL по умолчанию составляет 1 час. Стоимость кэширования зависит от размера входного токена и того, как долго вы хотите, чтобы токены сохранялись.

Кэширование контекста поддерживает как Gemini 1.5 Pro, так и Gemini 1.5 Flash.

Когда использовать контекстное кэширование

Кэширование контекста особенно хорошо подходит для сценариев, в которых к существенному исходному контексту неоднократно обращаются более короткие запросы. Рассмотрите возможность использования контекстного кэширования в таких случаях, как:

  • Чат-боты с подробными системными инструкциями
  • Повторный анализ длинных видеофайлов
  • Повторяющиеся запросы к большим наборам документов
  • Частый анализ репозитория кода или исправление ошибок

Как кэширование снижает затраты

Кэширование контекста — это платная функция, предназначенная для снижения общих эксплуатационных расходов. Выставление счетов зависит от следующих факторов:

  1. Количество токенов кэша: количество кэшированных входных токенов, оплачиваемых по сниженной ставке при включении в последующие запросы.
  2. Продолжительность хранения: количество времени хранения кэшированных токенов (TTL), оплата взимается на основе продолжительности TTL количества кэшированных токенов. Для TTL нет минимальных или максимальных границ.
  3. Другие факторы: взимаются другие сборы, например, за некэшированные входные токены и выходные токены.

Актуальную информацию о ценах можно найти на странице цен на Gemini API. Чтобы узнать, как считать жетоны, см. руководство по токенам .

Как использовать контекстное кэширование

В этом разделе предполагается, что вы установили Gemini SDK и настроили ключ API, как показано в кратком руководстве .

Генерация контента с использованием кеша

В следующем примере показано, как создать контент с помощью кэшированной системной инструкции и видеофайла.

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)

Получение списка кешей

Невозможно получить или просмотреть кэшированный контент, но вы можете получить метаданные кэша ( name , model , display_name , usage_metadata , create_time , update_time и expire_time ).

Чтобы вывести метаданные для всех загруженных кешей, используйте CachedContent.list() :

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

Обновить кэш

Вы можете установить новый ttl или expire_time для кеша. Изменение чего-либо еще в кеше не поддерживается.

В следующем примере показано, как обновить ttl кэша с помощью CachedContent.update() .

import datetime

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

Удалить кэш

Служба кэширования предоставляет операцию удаления для ручного удаления содержимого из кэша. В следующем примере показано, как удалить кеш с помощью CachedContent.delete() .

cache.delete()

Дополнительные соображения

При использовании контекстного кэширования учитывайте следующие соображения:

  • Минимальное количество входных токенов для кэширования контекста составляет 32 768, а максимальное соответствует максимальному для данной модели. (Подробнее о подсчете жетонов см. в руководстве по токенам ).
  • Модель не делает никакого различия между кэшированными токенами и обычными входными токенами. Кэшированное содержимое — это просто префикс к приглашению.
  • Для кэширования контекста не существует специальных ограничений по скорости или использованию; применяются стандартные ограничения скорости для GenerateContent , а ограничения токенов включают кэшированные токены.
  • Количество кэшированных токенов возвращается в usage_metadata из операций создания, получения и списка службы кэша, а также в GenerateContent при использовании кэша.