Qwen3 思考输出太长或失控 — 限制思考链长度和内容
症状
- 思考链长度远超预期(几千甚至上万 token)
- 思考过程循环重复,不收敛
- 最终答案迟迟不出来
- 内容和思考链混在一起
原因
- 模型遇到难题时反复尝试
- 某些 prompt 触发了模型的"过度思考"行为
- 上下文太长导致模型陷入循环
解决方案
1. 硬限制思考 token 数
在 SGLang 中可以设置 max_thinking_tokens:
"extra_body": {
"thinking": {
"type": "auto",
"max_thinking_tokens": 4096 # 最多思考 4096 token
}
}
超出这个限制后模型会强制输出答案(即使没思考完)。
2. 用非思考模式
如果思考模式经常失控,直接关掉:
text = tokenizer.apply_chat_template(
messages, enable_thinking=False
)
3. 在 prompt 中引导
明确告诉模型思考的边界:
请在思考时保持简洁,不要超过 10 个步骤。
或者如果不需要思考直接:
/no_think 直接给答案,不要思考过程。
4. 限制 max_new_tokens
同时限制总输出长度:
model.generate(**inputs, max_new_tokens=2048) # 思考+答案总共不超过 2048
5. 清理历史对话
多轮对话中累积太长的历史会让模型行为异常:
# 定期重置对话
if len(messages) > 20:
messages = messages[-10:] # 只保留最近 10 条
6. 正确解析思考内容
如果你是在做程序化调用,正确分离思考链和答案:
import re
def split_thinking(text):
"""分离思考链和最终答案"""
think_match = re.search(r'<think>(.*?)</think>', text, re.DOTALL)
if think_match:
thinking = think_match.group(1)
answer = re.sub(r'<think>.*?</think>', '', text, flags=re.DOTALL).strip()
return thinking, answer
return None, text
常见"思考失控"场景
| 场景 | 解决方案 |
|---|---|
| 数学题反复算不对 | 限制思考 token 上限,或换非思考试 |
| 复杂编程调试 | 限制思考 token,或分步让模型做 |
| 多 Agent 循环 | 限制 max_steps |
| 长对话后期 | 清理历史重新开始 |