Счёт за OpenAI в прошлом месяце заставил меня сесть и честно посчитать. Не «в целом дорого», а конкретно — сколько токенов улетает на каждый запрос и где дыры. Оказалось, половина денег я сливал просто потому, что не думал о формате.
Делюсь тем, что выяснил на практике.
Почему один и тот же запрос может стоить в 10 раз дороже
Когда я впервые увидел разницу в стоимости между gpt-4o и gpt-4o-mini на реальных задачах, решил — ошибка. Замерил на 200 однотипных запросах: классификация текста по тональности. Оказалось, для этой задачи разницы в качестве почти нет, а экономия — 20 центов против доллара за запрос.
Базовая арифметика простая: платите за каждый входной токен и каждый выходной. Чем короче промпт и чем точнее инструкция — тем дешевле. Звучит очевидно, но я постоянно видел промпты с тремя абзацами преамбулы — ради «контекста», который модели не нужен.
Что реально работает
Выбор модели под задачу, а не «самую умную»
Я раньше делал наоборот: брал gpt-4o для всего подряд — и для простого перевода, и для сложного анализа. Потом замечать начал. Сейчас у меня простая лестница: простая классификация или теги — gpt-4o-mini. Нужна внимательность к нюансам — gpt-4o. Промежуточные задачи — gpt-4o с жёстким лимитом на output tokens.
Разница между gpt-4o и gpt-4o-mini — примерно в 15 раз на стоимости токена. Для задач, где точность на уровне 95% достаточна, это просто деньги на столе.
Системный промпт — не место для вежливости
Мой первый системный промпт содержал: «Ты — опытный аналитик. Будь внимательным и точным. Отвечай по существу». Потом сократил до «Анализируй текст. Возвращай только категорию и краткое обоснование». Результат тот же, токенов улетает меньше.
Правило, которое я для себя вывел: системный промпт должен описывать формат вывода и границы задачи, а не характер модели.
Few-shot примеры вместо длинных объяснений
Вместо «проанализируй текст по таким критериям: первый критерий — ..., второй — ...» я даю два примера в формате input → output. Модель понимает задачу быстрее, инструкция короче, а результат стабильнее. Минус одно-два предложения с каждого запроса — мелочь, но на 10 тысячах запросов это уже заметно.
JSON mode и структурированный вывод
Одна из самых недооценённых штук. Когда прошу «верни ответ в JSON» без дополнительных параметров, модель иногда добавляет объяснения, обёртки, комментарии. С response_format: { type: "json_object" } выходной поток становится предсказуемым — ровно тот JSON, который ожидаю, без лишних слов.
Параллельно я ограничиваю max_tokens до разумного значения. Не 4096 по умолчанию, а столько, сколько реально нужно. Если ответ помещается в 200 токенов — ставлю 250 с запасом. Модель не «растекается» и не генерирует лишнее.
Кэширование — способ, о котором забывают
Я долго не пользовался кэшированием, пока не заметил, что одни и те же системные промпты улетают в API сотни раз. А ведь это возможность не платить за повторяющиеся куски.
Работает просто: передаёте хэш промпта, и если система уже обрабатывала этот кусок — он не оплачивается повторно. У меня системный промпт с инструкциями по форматированию — это 800 токенов. Запросов в день — 5000. Без кэша каждый из них тащит эти 800 токенов. С кэшем — платишь один раз.
Практический момент: кэш «живёт» какое-то время и имеет ограничения по объёму. Для высоконагруженных систем это не серебряная пуля, но для типовых сценариев — очень рабочая штука.
Пакетная обработка — если задача позволяет
Batch API — отдельная история. Не все задачи можно накопить, но если у тебя сотни однотипных запросов — это до 50% экономии. Собираю пачку из 50–100 запросов, отправляю одним вызовом, получаю ответы пачкой.
Минус: увеличивается latency. Если задача не требует мгновенного ответа — batch сильно выгоднее. Я использую для отложенных отчётов, массовой классификации, генерации описаний — всего, что можно подождать 5–10 минут.
Как я считаю эффективность
После оптимизаций замеряю три вещи.
Первое — стоимость на 1000 запросов. Не «стало дешевле» примерно, а конкретная цифра. У меня было 4 доллара на 1000, стало 1.2 — вот такая конкретика.
Второе — качество выхода. Я не экономлю вслепую. Если оптимизация привела к росту ошибок — это не экономия, а перекладывание на другое место.
Третье — latency. Иногда ультрадешёвая модель работает медленнее. Если задача чувствительна ко времени — этот trade-off важно осознавать заранее.
Что в итоге
Самые жирные точки экономии — выбор модели и сокращение входного потока. На третьем месте кэширование. Batch — если сценарий подходит.
Я урезал свой счёт за GPT API примерно втрое за месяц, не меняя качество результатов. Без хитрых архитектурных решений — просто перестал транжирить токены по привычке.
Если коротко: начните считать стоимость каждого запроса, а не «в среднем». Увидите, куда реально уходят деньги.
