今天聊一個(gè)每個(gè)本地部署 Qwen 的人遲早會(huì)踩的坑 —— 聊天模板
事情是這樣的,最近想用 Qwen3.6 跑點(diǎn) Agent 任務(wù),結(jié)果一上手就翻車:在 LM Studio 里偶爾工具調(diào)用剛發(fā)出去模型就 <|im_end|> 提前收攤,換到 llama.cpp 上 loop.previtem 直接報(bào)解析錯(cuò)誤,搬到 vLLM 上想跑 Codex 工具發(fā)個(gè) developer role 又被官方模板嫌棄……一通操作下來感覺自己不是在用模型,是在調(diào)試一個(gè) Jinja 模板
后來才知道,這些不是我用錯(cuò)了,全是 Qwen 官方 jinja chat template 的鍋
HuggingFace 上有個(gè)叫 froggeric 的老哥實(shí)在看不下去,干脆自己 fork 了官方模板,專門治這些病
![]()
項(xiàng)目名簡單粗暴:Qwen-Fixed-Chat-Templates,目前已經(jīng)迭代到 v19,專為 Qwen 3.5 和 Qwen 3.6 全系列(27B / 32B / 35B 都包)打造
簡介
一句話講清楚:這是一個(gè) drop-in 直接替換 的 jinja 聊天模板,專修官方版本的渲染錯(cuò)誤、KV Cache 失效、token 浪費(fèi)和 Agent 任務(wù)下的致命卡死
? 直接把官方 chat_template.jinja 換成 froggeric 這個(gè)版本就行,模型權(quán)重不用動(dòng),量化文件不用重做
經(jīng)過實(shí)測(cè),在以下推理引擎上都能跑:
LM Studio :右側(cè)面板換 Prompt Template 直接保存
llama.cpp / koboldcpp :
--jinja --chat-template-file chat_template.jinjavLLM :替換
tokenizer_config.json里的chat_template字段,配合--tool-call-parser qwen3_coderMLX / oMLX :覆蓋本地模型目錄的
chat_template.jinja,啟動(dòng)加--jinja任意支持 HuggingFace Jinja 模板的引擎也通吃
直接上 froggeric 整理的"罪狀表"(v19 視角):
類別
問題
后果
Agent 死循環(huán)
提前停機(jī) Bug
模型想邊說話邊調(diào)工具,結(jié)果一上頭就 `<
Agent 死循環(huán)
重試自旋
工具明明報(bào)錯(cuò)了,模型還在原地反復(fù)發(fā)同一個(gè)失敗的
Agent 死循環(huán)
工具調(diào)用后過度思考
拿到數(shù)據(jù)后陷入"我該不該回答"的內(nèi)心戲
Agent 死循環(huán)
誤判錯(cuò)誤
返回結(jié)果里只要帶個(gè) error 字樣,立刻誤以為工具失敗
性能
KV Cache 失效
歷史 prune 每輪都改變,整個(gè) prompt 重新算一遍,速度起飛(向下)
性能
"空 think" 中毒
歷史里殘留一堆空
,模型學(xué)會(huì)"不思考才能用工具"的詭異認(rèn)知
兼容性
老舊 C++ 引擎崩潰
loop.previtem
在老版 llama.cpp / minijinja 上直接掛
兼容性
工具調(diào)用格式錯(cuò)
Qwen 訓(xùn)練時(shí)用的是 XML 格式
,官方模板卻給改成 JSON,vLLM 的 qwen3_coder 解析器直接懵
兼容性
Jinja C++ 崩潰
Python 專屬過濾器 map 、 first 在 minijinja 上是一炸一個(gè)準(zhǔn)
穩(wěn)定性
對(duì)話中插系統(tǒng)消息崩潰
框架想中途插一句 system 指令,模板硬錯(cuò)
穩(wěn)定性
沒用戶消息直接崩
純 Agent loop 或系統(tǒng)消息上下文里 raise_exception 觸發(fā)
穩(wěn)定性
思考沒關(guān)就調(diào)工具
XML 標(biāo)簽泄漏到工具解析器
邊界 case developer
角色被拒
Claude Code / Codex / OpenCode 現(xiàn)代 API 都用 developer 角色,官方模板不認(rèn)
邊界 case --reasoning off
被忽略
明明關(guān)了思考,錯(cuò)誤升級(jí)路徑里又偷偷開了
塊
邊界 case
關(guān)思考時(shí)幻覺 reasoning 標(biāo)簽
Qwen 自己會(huì)幻覺出多余的 \n ,堆棧空格炸了
v19 改了什么(這是最值得看的部分) ![]()
v19 三大修復(fù) · The Agentic Loop Cure
v19(2026-05-18 發(fā)布)的核心是 The Agentic Loop Cure,三件大事:
1. 干掉"空 think 中毒"
之前的版本為了省 token,把歷史里的
塊清空成空標(biāo)簽,結(jié)果模型把"空思考 = 可以調(diào)工具"和"完整思考 = 必須接對(duì)話"建立了一個(gè)錯(cuò)亂的關(guān)聯(lián),80% 以上的過早收攤 Bug 都來自這個(gè),v19 直接重寫 AST 歷史渲染,徹底不再注入空 think 塊
2. 拆掉系統(tǒng)提示詞里的"邏輯陷阱"
老版的
塊里給了一道死命令:" 之后必須調(diào)工具",模型一遇到只想聊天的場(chǎng)景就 panic,v19 改成了 Universal Synthesis 指令,允許模型從 直接轉(zhuǎn)入對(duì)話回復(fù),不必再為這條規(guī)則做內(nèi)心 debate
3. KV Cache 100% 命中 + Amnesia 修復(fù)
preserve_thinking 現(xiàn)在默認(rèn) true,過去的思考鏈嚴(yán)格按時(shí)序保留,**完全治好了多步工具循環(huán)里的"失憶卡頓"**,同時(shí)數(shù)學(xué)保證 100% Prefix KV Cache 命中率,本地推理速度直接拉滿
這一波下來,agent loop 基本可以一氣跑完,不再卡在中途亂拐彎
安裝方式
按你用的引擎選一個(gè):
LM Studio
1. 右側(cè)面板打開 Qwen 模型
2. 找到 Prompt Template
3. 把 chat_template.jinja 全文粘進(jìn)去
4. 保存
llama.cpp / koboldcpp
--jinja --chat-template-file chat_template.jinja
vLLM
把 tokenizer_config.json 里的 chat_template 字段整段替換成 jinja 文件原文,然后配合 Qwen 原生 XML 工具解析器:
--tool-call-parser qwen3_coder
oMLX
覆蓋本地模型目錄的 chat_template.jinja,啟動(dòng)時(shí)加 --jinja,把所有 chat_template_kwargs 覆蓋項(xiàng)刪掉,模板內(nèi)部已全自動(dòng)處理
? Qwen 3.5 / 3.6 全系列(35B / 32B / 27B / 14B)共用同一個(gè) chat_template.jinja,不需要分版本思考模式開關(guān),省錢小妙招
這套模板還有一個(gè)我特別喜歡的功能:思考模式可以在 prompt 里隨時(shí)切換
直接在 system 或 user 消息里塞一個(gè) control token:
快速回答,不思考:
System: You are a coding assistant. <|think_off|>
User: What's 2+2?深度推理:
System: You are a coding assistant. <|think_on|>
User: Implement a red-black tree in Rust.
模板會(huì)自動(dòng)攔截這個(gè) tag,從最終上下文里刪掉,模型看不到,但模式已經(jīng)切了
為什么用 <|think_on|> 而不是早期社區(qū)流行的 /think?因?yàn)?Qwen 控制 token 的 delimiter 絕不會(huì)和正常文本或文件路徑打架,安全等級(jí)高一檔
想再省點(diǎn) token?
v19 默認(rèn) preserve_thinking=true,主打 KV Cache 命中率,但如果你顯存吃緊、context window 緊張,可以在引擎模板 kwargs 里關(guān)掉:
{
"preserve_thinking": false
}
代價(jià)是多輪對(duì)話 KV Cache 命中率會(huì)下降(prompt 字符串會(huì)動(dòng)態(tài)變化),但能省下一截 context
唯一的小坑:升級(jí)到 v19 的時(shí)候,preserve_thinking默認(rèn)改成 true 了,如果你之前自己改過 kwargs,記得對(duì)照一下
總結(jié)
老實(shí)講,這是那種"看起來不起眼但用過就回不去"的項(xiàng)目,沒有花哨的功能,就是把官方挖的坑一個(gè)一個(gè)填了
適合的人群:
用 llama.cpp / LM Studio / vLLM 本地跑 Qwen 3.5 / 3.6 的所有人
想跑 Agent / 工具調(diào)用 / Coder 任務(wù)的開發(fā)者
被 KV Cache 失效折磨到懷疑硬件的同學(xué)
用 Claude Code / Codex / OpenCode 接 Qwen 的玩家
唯一的勸退點(diǎn)是:得自己手動(dòng)替換模板,對(duì)純小白稍微有門檻,但跟著官方 README 一步步來五分鐘就能搞定
_template .cpp
制作不易,如果這篇文章覺得對(duì)你有用,可否點(diǎn)個(gè)關(guān)注。給我個(gè)三連擊:點(diǎn)贊、轉(zhuǎn)發(fā)和在看。若可以再給我加個(gè),謝謝你看我的文章,我們下篇再見!
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.