目录
- 引言
- Qwen3 chat template
- 代码实战
引言
我们都知道 GPT 回答问题的时候其实是在"猜"——一个token一个token地猜下一个该说什么。就像打字时的自动补全,只是聪明了许多倍。但这里有个问题:如果让模型直接猜,它怎么知道现在轮到谁说话?哪句是你问的,哪句是它答的,哪句又是系统在背后偷偷塞给它的"小抄"?
这就是聊天模板存在的理由。
当模型生成 <|im_start|>assistant 这种标记时,它其实是在告诉自己:"好,现在轮到我说话了。"而当它输出 <|tool_call|> 时,则是在说:"等等,我需要查点东西。“这些看起来像乱码的东西,是模型的"舞台指示”——告诉它何时上场、何时退场、何时该调用工具干活。
其实,这些标记是在训练时就刻进模型 DNA 里的。Llama 用一套,Qwen 用另一套,ChatGPT 还有自己的独门秘方。选错了模板,就像让演员拿错了剧本——再好的演技也救不了场。
所以当我们谈论 AI 如何从"聊天机器人"进化成能订机票、写代码、操控软件的"智能助手"时,别忘了这个不起眼的配角。没有合适的聊天模板,函数调用就是空谈。模型会把 JSON 当诗来写,把工具调用当闲聊来说。
接下来,我想带你看看这些模板到底长什么样,以及如何让它们为我们所用。
Qwen3 chat template
以下将基于 qwen3-0.6B 模型tokenizer_config.json 这个文件中的 chat_template全面解析一下Qwen3的聊天模板。
Qwen3-0.6B官方的tokenizer_config.json:
https://huggingface.co/Qwen/Qwen3-0.6B/blob/main/tokenizer_config.json
这个 chat_template使用 Jinja2 模板语言编写,其核心作用是将多轮对话(包含不同角色和内容)格式化为一段单一的、符合 Qwen3-0.6B 模型预训练格式的字符串,以便模型能够理解和处理。
核心设计思想
该模板的核心是使用特殊的 token 来界定不同的对话角色和内容块。最关键的 token 是:
<|im_start|>: 标志着一个新对话回合的开始。<|im_end|>: 标志着一个对话回合的结束。
在这两个 token 之间,会包含角色(如 system, user, assistant)和该角色的具体发言内容。
模板结构详解
我们可以将这个模板的功能分解为以下几个主要部分:
1. 工具(Tools)处理
模板首先会检查对话中是否提供了 tools(函数)。
-
如果提供了
tools:- 模板会以
<|im_start|>system\n开始,构建一个特殊的系统提示(System Prompt)。 - 这个系统提示会明确告知模型可以使用工具,并以 XML 标签
<tools>和</tools>的形式,将所有可用工具的定义(以 JSON 格式)包裹起来。 - 接着,它会指导模型如何以
<tool_call>和</tool_call>的 XML 标签来生成函数调用请求。 - 这个结构化的系统提示旨在让模型更好地理解何时以及如何使用外部工具。
- 模板会以
-
如果没有提供
tools:- 模板会检查第一条消息是否为
system角色。如果是,它会简单地将其格式化为<|im_start|>system\n{content}<|im_end|>\n。
- 模板会检查第一条消息是否为
2. 对话历史(Messages)处理
模板会遍历整个 messages 列表,并根据每个消息的 role(角色)进行不同的格式化处理:
-
user角色:- 格式化为:
<|im_start|>user\n{content}<|im_end|>\n。 - 这清晰地向模型表明这是用户的输入。
- 格式化为:
-
system角色 (非首条消息):- 同样格式化为:
<|im_start|>system\n{content}<|im_end|>\n。
- 同样格式化为:
-
assistant角色 (模型回复):

5713

被折叠的 条评论
为什么被折叠?



