🧠 图解记忆:消息是结构化数据,Chat Template 把角色翻成模型见过的 Token 格式;点击图片可查看原图。
Chat Template = 把多轮消息列表转换成模型在训练时见过的格式(角色标记 + 特殊 Token)。
为什么必须用模板?
模型训练时数据长这样(带角色标记):
<|im_start|>system
你是一个AI助手<|im_end|>
<|im_start|>user
你好<|im_end|>
<|im_start|>assistant
你好!有什么可以帮你?<|im_end|>如果直接拼接消息而不套模板:模型没见过"裸奔"的输入格式 → 角色信息丢失 → 答非所问、忘记 System Prompt。
不同模型模板不同(面试重点)
| 模型 | 模板特征 |
|---|---|
| ChatML(GPT/Qwen) | `< |
| LLaMA 3 | `< |
| Mistral / 部分模型 | [INST] ... [/INST] |
代码示例(正确姿势)
python
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
messages = [
{"role": "system", "content": "你是一个严谨的AI助手"},
{"role": "user", "content": "1+1等于几?"},
]
# ✅ 用官方模板(自动处理角色标记和特殊Token)
prompt = tokenizer.apply_chat_template(messages, tokenize=False)
# '<|im_start|>system\n你是一个严谨的AI助手<|im_end|>\n<|im_start|>user\n1+1等于几?<|im_end|>\n<|im_start|>assistant\n<|im_end|>'
# ❌ 错误做法:手动字符串拼接,没有角色标记和特殊Token
prompt = f"System: 你是一个严谨的AI助手\nUser: 1+1等于几?\nAssistant:"高频追问
- 谁负责套模板? 推理框架(vLLM 等)一般内置,或调用方用
apply_chat_template - 模板会额外消耗 Token 吗? 会——特殊 Token 也占 token 数;长 System Prompt + 模板前缀可吃 Prompt Caching 红利
- 为什么开源模型聊天效果差? 常见原因之一就是没套对模板(或 GenerationConfig 不对)
面试话术:
"Chat Template 就是把消息列表转成模型训练时的输入格式,核心是角色标记和特殊 Token。不同模型模板不同——Qwen 用 ChatML 的
<|im_start|>,LLaMA 3 用<|start_header_id|>——所以必须用apply_chat_template而不是手拼字符串。我在部署开源模型踩过坑:不套模板时模型忘记系统指令,套对模板后效果立竿见影。"
