关闭 Qwen3 思考模式 — 三种方法从提示词到 API 硬开关
为什么要关闭思考模式
虽然思考模式在复杂推理任务上表现出色,但它有几个明显的缺点:
- 推理慢:思考链需要额外的 token 生成时间,首 token 延迟高
- token 多:思考链也消耗上下文窗口,限制了后续多轮对话
- 成本高:云端 API 调用时思考链 token 同样计费
- 输出啰嗦:用户可能不关心思考过程,只想看最终答案
关闭思考模式后,Qwen3 的行为和 Qwen2.5-Instruct 类似——直接输出答案,快速响应。
方法一:提示词指令(最通用)
最简单的方法,适用于所有调用方式——Transformers、Ollama、SGLang、vLLM、云端 API 都可以用。
显式指令
在系统提示或用户消息中加入 /no_think:
messages = [
{"role": "system", "content": "/no_think\n你是一个有帮助的助手。"},
{"role": "user", "content": "帮我翻译这句话。"},
]
或者在用户消息中:
用户: /no_think 直接告诉我答案:1 + 1 = ?
自然语言指令
也可以用自然语言引导:
用户: 请直接给我答案,不要思考过程。
用户: 跳过分析步骤,直接输出结果。
提示词指令是软开关——模型会尽量遵循,但不保证 100% 关闭。在重要场景下建议用硬开关。
方法二:Transformers 的硬开关
用 Transformers 库加载模型时,通过 apply_chat_template 的 enable_thinking 参数强制关闭思考模式。
这是最彻底的方法,在 tokenizer 层面就把思考模式关闭了,模型不会生成任何思考链。
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Qwen/Qwen3-8B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
messages = [
{"role": "user", "content": "1 + 1 = ?"},
]
# 关键参数:enable_thinking=False
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True,
enable_thinking=False # 强制关闭思考
)
model_inputs = tokenizer(text, return_tensors="pt").to(model.device)
generated_ids = model.generate(
**model_inputs,
max_new_tokens=512
)
response = generated_ids[0][model_inputs["input_ids"].shape[1]:]
print(tokenizer.decode(response, skip_special_tokens=True))
默认值是 enable_thinking=True。把它设为 False 后,模型的行为就完全变成了非思考模式。
方法三:推理框架 API 层配置
SGLang
SGLang 通过 API 参数控制:
curl http://localhost:30000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-8B",
"messages": [{"role": "user", "content": "1 + 1 = ?"}],
"extra_body": {
"thinking": {"type": "disabled"}
}
}'
或者启动服务时设置默认关闭:
python -m sglang.launch_server \
--model-path Qwen/Qwen3-8B \
--thinking-type disabled
vLLM
vLLM 暂时没有专门的思考模式参数,但可以通过模板参数控制:
from vllm import LLM, SamplingParams
llm = LLM(
model="Qwen/Qwen3-8B",
tokenizer_mode="auto",
)
# 通过 extra_body 传递
sampling_params = SamplingParams(
max_tokens=512,
extra_body={"thinking": {"type": "disabled"}}
)
Ollama
Ollama 目前对 Qwen3 的思考模式支持有限。通常建议在 prompt 里加 /no_think:
ollama run qwen3:8b "1 + 1 = ? /no_think"
或者在 Ollama Modelfile 里设为默认行为:
SYSTEM 你是一个有帮助的助手。/no_think
方法对比
| 方法 | 强度 | 适用场景 | 缺点 |
|---|---|---|---|
提示词 /no_think | 软开关 | 通用、快速测试 | 不保证 100% 关闭 |
Transformers enable_thinking=False | 硬开关 | 纯 Python 调用 | 只适用于 Transformers |
| SGLang / vLLM API 参数 | 硬开关 | 推理服务部署 | 框架特定配置 |
何时必须硬开关
以下场景建议用硬开关,不要只靠 prompt:
- 需要格式化输出(JSON、XML、代码):思考链会污染输出格式
- 低延迟实时对话:思考链会显著增加首 token 延迟
- 生产环境 API:保证行为可预测
- token 预算紧张:思考链会占用宝贵的上下文窗口
相关阅读
- 01-思考模式原理:理解思考模式内部机制
- 03-API 层控制思考行为:各框架完整配置说明
- 04-思考 vs 非思考 性能对比:两种模式的效率差异