← 首页|学术|Fail-Fast, Restart-Smart:给 SWE Agent 装一个轻量失败预警器
cs.SE · cs.AI · 2608.03222 · 2026年8月4日

Fail-Fast, Restart-Smart:给 SWE Agent 装一个轻量"失败预警器" · Early Failure Prediction and Restart for SWE Agentic Tasks

Chenyu Wang, Yunbo Lyu, Junda He, Zhou Yang, Chenxing Zhong, Yaniv Harel, David Lo
💬 提出 0.6B 轻量 monitor,仅凭可观测的轨迹前缀(不碰策略模型内部状态)就能预测 SWE agent 是否会失败;触发后不是简单终止,而是同策略无历史重启,并把此前产生的 diff 作为"可选覆盖层"暴露给 agent 自行判断是否复用。在 SWE-bench Verified 上省 14.6%–20.4% 执行 token,并能把 Qwen3.6-27B 的解决率从 66.6% 拉到 71.8%——核心洞察是"失败可以提前预测"这件事本身是轻量、可跨策略迁移的能力,不需要依附在某个具体策略模型上。

🎯 问题

SWE agent 的失败轨迹又长又贵,还很难提前识别
长程 SWE agent(如基于 mini-swe-agent 框架跑 SWE-bench)的失败轨迹往往比成功轨迹更长,表现出"冗余探索"或"原地打转"(looping)的模式——agent 已经偏离正轨,却仍在不断消耗 token 反复试错,直到步数/预算耗尽才停止。这带来两个连带问题:一是纯粹的浪费(大量 token 花在注定失败的轨迹上),二是即便及时止损,简单粗暴地掐断轨迹本身也不解决任务——需要一种"止损后还能补救"的机制,而不只是省钱。
SWE-bench / mini-swe-agent:SWE-bench Verified 是一套人工核验过的真实 GitHub issue 修复基准,agent 需要阅读 issue、探索代码库、编辑文件、跑测试,最终生成能通过隐藏测试的 patch;mini-swe-agent 是一个精简的 bash 工具循环式 agent 框架,常被用作研究基座。

🔬 方法

FailFast:用 0.6B monitor 只看"外部可观测前缀"做预测
Monitor 基于冻结的 Qwen3-0.6B 主干,用 LoRA(rank 16, alpha 32)微调 attention/MLP 投影,只训练 LoRA adapter 和三个轻量线性头:value head(预测最终是否解决)、F2P head(fail-to-pass,密集进度监督)、P2P head(后来权重置零,因为"没有显著增益")。关键设计是它完全不依赖策略模型的内部信号(logits、hidden states),只吃两块可序列化的外部信息:[ISSUE](任务描述)和 [WINDOW](最近 8 步的 thought/action/observation,外加一个持续钉住最新 patch 产生步骤的 pin)。这意味着同一个 monitor 理论上可以套在任何策略模型的轨迹上。
▶ 训练细节与消融
训练数据来自 Qwen3.6-27B 在 mini-swe-agent 框架下、SWE-bench Verified 350 个训练实例上跑出的 11 组独立轨迹(seed 0–10)。损失函数= 终局标签的 BCE + 辅助进度项 + Bradley-Terry 偏好排序损失(在按"步数占比十分位桶"匹配的混合实例中比较成功/失败前缀)。消融显示 [WINDOW] 是最关键特征——去掉它 recall 从 58.1% 掉到 44.9%(降 13.2 个百分点);反而一个候选的全局 [STATE] 摘要特征会拖累效果,最终没有采用。部署时用逻辑回归融合校准后的 value、F2P 估计和步数占比得到一个 meta score,并设置最小步数门槛 φmin=20 步以避免早期噪声误报。
RestartSmart:不是终止,是"同策略无历史重启 + diff 可选复用"
一旦 FailFast 报警,RestartSmart 会用同一个策略模型发起一次全新 rollout,清空之前的对话历史(避免被失败上下文"锚定")。同时系统会回放被中止轨迹的 bash 命令、在每条命令后抓取 git diff HEAD,并等待编辑"稳定"(连续 5 步无新编辑)才截断,避免捕获到写到一半的中间态。最后这份 diff 不是以文本摘要形式塞进 prompt(作者提到这样会引发"LLM anchoring effects"),而是作为一个可移除、由 git-apply 驱动的工具暴露给新一轮 agent,默认处于"关闭"状态,并在 prompt 中被明确框定为"一次已中止尝试留下的、未经验证的线索"——agent 可以自行选择检查、应用或丢弃。

📊 结果

在 SWE-bench Verified 上:省 token,也能真提分
FailFast Token 节省(5% FPR)
14.6%–20.4%
Qwen3.6-27B 解决率
66.6% → 71.8%
冷重启对照组增益
仅 +0.2pp
Token 节省:在 5% 假阳性率(FPR)预算下,monitor 只在 Qwen3.6-27B 的数据上训练,却能迁移到其它策略模型(包括 Gemini 3 Flash),四个策略上均取得 14.6%–20.4% 的执行 token 节省,优于 AgentStop(12.5%)和纯 Duration 控制(11.4%)两个基线。

重启提分:在更宽松的 25% FPR 预算下,RestartSmart 让 Qwen3.6-27B 解决率从 66.6% 提升到 71.8%(+5.2pp),而单纯冷重启只有 +0.2pp 的增益——说明"diff 可选复用"这个设计是有效增量,不是重启本身带来的。同时 Qwen3.5-9B 上最高 +4.0pp(52.2%),Gemma4-31B 上最高 +3.0pp(65.2%)。所有策略和预算组合下的提升都通过 McNemar 检验显著(p≤9.4×10⁻³),bootstrap 置信区间不含零。

代价与对照:重启带来 20.5%–43.8% 的净额外计算开销。对比基线 SWE-PRM(一种基于 prompt 的干预方法)在弱模型上有效(Qwen3.5-9B +4.2%),但在强模型上反而拖累——Qwen3.6-27B 解决率下降 3.2%,反衬出 FailFast-RestartSmart 这种"轻量外部信号 + 显式可选覆盖"设计的稳健性。

💡 我的看法

和 duplex agent 的"交互/推理解耦"是同一类问题的不同侧面
这篇论文最有意思的地方不是"省 token"这个结果本身,而是它验证了一个更一般的命题:判断一条推理轨迹是否值得继续,可以用一个远小于策略模型、完全不接触策略内部状态的外部 monitor 来做,而且这个能力是可迁移的(Qwen3.6-27B 训练、Gemini 3 Flash 上依然有效)。这和我在看 DuplexOmni 时关注的"交互层/思考层解耦"其实是同构的问题——DuplexOmni 用 480ms 时间片和控制 token 让实时交互层去判断"要不要打断/继续深度推理",而这篇论文是用一个独立的小模型去判断"这条 SWE 轨迹是否值得继续跑下去"。两者本质上都是在给一个重策略模型配一个轻量的"元认知"旁路,只是应用场景一个是实时语音交互的 turn-taking,一个是长程 agent 的执行时长控制。若把这个 monitor 范式往 duplex 场景迁移,一个自然的问题是:能否用类似"仅看外部可观测前缀、不碰内部状态"的轻量 monitor,去预测一段实时交互是否正在走向低质量响应(而不仅仅是判断是否该插话)?

另一个值得记一笔的设计是 RestartSmart 里"diff 作为可移除工具而非文本摘要注入"的选择——他们明确提到直接把摘要塞进 prompt 会引发锚定效应,这对我们做 agent 记忆/上下文管理也是个提醒:给 agent 传递"历史线索"时,用工具调用的显式、可撤销的形式,可能比隐式塞进上下文更可控。稍有欠缺的是论文没有太深入讨论 monitor 的误报代价分布——25% FPR 下多出的计算开销(20.5%–43.8%)实际上不小,如果换算到多轮长任务或者对延迟敏感的场景(比如更贴近 duplex 的实时场景),这个"止损再重启"的开销收益比可能就没有 SWE-bench 这种可以离线批跑的场景那么划算,是个值得关注的边界条件。
来源: arXiv:2608.03222