Second Thought: Reasoning in Parallel as LLM Agents Act and Observe
Zhensu Sun, Chengran Yang, Yunbo Lyu, Jieke Shi, David Lo
cs.AI, cs.SE
2026-08-14
ReAct agent 在动作与观察阶段完全停止思考,论文提出在该空档并行开四路辅助推理分支并在观察到达时收割,九组配置全部降低轮数、最多省 43% 主线程解码,延迟实测降 10.9%。
ReAct 范式的 agent 沿 Thought→Action→Observation 循环走,实质推理只发生在 Thought 阶段。一旦动作序列化、agent 开始等环境返回,推理就冻结了:动作阶段只是把已想清楚的计划渲染成工具调用,观察阶段压根不产出任何解码。论文把这段每轮都出现、时长还不可预测的空档叫「推理空窗」。工具执行越慢(容器测试、编译、检索),空窗越长,白等的时间也越多。
在此之前的并行推理方案(Self-Consistency、Tree-of-Thought、各种采样多候选链的工作)都是在 Thought 内部横向展开,把更多算力塞进关键路径。这篇的切入点正交:不改主线程的推理,把附加推理搬出串行解码路径,塞进本来就被浪费的等待时间。
框架叫 Second Thought,免训练、纯推理期改造。主线程 Thought 一结束的瞬间,fork 出四个辅助分支,与主循环的 Action/Observation 并行解码;观察一到,全部分支立即终止,完成的思考收割回来拼进上下文,供下一轮 Thought 使用。四个分支按时间方向(回顾/前瞻)×范围(当前轮/全历史)展开,各自针对一类高频失败模式:
两个关键设计。其一是「原子思考」:每个分支的输出被约束成 XML 标签包裹、不超过 25 词、互相不引用的自足单元,任意 token 处被打断都只损失正在写的那一个单元,已闭合的全部有效。这解决了空窗时长不可预测的问题,不需要任何分支侧的协调协议。其二是 fork 方式:不引入外部评论者,让同一个模型接着自己的完整轨迹继续生成,分支与主线程共享 prompt 前缀,KV cache 直接复用,分支解码时关闭模型原生思考模式以最快出货。收割时每个维度最多保留 5 条,控制上下文增长;分支颗粒无收成时框架退化为原始 ReAct 循环。
三个 agent 基准(SWE-Bench Pro 仓库级修 bug、Terminal-Bench 2.1 终端运维、τ³-bench 银行客服对话)×三个推理模型(DeepSeek-V4-Flash、Qwen3.6-Plus、MiniMax-M3),原生思考模式全开,统计检验用 Benjamini–Hochberg 校正。核心数字:
| 配置 | Pass@1(base→ours) | 主线程解码(base→ours) | 轮数 |
| SWE-Pro + Qwen3.6 | 52.0→51.3(不显著) | 36,519→20,798(-43%) | 57.1→50.6 |
| SWE-Pro + DeepSeek-V4 | 48.7→52.0 | 23,841→20,255(-15%) | 56.2→52.8 |
| TB2 + Qwen3.6 | 39.3→51.7(+12.4) | 25,158→31,396(+25%) | 25.5→24.0 |
| TB2 + MiniMax-M3 | 49.4→59.6(+10.2) | 36,686→36,705(持平) | 44.6→43.1 |
| τ³ + Qwen3.6 | 16.7→19.8 | 16,755→13,764(-18%) | 26.1→25.9 |
九组配置轮数全部下降;六组主线程解码下降,幅度最大 43%,均值约 20%;Pass@1 九组里七组无显著变化,两组显著为正(+12.4、+10.2),唯一下降的一组(SWE-Pro+Qwen3.6)折算 150 题里不到一题,不显著。对照组 s1 用 budget forcing 把等量推理预算压回主线程自己的思考里:四个适用设置里 Second Thought 的 Pass@1 全部严格更高,串行解码少 1.3 到 3.2 倍。在 SWE-Pro+Qwen3.6 上 s1 把输出从 36.5k 撑到 65.6k 还掉了 3.3 个点。配对回放实验(50 题、并发固定、三轮取中位)确认墙钟时间从 256.9 秒降到 229.0 秒(-10.9%),其中主线程解码时间 -13.4%、工具执行 -6.0%。消融上去掉 Recall 掉点最狠(48.7→48.0),去掉 Rehearse 保持精度但主线程输出 +10%,印证预演分支搬运的正是主线程本来要逐轮做的盘算;只留单分支的话 Pass@1 落到基线附近。
这是把 agent 延迟优化的视角从「少思考」换到「把思考搬到别处」。免训练、不动模型、不动 harness,只在推理框架层加 fork/merge,任何流式 API 都能落地。工具越慢的场景(编译、容器、检索)空窗越长、收益越大——银行对话那组空窗短、失败模式在检索与合规而非规划,增益就小。对做 agent 基础设施的人,原子思考这个输出契约本身可复用:任何「时长不可预测的中断」场景(用户输入等待、流式对齐)都能用同一套「可任意截断的自足单元」设计。成本侧要心里有数:四分支让每任务 API 成本涨 66.4%–181.5%,几乎全来自缓存前缀读而非输出;只留最强的 Alternative 一个分支,开销降到 16.3%–35.5%。
论文没有独立的 Limitations 小节,作者自述的边界散在分析里:τ³-bench 增益小的原因被归为空窗短、失败源于检索与策略遵循而非规划错误,这解释合理但没有做分支类型按域选择的实验;默认配置是「空窗饥饿」的,主线程等分支全部关闭的无截断版能再拿 +4.7 个点(56.7%),默认只吃到可达增益的 41%,换来的代价是分支预算整个落到关键路径上;s1 对照在 MiniMax-M3 和 τ³-bench 上因 budget forcing 与函数调用不兼容而缺失,计算匹配的结论建立在四个设置上。读下来还有两点。收益结构性依赖空窗时长,思考型模型在 Thought 内已产生大量并行候选的场景,可挖的空窗价值可能更薄。回放实验只覆盖 50 题 × 一个模型 × 一个基准,延迟结论的外推面有限;四分支共享 KV cache 的部署前提在自建推理栈上容易满足,纯第三方 API 场景下缓存读计费方式直接决定这套方法贵不贵。