Оптимизация, тестирование и безопасность

Оптимизация токенов: стоимость, контекстные окна и сжатие

Оптимизация токенов для промптов LLM. Как работают токены и контекстные окна, как правильно их считать и как сжимать промпты, не теряя смысла.

  • Автор: Vijayraj Palanisamy
  • Обновлено
  • 4 мин чтения

Перевод английского оригинала. Код, промпты и вывод моделей оставлены на английском.

Языковые модели читают и пишут токены, и вы платите за оба вида. Оптимизация токенов означает тратить их там, где они улучшают ответ, и больше нигде. Сделанная хорошо, она снижает стоимость и задержку и часто повышает качество, потому что сфокусированный промпт легче выполнять.

Что такое токен

Токен — это фрагмент текста из словаря модели: слово, часть слова, знак препинания или пробел вместе со словом. Для английской прозы грубое правило — четыре символа, или три четверти слова, на токен. Это правило часто не работает:

  • Код, JSON и необычные идентификаторы используют больше токенов, чем проза.
  • Языки, отличные от английского, часто тратят больше токенов на слово.
  • У каждого провайдера свой токенизатор, поэтому один и тот же текст даёт разный счёт на разных моделях.

Считайте настоящим токенизатором

Оценки хороши для первой прикидки и непригодны для бюджета. OpenAI публикует свои токенизаторы, поэтому подсчёт может быть точным офлайн. Anthropic и Google предоставляют конечные точки подсчёта токенов; без них счёт — приближение.

PromptFlowEngine следует этому различию: счёт для моделей OpenAI вычисляется их токенизатором и помечается как точный, а для остальных провайдеров — как приблизительный. Проверить промпт можно в рабочем пространстве или через HTTP API:

curl -s https://promptflowengine.com/api/v1/tokens \
  -H 'content-type: application/json' \
  -d '{"prompt":"Summarize the notes below in 5 bullets.","model":"gpt-4.1"}'

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

Стоимость вызова — это входные токены, умноженные на цену ввода, плюс выходные токены, умноженные на цену вывода. Три факта определяют любую оптимизацию:

  1. Выходные токены обычно стоят в несколько раз дороже входных. Ограничение длины ответа часто экономит больше, чем сокращение промпта.
  2. Постоянная часть промпта оплачивается при каждом вызове. Пятьдесят потраченных впустую токенов в системном промпте, который запускается миллион раз, — это пятьдесят миллионов токенов.
  3. В разговоре или цикле агента история отправляется заново на каждом ходу. Стоимость растёт быстрее числа ходов.

Сжатие промпта: что убирать

Двигайтесь от самых безопасных сокращений к самым рискованным.

Вода и вежливость. «Привет», «пожалуйста», «я хотел бы, чтобы вы», «важно отметить, что». Они не несут инструкции.

Before: Hello! I would like you to please summarize the notes below.
        Please make sure to keep it brief.
After:  Summarize the notes below in 3 sentences.

Повторы. Одна и та же инструкция, сказанная дважды, нередко в разных разделах после месяцев правок.

Громоздкие конструкции. «Для того чтобы» превращается в «чтобы». «В связи с тем, что» — в «потому что».

Неиспользуемый контекст. Фон, от которого не зависит ни один тестовый случай. Уберите его и перезапустите тесты.

Избыток примеров. Попробуйте три примера вместо восьми и измерьте.

Многословные форматы. JSON с отступами и длинными ключами стоит дороже компактного JSON с короткими ключами. Для данных, вставляемых в промпт, компактный формат экономит токены при каждом вызове.

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

Что не убирать

  • Требования и ограничения. Более короткий промпт, потерявший правило, — это другой промпт.
  • Формат вывода. Его удаление экономит десять токенов и стоит вам парсера.
  • Разделители вокруг ввода. Они дёшевы и предотвращают инъекции.
  • Структуру. Заголовки разделов стоят несколько токенов и могут повысить соблюдение инструкций. Чрезмерно сжатый текст без артиклей и связок становится неоднозначным для модели и нечитаемым для следующего, кто будет его править.

Оптимизация контекстного окна

Контекстное окно — максимальное число токенов, которое модель может учитывать одновременно, ввод и вывод вместе. Окна стали очень большими, и вопрос сместился с «поместится ли» на «должно ли это там быть».

Больше контекста — не бесплатно. Помимо стоимости и задержки качество может падать по мере роста ввода: релевантный фрагмент в окружении тысяч нерелевантных токенов модели использовать труднее. Отправляйте то, что нужно задаче.

Извлекайте, а не включайте всё. Найдите фрагменты, относящиеся к вопросу, и вставьте только их. См. промптинг для RAG.

В длинных промптах важен порядок. Многие модели лучше всего обращают внимание на начало и конец длинного ввода. Ставьте длинные документы первыми, а вопрос или инструкции — после них, либо повторите ключевую инструкцию в конце.

Управляйте историей разговора. Суммируйте старые ходы, отбрасывайте ненужные результаты инструментов и начинайте новый разговор при смене темы.

Оставляйте место для ответа. Если ввод заполняет окно, вывод обрывается. Оставьте место для самого длинного ожидаемого ответа.

Разделяйте работу. Цепочка промптов даёт каждому шагу только тот контекст, который ему нужен.

Используйте кеширование

Основные провайдеры предлагают кеширование промптов: когда начало промпта совпадает с недавним запросом, повторяющаяся часть тарифицируется по сниженной ставке и обрабатывается быстрее. Чтобы получить выгоду:

  • Ставьте стабильное содержимое первым: системный промпт, определения инструментов, примеры, справочные документы.
  • Ставьте переменное содержимое последним: вопрос пользователя и данные конкретного запроса.
  • Не меняйте ничего в стабильной части между вызовами, например метку времени.

Кеширование делает длинный фиксированный промпт гораздо дешевле. Оно не устраняет потерь качества от нерелевантного контекста.

Управляйте длиной вывода

  • Укажите число: «не более 100 слов», «ровно 5 пунктов».
  • Просите только то, что нужно: метку, а не метку с объяснением.
  • Задайте максимум выходных токенов в API как жёсткую остановку.
  • Для моделей с рассуждением снижайте усилие рассуждения на простых задачах.

Установите бюджет и обеспечьте его соблюдение

Решите, сколько токенов может использовать каждый промпт в продакшене, и проверяйте это автоматически. Контрольная точка тестирования промптов роняет сборку, когда файл промпта превышает свой лимит токенов:

{ "include": ["prompts/**/*.md"], "model": "gpt-4.1", "maxTokens": 1500 }

Так рост токенов перестаёт быть тем, что вы обнаруживаете в счёте, и становится тем, что вы проверяете в pull request. О более широком процессе улучшения промпта через измерения см. оптимизацию промптов.

Применить на практике

Попробуйте: оптимизатор промптов

Меньше токенов и больше структуры — с доказательством, что все требования сохранились. Бесплатно, детерминированно и без аккаунта.

Связанные инструменты PromptFlowEngine

Ещё по теме «оптимизация, тестирование и безопасность»

Все руководства по промпт-инжинирингу