Кэширование промптов
| Принцип | переиспользование 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 сохраняет кэш между запросами в одном слоте и умеет записывать его на диск.
Как построить промпт под кэш
Порядок частей промпта — от самого стабильного к самому изменчивому:
- описание инструментов (tool use);
- системная инструкция;
- справочные документы, примеры, база знаний;
- история диалога;
- новый вопрос пользователя.
Практические советы:
- не вставлять в начало дату, время, идентификаторы запроса и другие изменяющиеся значения — переносить их в конец;
- сохранять стабильный порядок инструментов и документов (например, сортировать);
- в многоходовых диалогах ставить точку кэширования на последнем сообщении — каждое следующее обращение будет переиспользовать всю предыдущую историю;
- учитывать минимальную длину кэшируемого префикса (порядка 1–4 тысяч токенов в зависимости от модели) и время жизни кэша: при редких запросах он успевает истечь.
Где особенно полезно
- Агенты и агенты для кода — на каждом шаге отправляется вся растущая история; без кэша стоимость растёт квадратично.
- Чат с большим документом или кодовой базой — документ кэшируется один раз, вопросы задаются дёшево.
- Few-shot с множеством примеров и длинные системные инструкции.
- Пакетная обработка однотипных задач с общей инструкцией.
Кэширование промптов и RAG
Кэширование не заменяет RAG, но меняет компромиссы: если база знаний помещается в контекстное окно и стабильна, её можно целиком положить в кэшируемый префикс и обойтись без поиска. Когда документов больше или они часто меняются, по-прежнему нужен поиск. Не следует путать с семантическим кэшем — хранением готовых ответов на похожие вопросы: он экономит весь вызов модели, но рискует отдать неподходящий ответ.