Code Understanding is a Bottleneck for Coding Agents
Nishant Balepur, Kiran Tomlinson, Tobias Schnabel
cs.SE, cs.AI, cs.PL
2026-10-07
CABRA从调用图造出6840道受控编程题。八个裸模型随规模掉点,六个Agent靠grep和脚本维持近满分。任务改成跨类抽取共享逻辑后,Agent准确率才随行数下降。
SWE-bench 一类仓库基准把 GitHub issue 收成改代码、跑测试,难度常用改动行数代替。行数当不好尺子。仓库、任务类型、该改的位置在同一批题里一起变,分不清补丁长,还是没读懂调用关系。
Deng 等人把 SWE-Bench Pro 的低分归到编辑量更大。轨迹还有另一面:读文件、理依赖、跑测试变多时,准确率同样下去。CABRA 把两件事拆开,程序从零生成,一次只拉长一个轴。
CABRA(Coding Ability Blueprint for Rigorous Agent evaluation)先定任务类型,再定它怎么变大,不从仓库里挖 issue。
程序是有向无环调用图。节点是函数,边是调用,函数体用随机运算拼出,另有字符串和数组版。图分成不动的 Cinit 和必改的 Cedit,块间连边概率 0.3,删死代码除外。五类任务来自 Fowler 的重构目录:删死代码;新参数沿调用链下传;返回值从汇点上传;重复的 slow 提到最近公共祖先;DRY 把 get 收到第一个公共后代。
规模 n 取 5、10、25、50、100、200,一次只动一条轴。函数遍历:必改函数数等于 n,旁路固定 25。函数搜索:干扰函数数等于 n,必改固定 25,相当于代码里的 needle-in-a-haystack。运行时判定:相同代码包进 if check(),只改会执行的分支;check 是类 Collatz 循环,要推 n 步。指令遵循:题面追加 n 条不同规矩,如断言、指定注释、临时变量。删死代码用不上指令轴。后两条轴把两侧函数数都固定为 10。推理档位能调的模型用 medium。
共 6840 道:三种代码、五类任务(指令轴四类)、四条轴、六档 n、每格 20 道。黑盒评分,每个函数用 50 个随机输入对标准输出,测试数不少于 500。死代码删净、分支改对、附加规矩做完,才记 1 分。
无工具组八个模型:GPT-5.4 Mini、GPT-5.3 Codex、GPT-5、GPT-5.5、Grok-4.1 Fast、DeepSeek-V3.2、GPT-OSS 120B、Mistral Large 3。先写思考,再整份重写代码。有工具组六个 Agent,同用 Copilot harness 1.0.76:GPT-5.5、GPT-5.4 Mini、Gemini-3.5 Flash、Gemini-3.1 Pro、Sonnet-4.6、Opus-4.7。循环是 ReAct,一轮推理加一次 bash。正文写评测约 2.5 万美元,附录总表为 28262 美元。
图 2 把准确率对 n 做平均。八个裸 LLM 都随 n 下降。六个 Agent 在遍历、搜索、运行时上多半接近满分。GPT-5.4 Mini 裸跑会掉,放进 harness 后,在 n 大于 100 的非指令任务上超过裸跑的 GPT-5.5 和 Grok-4.1 Fast。指令遵循是基础四轴里唯一明显掉点的轴,n 到 200 时除 Opus-4.7 外都降。
Agent 把规模卸给工具。遍历用语法树搬参数,搜索用 grep 找名字,运行时用 exec 跑 check。脚本可以不随 n 变长,裸模型的自然语言推理会变长。
六类工具占比为读 22%、分析 14%、搜索 11%、编辑 36%、测试 8%、其他 9%。Qwen3-4B 打标,每类 20 条人工对照,CABRA 轨迹一致率 94%,SWE-bench 轨迹 89%。图 3 里,三条轴随 n 变多的是读和分析,编辑只在指令遵循上一起涨,运行时各路 token 几乎持平。48% 的读和 40% 的分析落在轨迹前四分之一,69% 的读、56% 的分析发生在第一次编辑之前。搜索之后接编辑的占 12%,接阅读的占 19%。
同一套标签打到 SWE-bench Verified 的 mini-swe-agent 轨迹,模型有 Claude-4.5 Opus、Sonnet-4.5、Gemini-3 Pro、Flash、GPT-5.2、GPT-5 Mini。人工时限从 L1(15 分钟内)到 L4(不少于 4 小时)。改动行数、阅读、分析、测试一起升。和准确率的点二列相关都不高,负号表示指标越高越容易失败,理解类调用次数仍排第一。
| 指标 | 与准确率的 r | 参照 |
| 理解调用次数 | -0.200 | 读加分析 |
| 全部工具 token | -0.178 | |
| 编辑 token | -0.177 | |
| 阅读次数 | -0.171 | |
| 改动行数 | -0.159 | |
| 编辑次数 | -0.151 | 最弱 |
第 5 节加了等价合并。两个类各有 ℓ 行,其中 d 行行为不同,共享逻辑抽到父类,子类最多留 d 行,行为仍走黑盒。改名、换序、拆并语句、乘法分配让等价代码长得不像。ℓ 从 5 到 200,每档 50 题。编辑量大致随行数线性涨,要核对的组合最坏按平方涨。Agent 准确率随 ℓ 下滑,理解类工具远多于编辑。正文没有逐点百分比。
行为保住的比例超过 90%。失分主要是子类留行太多,一行之差没找到。d 取 1、3、5,差异越多越差。ℓ 为 50 时,多行拆并和乘法分配掉点大,Gemini 更明显,六个里有三个怕多行差异;拿掉改名回升最多。不少裸模型始终过不了 0.5。Opus-4.7 在 50 行接近做满,200 行仍怕拆行和改名。事先说明只有一行不同,准确率更高。
改动行数不适合再当 Agent 难度的主指标。CABRA 把题分成两拨:工具一上就容易的,理解量上去也会掉的。搜索被 grep 削平,指令条数和跨类合并还在。
会拼工具的小模型,能在这些受控题上打过更大的裸模型。调用更该花在读懂待改的代码。
合成题替代不了 SWE-bench。受控轴负责归因,仓库 issue 负责真实感。
合成代码是随机运算、字符串和数组。一种调用图、五种重构、一个 harness,外推缺少直接证据。
SWE-bench 上的相关都很弱。理解调用次数 -0.200,改动行数 -0.159,只说明谁更靠前,预测仍然差。难度等级上各项一起涨,仓库侧给不出因果。token 不好归到单次调用。
工具会绕开出题人想测的能力。函数搜索被 grep 削平,测到的是会不会写脚本。打标用的是 Qwen3-4B,仓库轨迹一致率 89%,低于合成轨迹的 94%。
11% 的轨迹访问过共享目录,不到 0.2% 查过其他会话。沙箱重跑后趋势还在,主结果仍来自原先那批。