Кэширование промптов

Материал из llmdocs — справочник разработчика
Кэширование промптов
Принциппереиспользование KV-кэша общего префикса
Условиеточное совпадение начала промпта
Экономиядо ~90% стоимости и до ~80% задержки на кэшированной части
У провайдеровAnthropic, OpenAI, Google Gemini, DeepSeek
В открытых серверахvLLM (prefix caching), SGLang (RadixAttention), llama.cpp
Время жизниминуты — часы (зависит от провайдера)

Кэширование промптов (англ. prompt caching) — техника, при которой результат обработки начала промпта сохраняется и используется повторно в следующих запросах с тем же началом. Если каждый запрос к языковой модели начинается с одной и той же длинной системной инструкции, описания инструментов или документа на сотню страниц, модели не нужно каждый раз заново «читать» этот текст. Провайдеры API берут за кэшированные токены в разы меньше денег, а ответ начинается быстрее.

Как работает

При обработке промпта (фаза prefill) модель-трансформер вычисляет для каждого токена ключи и значения механизма внимания — KV-кэш. Он зависит только от предыдущих токенов, поэтому KV-кэш префикса «системная инструкция + документ» одинаков для всех запросов, которые с него начинаются. Сервер сохраняет этот кэш, и следующий запрос с тем же префиксом обрабатывает только новую часть.

Отсюда главное правило: кэш срабатывает лишь при точном совпадении начала промпта, токен в токен. Изменение одного символа в начале — например, текущего времени в системной инструкции — делает недействительным всё, что идёт после.

У провайдеров API

Провайдер Как включается Особенности
Anthropic (Claude) явные точки cache_control в запросе запись в кэш дороже обычного ввода, чтение — около 10% цены; TTL 5 минут (продлевается при использовании) или 1 час[1]
OpenAI автоматически для промптов от 1024 токенов скидка на кэшированный ввод, без доплаты за запись[2]
Google Gemini неявное автоматическое и явное с созданием объекта кэша и TTL явный кэш оплачивается за время хранения[3]

Пример для Anthropic API — кэшируется всё до отмеченного блока включительно:

response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    system=[
        {"type": "text", "text": "Ты — ассистент по документации проекта."},
        {"type": "text", "text": big_documentation,
         "cache_control": {"type": "ephemeral"}},
    ],
    messages=[{"role": "user", "content": "Как настроить авторизацию?"}],
)
print(response.usage)   # cache_creation_input_tokens, cache_read_input_tokens

Поля usage в ответе показывают, сколько токенов записано в кэш и сколько прочитано из него, — по ним проверяют, что кэш действительно работает.

В собственных серверах

Открытые инференс-серверы делают то же самое автоматически. В vLLM это Automatic Prefix Caching: блоки KV-кэша хешируются по содержимому и переиспользуются между запросами.[4] SGLang хранит префиксы в дереве (RadixAttention) и эффективно обслуживает много запросов с общими частями — например, несколько вариантов ответа на один вопрос или шаги агента.[5] llama.cpp сохраняет кэш между запросами в одном слоте и умеет записывать его на диск.

Как построить промпт под кэш

Порядок частей промпта — от самого стабильного к самому изменчивому:

  1. описание инструментов (tool use);
  2. системная инструкция;
  3. справочные документы, примеры, база знаний;
  4. история диалога;
  5. новый вопрос пользователя.

Практические советы:

  • не вставлять в начало дату, время, идентификаторы запроса и другие изменяющиеся значения — переносить их в конец;
  • сохранять стабильный порядок инструментов и документов (например, сортировать);
  • в многоходовых диалогах ставить точку кэширования на последнем сообщении — каждое следующее обращение будет переиспользовать всю предыдущую историю;
  • учитывать минимальную длину кэшируемого префикса (порядка 1–4 тысяч токенов в зависимости от модели) и время жизни кэша: при редких запросах он успевает истечь.

Где особенно полезно

  • Агенты и агенты для кода — на каждом шаге отправляется вся растущая история; без кэша стоимость растёт квадратично.
  • Чат с большим документом или кодовой базой — документ кэшируется один раз, вопросы задаются дёшево.
  • Few-shot с множеством примеров и длинные системные инструкции.
  • Пакетная обработка однотипных задач с общей инструкцией.

Кэширование промптов и RAG

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

См. также

Источники

  1. Anthropic Docs — Prompt caching
  2. OpenAI Docs — Prompt caching
  3. Google — Gemini API context caching
  4. vLLM — Automatic Prefix Caching
  5. Zheng et al. — SGLang: Efficient Execution of Structured Language Model Programs