编码智能体提前思考
摘要
本文研究了编码智能体中的语言模型如何在迭代编辑过程中内部表示不断演变的程序。作者发现,线性探针可以从残差流中解码程序属性(例如解析、测试通过率),并且令人惊讶的是,这些表示在代理实际进行编辑之前就能预测未来结果,揭示了一个“潜在编程视野”。
暂无内容
查看缓存全文
缓存时间: 2026/07/14 13:17
# 编码智能体的潜在编程视界
来源:https://arxiv.org/html/2607.05188
André Silva, Han Tu, Martin Monperrus KTH皇家理工学院 瑞典斯德哥尔摩 \{andreans, htu, monperrus\}@kth.se
###### 摘要
一个解决软件工程任务的编码智能体需要经过数十个步骤进行推理、编辑代码和运行测试,然而,对于底层语言模型内部如何表示它正在处理的程序,我们知之甚少。我们展示了编码智能体下语言模型的残差流线性地编码了演进中程序的属性:一个在隐藏状态上的逻辑回归探针能够解码当前代码是否能够解析、通过其测试套件、减少失败测试数量以及引入回归,在两个模型和两个基准测试上,正确性预测的AUC高达0.83。我们的第二个发现更为惊人:这些表示领先于智能体自身的编辑。训练来预测未来编辑结果(在它们被具体化并写入磁盘之前)的探针,其性能在多达约25步之前仍高于随机水平。我们将此称为智能体的*潜在编程视界*。作为外部有效性的证明,我们展示了这些探针无需重新训练即可跨基准测试迁移。我们的正面结果为编码智能体的机制可解释性研究开辟了更多探索空间。
## 1 引言
编码智能体越来越多地被用于解决复杂的软件工程任务。在众多步骤中,它们读取文件、推理问题、编辑代码、运行测试并修正更改,不断迭代直至任务完成。尽管构建此类智能体备受关注,但令人惊讶的是,我们对底层语言模型如何表示它正在处理的代码知之甚少。在本文中,我们研究以下问题:*编码智能体内部关于它正在编辑的程序表示了什么?*
其他领域的先前工作提供了期望找到丰富答案的理由。在棋盘游戏上训练的Transformer能够发展出可线性解码的游戏状态内部表示(Li 等,2023 (https://arxiv.org/html/2607.05188#bib.bib28);Nanda 等,2023 (https://arxiv.org/html/2607.05188#bib.bib33);Karvonen,2024 (https://arxiv.org/html/2607.05188#bib.bib27))。在合成网格世界程序上训练的模型则编码了这些程序的当前和未来语义状态(Jin & Rinard,2024 (https://arxiv.org/html/2607.05188#bib.bib23))。
在软件领域,先前的工作(Ribeiro 等,2025 (https://arxiv.org/html/2607.05188#bib.bib40);Bui 等,2025 (https://arxiv.org/html/2607.05188#bib.bib8);Vu 等,2025 (https://arxiv.org/html/2607.05188#bib.bib49))已经确定,单个生成函数的正确性可以从模型的隐藏状态中线性解码。然而,这些工作假设的是单步生成,其中完整程序位于上下文中且从未改变。它们都不涉及在多步迭代中编辑仅部分观察到的真实代码库的编码智能体,而模型的隐藏状态随每次编辑而变化。这正是我们在本文中要解决的问题。
为了研究这个颇具难度的问题,我们按如下方式进行。我们系统地收集了智能体执行轨迹,在每一步提取模型的残差流,并训练线性探针以解码被编辑程序的属性。我们考虑了两个开源权重模型,它们在两个基准测试(SWE-Bench-Verified (Jimenez 等,2024 (https://arxiv.org/html/2607.05188#bib.bib22)) 和 SWE-Bench-Pro (Deng 等,2025 (https://arxiv.org/html/2607.05188#bib.bib12)))上运行 mini-swe-agent (Yang 等,2024 (https://arxiv.org/html/2607.05188#bib.bib54))。主要发现有两个。
##### 编码智能体编码当前程序。
线性探针能够恢复硬程序属性。我们展示了这些探针能够捕捉当前程序是否能够解析、是否通过测试套件、是否减少了失败测试数量以及是否引入了回归,所有这些都远高于经过标签混洗的对照控制。该信号贯穿整个轨迹,并在模型的中间层中最强。
##### 编码智能体预见未来程序。
除了跟踪当前状态,智能体还表示尚未具体化的程序。训练用于预测未来编辑结果的探针,在多达约25步之前仍能成功预测。这相当于游戏网络中学到的“前瞻”能力在编码领域的类比(Jenner 等,2024 (https://arxiv.org/html/2607.05188#bib.bib21);Taufeeque 等,2024 (https://arxiv.org/html/2607.05188#bib.bib46))。编码智能体在编辑具体化之前很久,就已经对其将要编写的未来程序形态有所预知。
据我们所知,我们是第一个展示编码智能体维护并持续更新程序及其语义属性的潜在表示的人(图 1)。此外,我们是第一个报告潜在空间中存在长期编程视界的人,并有超越随机水平的预测能力的有力证据。
##### 贡献。
- •我们提出了一种新颖的实验协议,用于研究编码智能体如何在潜在空间中维护程序表示。
- •我们展示了在编码智能体隐藏状态上的线性探针能够解码程序的四个硬属性。我们的实验结果基于真实世界代码库和多步轨迹(中位数 = 52 步)。我们证明了这些探针经过校准,并且无需重新训练即可跨基准测试迁移。
- •我们展示了潜在空间捕捉了编程视界。潜在程序表示支撑了未来编辑预测:探针可以预测 kk 步之后编辑的结果,并且这适用于高达 k=25k=25 步。
## 2 潜在程序表示
考虑一个编码智能体解决编程任务的方式:通过迭代搜索和推理代码库、进行编辑、运行测试,并利用反馈指导其下一步。除了底层模型发射和观察到的令牌之外,这样的智能体可能编码了一个潜在程序表示——即它对程序的内部记录,会不断更新和修正。这种表示在令牌级别对框架和用户是不可见的,正是我们在本文中研究的对象。
这种表示(如果存在)存在于模型内部计算的某个位置。实际上,Transformer模型维护着一个不断更新的隐藏状态向量,称为残差流,每一层都从中读取并向其写入累加更新,携带从输入到输出的信息。我们用 htl∈Rd\\mathbf{h}_{t}^{\\ell}\\in\\mathbb{R}^{d} 表示在层 l\\ell 之后令牌位置 t 处的残差流。由于每一层都通过它进行通信,因此残差流是探测模型内部表示了什么的标准目标(Elhage 等,2021 (https://arxiv.org/html/2607.05188#bib.bib14))。在本文中,我们研究残差流是否包含潜在程序表示。
###### 定义 1(潜在程序表示)。
潜在程序表示是关于程序在残差流 htl\\mathbf{h}_{t}^{\\ell} 中编码的内容。它独立于智能体已经或将要发射的表面令牌而被捕获。
残差流不仅包含潜在程序表示。它还携带关于当前任务和过去对话的信息,因此潜在程序表示与隐藏状态中的其他信号纠缠在一起,而恢复它正是我们稍后介绍的探针的任务,见 3.4 节。
###### 定义 2(潜在程序空间)。
潜在程序空间是隐藏状态空间 Rd\\mathbb{R}^{d} 中沿着编码潜在程序表示的流形。当智能体编辑代码和运行测试时,隐藏状态沿着这个流形移动,形成一条潜在程序表示轨迹。
在每一步,隐藏状态就是该流形上的一个点,它捕捉了当前程序。然而,一个能力强的智能体可能不仅推理当前状态。如果模型在进行前瞻规划,其当前隐藏状态也应该编码未来程序——即它可能在几步之后编写的程序——的属性。我们将这种在潜在空间中规划的范围称为“潜在编程视界”。
###### 定义 3(潜在编程视界)。
潜在编程视界是指未来编辑在多大程度上已经编码在当前残差流中。我们将潜在编程视界定位于仅基于 htl\\mathbf{h}_{t}^{\\ell} 提前预测 t+k 步时的程序属性的能力。我们将其称为 k 时的编程视界。
视界 k 捕捉了未来规划的深度。任何关于 k=0 时程序的预测都意味着当前程序的属性在潜在空间中被表示。对于较小的 k(短期视界),预测成功意味着当前隐藏状态已经携带了仅几步之遥的编辑属性,例如同一文件中的一系列编辑。对于较大的 k(长期视界),预测成功意味着智能体预见到了只会在轨迹中更靠后才会编写的程序。
虽然语言模型并未明确训练在隐藏状态中编码程序表示,但多种训练信号可能会推动它们朝这个方向发展。下一个令牌预测隐式地鼓励学习程序语法和语义,因为如果理解这些,预测函数的下一行会更容易。除了下一个令牌训练目标,现代代码模型还通过基于执行轨迹(Copet 等,2025 (https://arxiv.org/html/2607.05188#bib.bib10))或来自编译器和测试套件的反馈(Ye 等,2022 (https://arxiv.org/html/2607.05188#bib.bib55))的信号进行后训练,特别是在强化学习期间(Wei 等,2026 (https://arxiv.org/html/2607.05188#bib.bib53))。基本上,预训练和后训练都应该有助于为编码智能体正在处理的程序生成语义丰富的潜在表示。
在本文中,我们是第一个研究潜在程序表示是否已出现在编码模型的潜在空间中,以及编码智能体在软件工程任务期间如何维护它们的人。
## 3 方法
参见图注图 1:我们的方法:训练探针预测程序属性。从智能体编辑轨迹的第 t 步取出的残差流向量 ht\\mathbf{h}_{t},由线性探针处理,参数化为一个前瞻编程视界 k。每个探针预测 k 步之后的程序是否具有四个二元属性(▲\\blacktriangle 良构性,∙\\bullet 完全正确性,■\\blacksquare 部分正确性,◆\\blacklozenge 回归)中的一个;在每次编辑事件时通过检出该程序版本并评估其来计算地面真实标签。当 k=0 时,探针评估潜在空间是否映射了当前状态下的程序,而更大的 k 探针则测量 ht\\mathbf{h}_{t} 在多大程度上预见了智能体最终将编写的程序:即其潜在编程视界。填充的单元格表示在程序中观察到的属性(真),浅色单元格表示未满足的属性(假);所有这些都从训练轨迹中符号化计算得出。在推理时,探针预测未来的属性,我们测量预测准确率。我们研究编码智能体在多步智能体编辑真实代码库期间,在潜在空间中发生了什么。
### 3.1 概述
我们需要一种方法来捕捉隐藏状态中的程序表示。为此,我们遵循探测文献(Alain & Bengio,2017 (https://arxiv.org/html/2607.05188#bib.bib3);Zhang 等,2025 (https://arxiv.org/html/2607.05188#bib.bib57))并训练线性探针从隐藏状态对程序属性进行分类。图 1 展示了我设置的整体概览。如果这样的探针预测程序属性高于随机水平,则表明模型确实在其残差流中编码了这些属性。
### 3.2 形式化设置
设 M\\mathcal{M} 为一个具有 L 个 Transformer 层的语言模型。一个编码任务的智能体轨迹 T\\mathcal{T} 包含 S 个交互步骤。在每一步 s,智能体根据累积的上下文生成响应 A_s;随后工具产生输出 O_s。
完整轨迹是线性化的串联:
T = C_1 ⊕ A_1 ⊕ O_1 ⊕ ⋯ ⊕ A_S ⊕ O_S
其中 C_1 是初始上下文(通常是系统和用户提示),⊕ 表示令牌序列串联。
对于生成部分 ⋃_{s=1}^{S} A_s 中的每个位置 t,令 h_t^ℓ ∈ R^d 表示第 ℓ 层之后的残差流。我们从第 1 层开始索引,因此 h_t^1 是第一个Transformer块之后的残差流,h_t^L 是最后一个块之后的。
当步骤 s 中 A_s 包含修改代码库的工具调用时,发生*编辑事件*。令 e_1 < e_2 < ... 表示 T 内部连续编辑事件的令牌索引。这些编辑捕捉了模型执行手头任务的试错过程。
在本文中,*程序属性* φ 是一个函数,它给每个编辑事件 e_i 分配一个二元标签 y_i^φ ∈ {0,1},反映结果程序版本的属性。例如,属性“可编译性”捕捉给定编辑处的程序是否能够编译,见第 3.3 节本文考虑的属性列表。
标签仅在每个事件处外部计算,然后保留到下一次编辑:每个生成的令牌位置 t 满足 e_i ≤ t < e_{i+1} 的,都获得编辑 e_i 的标签。
我们还在初始程序版本上评估 φ,并将其视为轨迹之前的幻影编辑 e_0,因此每个位置 t 即使在智能体第一次编辑之前也有定义明确的标签。
按步数而不是按令牌索引标签更方便:令 σ(t) 是生成令牌 t 的步骤(即 t ∈ A_{σ(t)}),并令 y_s^φ 表示在步骤 s 生效的标签,即步骤 s 或之前最近一次编辑的标签。令牌级别的标签则为 y_t^φ = y_{σ(t)}^φ。
### 3.3 程序属性
我们定义了四个要通过探测研究的程序属性。我们将训练探针从模型处理程序时的隐藏状态预测这些属性的当前值和未来值。
##### ▲ 良构性
良构性是代码能够执行的必要先决条件。我们通过解析或编译给定版本的程序来操作性地定义它。如果成功,标签为 1,否则为 0。
##### ∙ 完全正确性
完全正确性跟踪程序的功能行为,这是代码生成和修复的最终目标。如果程序通过了基准测试的测试套件预言,标签为 1,否则为 0。
##### ■ 部分正确性
这个探针不是问代码是否完全正确,而是捕捉部分正确性,即程序是否在朝着正确的方向前进。如果失败测试的数量严格小于任务开始时的数量,标签为 1,否则为 0。
##### ◆ 回归
一个能力强的智能体不仅必须注意它试图修复的测试,还必须注意那些它不能破坏的测试。这个探针测试的是相似文章
编程代理的胜负不在于提示词,而在于运行时基础设施
随着编程代理能力增强,瓶颈从模型质量转向支持长时间运行的基础设施,包括持久状态、权限、检查点、可观测性和成本控制。作者认为,最好的代理产品更像是运行时和工作流系统,而非仅仅改进提示界面。
前沿编程智能体利用元编程适应陌生编程语言
本文在深奥编程语言上评估了六个前沿编程智能体,发现更强的智能体使用元编程——编写Python程序在陌生的目标语言中生成和调试代码。禁止此策略导致性能大幅下降,而提供Python辅助代码则能提升较弱的智能体。
AI 编码代理需要“先计划后编辑”的工作流程?征求反馈
一种为 AI 编码代理提出的工作流程,强调在代码编辑之前进行头脑风暴和执行边界约束,寻求社区对其实用性的反馈。
编码智能体的未来是JEPA吗?[D]
作者讨论了将Yann LeCun的JEPA(联合嵌入预测架构)应用于编码智能体,提出不应将代码视为文本,而应让智能体学习紧凑的状态表示并预测未来状态,可能比当前基于LLM的方法实现数量级的效率提升。
编码代理作为世界模拟器表现良好
本文提出了一种基于代理的框架,利用编码代理从自然语言提示生成物理上可信的世界模拟,在物理准确性和指令保真度方面优于基于视频的模型。