Skip to content
🔗 分享本题
查看我的学习进度 →

Chat Template 动漫知识图:结构化 messages 经模型官方模板插入角色标记、分隔和特殊 Token,转换为训练时见过的输入格式,手工拼接可能造成角色混乱

🧠 图解记忆:消息是结构化数据,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 而不是手拼字符串。我在部署开源模型踩过坑:不套模板时模型忘记系统指令,套对模板后效果立竿见影。"