Qwen-3 的聊天模板教會我們的 4 件事
一個無聊的 Jinja 片段揭示了關於新 Qwen-3 模型的資訊。
由 Qwen 推出的新 Qwen-3 模型配備了比其前身 Qwen-2.5 和 QwQ 複雜得多的聊天模板。透過檢視 Jinja 模板中的差異,我們可以發現關於新模型的有趣見解。
聊天模板
什麼是聊天模板?
聊天模板定義了使用者和模型之間對話的結構和格式。該模板充當翻譯器,將人類可讀的對話
[
{ 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>
您可以在 Hugging Face 模型頁面輕鬆檢視給定模型的聊天模板。
Qwen/Qwen3-235B-A22B 的聊天模板
讓我們深入瞭解 Qwen-3 聊天模板,看看能學到什麼!
1. 推理不必強制
您可以透過簡單的預填充使其可選...
Qwen-3 的獨特之處在於它能夠透過 `enable_thinking` 標誌切換推理。當設定為 false 時,模板會插入一個空的 `<think></think>` 對,告訴模型跳過逐步思考。早期的模型將 `<think>` 標籤嵌入到每個生成中,無論您是否需要,都強制進行思維鏈。
{# Qwen-3 #}
{%- if enable_thinking is defined and enable_thinking is false %}
{{- '<think>\n\n</think>\n\n' }}
{%- endif %}
例如,QwQ 在每次對話中都強制進行推理。
{# QwQ #}
{%- if add_generation_prompt %}
{{- '<|im_start|>assistant\n<think>\n' }}
{%- endif %}
如果 `enable_thinking` 為 true,模型可以決定是否進行思考。
您可以使用以下程式碼測試模板
import { Template } from "@huggingface/jinja";
import { downloadFile } from "@huggingface/hub";
const HF_TOKEN = process.env.HF_TOKEN;
const file = await downloadFile({
repo: "Qwen/Qwen3-235B-A22B",
path: "tokenizer_config.json",
accessToken: HF_TOKEN,
});
const config = await file!.json();
const template = new Template(config.chat_template);
const result = template.render({
messages,
add_generation_prompt: true,
enable_thinking: false,
bos_token: config.bos_token,
eos_token: config.eos_token,
});
2. 上下文管理應是動態的
Qwen-3 採用滾動檢查點系統,智慧地保留或修剪推理塊以維持相關上下文。舊模型會過早地丟棄推理以節省令牌。
Qwen-3 引入了“**滾動檢查點**”,透過反向遍歷訊息列表來查詢最新的非工具呼叫的使用者輪次。對於該索引之後的所有助手回覆,它會保留完整的 `<think>` 塊;所有更早的內容都會被剝離。
為什麼這很重要:
- 在多步工具呼叫期間保持活動計劃可見。
- 支援巢狀工具工作流,而不會丟失上下文。
- 透過修剪模型不再需要的思考來節省令牌。
- 防止“陳舊”推理滲入新任務。
示例
這是 Qwen-3 和 QwQ 透過工具呼叫保留思維鏈的示例。
檢視 @huggingface/jinja 以測試聊天模板
3. 工具引數需要更好的序列化
以前,每個 `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 和 QwQ 釋出時沒有此預設系統提示。儘管如此,如果您詢問,模型仍然可以準確識別其建立者。
結論
Qwen-3 向我們展示了透過 `chat_template` 我們可以提供更好的靈活性、更智慧的上下文處理和改進的工具互動。這些改進不僅提高了能力,還使代理工作流更可靠和高效。