Токены всегда заканчиваются в самый важный момент. Осталось два шага до решения задачи — но «извините, лимит исчерпан». На бесплатном сервисе придётся ждать восстановления лимита часы, дни или месяц, а на платном — снова и снова закидывать деньги в аккаунт.
Что ж, будем экономить токены — и ради самой экономии, и для лучшего понимания принципов работы с LLM.
Как не разориться на токенах, на чём сэкономить и как при этом не снизить качество работы LLM, рассказывает Валентин Исипчук: он наставник на курсе «Вайб-кодинг на Claude Code» в Хекслет и практикующий разработчик (Java, Kotlin, Golang, JavaScript/TypeScript).
Стоимость токена
Токен — это минимальная единица текста, с которой работает модель, часть слова или целое слово (а иногда даже пробел или запятая).
При запросе к LLM промпт нарезается на токены — и вот уже первые расходы: «входящие» (Input) токены учитываются при общем расчёте.
В промпте, написанном по-английски, 1000 слов будут нарезаны в среднем на 1250 токенов. В русском же языке токены «мельче»: одно слово может биться на два или три токена (из тысячи слов получится 2000-3000 токенов).
Модель не понимает текстовых токенов, поэтому система преобразует их в числовой вид.
При ответе модель сама генерирует «числовые» токены, которые затем преобразуются в текстовый ответ (в чат-боте), в команды программному окружению (в агенте) или в картинку (в некоторых мультимодальных моделях).
Токены ответа (Output) заметно дороже, чем входящие, однако статистически их расходуется меньше, чем входящих: если считать в токенах, то ответ, как правило, лаконичнее запроса.
Есть и ещё один тип токенов: reasoning tokens — те, что модель использует при размышлении. Их стоимость учитывается в стоимости генерации ответа.
Практические выводы:
Промпт, написанный по-русски обойдётся заметно дороже, чем по-английски.
Токены тратятся при запросе к модели, при её раздумьях и при ответе. Все эти токены оплачиваются: входящие подешевле, исходящие (включая размышления) — подороже.
Контекстное окно: почему диалог дорожает
Следующий важный параметр, который влияет на качество и стоимость работы — это контекстное окно (Context Window) модели. Оно измеряется в токенах и определяет, какой объём переписки может обработать модель.
У модели нет собственной памяти, и чтобы модель не потеряла суть разговора — при каждом следующем промпте в модель передаются и все предыдущие сообщения. Модель перечитывает их и на основе прочитанного создаёт следующий ответ.
И так объём промпта нарастает с каждым новым запросом к модели. Каждый раз модель вынуждена принимать на вход промпты всё большего объёма.
Объём промпта измеряют в токенах. Контекстное окно — это максимальный суммарный объём токенов (входных и выходных), который модель способна обработать за один запрос.
Практические выводы:
1. Каждый следующий промпт, как правило, объёмнее и дороже предыдущего.
2. Большой диалог переполняет контекстное окно, и модель начинает ошибаться. Чтобы подогнать объём диалога под контекстное окно, система удаляет излишнюю информацию из диалога, и по этой причине «забывает» детали обсуждения.
Помимо контекстного окна есть ещё и память. Сама по себе модель не обладает памятью, и для решения этой проблемы модель надстраивают «запоминающей обвязкой»: факты из промптов и ответов извлекаются (с помощью специализированных моделей или алгоритмов поиска) и записываются в отдельное хранилище.
Когда пользователь отправляет очередной промпт — поисковый алгоритм ищет в своих записях релевантную информацию и подмешивает её в отправленный промпт.
Практический вывод: промпт, как правило, объёмнее, чем текст, который видит пользователь — из-за системных инструкций, истории диалога и результатов поиска по памяти.
Итак, пользователь тратит токены, и их перерасход — это потеря денег, а иногда и времени. Токены расходуются на запрос, на ответ и на размышление, и задача пользователя — ограничить эти статьи расходов.
Пользователь чат-бота и разработчик ИИ-агента будут применять разные подходы, но общие принципы одинаковы для обоих:
Очистка исходных данных от мусора
Выбор экономичного формата файла при загрузке
Лаконичный промптинг
Ограничения вывода
Разделение работы на отдельные сессии
Посмотрим, что можно сделать на практике.
Подготовка данных для промпта: очистка текста и выбор файла
Каждый лишний символ, отправленный в нейросеть — это выброшенные деньги. Технический мусор, скрытая разметка файлов и прочий хлам раздувают Input, заставляя оплачивать пустой объём. Оптимизация начинается на самом первом этапе: перед отправкой данных их необходимо очистить и упаковать в правильный формат.
Валентин Исипчук:
Нужно отдавать модели как можно меньше текста. Если ты хочешь, чтобы модель дала тебе выжимку из какого-то текста, то стоит скидывать ей не весь текст, а только тот кусок, который тебе интересен. Не книгу на сто страниц, а только пять страниц с конкретной главой.
Критический фактор — правильный выбор формата файла, в котором отправляются данные. Среди форматов для неструктурированного текста самый экономичный — .txt. Отсутствие лишних данных (форматирования, разметки, дополнительной технической информации) делает его самым экономичным в пересчёте на токены.
Однако форматирование данных — это полезно: оно помогает модели лучше воспринимать текст. И тут возникает вопрос о балансе «цена/качество». И с этой точки зрения лучшим решением будет формат Markdown. Файлы .md поддерживают форматирование (заголовки, списки, выделение текста, таблицы), и модель увидит акценты в тексте. При этом форматирование в Markdown лаконично и не сожжёт много токенов.
Для загрузки табличных данных весьма эффективным и экономичным будет формат .csv, но, тем не менее, модель лучше поймёт данные в .md, чем в .csv.
Чего не стоит делать — так это отправлять файлы с обилием разметки. В порядке увеличения прожорливости: .json / .yaml, .pdf / .docx, .html / .xml. Лучше конвертировать эти файлы во что-то более экономичное.
С экономией Input-токенов немного разобрались. Посмотрим, как сэкономить на ответах модели.
Сокращаем ответ модели: промптинг, структурированный вывод и Effort
Изумительная угодливость и обильные реверансы в ответах ИИ уже породили множество шуток и мемов. Любая бессодержательная реплика модели — это лишние токены и груда мусора, через которую пользователь вынужден пробираться. Надо это пресекать.
Когда модель начинает расписывать всё слишком подробно, ты сам устаёшь и после определённого порога начинаешь пропускать мимо глаз половину текста. А компактный и сжатый текст не так больно читать. Нужно использовать скиллы, настройки и промпты, которые убеждают модель писать как можно меньше текста в ответ. Можно просто сказать: отвечай коротко или только по делу, без вводных серий «да, я прекрасно понял».
Как ограничить словоохотливость модели:
Чётко указывать формат ответа. Если нужен код — требуем только код без комментариев. Если нужен анализ текста — просим выдать его в виде сухих тезисов или компактной таблицы.
Требовать структурированный вывод: жёстко фиксировать схему ответа (например, через JSON Schema). В чат-ботах работает подход «Изложи тезисы в формате “лаконичный тезис и его расшифровка в объёме не более 150 символов”».
Прямая речь:
Зачастую, когда модель отвечает в структурированном формате, она более строга в плане того, что она возвращает, и при этом добавляет меньше сопутствующих речей.
Настроить Effort (уровень усилий). Этf настройка регулирует внутренний цикл рассуждений модели. Низкий уровень Effort экономит скрытые токены на простых задачах.
Есть и экстремальные решения.
Существует скилл Caveman, который буквально заставлял модель общаться так, как говорит пещерный человек: «я посмотреть, но не работать»
Это довольно эффективный подход, хоть и не всегда надёжный.
Управление контекстом: отдельные чаты, проекты и память
Объём промптов нарастает как снежный ком, и окно контекста, которое на старте кажется огромным, заполняется всё быстрее. Эту проблему нужно и можно решить.
Прямая речь:
У меня есть друг. Он завёл один гигантский диалог, где обсуждал вообще всё на свете — и вёл его несколько месяцев. В какой-то момент он нажимает Enter и говорит мне: „Давай пока в магазин сходим, а то он что-то очень долго отвечает“. Диалог тянулся 4 или 5 месяцев! Контекст переполнился, модель начала тупить и забывать данные. Надо просто закрыть этот диалог, начать новый, и всё будет хорошо.
Вместо того, чтобы ходить в магазин в ожидании ответа — лучше использовать инструменты управления контекстом.
Для пользователя чат-бота
Разделение на чаты. Один чат — одна узкая задача. Решили проблему — закрыли окно и открыли новое.
Использовать проекты (Projects) — это современный формат работы в Claude или ChatGPT. Проект — изолированное рабочее пространство со сквозной памятью.
По сути проект — это папка, внутри которой хранятся диалоги, связанные одной темой. Память в проекте общая, и если в одном чате ты обсуждал какую-то тему, то если ты затронешь ту же тему в другом чате — модель сможет понять, о чём идёт речь.
Для разработчика
Использовать функцию Memory: она позволяет зафиксировать ключевые факты на уровне интерфейса. Модель будет помнить важные факты, но в оперативное контекстное окно будут попадать не все эти факты, а лишь релевантные текущему запросу. Меньше фактов в промпте — меньше токенов израсходовано.
Для разработчика: роутинг моделей, кеширование, счётчики токенов
— А давайте просто купим дорогую модель — и всё у нас будет хорошо!
Это популярная фраза, но нет: хорошо не будет. Использовать супермодель (речь про мощную LLM!) для простых задач вроде исправления опечаток или составления новостной сводки — это пустая трата денег.
Задачи раздают нескольким моделям. Какая-нибудь более крутая делает сложную, но менее объёмную работу. А модель попроще решает множество простых задач. Израсходовали чуть меньше токенов от дорогой модели и потратили больше на дешёвую — в итоге получилась экономия в деньгах.
Распределение задач между несколькими моделями называют роутинг или маршрутизация моделей.
Есть и другой метод экономии: кеширование запросов и ответов. Например, в специализированных справочных системах пользователи очень часто задают одни и те же вопросы, и им можно возвращать примерно одинаковые ответы. Нет смысла десять раз задавать модели один и тот же вопрос и расходовать токены: будет дешевле сохранять часто повторяющиеся вопросы и ответы и возвращать пользователю уже готовый ответ.
Запросы пропускают через специальную модель, которая переводит текст в математические векторы (эмбеддинги) и проверяет, нет ли схожего ответа в базе кеша.
По получившемуся вектору смотрим, есть ли у нас в базе схожие вектора. Если есть — достаём схожий ответ от модели и отдаём напрямую, не нагружая дорогую модель.
Кеширование
Во многих приложениях часть промпта повторяется от запроса к запросу. Обычно это системная инструкция, описание структуры ответа или другой статичный блок контекста. Без кеширования модель будет каждый раз обрабатывать этот текст заново, расходуя токены.
Чтобы избежать лишних затрат, повторяющиеся фрагменты можно сохранять в кеш. Например, у Anthropic в запросе есть параметр cache_control: он позволяет отметить текст, который должен быть закеширован.
У других вендоров название и структура этого параметра может отличаться, но суть схожая: модель запоминает обработанную часть запроса и при следующих обращениях не выполняет одни и те же вычисления повторно.
Первый запрос обычно обходится дороже, ведь данные нужно записать в кеш. Зато последующие запросы становятся заметно дешевле, а нередко и быстрее.
Чтобы кеширование работало — закешированный текст должен повторяться от запроса к запросу. Даже небольшие правки могут привести к созданию новой записи вместо использования существующей.
Убедиться, что кеш действительно работает, обычно можно через поле usage в ответе API. Там часто указывается, сколько токенов было записано в кеш и сколько прочитано из него.
Batch API
Batch API позволяет отправлять запросы пакетами — но при условии, что модель вернёт ответ не в реальном времени, а позже. Многие провайдеры выполняют такие запросы значительно дешевле обычных вызовов API.
Взамен приходится ждать завершения обработки: ответ может прийти через несколько минут или даже часов. Есть и ещё один нюанс: ответы приходят в произвольном порядке, поэтому после получения их нужно обрабатывать в приложении.
Сделать на Batch API систему онлайн-поддержки пользователей не получится: вряд ли пользователь станет ждать ответа на протяжении часов. Но эта система вполне подойдёт для фоновых задач, не требующих мгновенного ответа — для классификации данных, обработки логов или для создания описаний товаров.
Подсчёт токенов
Подсчёт токенов не снижает затраты напрямую, но помогает заранее оценить расходы. Предварительный подсчёт даст понять, сколько будет стоить обработка данных и позволит настроить промпты.
Разные модели разбивают текст на разное количество токенов. Перед запуском крупной задачи есть смысл посмотреть, как один и тот же промпт токенезируется разными моделями, попробовать разные версии промпта и выбрать ту, которая будет меньше стоить, но качественно решать задачу.
Поэкспериментировать можно в онлайн-счётчиках токенов:
BenchLM
GPT for Work
OpenAI Tokenizer
Подсчёт токенов можно встроить прямо в приложение: для этого есть специализированные библиотеки вроде tiktoken и её аналогов для разных языков программирования.
Универсальный рецепт для экономии токенов
Спойлер: универсального рецепта нет. Каждый проект — особенный, в каждом — множество нюансов. Решение, которое сработало на одном проекте, не поможет на другом. Однако понимание общих принципов работы LLM, практические эксперименты и анализ помогут выбрать оптимальное решение.
Каких-то чётких рекомендаций и правил нет, всё зависит от конкретной задачи и инструмента. Самое верное решение — экспериментировать и смотреть на результаты. В рамках своей задачи стоит попробовать разные модели в разных комбинациях и понять, что лучше подходит и в каком соотношении получается максимально дешёво при том, что результат получается удовлетворительный.
Частые вопросы про токены и промпты
Что такое токен простыми словами?
Токен — это фрагмент текста: слово, его часть, знак препинания или пробел. Нейросеть читает и считает текст токенами, и по их числу формируется стоимость запроса.
Сколько токенов в одном слове?
В английском 1 токен — около 0.75 слова (1000 токенов ≈ 750 слов). В русском языке слово делится на 2–3 токена.
Почему русский промпт дороже английского?
Русские слова токенизатор дробит мельче, чем английские. Одно слово на русском языке в среднем занимает 2–3 токена, а на английском — 0.75 токена. Поэтому одинаковый по объёму текст на русском языке даёт больше токенов и стоит дороже, чем на английском.
Почему модель «забывает» начало диалога?
У модели нет собственной памяти: при каждом запросе ей передают всю переписку. Когда объём диалога превышает контекстное окно, система удаляет часть диалога — и модель начинает ошибаться и «забывать» начало разговора.
Как узнать, сколько токенов съел запрос?
Число токенов показывают онлайн-токенизаторы и ответ API: в поле usage указаны input- и output-токены.
