Qwen-3 的聊天模板教會我們的 4 件事

釋出於 2025 年 4 月 30 日
在 GitHub 上更新

一個無聊的 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 透過工具呼叫保留思維鏈的示例。 image/png

檢視 @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` 我們可以提供更好的靈活性、更智慧的上下文處理和改進的工具互動。這些改進不僅提高了能力,還使代理工作流更可靠和高效。

社群

此評論已被隱藏(標記為包含露骨內容)

很棒的帖子!🔥

有沒有解釋為什麼這個模板有時使用像 `<|im_start|>` 和 `<|im_end|>` 這樣的尖括號符號,而另一些時候卻使用像 `<think>` 和 `</think>` 這樣的 XML 符號,而不是 `<|think_start|>` 和 `<|think_end|>`?

這讓我覺得很不一致。

·

使用尖括號符號的識別符號是令牌,也就是說,它們實際上被分詞器識別並轉換為單個“特殊”令牌。例如,`<|im_end|>` 用作 `EOS_TOKEN`。(順便說一下,如果您想嘗試微調這些 Qwen 模型,您需要知道這一點,因為您需要在微調配置中明確設定 `eos_token='<|im_end|>'`。)

XML 風格的識別符號是定義生成輸出部分的佔位符。它們以與任何其他文字相同的方式進行分詞(也就是說,它們可能被轉換為多個令牌,但這取決於詞彙表),它們沒有預定的特殊含義,它們的用法是在訓練期間由模型學習的。

話雖如此,`<think>` 和 `</think>` 這兩個特定的佔位符在推理模型中相當標準。

註冊登入 發表評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.