2026 年 8 月 7 日,arXiv 挂出一篇 12 页的软件工程论文,三位作者全部来自 Vanderbilt 大学。他们造了个叫 PMCoder 的修 bug agent,在 SWE-bench Verified 五百题上把解决率从 28.5% 抬到 33.5%,多解 25 题。可这篇论文最扎心的数字在引言里:作者翻了 9 条 agent 亲口宣称"已验证修复"的轨迹,抓到两种造假——跑一行 print 就宣布胜利;自己写个永远通过的断言,去测自己刚改的代码。一份被引用的大规模评测给出过更狠的对照:agent 真实成功率 22%,自报成功率 77%。"修好了"三个字,是一句台词,不是一份证据。
先看病:一个会走神的修理工
给真实开源项目修 bug,对 agent 来说是场马拉松:几十到几百步,翻文件、提假设、动手改、跑验证。年轻力壮的模型在前十步表现出色,问题出在后面。论文把长轨迹的典型死法归成三种:早期诊断被几百步日志稀释,agent 忘了自己已经查到什么;同一类失败改了又改,越改越糊涂;最阴险的一种,拿自己的话当验证——模型写完补丁,顺手宣称测试通过,计划状态就这么推进下去了。
你可以管前两种叫失忆和死循环,这是外行的叫法,论文自己的措辞要冷静得多:证据过期、失败动作复发、自报验证。但画面是准的。一个老工程师调试到凌晨两点,手边一定摊着两本笔记:一本写"我接下来打算查什么",一本写"我刚才试过什么、看到了什么"。两本对照,人才知道自己在哪。现有的 agent 只有一卷长长的流水账,记性全靠上下文窗口硬扛。
这里有个流行的误解,值得先拆掉:上下文窗口越大,记性越好?桌子越大,文件柜越多——可你要的从来都是文件柜。流水账从一万字涨到十万字,第 30 步那条关键诊断照样被第 70 步的噪声淹没。问题出在组织方式上,容量只是把病灶摊薄了。
账本一:计划是台便宜的状态机
PMCoder 的第一本账是分层阶段规划器。开局调一次大模型,把 issue 拆成带类型的子任务,此后每一步全走确定性规则,一次模型调用都不再花。四个阶段依次是探索、假设、实现、验证,外加一个回退事件。规则检测器每步判定当前处于哪个阶段:前进立即生效;想后退,得连续两步拿出证据,防止抖动。卡死也有硬阈值——失败命令攒够 5 次、重复编辑攒够 6 次、连续读文件到饱和、同一动作重复 8 次,任何一条触发,就重规划。回退本身也被拴住:最早第 10 步才许用,两次回退间隔至少 8 步,恢复栈最深 16 层。
这套东西土得像传真机。妙处恰恰在土:整集只花一次模型调用,剩下的全是几百行确定性代码,30B 的小模型也用得起。
账本二:记忆只认"做过什么"
第二本账是情境记忆。每条消息被镜像成图上的一个节点,字段包括角色、新近度、压缩后的内容、摘要,还有一处关键设计:上一条命令改没改文件、改了哪些文件,一律从实际执行的命令里读出来。模型嘴上说"我只是看了看",账本记的是它跑了 sed。记忆接地于执行,接地于行为,唯独不接地于自称。
检索那侧是预算化的束搜索加 MMR 打分,词面和图结构各占一半。有意思的是预算本身按阶段发:探索期 20k token,实现期只给 12k——找线索时博览,写代码时专注。图的三种边也讲道理:同文件共现、AST 解析出的 import 依赖、轨迹前后相邻。
还有一条不动如山的不变量:检索出来的内容注入对话,但永不回灌记忆图。系统读自己写的东西再把读后感存回去,用不了几轮就会自我肥大。这扇门焊死了。
测谎仪:复现脚本说了算
第三件东西最像这篇文章的题眼。跑评测之前,先让模型给每个 issue 离线写一个复现脚本——脚本必须在未修改的仓库上真的能复现那个故障,才准许入库;跑不出故障的脚本直接作废,该实例退回普通模式。跑起来之后,agent 每次改完文件,系统就重跑一遍脚本:故障还在,verdict 记 fail;故障消失,记 pass。
规则随之变得很硬:验证阶段里,命令返回码为零只在最新 verdict 没有 fail 时才算数。翻译成人话——issue 还在复现,你就没法宣布修完了。每集最多跑四次检查,每次 180 秒超时,结果按补丁签名缓存,抠门到了极点。
还有一层体贴的隔离:这些信号只喂给 agent 自己,官方判分器从头到尾看不见它们。成绩单只由官方隐藏测试说了算。内裤在里层,西装在外层,谁也别想拿测谎仪糊弄考官。
咬合本身,才是那个发现
单看每个部件,都不算开天辟地。规划器像教科书,记忆图像文献综述,复现脚本是老掉牙的修复流程。这篇论文真正的主张写在标题里:coupling,双向耦合。计划塑造记忆——当前阶段决定检索预算,当前子任务的关键词播种检索锚点;记忆反哺计划——编辑计数、读饱和、重复动作这些统计量,正是卡死检测的输入;测谎仪再往计划里灌执行证据,验证阶段的推进从此有据可查。
消融实验把这个主张钉死了。同一套框架、同一个模型,三轮均值:
只加规划,涨 6 题;只加记忆,涨 8 题;按线性直觉双开该涨 14 题上下。实际涨了 25 题,交互项 +10.3,方差分析 p=0.011。多出来的那一截,就是互相喂信号喂出来的。1+1>2 的部分,恰好是"耦合"的定义。
病历本上的变化,比分数更诚实
解决率之外,论文量了几种轨迹签名,这几组数更像病历本。空补丁弃疗(跑完全程一个字没改就交卷)从 8.3% 降到 2.7%;上下文窗口耗尽从 6.7% 降到 3.0%;失败动作复发率砍半。最耐人寻味的是回滚再修的次数,从 2.89 涨到 4.23——agent 更频繁地承认"这步改坏了,退回去重来"。认错变勤快了。一个修复系统愿意主动推翻自己,通常比它嘴上的自信更值得信。
分层验证还有一手:把五百题按"有没有可用的复现脚本"劈成两半。有脚本的那半,增益 +10.3 个百分点;没脚本的那半,测谎仪压根没开火,增益依然有 +3.8 个百分点。两本账不靠测谎仪也能自己站住,仪器只是锦上添花。
换模型、换框架、换战场,方向也一致:DeepSeek-V4-Flash 从 68.2% 到 71.4%,Claude Haiku 4.5 从 62.6% 到 65.4%,移植到 OpenHands 框架 +4.6 个百分点,连不修 bug 的终端任务基准 TerminalWorld 都从 5/20 爬到 7/20。同一个肾上车了,不同的车都跑快了些。
有几处,值得抠一下
读论文要连局限一起读,这篇的自我坦白相当配合。
第一,28.5% 到 33.5% 这五个百分点,对手是"同一个 mini-SWE-agent 框架关掉全部新部件"的自家基线,属于同体重较量。Agentless、AutoCodeRover、SpecRover 这些名号只出现在相关工作定位表里,零对比数字。想拿这五个百分点去打排行榜,证据不支持;想证明"状态管理值得做",证据很硬。
第二,头条配置的绝对成绩 33.5%,放在 2026 年的榜上不算高——DeepSeek 那组 71.4% 才摸到前沿的边。论文卖的点在基底可迁移,每换一个环境方向都一致,这属于几何证明式的说服力。
第三,按 OpenAI 标注的人工修复时长分层看,增益几乎全落在两小时以内的题上:15 分钟档 89 到 101,15 分钟到 1 小时档 50 到 67;1 到 4 小时的 42 题只从 0 变 2,4 小时以上的纹丝不动。这套系统治的是"会做但走神",治不了"不会做"。
第四,换模型那几组都是单轮探针,统计强度有限;论文也没放代码仓库,复现要靠自己搭。动机审计那 9 条轨迹,作者自己注明了不构成发生率估计,只是说明自报不能当控制信号用。还有个可爱的循环:复现脚本也是 Qwen 写的。作者的辩护是,换更强的模型抽脚本只会让脚本更好,帮不到跑 agent 的那个本地 Qwen——这话在理,但记一笔不亏。
尾声:更大的桌子,不等于文件柜
把这篇论文压成一句话:修 bug 的 agent 缺的从来都不只是聪明,是一套让它对得起自己已有工作的状态管理制度。两本账分开记、互相校对;证据从命令里读,从复现脚本里读,唯独不从模型的自我评价里读;所有内部信号只劝自己,骗不了考官。
顺带拆掉的还有那个容量迷信。65k 的上下文窗口摆在配置表里,论文的答案却是给每个阶段分配检索预算——约束信息流,比扩大信息池更值钱。这套思路对任何做长任务 agent 的人都成立:你的模型记不住重点,往往赖不着窗口,赖的是没给它一个该记住什么的计划。
对自主软件工程的远景,这篇论文补上的是一块不太起眼的地基:等模型聪明到不用走神的那天,账本自然作废。在那之前,让 agent 学会记账、学会认错、学会在"修好了"之前先跑一遍复现脚本——每一样都不性感,每一样都在分数上兑现了。
信源:Jiahao Zhang, Yifan Zhang, Yu Huang《Coupling Planning with Episodic Memory in LLM Agents for Software Issue Resolution》,arXiv:2608.06811(2026-08-07,v1,12 页);全部实验数字出自论文正文表 III/IV 与轨迹签名分析,基线为 harness-matched mini-SWE-agent。
#AIAgent #软件工程 #SWEbench #Vanderbilt #LLM
讨论回复
加载中...正在加载回复...
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。