~/tools / モデルのファイルとチャットテンプレート / Hugging Face Chat Template Tester
Hugging Face Chat Template Tester — チャットテンプレートを描画して確認
Hugging Face のチャットテンプレート(Jinja)か、モデルの tokenizer_config.json をまるごと貼り付け、messages と tools を加えると、transformers の apply_chat_template(..., tokenize=False) が作るプロンプトのテキストそのものを確認できます。このツールは transformers と同じサンドボックス設定で Jinja2 を実行するので、テキストもエラーも行番号も Python と同じです。データはブラウザの外へ出ません。
Jinja テンプレート(chat_template.jinja)か、Hugging Face のモデルのファイルにある tokenizer_config.json または chat_template.json をまるごと貼り付けます。
メッセージの JSON のリスト。apply_chat_template に渡すリストと同じものです。
ツール定義の JSON のリスト(JSON Schema)。ツールを使わない場合は空のままにします。
末尾にアシスタントの発話の開始部分を足し、モデルが返答を書けるようにします(テンプレートが対応している場合)。
最後のメッセージを閉じずに残し、モデルがその続きを書くようにします(プリフィル)。add_generation_prompt と同時には使えません。
apply_chat_template にキーワード引数として渡すその他の値。{"enable_thinking": false} のような JSON オブジェクトで指定します。テンプレートが読む変数は出力の下に一覧で出ます。
詳細オプション
transformers はトークナイザーの特殊トークンをテンプレートに渡します。tokenizer_config.json を貼り付けると自動で入力されます。
documents に対応するテンプレート(RAG)向け: {"title": "…", "text": "…"} のようなオブジェクトの JSON のリスト。
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
このテンプレートについて
- 読み取る変数
- 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 は Python の json モジュールと同じように読み取ります。整数は int、小数点のある数は float になり、テンプレートでの出力のされ方が変わることがあります。
2026-11-09 に transformers 5.22.2、Jinja2 3.1.6(Python 3.14)で確認しました。 transformers: チャットテンプレート · transformers のソースコード
すべてブラウザの中で動きます。貼り付けた内容は送信も保存もされません。
Hugging Face にある多くのオープンモデルには、チャットテンプレートが付いています。メッセージのリストを、モデルが実際に読むテキストに変える小さな Jinja プログラムです。空白が1つ足りない、BOS トークンが二重になる、生成プロンプトが違うといった差でモデルに見えるものが変わりますが、テンプレートは実行しないと読みにくいものです。このツールは transformers と同じやり方でテンプレートを実行します。Jinja2 3.1.6 を JavaScript に移しました。字句解析、構文解析、変数がどこから見えるかの規則、定数畳み込み、transformers が使うサンドボックス、すべての組み込みフィルターとテスト、そして文字列・数値・並べ替え・エラーメッセージに関する Python 自身の動作です。その上で transformers 5.22.2 の apply_chat_template に従い、bos_token などの特殊トークン、tools を渡したときの tool_use テンプレート、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
使い方
- チャットテンプレートか、モデルの tokenizer_config.json または chat_template.json をまるごと貼り付けるか、例を選びます。
- messages と tools(Python で渡すものと同じ JSON のリスト)を編集し、add_generation_prompt などのオプションを設定します。
- プロンプトのテキストとテンプレートが使う変数を読み、同じ入力を transformers で確認する Python コードをコピーします。
FAQ
結果は apply_chat_template と同じですか?
apply_chat_template(..., tokenize=False) と同じ、トークン化の前のテキストです。特殊トークン、add_generation_prompt、continue_final_message、tools、documents は transformers 5.22.2 と同じように扱います。テキストをトークン ID に変換することはしません。
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 は設定しません。出力を変えるには、Python で enable_thinking=False と渡すのと同じように、追加の変数(たとえば {"enable_thinking": false})として渡します。
テンプレートはどこかに送られますか?
いいえ。すべてブラウザの中で動きます。