Qwen3开关模型思考
硬开关
修改gguf模型文件(LMstudio可用)
先安装gguf包
pip install gguf
使用Python3.12,目前3.13有bug会安装不上最新版的gguf
使用Python打开gguf模型内部模板
from gguf import GGUFReader r = GGUFReader(r'\Qwen3-4B-Q4_K_M.gguf') print(r.get_field('tokenizer.chat_template').contents())
复制整套模板
修改模板逻辑
在倒数第四行修改成,没有定义
enable_thinking
就停止思考{%- if enable_thinking is not defined or enable_thinking is false %}
然后生成一个
no_think.json
文件(不限文件名)放进chat_template
中.{ "chat_template": "这里把修改好的模板全部复制过来" }
通过gguf的工具,使用新模板将重新打包一个新的模型.
- 先找到
gguf_new_metadata.py
工具一般在gguf包目录下
.venv1/Lib/site-packages/gguf/scripts/gguf_new_metadata.py
- 然后运行脚本,打包模型
Python gguf_new_metadata.py \ Qwen3-4B-Q4_K_M.gguf \ Qwen3-4B-NoThink-Q4_K_M.gguf \ --chat-template-config no_think.json
可以改成自己
文件名
,或者不同的地址
- 先找到
问题点
这样修改之后,模型是默认不思考的,控制的办法也是简单粗暴,当没有enable_thinking的时候就直接输出
<think>/n/n</think>
,通过提前生成think
的结束标签来直接结束思考.而且
<think>/n/n</think>
标签在不思考的时候是必须会输出的,哪怕把模板内控制思考的这一行完全删掉也是没用的,应该是训练阶段就加入SFT
,专门应对不思考的情况.所以
Qwen3系列
本质上还是一个思考模型
,只是通过提前加入思考结束标志
才变成非思考
模型.后续模型对接还要在前端自行处理空的<think>
标签
Ollama使用
重新编写模型配置文件
ollama show --modelfile [模型名称] //查看模型文件
参考如下:
# 基础模型(必须) FROM <模型名> # 系统提示(定义模型的默认行为) SYSTEM """ 你是一个幽默的助手,回答要简短且押韵。 """ # 调整生成参数 PARAMETER temperature 0.7 # 控制随机性(0-1,越高越有创意) PARAMETER num_ctx 4096 # 上下文窗口大小 PARAMETER num_predict 512 # 最大生成长度 # 模板(控制对话格式) TEMPLATE """{{ .System }} {{ .Prompt }}"""
在注册模型,加入新的配置文件
ollama create qwen3-8b-gguf -f Modelfile # 使用新的Modelfile文件创建新模型 # 相同的gguf模型,更换配置文件不会重新导入 只会迅速更换模板文件
查看是否注册成功
ollama list
运行新模型
ollama run qwen3-8b-gguf
可以看见还是有
<think>
标签存在的,这个应该是qwen3模型的通病了
软开关
直接在system prompt
系统提示词中,输入/no_think
即可.