Кэширование промпта
GigaChat хранит префиксный key-value (KV) кэш в течение короткого окна. Когда
последующий запрос имеет неизменный префикс, совпадающий с предыдущим, GigaChat
переиспользует сохранённое состояние вместо повторной обработки этих токенов и
сообщает число переиспользованных токенов как precached_prompt_tokens.
Шлюз отдаёт это значение как OpenAI
usage.prompt_tokens_details.cached_tokens и Anthropic
cache_read_input_tokens, поэтому любой OpenAI/Anthropic-клиент может наблюдать
попадания в кэш без изменения своего кода.
Что было измерено
Поведение ниже измерено на живом GigaChat API с GigaChat-2-Max и стабильным
системным промптом примерно на 1200 токенов. Считайте эти числа порядком
величины, а не контрактом.
| Наблюдение | Результат |
|---|---|
| Время жизни кэша (TTL) после последнего попадания | примерно 30 секунд |
| Переиспользованные токены на повторном длинном префиксе | до ~99% токенов промпта |
Доля попаданий при фиксированном X-Session-ID | 100% (15/15, два прогона) |
Доля попаданий при случайном X-Session-ID на каждый вызов | 87% (13/15, два прогона) |
Отсюда два вывода:
- Кэш недолговечен. Он помогает интерактивным сценариям (агенты, чат, многошаговые циклы с инструментами, повторные попытки), где следующие запросы приходят за секунды, и почти не помогает пакетным задачам с интервалом в минуты.
- Стабильный
X-Session-IDповышает долю попаданий. Он удерживает запросы на той же записи кэша, а не полагается на собственную маршрутизацию вышестоящего сервиса.
Как включить
1. Проброс заголовка клиентом
Любой клиент может передать X-Session-ID. Шлюз пересылает его наверх без
изменений:
curl http://localhost:8090/v1/chat/completions \
-H "Authorization: Bearer <proxy-api-key>" \
-H "X-Session-ID: conversation-123" \
-H "Content-Type: application/json" \
-d '{"model": "GigaChat-2-Max", "messages": [{"role": "user", "content": "..."}]}'
Используйте один идентификатор на логический диалог и разные для несвязанных
диалогов. GIGACHAT_SESSION_ID задаёт глобальное значение по умолчанию, которое
перекрывается заголовком запроса. Рабочий пример лежит в
examples/openai/chat_completions/basic/session_cache_usage.py.
2. Идентификатор сессии из префикса
Многие OpenAI/Anthropic/Gemini-клиенты не умеют передавать свои заголовки. Если
включено, шлюз собирает стабильный X-Session-ID из собственного стабильного
префикса запроса (односторонний хэш текста промпта, а не сам текст):
GPT2GIGA_CACHE_SESSION_ENABLED=True
GPT2GIGA_CACHE_SESSION_SCOPE=system
GPT2GIGA_CACHE_SESSION_MIN_PREFIX_TOKENS=1024
| Переменная | По умолчанию | Назначение |
|---|---|---|
GPT2GIGA_CACHE_SESSION_ENABLED | False | Собирать X-Session-ID из стабильного префикса запроса. |
GPT2GIGA_CACHE_SESSION_SCOPE | system | system — хэш только системного промпта; prefix дополнительно включает ведущий пользовательский ход. system стоит по умолчанию, потому что остается стабильным между ходами диалога. |
GPT2GIGA_CACHE_SESSION_MIN_PREFIX_TOKENS | 1024 | Минимальная оценка токенов префикса, при которой идентификатор сессии применяется. |
Идентификатор сессии из префикса работает для OpenAI Chat Completions, OpenAI
Responses, Anthropic Messages и Gemini GenerateContent, включая потоковые запросы.
Для Responses системный префикс включает instructions и ведущие сообщения
system или developer внутри input. Режим prefix также включает первый
пользовательский ход. Если шлюз восстанавливает историю диалога, он использует
собранный префикс: следующий запрос может переиспользовать сессию без повторной
передачи этого префикса.
Хэш учитывает фактическую модель upstream после применения настроек шлюза, модели маршрута и доверенных переопределений модели. Поэтому разные модели получают разные идентификаторы для одного префикса. Если upstream выбирает модель через assistant или thread, в хэше используется соответствующий идентификатор. Идентификатор сессии из префикса не применяется, если:
- клиент уже передал
X-Session-ID; - задан
GIGACHAT_SESSION_ID(приоритет у значения оператора); - в запросе нет пригодного префикса;
- префикс короче
GPT2GIGA_CACHE_SESSION_MIN_PREFIX_TOKENS(короткие промпты дают мало выгоды, поэтому их не трогают).
Такой идентификатор сессии не меняет промпт или настройки генерации. Он влияет
на маршрутизацию кэша upstream. Когда GigaChat
возвращает идентификатор сессии в заголовках ответа, шлюз отдаёт его как
metadata.gigachat_x_session_id; для собранной сессии это односторонний хэш
самого вызывающего, а не сырой текст промпта.
Где кэш помогает
Время жизни ~30 секунд подходит шаблонам запросов, которые повторяются за секунды:
- Многошаговые агенты и циклы инструментов. Каждый шаг заново отправляет растущую историю; неизменный префикс кэшируется между шагами.
- Повторные попытки и fallback. Повтор через секунды после таймаута переиспользует префикс.
- Параллельные подзадачи с общим промптом. Одновременные вызовы с одним системным промптом попадают в одну запись.
- Интерактивный чат. Следующий ход в том же диалоге переиспользует прежнюю историю.
Почти не помогает пакетным или плановым задачам с интервалом в минуты и запросам, чей префикс меняется на каждом вызове.
Как проверить попадания в кэш
Смотрите usage.prompt_tokens_details.cached_tokens (формат OpenAI) или
cache_read_input_tokens (формат Anthropic) в ответе. Ненулевое значение
означает, что вышестоящий сервис переиспользовал кэшированные токены для этого
запроса.