What is 聊天模板?
一种格式化结构,定义了对话消息(系统、用户、助手)如何被分词并排列为语言模型的输入。
Definition
聊天模板是一种预定义的文本格式,将多轮对话结构化为语言模型期望的token序列。每个模型系列都有自己的聊天模板,指定如何使用特殊token和格式约定来分隔系统指令、用户消息和助手回复。例如,Llama模型使用[INST]和[/INST]等token来包裹用户轮次,而ChatML(Mistral等模型使用)使用带有角色标签的<|im_start|>和<|im_end|>标记。
聊天模板是必不可少的,因为语言模型从根本上是下一token预测器——它们没有「角色」或「轮次」的固有概念。聊天模板将这种对话结构编码到模型实际处理的扁平token流中。如果使用了错误的模板,模型将无法区分用户消息和助手回复,导致不连贯或角色混淆的输出。这是LLM部署中最常见但最容易避免的错误之一。
现代框架如Hugging Face Transformers将聊天模板作为Jinja2模板存储在分词器配置中,通过`apply_chat_template()`方法 实现自动格式化。在为对话模型准备微调数据时,训练管道必须对每个样本应用正确的聊天模板,以便模型学习预期的格式。训练和推理之间模板不匹配是微调模型性能下降的常见原因。
Why It Matters
使用正确的聊天模板是从任何对话模型获得连贯输出的前提。它对微调同样至关重要:训练数据必须使用与模型预训练时相同的模板格式化,否则模型将学到一种与推理时冲突的格式。对于使用多个模型系列的团队来说,理解聊天模板可以防止微妙的bug,这些bug表现为模型忽略指令、混淆角色或生成格式错误的回复。
How It Works
当用户向模型发送对话时,聊天模板处理器接收结构化的消息列表——每条消息包含角色(system、user或assistant)和内容——并将它们渲染为带有适当特殊token的单个字符串。例如,在ChatML格式中,系统消息变为:<|im_start|>system\n你是一个有帮助的助手。<|im_end|>\n。分词器随后将此格式化字符串转换为token ID。在微调过程中,相同的模板应用于每个训练样本的对话,损失通常仅在助手token上计算(不包括用户或系统token),这样模型学习的是生成回复而非提示。
Example Use Case
一个团队在客户支持对话上微调Mistral 7B模型,但不小心使用了Llama的聊天模板而不是ChatML来格式化训练数据。微调后的模型产生了混淆的输出,用户和助手的角色混在一起。在使用正确的ChatML模板重新格式化训练数据并重新训练后,模型正确区分了角色并产生了连贯、结构良好的回复。这个修复只花了几个小时的重新训练时间,却节省了数周的调试时间。
Key Takeaways
- 聊天模板将对话结构(角色、轮次)编码到模型期望的扁平token序列中。
- 每个模型系列有自己的聊天模板——使用错误的模板会产生不连贯的输出。
- 训练数据必须使用与基础模型预训练格式相同的聊天模板。
- 现代框架将模板作为Jinja2存储在分词器配置中以实现自动格式化。
- 微调过程中的损失掩码通常排除非助手token,使学习聚焦于回复生成。
How Ertas Helps
Ertas Studio自动为用户选择的基础模型应用正确的聊天模板,消除了最常见的微调陷阱之一。当用户上传包含结构化消息的JSONL训练数据时,Ertas在分词之前根据模型的预期模板格式化每个样本。这意 味着用户可以使用干净、人类可读的消息数组工作,让平台处理模型特定的格式化细节。
Related Resources
Base Model
JSONL
System Prompt
Tokenizer
Training Data
Getting Started with Ertas: Fine-Tune and Deploy Custom AI Models
Introducing Ertas Studio: A Visual Canvas for Fine-Tuning AI Models
Hugging Face
llama.cpp
Ollama
Ertas for SaaS Product Teams
Ertas for Customer Support
Ship AI that runs on your users' devices.
Early bird pricing starts at $14.50/mo — locked in for life. Plans for builders and agencies.