№119

12 ноября 2026

инструменты · агенты · данные

Как платить меньше за повторяющийся промпт: неизменное в начало, переменное в конец

Если сервис много раз отправляет через API Anthropic или OpenAI один и тот же системный промпт, его неизменная часть читается из кэша, то есть из сохранённой у провайдера копии.

3 мин чтения · кэш: 0,1 цены токена · 15–30 минут

Где подвох
Кэш живёт считанные минуты, у Anthropic 5 по умолчанию. Один изменившийся символ сбрасывает кэш для всего, что идёт после него, поэтому переменное нельзя ставить раньше неизменного.

Как повторить

  1. Найдите промпт, который уходит в модель много раз почти без изменений: системная инструкция, документы для поиска по базе (RAG), примеры ответов, описание инструментов агента.
  2. Разделите его на две части. В первой то, что одинаково при каждом вызове. Во второй то, что меняется: дата, метка времени, имя пользователя, его сообщение.
  3. Соберите промпт заново: неизменная часть первой, переменная после неё.
  4. У Anthropic поставьте точку кэша cache_control на последний неизменный блок, тот, что стоит прямо перед переменной частью:
   "system": [
     { "type": "text", "text": "Статичная инструкция и примеры..." },
     { "type": "text", "text": "Ещё статика...", "cache_control": { "type": "ephemeral" } }
   ],
   "messages": [{ "role": "user", "content": "Дата, данные пользователя, вопрос" }]

Поставить точку раньше можно, но тогда часть статики после неё при каждом запросе будет перечитываться заново - выигрыш меньше. Поставить её внутри переменной части нельзя: кэш совпадёт в лучшем случае на один запрос, потом сломается. У OpenAI кэш включается автоматически и точка не нужна, но порядок блоков всё равно решает исход.

  1. Если в работе несколько провайдеров, настройте приём под каждого отдельно.

Как проверить результат

Отправьте один и тот же запрос дважды подряд с разницей в пару секунд. Во втором ответе API поле чтения из кэша (cache_read_input_tokens у Anthropic, у других провайдеров похожее) должно стать ненулевым и примерно равным длине неизменной части в токенах. На следующих запросах чтение растёт, а запись в кэш (cache_creation_input_tokens) после первого вызова падает. Если в обоих полях нули, чаще всего неизменный блок короче минимума: у моделей Anthropic это от 512 до 4096 токенов в зависимости от модели, у OpenAI кэш тоже работает только от определённой длины. Реже причина в том, что точка кэша стоит не там или в неизменную часть попало переменное, например метка времени.

Как это устроено

Провайдер считает хэш (цифровой отпечаток) от начала запроса и сверяет его с уже обработанными. Совпадение идёт подряд от первого токена, поэтому текст должен совпадать до символа. Готовую часть модель берёт из кэша и заново обрабатывает только то, что после первого расхождения. Если метка времени стоит перед общей инструкцией, совпадения нет ни разу: вы на каждом вызове платите за запись и не получаете скидку за чтение. В документации Anthropic разобран такой случай: метка времени в шестом блоке при точке кэша на нём же. Лечится переносом точки на пятый блок, последний неизменный.

Экономия на повторяющейся части у Anthropic может доходить до 90% и выше, у части моделей чтение стоит 0,05–0,025 цены токена. У OpenAI похожая скидка на чтение действует по умолчанию. Срок жизни кэша у Anthropic за доплату продлевается до часа. У OpenAI на новых моделях он 30 минут с опцией до 12 часов, на более старых может доходить до суток, если в организации не включён режим нулевого хранения данных. Если промпт приходит реже, чем раз в несколько минут у Anthropic или раз в полчаса-час у OpenAI на новых моделях, выигрыша не будет, а за первую запись вы переплатите.

Ссылки

  • Anthropic: Prompt caching: как ставить cache_control, минимальная длина по моделям, цены записи и чтения.
  • OpenAI: Prompt caching: как работает автоматический кэш OpenAI и сколько он живёт.

Источник: sergei_notevskii, Instagram Reels.

Больше подобного

Разбираю по находке в день и складываю сюда. Свежее и то, что до сайта не доехало, выходит в канале «Евдокимов как обычно».