Перейти к основному содержимому
  1. Теория на русском языке/
  2. Оптимизация инференса LLM/

Кэширование префикса (Prefix caching)

·583 слов·3 минут
Оглавление

Кэширование префикса (также называют prompt caching или context caching) — одна из самых эффективных техник для снижения задержки и стоимости инференса LLM. Особенно полезно в продакшене, где часто повторяются структуры промптов: чаты, агенты, RAG-пайплайны.

Суть проста: если сохранить KV-кэш для одного запроса, то новый запрос с тем же префиксом может не пересчитывать эту часть промпта, а сразу использовать готовый результат.

Prefix caching отличается от семантического кэширования, где в базе хранятся полный ввод и вывод, и только точное совпадение (или очень похожий запрос) даёт кэш-хит.

Как работает кэширование префикса
#

  1. На этапе prefill модель делает проход по всему входу и строит KV-кэш для attention.
  2. На этапе decode модель генерирует выходные токены по одному, используя кэшированные состояния из prefill. KV-пары для каждого токена хранятся в памяти GPU.
  3. Для нового запроса с тем же префиксом можно пропустить проход по кэшированной части и сразу продолжить с последнего токена префикса.
Important

Это работает только если префикс совпадает полностью, включая пробелы и форматирование. Даже один символ разницы ломает кэш.

Например, чат-бот с таким системным промптом:

You are a helpful AI writer. Please write in a professional manner.

Этот промпт не меняется от диалога к диалогу. Вместо пересчёта каждый раз, вы сохраняете его KV-кэш один раз. Когда приходят новые сообщения, используете этот кэш, обрабатывая только новую часть промпта.

Чем отличается KV caching от prefix caching
#

KV caching — это хранение промежуточных attention-состояний каждого токена в памяти GPU. Изначально термин описывал кэширование внутри одного запроса, что критично для ускорения decode.

LLM работают авторегрессивно: на этапе decode каждый новый токен строится на основе предыдущих (т.е. с использованием KV-кэша). Без KV-кэша модель пересчитывала бы всё для каждого шага (а контекст только растёт), что крайне неэффективно.

Если распространить идею кэширования на несколько запросов, корректнее говорить о prefix caching. Поскольку вычисление KV-кэша зависит только от всех предыдущих токенов, разные запросы с одинаковым префиксом могут использовать один и тот же кэш и не пересчитывать его.

Как строить промпты для максимального кэш-хита
#

Prefix caching помогает только при стабильных промптах. Вот лучшие практики для максимизации кэш-хитов:

  • Ставьте статичный контент в начало: всё постоянное или редко меняющееся размещайте в начале промпта (системные сообщения, инструкции, общий контекст). Динамику и пользовательские данные — в конец.
  • Группируйте похожие запросы: объединяйте запросы (особенно при обслуживании многих пользователей/агентов) с одинаковым префиксом, чтобы эффективнее переиспользовать кэш.
  • Избегайте динамики в префиксе: не вставляйте timestamp, request ID и другие переменные в начало промпта — это снижает кэш-хит.
  • Используйте детерминированную сериализацию: сериализация (например, JSON) должна быть стабильной по порядку ключей и структуре. Недетерминированная сериализация приводит к промахам кэша даже при одинаковом содержимом.
  • Анализируйте кэш-хиты: регулярно проверяйте эффективность кэша и ищите точки для оптимизации.

Внедрение и прирост производительности
#

Prefix caching может уменьшить вычисления и задержку на порядок в ряде сценариев.

  • Anthropic Claude Sonnet поддерживает prompt caching: до 90% экономии и 85% снижения задержки для длинных промптов.
  • Google Gemini делает скидку на кэшированные токены и отдельно считает стоимость хранения.
  • Фреймворки vLLM, TensorRT-LLM, SGLang поддерживают автоматический prefix caching для разных open-source LLM.

В агентных пайплайнах эффект ещё сильнее: иногда соотношение входных и выходных токенов 100:1, и пересчёт больших промптов становится крайне дорогим.

Ограничения
#

Для приложений с длинными повторяющимися промптами prefix caching может радикально снизить задержку и стоимость. Но со временем размер KV-кэша может стать очень большим. Память GPU ограничена, и хранение длинных префиксов для многих пользователей быстро её съедает. Нужны стратегии вытеснения кэша или многоуровневая память.

Open-source сообщество активно работает над распределёнными стратегиями сервинга. Подробнее см. prefix-aware routing.

Дополнительные ресурсы
#