线性探针可提前约 25 步读出编码 Agent 补丁会否通过测试

Latent Programming Horizons in Coding Agents

André Silva, Han Tu, Martin Monperrus

cs.LG, cs.SE

2026-07-06

KTH 在 22714 条 SWE-Bench 轨迹上训练线性探针。残差流能读出当前代码是否通过测试,AUC 最高 0.83;同一套探针在编辑落地前约 25 步仍高于随机。

这篇在解决什么

编码 Agent 修一个真实仓库,要走几十步:读文件、改代码、跑测试、再改。我们看得见它吐出来的 token 和工具调用,看不见底层语言模型有没有在残差流里维护一份「当前程序长什么样」的内部账本。既有探针工作大多盯单次生成的函数,上下文里就是整段代码,程序也不会在中途被改掉。Agent 场景里程序只被部分观察到,并且每一步都在变。

棋类网络会在隐状态里线性编码棋盘,Karel 网格程序的模型能读出当前和未来的语义状态。这篇要量的是:在 SWE-Bench 这种真实仓库、多步编辑上,同样的线性可读性在不在,以及能超前到多远。

方法

KTH 用 mini-swe-agent v2.2.8,跑 Qwen3.6-35B-A3B 和 Laguna-XS.2,覆盖 SWE-Bench-Verified 全部 500 题和 SWE-Bench-Pro 全部 731 题,每题最多 10 条轨迹。总共 22714 条轨迹,中位 52 步,79480 次代码编辑,2240 万个隐状态向量。两条模型的残差维度都是 2048。隐状态每 5 个 token 采一次,探针打在第 1、11、21、31、40 层。

四个二元标签都在每次编辑后 checkout 那一版代码、在仓库外算出来:

每个性质、每一层、每一个前瞻步数 k 各训一个逻辑回归。k=0 读当前程序;k>0 用此刻的隐状态去预测 k 步之后那版程序的标签。轨迹按任务 ID 划分,同一题不会同时出现在训练和测试里。对照是打乱标签再训一遍,用来确认信号在表示里,不在探针容量里。

结果

当前程序就能被线性读出来。最强的是语义标签。Qwen3.6 完全正确 AUC 最高 0.83(Verified 第 31 层 0.828,Pro 第 31 层 0.832),部分正确最高 0.84(Pro 第 21 层 0.841)。Laguna-XS.2 弱一截:完全正确约 0.73,回归在 Pro 上到 0.745。合式在 Verified 上接近随机(AUC 始终低于 0.60),因为正例率超过 0.92,模型几乎总在写能编译的 Python;Pro 掺了 C++、TypeScript,正例率掉到 0.52–0.57,合式 AUC 才升到 0.78。打乱标签的对照一律贴在 0.50。

层间是稳定的倒 U:第 1 层最弱,中间层最强,最后一层略掉,靠近 next-token。Qwen 在语义探针上大约领先 Laguna 0.10 AUC,编码位置一样,只是线性可分程度不同。

探针可以不重训就跨基准迁移。完全正确和部分正确的跨集 AUC 仍有 0.63–0.78,相对分布内的 0.71–0.84 只掉 0.04–0.09。合式跨集接近随机,两边的句法失败率差太大。

前瞻更意外。用 Laguna 预测未来的完全正确:k=0 时 AUC 约 0.77(Verified)和 0.82(Pro);前 25 步陡降,到 k=25 仍约 0.55 和 0.65,高于随机;之后进入平台,直到 k=50 还在 0.52 和 0.60。论文把这份超前叫做 latent programming horizon。

为什么重要

编码 Agent 的残差流里已经有一份可线性读出的程序账本,而且这份账本跑在磁盘写入前面。如果因果成立,就可以在 Agent 写出下一笔补丁之前做监控、熔断、甚至沿探针方向做 steering。这篇还没做因果,只证明「读得出来」。对做 interpretability 的人,Qwen3.6-35B-A3B 比 Laguna-XS.2 更合适当探针对象,信号大约强 0.10 AUC。

局限与存疑

读得出来不等于模型在用。作者自己写了:要证明因果,需要沿探针方向 steering,看编辑是否真的改变。轨迹中位只有 2 次编辑(均值 3.5),「提前 25 步」多数是推理和读文件,不是 25 次补丁。合式标签严重不平衡,Brier 分好看是因为常预测正例。只测了两个开源中等模型和一种 harness。隐状态每 5 个 token 采一次,k=50 的实验丢掉所有短于 50 步的轨迹。

术语

原文与代码

社区讨论

相关论文

全部论文解读