Токены, стоимость и переносимость моделей

В проде каждый токен стоит денег и времени, а один и тот же промпт на разных моделях ведёт себя по-разному — это нужно учитывать.

Токен — единица, которой модель считает текст; от числа токенов на входе и выходе зависят и цена запроса, и задержка.

Откуда берётся стоимость

Провайдеры тарифицируют по токенам: отдельно за вход (промпт) и за выход (ответ). Длинный системный промпт, раздутые few-shot примеры, огромный контекст и многословные ответы — всё это деньги и задержка на каждом запросе. На масштабе тысяч вызовов экономия токенов ощутима.

Оценка длины

Грубая прикидка: для английского ~1 токен на 4 символа; для русского текста токенов на тот же смысл обычно больше (кириллица «дробится» сильнее). Точное число даёт токенайзер конкретной модели. Простая прикидка по символам помогает оценить порядок.

def approx_tokens(text, chars_per_token=4):
    return max(1, round(len(text) / chars_per_token))

prompt = "Сделай краткое содержание текста в трёх пунктах."
print("Символов:", len(prompt))
print("Примерно токенов:", approx_tokens(prompt))

Вывод:

Символов: 48
Примерно токенов: 12

Это лишь оценка порядка; реальный токенайзер для русского обычно даст больше. Для бюджета важна не точность до токена, а понимание, что длина = деньги.

Приёмы оптимизации

  • Короче инструкции: уберите воду, дубли, очевидное. Краткий точный промпт часто не хуже длинного.
  • Меньше примеров: оставьте минимум few-shot, который держит качество.
  • Отбор контекста: кладите только релевантные куски, а не весь документ.
  • Ограничивайте вывод: «до 100 слов», «только JSON» — экономят выходные токены.
  • Кэширование промптов: если провайдер поддерживает кэш стабильной части промпта — повторные запросы дешевле.
  • Дешевле модель для простого: рутинную классификацию незачем гонять на самой дорогой модели.

Переносимость между моделями

Промпт, идеально работающий на одной модели, на другой может вести себя иначе: отличаются дефолтный стиль, чувствительность к формату, поведение system prompt, длина контекста, склонность к рассуждению. Разные семейства (Claude, GPT, Gemini и др.) имеют свои «привычки».

Что проверить при переносе
Соблюдается ли формат вывода
Не изменился ли тон/многословность
Так же ли работают делимитеры/роли
Нужна ли явная просьба о рассуждении

Практический вывод: при смене модели прогоните свой eval-набор заново и при необходимости подстройте промпт. Не считайте промпт «универсальным» по умолчанию.

Итог

  • Стоимость и задержка зависят от числа токенов на входе и выходе.
  • Оптимизируйте: короче инструкции, меньше примеров, отбор контекста, ограничение вывода, кэш.
  • Для простых задач берите модель подешевле.
  • Промпты не полностью переносимы — при смене модели перепроверяйте на eval-наборе.
Проверьте себя
1. От чего напрямую зависят цена и задержка запроса к LLM?
AОт времени суток
BОт числа токенов на входе и на выходе
CОт длины имени модели
DОт температуры
2. Какой приём НЕ помогает экономить токены?
AУбрать воду и дубли из инструкции
BОграничить длину вывода
CДобавить как можно больше лишних few-shot примеров
DКласть в контекст только релевантные куски
3. Что делать при переносе промпта на другую модель?
AНичего, промпты универсальны
BПрогнать eval-набор заново и при необходимости подстроить промпт под поведение новой модели
CУдвоить температуру
DУдалить system prompt
Поддержать проект