chat template 是什么
chat template 是把结构化的消息列表渲染成模型训练时见过的带角色标记纯文本的模板:模型不认识 JSON 消息,只认识训练格式的字符串。标准做法是用 tokenizer 自带的 Jinja 模板渲染,而不是手工拼字符串。模板与训练格式不一致时,典型表现是答非所问、输出里带角色标记、或者回复刚开始就结束。
基本信息
| 载体 | tokenizer 的 chat_template 字段(Jinja 模板) |
|---|---|
| 渲染入口 | tokenizer.apply_chat_template,推理服务端按模型自带模板渲染 |
| 关键开关 | add_generation_prompt=True 追加助手起手标记 |
| 常见缺失 | 部分模型仓库未提供模板,需要显式配置 |
| 适用平台 | HF transformers、vLLM/TGI 等 OpenAI 兼容服务 |
典型使用场景
- 采集与处理多轮对话数据:轮次必须渲染成训练时的角色格式,否则微调效果无从保证
- 自查输出异常:把渲染结果打印出来核对标记与分隔符,比猜测推理服务更直接
- 跨模型迁移:不同模型的标记体系不同,切换模型前先对比两个模板的差异
- 自建推理服务:确认服务端确实用了模型自带模板,而不是框架兜底的通用格式
- 构造评测集:prompt 渲染方式与线上一致,评测结论才对线上有意义
本地渲染自查
本地渲染自查
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("<模型路径>")
text = tok.apply_chat_template(
[{"role": "system", "content": "你是运维助手"},
{"role": "user", "content": "你好"}],
tokenize=False,
add_generation_prompt=True,
)
print(repr(text)) # 用 repr 看空格、换行与特殊标记是否与模型卡示例一致模板不匹配的表现
| 现象 | 可能原因 | 核对动作 |
|---|---|---|
| 答非所问、答完就停 | 角色标记与训练格式不一致 | 对比 repr 输出与模型卡示例 |
| 输出里出现标记文本 | 模型把标记当正文,通常是模板缺失 | 确认仓库是否提供模板,必要时显式配置 |
| 回复立刻结束或突然截断 | 结束标记处理不一致 | 检查模板里的结束标记与生成结束条件 |
| 多轮里角色错位 | 历史轮次渲染不全 | 确认历史消息都进了渲染输入 |
渲染时优先让模板与 tokenizer 自己处理特殊标记:自定义角色标记如果不是词表里的特殊 token,会被拆成普通子词,与训练时的分词结果不同。
模板属于模型资产的一部分,建议与 revision 一起记录进部署清单:换仓库版本后模板可能同步变化,输出风格随之改变。