Расходы на LLM API растут не только потому, что модель дорогая.
Часто проблема проще: продукт каждый раз отправляет модели слишком много лишнего. Системный промпт раздувается. История диалога тянется целиком. В запрос попадают лишние фрагменты базы знаний. Ответы получаются длиннее, чем нужно. Все задачи идут в одну сильную модель, даже если половину из них могла бы обработать более дешёвая.
Формально всё работает.


По факту счёт растёт, а команда начинает искать виноватого в прайсах. Хотя виноватый часто сидит в архитектуре запроса и делает вид, что он “временное решение”.
Если вы уже разобрались, что такое входные, выходные и кэшированные токены, следующий вопрос практический: как снизить расходы без поломки качества.
Ответ короткий: не резать всё подряд.
Ответ нормальный: считать дорогие сценарии, использовать Batch API для несрочных задач, проектировать запросы под кэширование, маршрутизировать задачи между моделями и не отправлять модели весь цифровой чердак.
Один и тот же AI-сервис может стоить по-разному при одинаковой модели.
Разница возникает не в названии модели, а в том, что именно вы ей отправляете и что просите вернуть.
Дорогими становятся привычки:
| Что делает продукт | Почему это дорого |
|---|---|
| Отправляет всю историю диалога | каждый следующий запрос становится тяжелее |
| Добавляет все инструкции “на всякий случай” | модель читает дубли и лишние правила |
| Передаёт много фрагментов базы знаний | растёт input и появляется шум |
| Использует сильную модель для всех задач | простые операции стоят как сложные |
| Просит подробный ответ по умолчанию | растёт output |
| Не отделяет срочные задачи от несрочных | теряется возможность batch-обработки |
| Не держит стабильный префикс промпта | хуже работает кэширование |
Если AI-бот отвечает на вопрос клиента, ему не всегда нужно перечитывать все правила компании, всю историю переписки и половину базы знаний.
Иногда ему нужен один статус, три факта и короткий ответ.
Но если архитектура устроена лениво, модель получает всё подряд. Модель не спорит. Она читает. Потом выставляется счёт.
Оптимизация расходов не означает, что любой запрос должен стать максимально дешёвым.
Есть нормальные расходы. Например: сложная аналитика, проверка важного ответа, работа с юридически чувствительным текстом, финальная валидация результата перед отправкой клиенту.
Там экономия любой ценой может стоить дороже, чем сами токены.
А есть мусорные расходы. Их и нужно искать первыми.
| Тип расхода | Пример | Что делать |
|---|---|---|
| Оправданный | сильная модель проверяет важный ответ | оставить и считать стоимость |
| Мусорный | одно правило повторяется в системном промпте и базе знаний | убрать дубли |
| Мусорный | вся история диалога отправляется каждый раз | заменить summary |
| Спорный | все задачи идут в самую дорогую модель | разделить сценарии |
| Спорный | модель всегда пишет длинные ответы | задать формат и лимит |
Цель не в том, чтобы удешевить всё подряд.
Цель — убрать переплату, которая не улучшает результат.
Нельзя нормально оптимизировать то, что вы не считаете.
Если в продукте виден только общий месячный счёт за API, команда работает вслепую. Счёт вырос — неприятно. Почему вырос — непонятно. Кто виноват — модель, пользователи, длинные документы или “ну оно само”.
Минимально нужно логировать:
| Метрика | Зачем нужна |
|---|---|
| модель | понять, где используется дорогая модель |
| тип сценария | отделить чат, RAG, отчёты, классификацию |
| input tokens | увидеть тяжёлый входной контекст |
| output tokens | найти слишком длинные ответы |
| cached tokens | понять, работает ли кэширование |
| стоимость запроса | считать экономику сценария |
| latency | видеть влияние на скорость |
| ошибки и повторы | проверять, не сломалась ли точность |
Она может выглядеть терпимо, пока небольшая доля тяжёлых запросов съедает основную часть бюджета.
Например, 80% обращений — короткие FAQ. Они стоят недорого. Но 20% запросов идут через RAG по длинным документам, тащат много фрагментов базы знаний и каждый раз возвращают подробный ответ. Если смотреть только среднее значение, проблема будет замазана.
Считать лучше по сценариям:
После этого видно, где перерасход: во входном контексте, в output, в выборе модели, в повторяющихся инструкциях или в отсутствии batch-обработки.

Batch API нужен для задач, где результат не нужен пользователю прямо сейчас.
Это не волшебная кнопка “сделать дешевле весь AI-продукт”. Это способ дешевле обработать большой объём запросов асинхронно.
У OpenAI Batch API предназначен для асинхронной обработки запросов и даёт 50% скидку относительно синхронных API; текущее окно обработки — до 24 часов. Источник: platform.openai.com.
У Gemini Batch API тоже рассчитан на крупные несрочные задачи, обрабатывает запросы асинхронно и стоит 50% от стандартной интерактивной стоимости для эквивалентной модели. Источник: Google AI for Developers.
Batch API подходит для:
Batch API не подходит для:
| Задача | Batch подходит? | Почему |
|---|---|---|
| Классификация 10 000 обращений | Да | результат не нужен мгновенно |
| Ответ клиенту в чате | Нет | пользователь ждёт сейчас |
| Ночная обработка документов | Да | можно выполнить асинхронно |
| Поиск статуса заказа | Нет | нужен быстрый ответ |
| Подготовка черновиков описаний | Да | можно обработать пачкой |
| Подсказка менеджеру во время звонка | Нет | важна задержка |
Простой критерий такой: если пользователь не смотрит на экран и не ждёт ответ прямо сейчас, задачу можно рассмотреть для batch-обработки.
Если ждёт — не надо превращать интерфейс в медитацию на спиннер. Пользователь пришёл за результатом, а не за практикой терпения.
Во многих AI-продуктах часть запроса повторяется постоянно.
Например:
Если эти части каждый раз одинаковые, провайдер может обработать их дешевле и быстрее через кэширование.
У OpenAI prompt caching работает автоматически на современных моделях. В официальной документации указано, что он может снижать latency до 80%, а стоимость input-токенов — до 90%. Cache hits возможны для точного совпадения префикса, поэтому статичные инструкции и примеры лучше держать в начале запроса, а переменные данные — в конце. Источник: platform.openai.com.
Ключевое слово — точного.
Кэширование работает не потому, что промпты “примерно похожи по смыслу”. Для кэша важна стабильность структуры и повторяющихся блоков.
| Что повторяется | Как сделать | Что мешает |
|---|---|---|
| Системный промпт | держать стабильным | переписывать при каждом запросе |
| Правила ответа | вынести в постоянный блок | вставлять в разном порядке |
| Схема JSON | фиксировать структуру | менять поля без причины |
| Примеры | хранить в одном месте | каждый раз генерировать заново |
| Документы | кэшировать крупные повторяющиеся блоки | смешивать с динамическими данными |
| Пользовательский контекст | ставить после статичного блока | вставлять в начало запроса |
Хорошая структура запроса:
Плохая структура:
Второй вариант может работать. Но кэширование будет срабатывать хуже. Иногда не будет вообще.
Промпт не нужно каждый раз украшать новыми словами “для естественности”. Машина красоту не оценит. Счёт выставит.

Нельзя один раз прочитать документацию OpenAI и решить, что у всех провайдеров caching устроен одинаково.
| Провайдер | Как устроено кэширование | Что важно |
|---|---|---|
| OpenAI | prompt caching работает автоматически для повторяющихся префиксов | статичный контент лучше ставить в начало запроса |
| Anthropic Claude | отдельно учитываются cache writes и cache reads, есть TTL 5 минут и 1 час | нужно считать экономику записи и чтения кэша |
| Gemini | есть implicit caching и explicit caching, explicit caching учитывает TTL и хранение | для гарантированной экономии нужен explicit caching |
У Anthropic prompt caching управляется через cache control: в документации отдельно описаны cache creation, cache read и TTL 5 минут или 1 час. Источник: Claude API Docs.
У Gemini есть implicit caching и explicit caching. Explicit caching позволяет вручную кэшировать контент, выбирать TTL и получать гарантированную экономию при повторном использовании; стоимость зависит от числа кэшируемых токенов, срока хранения и обычных input/output-расходов. Источник: Google AI for Developers.
Принцип общий: повторяющийся контекст можно сделать дешевле.
Экономика разная.
Перед внедрением кэширования нужно смотреть документацию конкретного провайдера и считать свою нагрузку. Иначе можно красиво “оптимизировать” в презентации и неприятно удивиться в биллинге.
Во многих продуктах все запросы по умолчанию отправляют в одну сильную модель.
Так проще. Но не всегда разумно.
Не каждая задача требует самой дорогой модели. Классификация обращения, извлечение e-mail из текста, проверка формата JSON, нормализация названия компании, короткий служебный ответ — это не всегда работа для тяжёлой модели.
Простые задачи можно отдавать более дешёвой модели:
Сложные задачи лучше оставлять сильной модели:
Пример маршрута для AI-бота поддержки:
Запрос пользователя → дешёвая модель определяет тип обращения → система выбирает сценарий → простые вопросы закрываются дешёвой моделью → сложные или рискованные вопросы уходят в сильную модель → результат проверяется по формату → пользователь получает ответ.
Это и есть маршрутизация моделей, или routing.
Смысл не в том, чтобы заменить сильную модель слабой. Смысл в том, чтобы не заставлять сильную модель делать всю подсобную работу.
Плохой routing опасен. Если система неверно определяет сложность задачи, дешёвая модель начнёт отвечать там, где нужна точность.
На графике расходов всё станет лучше.
В продукте — хуже.
А пользователю всё равно, что вы сэкономили на токенах. Он видит неправильный ответ.

Контекст — это не склад.
Но во многих AI-продуктах его используют именно так. В запрос отправляют всё, что может пригодиться: инструкцию, старую инструкцию, новую инструкцию, FAQ, документы, историю, комментарии менеджера, фрагменты базы знаний и “ещё вот это, чтобы наверняка”.
Наверняка получается дорого.
Чистка контекста снижает input-токены. То есть уменьшает объём текста, который модель должна прочитать перед ответом.
Первое, что нужно сделать, — убрать дубли.
Если одно и то же правило есть в системном промпте, базе знаний и дополнительной инструкции, модель читает его несколько раз. Польза сомнительная. Стоимость реальная.
Второе — отделить постоянное от переменного.
Постоянные правила должны быть стабильными. Переменные данные должны попадать в запрос только тогда, когда они нужны.
Третье — не отправлять всю базу знаний.
Если у вас RAG-сценарий, задача retrieval-части — найти релевантные фрагменты. Не нужно скармливать модели весь справочник “для надёжности”. Это повышает стоимость и может ухудшить ответ: чем больше лишнего текста, тем выше шанс, что модель зацепится не за тот фрагмент.
Практический минимум:
| Что сделать | Зачем |
|---|---|
| Оставить постоянные инструкции в одном месте | убрать дубли |
| Разделить постоянное и переменное | улучшить структуру запроса |
| Ограничить число фрагментов базы знаний | снизить input |
| Ранжировать фрагменты по релевантности | убрать шум |
| Не отправлять устаревшие данные | снизить риск ошибки |
| Сокращать длинные документы до нужных частей | не платить за лишнее |
| Убрать данные “на всякий случай” | не раздувать контекст |
Лучше 3–5 релевантных фрагментов, чем 15 случайных кусков, которые раздувают запрос и мешают ответу.
В чат-ботах и AI-ассистентах история диалога быстро становится дорогой.
Первые сообщения стоят немного. Потом пользователь уточняет. Потом меняет задачу. Потом возвращается к старому вопросу. Потом добавляет ограничение. Потом просит “учесть всё выше”.
Если каждый раз отправлять всю переписку, каждый следующий запрос становится дороже предыдущего.
В какой-то момент пользователь пишет одну строку, а модель перечитывает роман в трёх томах.
Решение — summary истории.
Не нужно удалять историю вслепую. Нужно сжимать её до рабочего состояния:
Что хранить в summary:
Когда обновлять summary:
Так ассистент сохраняет смысл, но не тащит в каждый запрос всю переписку.
Это особенно важно для клиентской поддержки, личных кабинетов, CRM-ассистентов и внутренних AI-сервисов. Там длинный контекст — обычная история. И дорогая, если её не контролировать.
Команды часто смотрят на input-токены и забывают про output.
А ответ модели тоже стоит денег. Иногда output-токены дороже input-токенов. Поэтому фраза “ответь подробно” в массовом продукте может стать маленьким финансовым преступлением.
Без злого умысла, зато регулярно.
Не каждый ответ должен быть длинным.
Если пользователь спрашивает статус заказа, ему не нужна лекция про логистические процессы. Ему нужен статус и следующий шаг.
Если менеджер просит подсказку по лиду, ему не нужен эссеистический разбор. Ему нужны 3 факта и рекомендация.
Если API ждёт структурированные данные, ему не нужна вежливая прелюдия: “Конечно, вот JSON”. Ему нужен JSON.
Примеры ограничений:
Хороший промпт задаёт не только задачу, но и формат результата.
Плохо:
Проанализируй обращение клиента и дай ответ.
Лучше:
Проанализируй обращение клиента. Верни:
Модель не обязана угадывать, насколько длинный ответ вам нужен. Если не задать формат, она часто выберет безопасную многословность.
Безопасную для себя. Платную для вас.
Представим AI-бота поддержки.
Он отвечает клиентам по базе знаний, смотрит историю обращения и иногда передаёт диалог менеджеру.
В каждый запрос отправлялось:
Все запросы шли в одну сильную модель.
Несрочная аналитика старых обращений выполнялась через обычный синхронный API.
Системный промпт сделали стабильным.
Постоянные правила вынесли в один блок.
Историю диалога заменили summary.
Для RAG стали передавать 3–5 релевантных фрагментов вместо 8–12.
Ответ ограничили форматом: краткий ответ, статус, следующий шаг.
Простую классификацию обращений отдали более дешёвой модели.
Сложные ответы и спорные случаи оставили сильной модели.
Анализ старых обращений перевели в batch-обработку.
| Было | Стало | Эффект |
|---|---|---|
| вся история в каждом запросе | summary истории | меньше input-токенов |
| много фрагментов базы знаний | только релевантные фрагменты | меньше шума и стоимости |
| одна дорогая модель для всего | routing моделей | дешевле простые операции |
| подробный ответ по умолчанию | формат и лимит ответа | меньше output-токенов |
| синхронная массовая обработка | Batch API | ниже стоимость несрочных задач |
| нестабильный промпт | стабильный префикс | выше шанс на caching |
Здесь нет одного чудо-приёма.
Экономия складывается из нескольких решений. В этом и смысл: расходы на токены редко снижаются одной правкой. Обычно это аудит архитектуры.

Оптимизация может навредить.
Если просто резать всё подряд, продукт станет дешевле и хуже. Это не победа. Это скидка на собственную ошибку.
Четыре частые проблемы.
Первая — слишком короткий контекст.
Модель не видит нужных данных и отвечает общими словами. Пользователь задаёт уточняющий вопрос. Потом ещё один. В итоге экономия исчезает, потому что запросов становится больше.
Вторая — слишком дешёвая модель.
Она может нормально классифицировать простые обращения, но ошибаться в сложных. Особенно там, где нужны нюансы, логика, длинный контекст или высокая точность.
Третья — слишком жёсткие лимиты ответа.
Краткость хороша, пока она не превращается в обрубок. Если пользователю нужно объяснение, а он получает сухую строку, качество падает.
Четвёртая — слепое удаление истории.
Ассистент теряет договорённости, статус клиента и важные ограничения. Снаружи это выглядит так, будто компания ничего не помнит.
Проверять качество после оптимизации нужно не на ощущениях, а по метрикам:
Если запрос стал дешевле, но пользователь чаще переспрашивает, вы не сэкономили. Вы перенесли стоимость в другой столбец.
Бухгалтерия такое любит. Продукт — нет.
Перед тем как переписывать промпты, проверьте систему.
Если на половину вопросов ответ “не знаем”, проблема не только в стоимости токенов.
Проблема в том, что AI-функция уже работает, но её эксплуатацией никто толком не управляет.
Сократить промпт полезно. Но этого мало.
Настоящая экономия появляется, когда команда управляет всей цепочкой:
Токены — это не только техническая единица текста. Это себестоимость AI-функции.
Если продукт не считает токены, он не управляет расходами.
Если продукт отправляет модели всё подряд, он платит за всё подряд.
Если продукт разделяет сценарии, чистит контекст, использует caching, batch-обработку и routing, расходы становятся управляемыми.
Не магически низкими.
Управляемыми.
А это уже нормальная инженерная история, а не надежда на то, что следующий счёт будет добрее.