~/tools / 模型檔案與聊天範本 / Hugging Face Chat Template Tester
Hugging Face Chat Template Tester — 渲染 Hugging Face 聊天範本,看到確切的提示詞
貼上 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)。不使用工具時請留空。
在結尾加上助理回合的開頭,讓模型撰寫回覆(若範本支援)。
讓最後一則訊息保持開放,讓模型接著寫下去(prefill)。不能與 add_generation_prompt 同時使用。
以關鍵字引數傳給 apply_chat_template 的其他值,以 JSON 物件表示,例如 {"enable_thinking": false}。範本讀取的變數會列在輸出下方。
更多選項
transformers 會把 tokenizer 的特殊 token 傳給範本。貼上 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
關於此範本
- 它讀取的變數
- 由 apply_chat_template 設定: add_generation_prompt, messages, tools特殊 token: 無其他: 無
- 使用 {% 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)輸出是 tokenization 之前的文字。transformers 接著以 add_special_tokens=False 進行 tokenization,因此特殊 token 只會出現在範本寫下它們的地方。
提供 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 程式,把訊息清單轉成模型實際讀取的文字。少一個空格、BOS token 重複,或是生成提示詞不對,都會改變模型看到的內容,而範本不實際執行很難看懂。本工具以 transformers 的方式執行範本。我們把 Jinja2 3.1.6 移植到 JavaScript:包括詞法分析器、語法分析器、變數在何處可見的規則、常數折疊、transformers 使用的沙箱、所有內建過濾器與測試,以及 Python 本身處理字串、數字、排序與錯誤訊息的行為。在此之上,本工具遵循 transformers 5.22.2 的 apply_chat_template:處理 bos_token 等特殊 token、提供 tools 時使用的 tool_use 範本、add_generation_prompt、continue_final_message、documents、reasoning_content,以及 {% generation %} 區段。我們用 15 種對話渲染了 39 個開放模型(Qwen、Llama、Mistral、Gemma、Phi、DeepSeek、gpt-oss 等)的聊天範本,585 筆結果全部與 transformers 相符。另有超過 20,000 個測試範本同樣相符,包括錯誤與行號;例外是少數使用 random 過濾器的範本,其結果在 Python 中本來就是隨機的。
使用情境
- 在微調或部署之前,確切看到模型收到的提示詞:BOS 與 EOS token、空格、換行與生成提示詞
- 找出範本讀取的開關,例如 enable_thinking,並查看它們改變了什麼
- 除錯你正在撰寫的聊天範本:錯誤與行號、tools、documents 與 continue_final_message
使用方法
- 貼上聊天範本,或模型完整的 tokenizer_config.json 或 chat_template.json,也可以選一個範例。
- 編輯 messages 與 tools(與你在 Python 中傳入的 JSON 清單相同),並設定 add_generation_prompt 與其他選項。
- 閱讀提示詞文字與範本使用的變數,並複製 Python 程式碼,在 transformers 中檢查相同的輸入。
FAQ
結果與 apply_chat_template 相同嗎?
與 apply_chat_template(..., tokenize=False) 相同,也就是 tokenization 之前的文字。特殊 token、add_generation_prompt、continue_final_message、tools 與 documents 的處理方式與 transformers 5.22.2 相同。本工具不會把文字轉成 token IDs。
bos_token 與 eos_token 從哪裡來?
在 Python 中,它們來自 tokenizer。貼上 tokenizer_config.json 時,本工具會從中讀取。否則,請在「更多選項」中輸入。
{% generation %} 有什麼作用?
有些範本會把助理的回覆包在 {% generation %} … {% endgeneration %} 中。transformers 將這些區段用於 return_assistant_tokens_mask,例如只針對助理的 token 進行訓練。本工具會在輸出中標示這些區段。
vLLM、llama.cpp 或其他伺服器會得到相同的文字嗎?
其他軟體可能以不同的引擎或不同的設定渲染同一個範本,因此輸出可能不同。本工具遵循 transformers。
為什麼 enable_thinking 這類變數會列在「其他」之下?
範本會讀取它,但 apply_chat_template 不會設定它。請把它當作額外變數傳入(例如 {"enable_thinking": false})來改變輸出,就像在 Python 中傳入 enable_thinking=False 一樣。
我的範本會被傳送到任何地方嗎?
不會。一切都在你的瀏覽器中執行。