Ваш счет за ИИ утроился за одну ночь. Модель, объем трафика и даже текст промптов остались прежними; виновником стала одна единственная строка кода, которая нарушила работу кэширования промптов OpenAI.
Почему кэширование имеет значение
Кэширование промптов у провайдера экономит ваши деньги, пропуская повторную обработку любого запроса, который начинается с байт-в-байт идентичного префикса. Если первые токены совпадают с предыдущим вызовом, провайдер повторно использует уже вычисленное представление этих токенов и взимает плату только за новый суффикс. Правило строгое: совпадение должно быть точным, а не просто похожим. Один отличающийся токен в начале уничтожает всё попадание в кэш.
Ошибка, уничтожившая показатель попадания в кэш
В нашем агенте мы поместили текущую метку времени в самый верх системного промпта, чтобы дать модели ощущение «настоящего момента». Поскольку метка времени меняется каждую секунду, последовательность первых токенов была уникальной для каждого запроса. Кэш никогда не находил совпадений, поэтому каждый вызов обходился в полную стоимость за 18 000 статических токенов, следовавших далее — схемы инструментов, фрагменты документации, примеры few-shot и фиксированные инструкции. Результатом стал 0% показатель попадания в кэш (cache hit rate) и утроившийся счет.
Перестановка для обеспечения кэшируемости
Исправление простое: держите всё, что никогда не меняется, в начале промпта, а любые изменяемые данные переносите в конец.
Статический префикс (кэшируемый)
- Определения инструментов
- Документы для поиска (retrieval)
- Примеры few-shot
- Фиксированные системные инструкции
Изменяемый суффикс (некэшируемый)
- Текущее время
- Идентификаторы сессий
- Сообщения пользователя
- Актуальный контекст
Если модели нужно время, добавьте его после статического блока, а не в начало. Тогда кэш сможет повторно использовать тяжелую статическую часть, пока вы поставляете свежий контекст в конце.
Скрытые «убийцы» в стеке
Даже если шаблон выглядит правильно, middleware или SDK могут незаметно добавлять метаданные — ID запроса, временные метки или другие заголовки — перед тем, как полезная нагрузка (payload) попадет в API. Некоторые конвейеры развертывания (deployment pipelines) также перемешивают определения инструментов при каждом обновлении. Эти невидимые изменения меняют байтовую последовательность и саботируют кэш без каких-либо изменений в вашем собственном конструкторе промптов.
Следите за показателем попадания в кэш
Относитесь к показателю попадания в кэш как к основной метрике здоровья любого ИИ-агента. Резкое падение сигнализирует о том, что что-то в начальных байтах запроса стало переменным. Инструменты мониторинга, показывающие процент попаданий, позволяют заметить аномалии в расходах до того, как они станут критическими.
Вывод
Кэширование промптов зависит от неизменяемого префикса. Любое изменение — даже одна временная метка — в начале каждого запроса аннулирует кэш и может утроить ваш счет. Держите статический контент первым, изменяемый — последним, проверяйте свой инструментарий на наличие скрытых механизмов добавления данных и следите за показателем попадания в кэш. Дисциплинированная структура промпта защищает как производительность, так и ваш бюджет.
