原文:https://huggingface.co/blog/qwen-3-chat-template-deep-dive
什么是聊天模版?
聊天模版是把人类可读的聊天,转换成大模型可读的输入的一个模版。
举个例子:
下面是一个人类可读的json格式的聊天记录
[
{ role: "user", content: "Hi there!" },
{ role: "assistant", content: "Hi there, how can I help you today?" },
{ role: "user", content: "I'm looking for a new pair of shoes." }
]
经过聊天模版转换后,得到大模型的实际输入:
<|im_start|>user
Hi there!<|im_end|>
<|im_start|>assistant
Hi there, how can I help you today?<|im_end|>
<|im_start|>user
I'm looking for a new pair of shoes.<|im_end|>
<|im_start|>assistant
<think>
</think>
你可以在Huggingface的网页上很方便的查看聊天模版,比如Qwen3-235B的HF网页是https://huggingface.co/Qwen/Qwen3-235B-A22B
下面我们就逐行分析Qwen3的聊天模版,看看有什么新东西:
- 思考过程不是强制的
- 上下文管理是动态的
- tool call 对json格式更友好
- 不需要一个默认的系统提示词
1. 思考过程不是强制的
您可以通过简单的预填充使其成为可选的…
Qwen-3 的独特之处在于它能够通过enable_thinking标志位切换推理。当设置为 false 时,模板会插入一个空对,告诉模型跳过逐步思考。之前的深度思考模型会将该标签嵌入到每一轮对话,无论你是否愿意,都会强制执行思维链。
{%- if enable_thinking is defined and enable_thinking is false %}
{{- '<think>\n\n</think>\n\n' }}
{%- endif %}
例如 QwQ 强制在每次对话中进行推理。
{%- if add_generation_prompt %}
{{- '<|im_start|>assistant\n<think>\n' }}
{%- endif %}
如果这enable_thinking是真的,模型就能够决定是否思考。
您可以使用以下代码测试模板:
2. 上下文管理是动态的
Qwen-3 采用滚动检查点系统,智能地保留或修剪推理块以维护相关的上下文。旧模型会过早地丢弃推理块以节省 token。
Qwen-3 引入了“滚动检查点”机制,通过反向遍历消息列表来查找非工具调用的最新用户回合。对于该索引之后的任何助手回复,它会保留完整的区块;更早的所有内容都会被删除。
为什么这很重要:
在多步骤工具调用期间保持活动计划可见。
支持嵌套工具工作流程而不会丢失上下文。
通过修剪模型不再需要的想法来保存标记。
防止“陈旧”的推理渗透到新任务中。
3. tool call 对json格式更友好
以前,每个tool_call.arguments字段都会通过管道传输 | tojson,即使它已经是 JSON 编码的字符串——这有双重转义的风险。Qwen-3 首先检查类型,并且仅在必要时进行序列化。
{# Qwen3 #}
{%- if tool_call.arguments is string %}
{{- tool_call.arguments }}
{%- else %}
{{- tool_call.arguments | tojson }}
{%- endif %}
4. 不需要一个默认的系统提示词
与许多型号一样,Qwen-2.5系列具有默认系统提示。
你是阿里云打造的Qwen,你的得力助手。
这很常见,因为它可以帮助模型回答用户的问题,例如“你是谁?”。
但是,Qwen-3 的聊天模版中没有这个默认的系统提示。尽管如此,如果你询问模型,它仍然可以准确地识别它的创建者。
总结
Qwen-3 的聊天模版向我们展示了提供更佳的灵活性、更智能的上下文处理以及更完善的工具交互。这些改进不仅提升了功能,还使Agent工作流更加可靠高效。