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

> Повторное использование уже вычисленного начала промпта (KV-кэша) между запросами к LLM; снижает стоимость и задержку при длинных системных инструкциях, документах и диалогах.

Источник: https://llmdocs.ru/wiki/prompt-caching/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Принцип**: переиспользование KV-кэша общего префикса
- **Условие**: точное совпадение начала промпта
- **Экономия**: до ~90% стоимости и до ~80% задержки на кэшированной части
- **У провайдеров**: Anthropic, OpenAI, Google Gemini, DeepSeek
- **В открытых серверах**: vLLM (prefix caching), SGLang (RadixAttention), llama.cpp
- **Время жизни**: минуты — часы (зависит от провайдера)
**Кэширование промптов** (англ. *prompt caching*) — техника, при которой результат обработки начала промпта сохраняется и используется повторно в следующих запросах с тем же началом. Если каждый запрос к [языковой модели](https://llmdocs.ru/wiki/llm.md) начинается с одной и той же длинной системной инструкции, описания инструментов или документа на сотню страниц, модели не нужно каждый раз заново «читать» этот текст. Провайдеры API берут за кэшированные [токены](https://llmdocs.ru/wiki/tokenization.md) в разы меньше денег, а ответ начинается быстрее.

## Как работает

При обработке промпта ([фаза prefill](https://llmdocs.ru/wiki/vllm.md)) модель-[трансформер](https://llmdocs.ru/wiki/transformer.md) вычисляет для каждого токена ключи и значения механизма внимания — **KV-кэш**. Он зависит только от предыдущих токенов, поэтому KV-кэш префикса «системная инструкция + документ» одинаков для всех запросов, которые с него начинаются. Сервер сохраняет этот кэш, и следующий запрос с тем же префиксом обрабатывает только новую часть.

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

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

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

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

```python
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](https://llmdocs.ru/wiki/tool-use.md));
2. системная инструкция;
3. справочные документы, примеры, база знаний;
4. история диалога;
5. новый вопрос пользователя.

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

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

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

- **[Агенты](https://llmdocs.ru/wiki/ai-agent.md) и [агенты для кода](https://llmdocs.ru/wiki/coding-agents.md)** — на каждом шаге отправляется вся растущая история; без кэша стоимость растёт квадратично.
- **Чат с большим документом** или кодовой базой — документ кэшируется один раз, вопросы задаются дёшево.
- **Few-shot с множеством примеров** и длинные системные инструкции.
- **Пакетная обработка** однотипных задач с общей инструкцией.

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

Кэширование не заменяет [RAG](https://llmdocs.ru/wiki/rag.md), но меняет компромиссы: если база знаний помещается в [контекстное окно](https://llmdocs.ru/wiki/context-window.md) и стабильна, её можно целиком положить в кэшируемый префикс и обойтись без поиска. Когда документов больше или они часто меняются, по-прежнему нужен поиск. Не следует путать с **семантическим кэшем** — хранением готовых ответов на похожие вопросы: он экономит весь вызов модели, но рискует отдать неподходящий ответ.

## См. также

- [Контекстное окно](https://llmdocs.ru/wiki/context-window.md)
- [vLLM и инференс-серверы](https://llmdocs.ru/wiki/vllm.md)
- [Промпт-инжиниринг](https://llmdocs.ru/wiki/prompt-engineering.md)
- [ИИ-агент](https://llmdocs.ru/wiki/ai-agent.md)

## Источники

1. [Anthropic Docs — Prompt caching](https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching)
2. [OpenAI Docs — Prompt caching](https://platform.openai.com/docs/guides/prompt-caching)
3. [Google — Gemini API context caching](https://ai.google.dev/gemini-api/docs/caching)
4. [vLLM — Automatic Prefix Caching](https://docs.vllm.ai/en/latest/features/automatic_prefix_caching.html)
5. [Zheng et al. — SGLang: Efficient Execution of Structured Language Model Programs](https://arxiv.org/abs/2312.07104)
