Как повторить
- Найдите промпт, который уходит в модель много раз почти без изменений: системная инструкция, документы для поиска по базе (RAG), примеры ответов, описание инструментов агента.
- Разделите его на две части. В первой то, что одинаково при каждом вызове. Во второй то, что меняется: дата, метка времени, имя пользователя, его сообщение.
- Соберите промпт заново: неизменная часть первой, переменная после неё.
- У Anthropic поставьте точку кэша
cache_controlна последний неизменный блок, тот, что стоит прямо перед переменной частью:
"system": [
{ "type": "text", "text": "Статичная инструкция и примеры..." },
{ "type": "text", "text": "Ещё статика...", "cache_control": { "type": "ephemeral" } }
],
"messages": [{ "role": "user", "content": "Дата, данные пользователя, вопрос" }]Поставить точку раньше можно, но тогда часть статики после неё при каждом запросе будет перечитываться заново - выигрыш меньше. Поставить её внутри переменной части нельзя: кэш совпадёт в лучшем случае на один запрос, потом сломается. У OpenAI кэш включается автоматически и точка не нужна, но порядок блоков всё равно решает исход.
- Если в работе несколько провайдеров, настройте приём под каждого отдельно.
Как проверить результат
Отправьте один и тот же запрос дважды подряд с разницей в пару секунд. Во втором ответе 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.