SHEPHERD

SHEPHERD

1. 论文一句话总结

这篇论文想回答一个很直接的问题:

现在的代码智能体(coding agents)到底是怎么失败的?

作者没有先去改模型训练,而是先观察这些智能体在做真实软件修复任务时的行为轨迹(trajectory),总结出三类高频失败模式;然后设计了一个叫 Shepherd 的“裁判”,在测试时从多次运行结果里挑出“最不像会翻车的那条轨迹”,从而提高最终解题成功率。作者在 18 个模型、3908 条轨迹上做了分析,并报告 Shepherd 能把 o1-low 在 SWE-bench Verified 上的通过率从 21% 提高到 31%


2. 背景:这篇论文为什么重要?

2.1 什么是 coding agent?

可以把它理解成“会自己读代码、改代码、跑测试、和环境交互”的大模型代理。它不是只回答“这段代码怎么改”,而是真的要在代码仓库里行动。论文基于 OpenHands 这类代码代理框架来研究这种行为。

2.2 现在的问题是什么?

虽然代码大模型已经很强了,但在复杂软件工程任务上,表现还是不稳定。论文开头提到,即使在 SWE-bench Verified 这类基准上,最强模型也远没有“全都能修好”,因此问题已经不只是“模型会不会写代码”,而是“它在长流程交互里会不会做出正确行为”。

2.3 这篇论文的核心视角

很多工作都在研究“答案对不对”,但这篇论文更关心:

  • 模型有没有真的去和环境交互?

  • 它是不是按正确顺序行动?

  • 它是不是没验证就自以为完成了?

也就是说,它不只看“最后 patch 对不对”,还看“中间这条行为轨迹是不是健康”。


3. 核心问题定义:什么是 trajectory?

在这篇论文里,trajectory(轨迹) 指的是代码智能体解决一个 issue 时的完整过程记录,包括:

  • 模型说了什么

  • 调了什么工具/命令

  • 环境返回了什么结果

  • 最后有没有 finish

作者把这些内容格式化后交给一个 LLM judge 来打分。Shepherd 并不直接运行代码做验证,而是只看这条文本轨迹本身


4. 理论/方法:论文到底提出了什么?

4.1 严格来说,这不是“数学理论论文”

它更像一篇:

  • 行为模式分析论文

  • LLM-as-a-judge 论文

  • test-time selection(测试时选择)论文

也就是:
先观察失败模式 -> 再做一个评分器 -> 最后用评分器从多次候选解里选最好的一条。


4.2 作者发现了三种关键失败模式

(1) Failure-to-Act, FA:该动手时不动手

意思是模型一直在“计划、解释、分析”,但没有真正去读文件、改文件、跑测试。
它像一个讲得很认真、却迟迟不下水的人。

论文说这是 最常见 的失败模式之一,尤其在一些 reasoning 模型里更明显。

(2) Out-of-Order Actions, OOA:动作顺序错了

模型会把彼此依赖的动作同时做,或者跳过前置步骤。
比如还没确认文件存在,就去改它;或者同一轮里同时“创建文件、编辑文件、测试文件”。

这种问题说明模型不是完全不会,而是不会按软件工程流程的依赖顺序行动。这是论文里第二常见的失败模式。

(3) False-Termination, FT:没验证就宣布结束

模型改完代码后,没有真正运行测试或验证,却在心里“脑补”自己已经修好了,然后直接 finish。
这类错误本质上是一种“把内部推理当成外部验证”的幻觉。论文认为 reasoning-enhanced 模型在这一点上反而更容易出问题。


4.3 作者怎么找到这三类模式的?

作者不是凭感觉随便起名字,而是用了一个三阶段流程:

  1. 探索阶段:人工读不同模型的轨迹,直到不再出现新的模式。

  2. 筛选阶段:只保留满足三个条件的模式:

    • 跨模型家族都能看到

    • 出现频率不低(大致 >10%)

    • 一旦出现就比较致命,不容易靠后续反馈自动修正

  3. 规模化阶段:把这些规则写成 judge rubric,让 LLM 自动打分。

他们在探索阶段一共人工标注了 250 条轨迹,来自 35 个随机 issue(共 500 个 issue 的子集)。最后保留下来的,就是 FA、OOA、FT 这三类。像 hallucination 虽然常见,但作者认为常常还能被环境反馈纠正,所以没有进入最终核心模式集合。


4.4 Shepherd 是怎么工作的?

核心思想

Shepherd 是一个 execution-free LLM judge

  • 输入:某个 coding agent 的完整 trajectory

  • 输出:一个 0-10 分 的 Shepherd score,加上简短解释

  • 含义:分数越高,说明这条轨迹里失败模式越严重

然后在测试时,作者会:

  1. 让同一个 agent 针对同一个任务跑 (K) 次

  2. 用 Shepherd 给每条轨迹打分

  3. 选择 分数最低 的那条轨迹对应的 patch

  4. 再用 benchmark 的 oracle test suite 去评估最终结果

这就是 Shepherd@K,本质上是一个 best-of-K 选择机制

为什么这个方法有意思?

因为它不需要重新训练模型,也不需要一定能执行完整测试
换句话说,Shepherd 更像一个“行为体检官”,它先看这条行为链条靠不靠谱,再决定值不值得押注。


5. 实验设置

5.1 任务和平台

  • 基准:SWE-bench Verified

  • 代码代理框架基础:OpenHands

  • 大规模行为分析:18 个模型,3908 条轨迹

5.2 轨迹怎么记录?

作者记录 agent 的每次消息、每次动作、环境的每次返回,并做格式化。
为了避免超长上下文,他们会裁剪环境输出,但保留“动作 - 反馈”结构。agent 一直运行到发出 finish,或者触达动作上限(文中举例是 30 步)。

5.3 主要实验比较对象

论文在提升性能的实验里,主要拿 o1-low 当 agent model 做大范围对比,并试了不同 judge model,包括较小的 judge(如 gpt-4o-mini、o3-mini)以及更强的 judge(如 claude-3.7-sonnet、gpt-4o)。另外还测了支持 function calling 的 gpt-4o-mini,以及 OpenHands-LM-32B。

5.4 对比基线

作者把 Shepherd 和这些策略比较:

  • 按最少 token 选

  • 只验证 patch 对不对

  • 验证整条 trajectory

  • 用部分测试集做 Fail-to-Pass 选择

  • Oracle 的 Pass@k 上界

  • 混合版 TShep@k:先用测试过滤,再用 Shepherd 打破平局

也就是说,Shepherd 并不是只跟“什么都不做”比,而是跟一串相当合理的候选选择器去比。


6. 实验结果

6.1 最核心结果

结果 1:Shepherd 能直接提高通过率

作者报告:

  • o1-low 在 SWE-bench Verified 上,从 21% -> 31%

  • 这个方案还 超过了 o1-high 的 29%

  • 成本上,o1-low + Shepherd@2 约 $800

  • o1-high 约 $1400

  • 也就是前者只用了后者 57% 的成本

这是这篇论文最亮眼的结果:
不是把模型变大,而是把轨迹挑聪明一点,也能赢。

结果 2:对强模型也还有收益

  • Qwen3-235B-A22B-Instruct 做 coding agent 时,Shepherd@2 把成绩从 43% 提高到 48.5%

  • OpenHands-LM-32B 时,从 27% 提高到 34%

说明这个方法不是只对弱模型补救,对已经比较强的模型也依然有效。

结果 3:强 judge 更有帮助

论文发现 judge 越强,Shepherd 作为选择器的效果通常越好;而且它整体上能匹配或超过其他非测试型 judge 标准


6.2 Shepherd 分数本身靠谱吗?

与人工评审的一致性

论文说 Shepherd score 和人工专家评分有单调一致关系,摘要里给出 Spearman ( \rho \approx 0.39, p \approx 0.011 )。同时,人工标注者之间的一致性是 Cohen's ( \kappa \approx 0.36 )

我对这个数字的理解

作者把它描述为“能对齐专家判断”,这一点我认同;但从数值看,( \rho \approx 0.39 ) 更像是有用的中等偏弱到中等相关,说明它适合做排序和筛选,但还谈不上“像完美裁判一样可靠”。
也就是说,Shepherd 更像一个“够用的守门员”,不是“绝对真理裁判”。这一点很重要。

与最终成功率的关系

Across models,Shepherd score 越高,SWE-bench Verified 的成功率越低。论文给出:

  • 全模型趋势:(R^2 = 0.78)

  • reasoning 模型趋势:(R^2 = 0.95)

  • non-reasoning 模型趋势:(R^2 = 0.93)

这说明 Shepherd score 至少不是在“瞎打分”,它和真实任务完成度有明显关系。


7. 这篇论文的价值

我觉得这篇论文最值得肯定的地方,不只是“分数涨了”,而是它把 coding agent 的失败方式说清楚了:

  • 从“模型不够聪明”
    转成

  • “模型在什么行为环节出错”

这个转向很重要。
因为只要失败模式是可观察、可解释、可统计的,后面就可以做:

  • 更好的推理控制

  • 更好的工具调用训练

  • 更好的 verifier / router / critic

  • 更好的 agent curriculum

它像是在混乱水流里先标出了暗礁的位置。


8. 局限性

论文自己承认有两个主要局限:

8.1 这是 post-hoc 方法,不是从根上治

Shepherd 做的是 测试时的后验选择,不是修改训练数据、目标函数、策略网络。
所以它更像“挑出较好的结果”,而不是“让模型本身变得不容易犯错”。

8.2 只验证了 coding agents

实验范围基本都在 SWE-bench Verified / coding agent 这个场景。
所以能不能推广到浏览器 agent、科研 agent、办公 agent,目前还不能直接下结论。

8.3 我再补一个隐含限制

Shepherd 的判断基础是“文本化轨迹”。
这意味着它很依赖:

  • 轨迹记录是否完整

  • 提示词是否把规则写清楚

  • judge 模型本身是否稳定

所以它虽然轻量,但也可能受到日志格式、裁剪策略、judge 偏好的影响。这个点论文有体现,但还没有被完全展开。这个判断是我基于其方法形式做的推断。


9. 未来方向

基于论文内容,我觉得未来方向至少有这几条:

9.1 从“选好轨迹”走向“生成好轨迹”

既然已经知道 FA / OOA / FT 是关键失败模式,就可以把它们直接写进:

  • 训练奖励函数

  • SFT / preference data

  • process supervision

  • rejection sampling 规则

也就是从 post-hoc selection 走向 behavior shaping。论文也明确提到,这些行为分析可以启发未来的 post-training 或 finetuning。

9.2 让 judge 变成在线干预者,而不是赛后裁判

现在 Shepherd 是“跑完再选”。
下一步可以做成:

  • 中途发现 FA,就强制要求 agent 立即调用工具

  • 中途发现 OOA,就要求拆成顺序动作

  • 中途发现 FT,就插入强制验证步骤

也就是把离线评分器,变成在线 steering controller。这个方向是对论文机制的自然延伸。

9.3 扩展到非代码环境

网页操作、数据分析、科研自动化,其实也都有“该行动不行动”“顺序依赖错乱”“未验证就结束”这类问题。
所以我觉得这套 failure taxonomy 很可能不只适用于 coding agent。只是论文目前没有做这一层验证。


10. 从这篇论文还能长出什么新 idea?(我的想法)

下面这些是我基于这篇文章延伸出来的想法,不是论文原文结论。

Idea 1:把 Shepherd score 拆成三维分数,而不是一个总分

现在的 0-10 总分虽然方便,但会把不同错误糊在一起。
我更想看:

  • FA-score

  • OOA-score

  • FT-score

这样可以做:

  • 不同模型的“行为指纹”分析

  • 针对不同任务动态调 agent

  • 失败模式条件化训练

比如某些任务更怕 FT,那就优先选择 FT 分低的轨迹。

Idea 2:做“阶段感知”的 Shepherd

不同阶段最该避免的错误不一样:

  • 前期更怕 FA(不探索)

  • 中期更怕 OOA(乱操作)

  • 后期更怕 FT(不验证)

所以可以设计一个 stage-aware judge,根据当前任务进度改变评分权重,而不是整条轨迹用一个静态 rubric。

Idea 3:把 Shepherd 变成 MCTS / beam search 的 value function

既然它能预测轨迹质量,那它未必只能在终点选。
也许可以在 agent 搜索过程中,把 Shepherd 当成中间状态价值估计器:

  • 哪条分支更健康?

  • 哪条分支更可能最终修好 issue?

这会让它从“reranker”进化成“search guidance”。

Idea 4:把“必须验证”写成环境级硬约束

与其让模型学会不 False-Termination,不如直接规定:

  • 没跑测试,不允许 finish

  • 没有外部验证证据,不允许提交 patch

也就是把 FT 从“软行为错误”变成“环境协议不允许”。
这样会更像安全系统设计,而不只是模型提示技巧。

Idea 5:利用失败模式做数据合成

既然这三类错误已经定义清楚,可以自动合成:

  • 正例轨迹

  • FA 负例轨迹

  • OOA 负例轨迹

  • FT 负例轨迹

然后做 process reward model、DPO、pairwise ranking、critic training。
这会把论文的分析性贡献转成真正的训练资产。


11. 我会怎么评价这篇论文?

优点

  • 问题抓得很准:不是泛泛讲 agent 不稳定,而是把失败模式具体化。

  • 方法很实用:不改训练,只在测试时多跑几次再挑。

  • 结果有说服力:不仅有分数提升,还有成本对比。

  • 分析框架可迁移:FA / OOA / FT 这套分类很有潜力扩展到别的 agent 任务。

不足

  • judge 的可靠性还没有强到“可以完全放心”

  • 仍然依赖多次采样,成本不是零

  • 还没把 failure pattern 真正反馈进训练过程

  • 跨领域泛化还没验证

总评

我会把它看成一篇 很好的“行为诊断 + 轻量增益”论文
它也许还不是最终答案,但它像在浑浊水面下放进了一盏灯:
先让我们看清,智能体到底是在哪一步开始偏航的。然后,真正的改进才有可能长出来。


12. 适合考试 / 汇报时背下来的极简版本

这篇论文研究代码智能体为什么会失败。
作者分析了 18 个模型、3908 条轨迹,发现三类关键失败模式:
不行动(FA)动作顺序错(OOA)没验证就结束(FT)
基于此,他们设计了一个 execution-free 的 LLM judge——Shepherd,对轨迹打分,并在多次运行中选出最可靠的一条。
实验表明,Shepherd 能把 o1-low 在 SWE-bench Verified 上从 21% 提升到 31%,还以更低成本超过 o1-high。
论文的意义在于:它把 coding agent 的失败,从“结果错了”进一步拆成了“行为哪里错了”。


博士,这份已经可以直接拿去复制做笔记了。下一轮我可以继续把它整理成 “5分钟汇报稿版本”“逐页PPT提纲版本”

LICENSED UNDER CC BY-NC-SA 4.0