名称: nowait-reasoning-optimizer 描述: 实现NOWAIT技术,用于R1风格大语言模型的高效推理。在优化推理模型(如QwQ、DeepSeek-R1、Phi4-Reasoning、Qwen3、Kimi-VL、QvQ)时使用,可减少链式思考令牌使用27-51%,同时保持准确性。触发词包括“优化推理”、“减少思考令牌”、“高效推理”、“抑制反思令牌”,或处理冗长CoT输出时。
NOWAIT推理优化器
实现论文“Wait, We Don’t Need to ‘Wait’! Removing Thinking Tokens Improves Reasoning Efficiency”(Wang等人,2025)中的NOWAIT技术。
概述
NOWAIT是一种无训练推理时干预,通过抑制生成过程中的自我反思令牌(如“Wait”、“Hmm”、“Alternatively”),减少链式思考(CoT)轨迹长度27-51%,而不影响模型效用。
何时使用
- 部署计算资源有限的R1风格推理模型
- 减少生产系统的推理延迟
- 优化推理任务的令牌成本
- 处理需要精简的冗长CoT输出
支持模型
| 模型系列 | 类型 | 令牌减少 |
|---|---|---|
| QwQ-32B | 基于RL | 16-31% |
| Phi4-Reasoning-Plus | 基于RL | 23-28% |
| Qwen3-32B | 基于RL | 13-16% |
| Kimi-VL-A3B | 多模态 | 40-60% |
| QvQ-72B-Preview | 多模态 | 20-30% |
重要:NOWAIT在基于RL的模型上效果最佳。蒸馏模型(如Qwen3-4B/8B/14B)在抑制反思令牌时性能下降。
快速开始
1. 基础实现
from scripts.nowait_processor import NOWAITLogitProcessor
# 为模型的分词器初始化处理器
processor = NOWAITLogitProcessor(tokenizer)
# 在生成过程中使用
outputs = model.generate(
inputs,
logits_processor=[processor],
max_new_tokens=32768
)
2. 抑制的关键词
完整列表见references/keywords.md。核心关键词:
wait, alternatively, hmm, but, however, check,
double-check, maybe, verify, again, oh, ah
工作原理
- 初始化关键词:从经验分析中识别反思关键词
- 扩展到令牌变体:将关键词映射到词汇表中的所有令牌变体(例如,“wait” → “ wait”、“Wait”、“ Wait”、“.wait”、“WAIT”)
- 推理时抑制:在解码过程中将反思令牌的对数设置为大负值
Logits(前) Logits(后)
Wait 0.8 → Wait -inf
First 0.6 → First 0.6
Hmm 0.5 → Hmm -inf
Let 0.4 → Let 0.4
关键发现
为何有效
- NOWAIT并非完全消除自我反思,而是引导模型跳过不必要的“等待”推理
- 模型仍在关键决策点执行基本验证
- 导致更线性、直接的推理路径
RL与蒸馏模型对比
| 模型类型 | NOWAIT效果 | 推荐 |
|---|---|---|
| 基于RL(QwQ、Phi4、Qwen3-32B) | 准确性稳定,令牌显著减少 | ✅ 推荐 |
| 蒸馏(Qwen3-4B/8B/14B) | 硬任务上准确性下降 | ⚠️ 谨慎使用 |
蒸馏模型严重依赖训练数据中的CoT结构——移除反思令牌会干扰其推理模式。
集成示例
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
)
预期结果
| 任务类型 | 原始令牌数 | NOWAIT令牌数 | 减少率 |
|---|---|---|---|
| 数学(AIME) | 15,000 | 10,500 | 30% |
| 视觉问答(MMMU) | 2,900 | 1,450 | 50% |
| 视频问答(MMVU) | 1,700 | 1,250 | 27% |
限制
- 在非常简单的任务上效果较差,因CoT开销已最小
- 蒸馏模型在挑战性任务上可能损失准确性
- 某些领域可能需要模型特定的关键词调整
参考文献
- 论文:arXiv:2506.08343v2
- 完整关键词列表:
references/keywords.md - 实现:
scripts/nowait_processor.py