你在豆包、智谱清言里点下发送的瞬间,消息并不直接进模型,而是先被拼装成一段带特殊记号的序列。负责拼装的这套格式叫聊天模板,它决定角色怎么贴标签、系统提示排哪里、轮次之间怎么分隔。
一条消息进站:标签怎么贴
模板的核心是角色标记。你的提问会被包进 user 段,模型的历史回答包进 assistant 段,开头的系统设定包进 system 段,每段前后各有起止记号,比如一个专用 token 表示「用户发言开始」。这些记号不在字面上显示,却全程参与注意力计算——模型靠它们分清哪句是你说的、哪句是自己以前答的。少了标记,模型会把你的问题当成自己说过的话,答非所问很多时候就是这么来的。
顺序与多轮:拼装的先后门道
拼装顺序有讲究:系统提示通常放最前,因为它要全程生效;历史消息按时间排列;你的新消息放末尾,紧接着一个「助手开始作答」的记号,模型从这里往下续写。多轮对话就是把上面这套一轮轮叠起来,越叠越长。束搜索是怎么保留候选的与重复惩罚是怎么压制复读的讲的输出侧参数都发生在拼装之后,而注意力是怎么算 QKV 的讲的计算吃的就是这份拼好的序列——输入格式错一点,后面全盘跟着错。
| 序列位置 | 放什么 | 为什么放这里 |
|---|---|---|
| 最前 | 系统设定 | 要全程生效 |
| 中间 | 历史消息,按时间排列 | 对话先后不乱 |
| 末尾 | 新消息加「助手开始作答」记号 | 模型从这里往下续写 |
模板差异对照表(换模型接口前核对)
- 系统段:有的模型给独立段落,有的塞进首条用户消息
- 角色记号:各家用词与符号不同,不能互换
- 结尾记号:决定模型知道在哪停笔
- 换接口先对一遍这份表,模板不匹配是答非所问的头号来源
模板对不上会怎样
每家模型的模板是私有的:DeepSeek 与文心一言的记号体系完全不同,把 A 家的格式喂给 B 家,轻则回答质量下滑,重则胡言乱语。调用开源模型时尤其要留神,本地部署常见的翻车原因就是手拼格式与官方模板差了一个记号。以官方技术报告或推理框架文档为准,别凭感觉抄别人的格式。检查方法也简单:把拼装后的完整序列打印出来,对照官方示例逐个记号核对,差一处都会让模型「认错人」。
关于聊天模板的三个常问问题
- 为什么同样的提示词,两个平台回答差别大?:除了模型本身,模板也不同——角色记号、系统段处理各有各的写法,同一段文字进了不同的格式壳子,产出自然有差异。
- 多轮对话为什么越聊越慢?:每轮都把历史全部重新拼装一遍,序列越来越长,注意力的计算量为什么随长度平方涨那篇的平方账随之生效,处理时间水涨船高。
- 系统提示应该写多长?:它排在序列最前、全程参与计算,写关键规则即可;太长会挤占窗口,还可能与后文要求互相打架。
记住流程就懂了:先拼装、后计算,模板是模型的第一道门。还有一层常被忽略:模板里系统提示的位置与措辞会实实在在影响回答风格,同样的用户问题,系统提示写在前后不同位置,模型给出的语气和详略都可能不同。多轮对话里历史并不是无限携带的,超长部分会被截断或压缩,被切掉的往往是最早的几轮——这就是前面聊过的事后面忘了的机制原因之一。换模型时如果发现同一个人设语气变了,先核对模板与系统提示是否原样迁移,再怀疑模型本身。反过来也要警惕模板污染:有的平台会在系统提示里塞入平台自己的规则,你看到的模板只是其中一段,排查行为异常时要把完整输入原样打印出来看。


