Гайд · TNWS AI
Как ограничить длину генерации в Transformers через max_new_tokens и проверить результат
Граница новых токенов против общей длины входа, детерминированный тест и контроль обрезанного ответа на локальной instruct-модели.
Задача и применимость
Запрос читателя: «как ограничить ответ модели transformers max_new_tokens do_sample». Ниже разобрана одна воспроизводимая задача на Python и Transformers 4.57.1. Действия относятся к checkpoint HuggingFaceTB/SmolLM2-135M-Instruct, а не ко всем нейросетям с похожим названием. Код не отправляет запросы к админ-панели и не меняет чужие данные. Для первого запуска требуется загрузить модель из Hugging Face Hub; модель может требовать памяти и иметь собственные лицензионные условия. Проверяйте карточку checkpoint до применения к пользовательскому контенту. Демонстрационные предсказания не выдаются здесь за фактически выполненный инференс: в доступной проверке сверены документация и синтаксис Python, но веса модели не запускались.
Факт из документации, на который опирается инструкция: GenerationConfig описывает max_new_tokens как максимальное число вновь созданных токенов, игнорируя длину промпта. do_sample=False использует детерминированный выбор по правилам декодирования, но не обеспечивает истинность ответа. max_length включает вход и в новых примерах уступает max_new_tokens для ограничения продолжения. Если версия вашей библиотеки или конфигурация checkpoint отличается, повторите короткий тест перед массовым использованием. Код показывает механизм, а не результат промышленной оценки качества на вашем корпусе.
Порядок действий
- Создайте фиксированный небольшой user-промпт и форматируйте его через шаблон модели.
- Посчитайте входные токены до генерации.
- Вызовите generate с явным max_new_tokens и do_sample=False.
- Отрежьте input_ids от выхода и декодируйте только продолжение.
- Оцените, закончен ли ответ смыслово, и не показывайте обрезанное предложение как итог.
Для установки в отдельном окружении используйте совместимую версию пакета и backend PyTorch: pip install "transformers==4.57.1" torch. Наличие команды не означает, что все веса доступны именно вашей системе или что GPU настроен. Секреты и персональные данные не помещайте в демонстрационные входы. Для быстрой диагностики перед первым большим прогоном проверьте import transformers; print(transformers.__version__).
Готовый шаблон Python
from transformers import AutoModelForCausalLM, AutoTokenizer
name = "HuggingFaceTB/SmolLM2-135M-Instruct"
tok = AutoTokenizer.from_pretrained(name)
model = AutoModelForCausalLM.from_pretrained(name)
messages = [{"role": "user", "content": "Name two colors."}]
input_ids = tok.apply_chat_template(messages, tokenize=True,
add_generation_prompt=True,
return_tensors="pt")
out = model.generate(input_ids, max_new_tokens=24, do_sample=False)
continuation = out[0, input_ids.shape[-1]:]
print("new_tokens", len(continuation))
print(tok.decode(continuation, skip_special_tokens=True))
Этот шаблон можно перенести в отдельный файл и заменить демонстрационные тексты на обезличенную выборку. Зафиксируйте checkpoint и входные строки, чтобы отличать ошибки подготовки от поведения модели. В серверном сценарии загрузку модели выполняйте один раз при старте службы, а не заново при каждом обращении. Если пример возвращает словарь, используйте проверку наличия ключа перед сохранением его в долговременное хранилище. Сначала воспроизведите малый тест, лишь затем подключайте массовый поток.
Пример входных данных и ожидаемой проверки
Вход: «Name two colors», максимум 24 новых токена. Ожидаемая проверяемая форма — new_tokens не больше 24 и декодированное продолжение без повторения исходного промпта. Возможный смысловой ответ — два названия цветов, но точные слова не фиксированы и требуют проверки.
Важно различать ожидаемую структуру ответа и непроверенное заранее содержимое нейросетевого предсказания. Если устройство или модель вернули иное значение, не «подгоняйте» скрипт под рассказ статьи. Сохраните фактический вывод, сопоставьте его с контрольным примером и запишите, какой слой дал отличие: вход, токенизация, checkpoint или постобработка. Так тест остается полезным после обновления окружения.
Как принимать решение по реальным данным
Ограничение токенов нужно для контроля нагрузки и предотвращения бесконечного продолжения, но слишком маленькая величина обрежет предложение или JSON. Входной промпт тоже потребляет контекст, поэтому max_new_tokens=24 не означает, что суммарная последовательность имеет 24 токена. Если декодировать весь out[0], отобразится и исходный промпт; в чате это выглядит как повтор вопроса. Отделите выход по длине input_ids, как в коде. do_sample=False удобно для воспроизводимого регрессионного теста в одном окружении, но смена checkpoint или реализации inference способна менять текст. Не используйте неизменность генерации как проверку фактов. Для production дополнительно проверяйте условие завершения и длину, особенно если требуются точные поля: валидируйте JSON, а неполный ответ помечайте ошибкой, а не успешно сформированным объектом.
Дополнительный тест перед внедрением
Сравните три входа: короткий вопрос, длинное описание и запрос со строгой формой ответа. Запишите длину входа, число новых токенов и причину отклонения ответа при тесте. Если итог вплотную достигает лимита и не содержит законченного предложения, увеличьте лимит только после оценки памяти и контекста либо упростите задачу; произвольное повышение верхней границы не исправит неподходящий промпт. На сервере отдельно ограничьте пользовательский ввод до вызова модели. Не подменяйте max_new_tokens старым max_length, потому что тогда одинаковое значение по-разному работает для короткого и длинного вопроса. Маленькая демонстрационная модель не обязана надёжно выполнять инструкции на русском: перенесите логику на свой checkpoint с тестами качества. Для обнаружения повторов смотрите именно continuation, иначе prompt сам создаст ложный сигнал.
Критерии готовности
- Длина continuation не превышает установленный предел.
- Декодированный ответ не включает исходное сообщение пользователя.
- Незаконченное предложение не отмечается валидным ответом.
Записывайте тестовый результат вместе с ID входа и конфигурацией, но не публикуйте приватные запросы в открытых логах. Ручная разметка небольшой выборки нужна даже тогда, когда код возвращает ответ без ошибок: технически правильная форма не подтверждает полезность предсказания. После изменения модели или библиотеки прогоните тот же набор повторно. Если одно из условий не пройдено, сначала исправляйте причину, затем расширяйте применение.
Типичные ошибки и что не делать
- Не трактовать max_new_tokens как количество слов или символов.
- Не ожидать, что do_sample=False гарантирует фактологическую правильность.
- Не публиковать обрезанный JSON как готовые данные.
Не путайте демонстрационный вывод с обещанием точности и не подменяйте источники сведений ответом модели. Для автоматического действия с последствиями для человека добавляйте независимую проверку. Изменения языка, объёма текста и домена применения требуют новой оценки качества. В документации производителя описан интерфейс инструмента, но показатели вашей задачи можно узнать только на вашей контрольной выборке.
FAQ
Что считает max_new_tokens?
Новые токены после входного промпта.
Почему ответ повторяет вопрос?
Возможно, декодирован весь вывод вместе с input_ids.
Делает ли do_sample=False ответ истинным?
Нет, он меняет стратегию декодирования.
Официальные источники
Частые вопросы
Что считает max_new_tokens?
Новые токены после входного промпта.
Почему ответ повторяет вопрос?
Возможно, декодирован весь вывод вместе с input_ids.
Делает ли do_sample=False ответ истинным?
Нет, он меняет стратегию декодирования.
Читайте также
Как извлечь ответ из заданного текста через Transformers question-answering
Контекст, вопрос и контроль отсутствующего ответа: извлекаем span из документа, проверяем offsets и не принимаем догадку за факт.
Как не потерять конец текста при truncation и padding в Transformers
max_length, truncation и padding для пары сообщений: проверяем, что юридически важная оговорка не исчезает до вызова модели.
Как обработать большой поток отзывов пакетами в Transformers без переполнения памяти
batch_size, потоковый источник и честный замер производительности: сохраняем соответствие входов и выходов и тестируем OOM.
Комментарии
Пока тихо. Скажите первое слово