~/tools / Файлы моделей и шаблоны чата / Hugging Face Chat Template Tester

Hugging Face Chat Template Tester — Отрисуйте чат-шаблон Hugging Face и увидите точный промпт

Вставьте чат-шаблон Hugging Face (Jinja) или весь tokenizer_config.json модели, добавьте messages и tools и увидите точный текст промпта, который создаёт apply_chat_template(..., tokenize=False) из transformers. Инструмент запускает Jinja2 с теми же настройками песочницы, что и transformers, поэтому текст, ошибки и номера их строк совпадают с Python. Ничто не покидает ваш браузер.

Примеры (написаны для этого инструмента)

Вставьте шаблон Jinja (chat_template.jinja) или весь tokenizer_config.json либо chat_template.json из файлов модели на Hugging Face.

Список сообщений в JSON, тот же список, который вы передаёте в apply_chat_template.

Список определений инструментов в JSON (JSON Schema). Оставьте пустым, если инструментов нет.

Добавляет в конце начало хода ассистента, чтобы модель написала ответ (если шаблон это поддерживает).

Оставляет последнее сообщение открытым, чтобы модель его продолжила (prefill). Нельзя использовать вместе с add_generation_prompt.

Другие значения, передаваемые в apply_chat_template как именованные аргументы, в виде объекта JSON, например {"enable_thinking": false}. Переменные, которые читает шаблон, перечислены под результатом.

Дополнительные параметры
Специальные токены

transformers передаёт шаблону специальные токены токенизатора. Они заполняются, когда вы вставляете tokenizer_config.json.

Для шаблонов, поддерживающих documents (RAG): список объектов JSON вида {"title": "…", "text": "…"}.

Время, которое возвращает strftime_now(). Оставьте пустым, чтобы использовать текущее время.

Текст промпта

<|im_start|>system
You are a helpful assistant.

# Tools

You can call these functions:
<tools>
{"type": "function", "function": {"name": "get_weather", "description": "Get the current weather in a city.", "parameters": {"type": "object", "properties": {"city": {"type": "string", "description": "City name"}}, "required": ["city"]}}}
</tools>

To call one, reply with JSON inside <tool_call></tool_call>.<|im_end|>
<|im_start|>user
What's the weather in Paris?<|im_end|>
<|im_start|>assistant

<tool_call>
{"name": "get_weather", "arguments": {"city": "Paris"}}
</tool_call><|im_end|>
<|im_start|>user
<tool_response>
{"temperature": 22}
</tool_response><|im_end|>
<|im_start|>assistant
Символов: 688

Об этом шаблоне

Переменные, которые он читает
Задаются apply_chat_template: add_generation_prompt, messages, tools
Специальные токены: нет
Другие: нет
Использует {% generation %}
Нет

Проверьте в Python

Запустите это, чтобы сравнить с transformers. Замените MODEL_ID на модель или передайте свой шаблон как chat_template=.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("MODEL_ID")
messages = [
    {'role': 'system', 'content': 'You are a helpful assistant.'},
    {'role': 'user', 'content': "What's the weather in Paris?"},
    {'role': 'assistant', 'content': '', 'tool_calls': [{'type': 'function', 'function': {'name': 'get_weather', 'arguments': {'city': 'Paris'}}}]},
    {'role': 'tool', 'name': 'get_weather', 'content': '{"temperature": 22}'},
]
tools = [
    {'type': 'function', 'function': {'name': 'get_weather', 'description': 'Get the current weather in a city.', 'parameters': {'type': 'object', 'properties': {'city': {'type': 'string', 'description': 'City name'}}, 'required': ['city']}}},
]
text = tokenizer.apply_chat_template(
    messages,
    tools=tools,
    add_generation_prompt=True,
    tokenize=False,
)
print(text)

Результат это текст до токенизации. Затем transformers токенизирует его с add_special_tokens=False, поэтому специальные токены появляются только там, где их пишет шаблон.

Если заданы tools и у модели есть шаблон с именем tool_use, transformers использует именно его. Шаблон также можно выбрать по имени.

messages, tools и documents читаются как модулем json в Python: целые числа становятся int, а числа с десятичной точкой float, что может изменить то, как шаблон их выводит.

Проверено 2026-11-09 на transformers 5.22.2 с Jinja2 3.1.6 (Python 3.14). transformers: чат-шаблоны · Исходный код transformers

Всё выполняется в вашем браузере. Ничто из вставленного вами не отправляется и не сохраняется.

Большинство открытых моделей на Hugging Face поставляются с чат-шаблоном: небольшой программой на Jinja, которая превращает список сообщений в текст, который модель на самом деле читает. Пропущенный пробел, двойной токен BOS или неверный промпт генерации меняют то, что видит модель, а шаблон трудно читать, не запустив его. Этот инструмент запускает его так, как это делает transformers. Мы портировали Jinja2 3.1.6 на JavaScript: его лексер, парсер, правила о том, какие переменные где видны, constant folding, песочницу, которую использует transformers, и все встроенные фильтры и тесты вместе с поведением самого Python для строк, чисел, сортировки и сообщений об ошибках. Поверх этого он следует apply_chat_template в transformers 5.22.2: специальные токены вроде bos_token, шаблон tool_use при заданных tools, add_generation_prompt, continue_final_message, documents, reasoning_content и участки {% generation %}. Мы отрисовали чат-шаблоны 39 открытых моделей (Qwen, Llama, Mistral, Gemma, Phi, DeepSeek, gpt-oss и других) на 15 видах диалогов, и все 585 результатов совпали с transformers. Более 20 000 других тестовых шаблонов тоже совпали, включая ошибки и номера строк, кроме нескольких, которые используют фильтр random, чей результат в Python тоже случаен.

Когда пригодится

  • Увидеть точный промпт, который получает модель, прежде чем дообучать её или запускать: токены BOS и EOS, пробелы, переводы строк и промпт генерации
  • Найти переключатели, которые читает шаблон, например enable_thinking, и увидеть, что они меняют
  • Отладить чат-шаблон, который вы пишете, с ошибками и номерами строк, tools, documents и continue_final_message

Как пользоваться

  1. Вставьте чат-шаблон или весь tokenizer_config.json либо chat_template.json модели или выберите пример.
  2. Отредактируйте messages и tools (те же списки JSON, которые вы передаёте в Python) и задайте add_generation_prompt и другие параметры.
  3. Прочитайте текст промпта и переменные, которые использует шаблон, и скопируйте код на Python, чтобы проверить те же входные данные в transformers.

Вопросы

Совпадает ли результат с apply_chat_template?

Он совпадает с apply_chat_template(..., tokenize=False), то есть с текстом до токенизации. Специальные токены, add_generation_prompt, continue_final_message, tools и documents обрабатываются как в transformers 5.22.2. Инструмент не превращает текст в token IDs.

Откуда берутся bos_token и eos_token?

В Python они берутся из токенизатора. Если вы вставляете tokenizer_config.json, инструмент читает их оттуда. В остальных случаях введите их в разделе Дополнительные параметры.

Что делает {% generation %}?

Некоторые шаблоны оборачивают ответы ассистента в {% generation %} … {% endgeneration %}. transformers использует эти участки для return_assistant_tokens_mask, например чтобы обучать только на токенах ассистента. Инструмент подсвечивает их в результате.

Дадут ли vLLM, llama.cpp или другие серверы тот же текст?

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

Почему переменная вроде enable_thinking указана в разделе Другие?

Шаблон её читает, но apply_chat_template её не задаёт. Передайте её как дополнительную переменную (например {"enable_thinking": false}), чтобы изменить результат, как в Python вы передали бы enable_thinking=False.

Отправляется ли мой шаблон куда-либо?

Нет. Всё выполняется в вашем браузере.

Похожие