用途
NOWAIT 实现了论文《Wait, We Don't Need to 'Wait'! Removing Thinking Tokens Improves Reasoning Efficiency》(Wang et al., 2025)中提出的 NOWAIT 技术。它是一种免训练的推理时干预方法,通过在生成过程中抑制自我反思 token(例如 "Wait"、"Hmm"、"Alternatively"),缩短思维链(CoT)轨迹长度 27-51%,同时不损害模型效用。
适用场景包括:在算力有限时部署 R1 风格推理模型、降低生产系统的推理延迟、优化推理任务的 token 成本,以及精简冗长的 CoT 输出。
主要能力
- 在推理时抑制反思关键词,减少不必要的 "等待" 式推理。
- 不消除自我反思本身,而是引导模型跳过冗余的等待推理,在关键决策点仍保留必要的验证。
- 生成更线性、直接的推理路径。
支持模型及 token 缩减幅度:
| 模型系列 | 类型 | Token 缩减 |
|---|---|---|
| QwQ-32B | RL-based | 16-31% |
| Phi4-Reasoning-Plus | RL-based | 23-28% |
| Qwen3-32B | RL-based | 13-16% |
| Kimi-VL-A3B | 多模态 | 40-60% |
| QvQ-72B-Preview | 多模态 | 20-30% |
重要提示:NOWAIT 对基于强化学习(RL)的模型效果最佳。蒸馏模型(Qwen3-4B/8B/14B)在抑制反思 token 后性能会下降。
使用方式
基础实现
from scripts.nowait_processor import NOWAITLogitProcessor
# Initialize processor for your model's tokenizer
processor = NOWAITLogitProcessor(tokenizer)
# Use during generation
outputs = model.generate(
inputs,
logits_processor=[processor],
max_new_tokens=32768
)
被抑制的关键词
完整列表见 references/keywords.md。核心关键词:
wait, alternatively, hmm, but, however, check, double-check, maybe, verify, again, oh, ah
工作原理
- 初始化关键词:通过经验分析识别反思关键词。
- 扩展为 token 变体:将关键词映射到词表中的所有 token 变体(例如 "wait" → " wait"、"Wait"、" Wait"、".wait"、"WAIT")。
- 推理时抑制:在解码过程中将反思 token 的 logits 设为极大负值。
logits 变化示意:
Logits (Before) Logits (After)
Wait 0.8 → Wait -inf
First 0.6 → First 0.6
Hmm 0.5 → Hmm -inf
Let 0.4 → Let 0.4
集成示例
HuggingFace Transformers:
from transformers import AutoModelForCausalLM, AutoTokenizer
from scripts.nowait_processor import NOWAITLogitProcessor
model = AutoModelForCausalLM.from_pretrained("Qwen/QwQ-32B")
tokenizer = AutoTokenizer.from_pretrained("Qwen/QwQ-32B")
processor = NOWAITLogitProcessor(tokenizer)
response = model.generate(
tokenizer(prompt, return_tensors="pt").input_ids,
logits_processor=[processor],
max_new_tokens=32768,
do_sample=True,
temperature=0.7
)
vLLM:
from vllm import LLM, SamplingParams
from scripts.nowait_processor import get_nowait_bad_words_ids
llm = LLM(model="Qwen/QwQ-32B")
bad_words_ids = get_nowait_bad_words_ids(llm.get_tokenizer())
sampling_params = SamplingParams(
max_tokens=32768,
bad_words_ids=bad_words_ids
)
预期效果
| 任务类型 | 原始 Token | NOWAIT Token | 缩减 |
|---|---|---|---|
| 数学(AIME) | 15,000 | 10,500 | 30% |
| 视觉问答(MMMU) | 2,900 | 1,450 | 50% |
| 视频问答(MMVU) | 1,700 | 1,250 | 27% |
关键发现
为何有效
- NOWAIT 并非完全消除自我反思,而是引导模型跳过不必要的 "等待" 推理。
- 模型在关键决策点仍会执行必要的验证。
- 结果是更线性、直接的推理路径。
RL 模型与蒸馏模型对比
| 模型类型 | NOWAIT 效果 | 建议 |
|---|---|---|
| RL-based(QwQ、Phi4、Qwen3-32B) | 准确率稳定,token 显著减少 | ✅ 推荐 |
| 蒸馏(Qwen3-4B/8B/14B) | 困难任务上准确率下降 | ⚠️ 谨慎使用 |
蒸馏模型高度依赖训练数据中的 CoT 结构,移除反思 token 会破坏其推理模式。
限制
- 在非常简单、CoT 开销本就很小的任务上效果较差。
- 蒸馏模型在挑战性任务上可能出现准确率损失。
- 某些领域可能需要针对具体模型调整关键词。
参考资料
- 论文:arXiv:2506.08343v2
- 完整关键词列表:references/keywords.md
- 实现:scripts/nowait_processor.py