Гайд · TNWS AI
Как оформить диалог для локальной LLM через apply_chat_template в Transformers
Роли user и assistant, add_generation_prompt и защита от двойных спецтокенов: проверяем входной шаблон перед генерацией.
Задача и применимость
Запрос читателя: «как оформить сообщения для модели transformers apply_chat_template». Ниже разобрана одна воспроизводимая задача на Python и Transformers 4.57.1. Действия относятся к checkpoint HuggingFaceTB/SmolLM2-135M-Instruct, а не ко всем нейросетям с похожим названием. Код не отправляет запросы к админ-панели и не меняет чужие данные. Для первого запуска требуется загрузить модель из Hugging Face Hub; модель может требовать памяти и иметь собственные лицензионные условия. Проверяйте карточку checkpoint до применения к пользовательскому контенту. Демонстрационные предсказания не выдаются здесь за фактически выполненный инференс: в доступной проверке сверены документация и синтаксис Python, но веса модели не запускались.
Факт из документации, на который опирается инструкция: apply_chat_template принимает список словарей с role и content. add_generation_prompt=True при поддержке шаблоном добавляет начало ответа assistant. При tokenize=True шаблон и специальные токены обрабатываются вместе; после tokenize=False повторная токенизация с add_special_tokens=True может продублировать спецтокены. Если версия вашей библиотеки или конфигурация checkpoint отличается, повторите короткий тест перед массовым использованием. Код показывает механизм, а не результат промышленной оценки качества на вашем корпусе.
Порядок действий
- Возьмите instruct-модель, в карточке которой указан chat template.
- Составьте messages с явными user/assistant и не смешивайте их с сырым текстовым префиксом.
- Вызовите apply_chat_template с tokenize=False только для просмотра готовой строки.
- Для реального ввода используйте tokenize=True и add_generation_prompt=True.
- Посмотрите, где заканчивается сообщение пользователя, и ограничьте число новых токенов при пробной генерации.
Для установки в отдельном окружении используйте совместимую версию пакета и backend PyTorch: pip install "transformers==4.57.1" torch. Наличие команды не означает, что все веса доступны именно вашей системе или что GPU настроен. Секреты и персональные данные не помещайте в демонстрационные входы. Для быстрой диагностики перед первым большим прогоном проверьте import transformers; print(transformers.__version__).
Готовый шаблон Python
from transformers import AutoTokenizer
name = "HuggingFaceTB/SmolLM2-135M-Instruct"
tok = AutoTokenizer.from_pretrained(name)
messages = [{"role": "user", "content": "Reply with exactly one word: hello."}]
preview = tok.apply_chat_template(messages, tokenize=False,
add_generation_prompt=True)
encoded = tok.apply_chat_template(messages, tokenize=True,
add_generation_prompt=True,
return_tensors="pt")
print(preview)
print("input_tokens", encoded.shape[-1])
Этот шаблон можно перенести в отдельный файл и заменить демонстрационные тексты на обезличенную выборку. Зафиксируйте checkpoint и входные строки, чтобы отличать ошибки подготовки от поведения модели. В серверном сценарии загрузку модели выполняйте один раз при старте службы, а не заново при каждом обращении. Если пример возвращает словарь, используйте проверку наличия ключа перед сохранением его в долговременное хранилище. Сначала воспроизведите малый тест, лишь затем подключайте массовый поток.
Пример входных данных и ожидаемой проверки
Вход — одно user-сообщение «Reply with exactly one word: hello». Ожидаемый формат preview — текст с ролевой разметкой по шаблону данной модели и открытым началом ответа assistant; encoded содержит индексы токенов. Сам текст ответа модели не задан этим кодом и не гарантируется по промпту.
Важно различать ожидаемую структуру ответа и непроверенное заранее содержимое нейросетевого предсказания. Если устройство или модель вернули иное значение, не «подгоняйте» скрипт под рассказ статьи. Сохраните фактический вывод, сопоставьте его с контрольным примером и запишите, какой слой дал отличие: вход, токенизация, checkpoint или постобработка. Так тест остается полезным после обновления окружения.
Как принимать решение по реальным данным
У разных chat-моделей разные разделители ролей. Если вручную записать «User: ... Assistant:», это не обязательно будет эквивалентно шаблону, на котором модель училась. Ошибка особенно заметна, когда генерация продолжает вопрос пользователя вместо ответа. Список messages отделяет содержимое от роли; если приложение получает пользовательский текст, кладите его в content соответствующей роли, но не позволяйте внешнему вводу заменять системные сообщения вашего приложения. Роль system поддерживается не одинаково всеми шаблонами, поэтому сверяйтесь с карточкой конкретного checkpoint. add_generation_prompt полезен тогда, когда шаблон различает начало нового ответа; документация предупреждает, что для некоторых моделей его действие отсутствует. Поэтому проверка preview перед запуском лучше слепой веры в аргумент.
Дополнительный тест перед внедрением
Создайте два теста: одиночное user-сообщение и предыдущая пара user/assistant плюс новый user. Просмотрите, что оба заканчиваются в нужном месте и у сообщения ассистента остаётся пространство для продолжения. Если вызываете tokenize=False ради логирования, при последующей токенизации указывайте add_special_tokens=False, иначе модель получит двойные специальные токены. В примере для реального ввода выбран tokenize=True, что проще и безопаснее. При сохранении набора диалогов храните роли явно, а не только конкатенированный текст: иначе при смене модели с другим шаблоном невозможно воспроизвести вход. Проверяйте длину input_tokens до генерации, потому что длинная история может вытеснить последний вопрос. Маленькая SmolLM2 служит демонстрацией формата, а не обещанием качества ответов на русском.
Критерии готовности
- В preview есть финальная позиция для ответа assistant, если шаблон её использует.
- Число токенов известно до inference.
- Спецтокены не добавлены повторно при втором проходе.
Записывайте тестовый результат вместе с ID входа и конфигурацией, но не публикуйте приватные запросы в открытых логах. Ручная разметка небольшой выборки нужна даже тогда, когда код возвращает ответ без ошибок: технически правильная форма не подтверждает полезность предсказания. После изменения модели или библиотеки прогоните тот же набор повторно. Если одно из условий не пройдено, сначала исправляйте причину, затем расширяйте применение.
Типичные ошибки и что не делать
- Не копировать разделители из чужой модели.
- Не конкатенировать user и system в один доверенный текст.
- Не считать шаблон гарантией соблюдения инструкции.
Не путайте демонстрационный вывод с обещанием точности и не подменяйте источники сведений ответом модели. Для автоматического действия с последствиями для человека добавляйте независимую проверку. Изменения языка, объёма текста и домена применения требуют новой оценки качества. В документации производителя описан интерфейс инструмента, но показатели вашей задачи можно узнать только на вашей контрольной выборке.
FAQ
Что передать в apply_chat_template?
Список сообщений с role и content.
Когда нужен add_generation_prompt?
При начале нового ответа assistant, если шаблон модели это использует.
Зачем tokenize=True?
Чтобы не дублировать спецтокены при повторной токенизации.
Официальные источники
Частые вопросы
Что передать в apply_chat_template?
Список сообщений с role и content.
Когда нужен add_generation_prompt?
При начале нового ответа assistant, если шаблон модели это использует.
Зачем tokenize=True?
Чтобы не дублировать спецтокены при повторной токенизации.
Читайте также
Как извлечь ответ из заданного текста через Transformers question-answering
Контекст, вопрос и контроль отсутствующего ответа: извлекаем span из документа, проверяем offsets и не принимаем догадку за факт.
Как не потерять конец текста при truncation и padding в Transformers
max_length, truncation и padding для пары сообщений: проверяем, что юридически важная оговорка не исчезает до вызова модели.
Как обработать большой поток отзывов пакетами в Transformers без переполнения памяти
batch_size, потоковый источник и честный замер производительности: сохраняем соответствие входов и выходов и тестируем OOM.
Комментарии
Пока тихо. Скажите первое слово