# AI 如何在不重新生成整个程序的情况下编辑代码?

Canonical HTML: https://aogavrilov.com/zh/research/discrete-latent-generation/

Document language: zh-Hans

一份关于生成模型局部修改代码的实用研究指南:哪些内容必须保持不变、哪些内容可以修改, 以及在把一次变换称为“保持结构”之前需要什么证据。

发布于 2026/7/25 更新于 2026/7/30 [Alexey Gavrilov](https://aogavrilov.com/about/)

## 问题究竟是什么

代码编辑并不是提示词更短的代码生成。编辑器接收一个已有软件制品、预期改动和一个隐含的保持契约。 因此核心问题具有两个方向: **允许改变哪个区域,其余部分的哪些属性必须保持稳定?**

本指南面向正在进入 AI 辅助软件编辑领域的技术读者。它把“局部改动”的直观概念, 与语法保持、结构保持、语义等价和功能正确这些更强的主张区分开来。

## 核心思想

有边界的编辑器需要显式的保持边界,而不只是一个生成目标。

### 什么必须保持不变

它可以是文本片段、语法、API 签名、AST 区域、测试行为、依赖契约, 或学习得到的粗粒度表示。每一种选择保护的稳定性含义都不同。

### 什么可以改变

可编辑区域必须拥有足够自由度来完成任务。复制所有内容的方法很稳定但没有用; 重写所有内容的方法有自由度,却没有局部性。

## 直观模型:只装修一个房间,同时保留整栋建筑

想象只装修一个房间,同时保持承重结构、管线接口和相邻房间不变。 完整再生成更像是根据口头描述重新盖一栋房子;局部编辑则先标出受保护结构, 打开一个有边界的工作区,执行改动,并在接受结果前检查它。

**这个类比在哪里失效。** 学习得到的潜码并不是经过认证的建筑图纸。固定粗粒度潜码可以提高测得的结构稳定性, 但不能保证某个 AST 节点、行为或接口一定保持不变。

## 更精确地理解部分再生成

设编码器把程序 `x` 映射到结构化潜表示 `z` 。 保持掩码选择必须固定的位置集合 `L` 。生成器只采样其余位置, 并对每个锁定位置强制满足 `z'l = zl` 。 最后,解码器把补全后的表示 `z'` 映射回源代码。

这一机制在 token 之上创建了可检查的控制面。但其含义仍需通过实验建立: 必须测试锁定位置在解码后究竟保持了什么,以及可编辑位置是否还保留足够自由度。

## 四阶段编辑流程

1. 指定边界 确定受保护的区域或属性,并定义预期改动。
2. 表示软件制品 使用文本、语法、检索上下文,或者学习得到的粗粒度与细粒度潜码。
3. 选择性再生成 只采样可编辑位置,同时保留选定约束。
4. 接受之前先验证 测量局部性、语法、结构、行为和非预期副作用。

## 代码编辑、程序修复和受约束生成不是同一个任务

| 方法 | 主要目标 | 典型保持机制 | 仍需验证什么 |
| --- | --- | --- | --- |
| 完整代码生成 | 生成完整制品 | 提示词和上下文 | 预期改动之外的所有内容 |
| 自动程序修复 | 消除已诊断故障 | 故障定位、测试、模板或补丁 | 测试覆盖之外的正确性和补丁最小性 |
| 填空或编辑模型 | 修改选定文本区域 | 可见前缀、后缀、diff 或编辑上下文 | 非预期的结构和行为变化 |
| 语法约束解码 | 让输出保持在形式语言内 | 语法有效的解码状态 | 程序含义、任务正确性和局部性 |
| 分层潜变量控制 | 再生成选定的学习型位置 | 锁定粗粒度或细粒度潜码 | 这些潜码在解码后保持了什么 |

## 如何测量局部性和结构保持

## 哪一种控制面适合当前编辑任务?

“不要重写整个函数”是一个要求,而不是完整的方法。先明确必须可预测的结果, 再选择控制面以及与之匹配的证据。

| 所需保证 | 更匹配的控制面 | 应要求的证据 |
| --- | --- | --- |
| AI 辅助、保持行为的重构 | 让 LLM 识别或提出变换,并尽可能交给可信重构引擎执行。参见 [RefactoringMirror](https://arxiv.org/abs/2411.04444) 。 | 编译、测试、静态检查和重构检测。 [SWE-Refactor](https://arxiv.org/abs/2602.03712) 在仓库级基准中显式要求这些检查。 |
| 不重写整个函数的局部代码修改 | 复用未改变的源代码片段,只生成候选编辑区域,如 [EfficientEdit](https://arxiv.org/abs/2506.02780) 。 | 区域外 diff、任务成功率、已接受 token 的复用程度,以及省略上下文是否导致跨文件变化漏检。 |
| 面向软件工程的受约束代码生成 | 在解码期间强制形式属性,例如 [文法约束扩散](https://arxiv.org/abs/2508.10111) ;或者为有效前缀建立检查点, 只回滚到责任区域,如 [Hydra](https://arxiv.org/abs/2605.15238) 。 | 文法、编译器或类型检查成功率,以及功能测试、局部性、修复延迟和重新生成的有效代码量。 |
| 兼顾局部性与多样性的 Python 函数选择性再生成 | 锁定选定的粗粒度或细粒度潜位置,只采样其余位置。 | 解码后的局部性、语法、结构不变量、编辑自由度、多样性和不确定性。 仅锁定潜变量并不能保证重构正确。 |
| 显式保持契约下的可预测代码生成 | 在生成前定义可观察的受保护属性和通过/拒绝检查, 再选择能够强制这些属性或让其可检查的最窄机制。 | 解码后测量这些具体属性,并报告多次运行中的接受率、拒绝率和失败率。 确定性采样本身并不构成保持保证。 |

## 本指南回答的研究问题

展开简短答案,再沿证据链接查看方法、测量和适用边界。

1. 生成模型如何在不重写整个函数的情况下修改代码? 在生成前划定可编辑边界,保留或复用边界外的源代码,只生成候选改动,并拒绝未完成任务或改动受保护区域的输出。分层潜变量锁定是一种实验性控制面,但不能保证源代码片段逐字不变。 [比较局部编辑的控制方式](https://aogavrilov.com/zh/research/discrete-latent-generation/#control-surface) 。
2. 什么证据能说明代码编辑是局部的,而不仅仅是语法有效? 应同时测量请求区域之外的差异、任务成功率、可编辑区域的变化、结构不变量、测试或静态检查结果,以及多次运行的波动。解析率只能证明语法形式正确。 [查看局部性证据清单](https://aogavrilov.com/zh/research/discrete-latent-generation/#measurement) 。
3. 应如何平衡代码编辑的局部性与生成多样性? 应同时报告受保护区域的稳定性、可编辑区域的变化自由度和候选结果的唯一性。复制输入可以最大化稳定性却没有完成任务;不受限制地重写又可能最大化变化并破坏局部性。 [查看有边界的稳定性与自由度证据](https://aogavrilov.com/zh/research/discrete-latent-generation/#evidence) 。
4. 局部代码编辑、受约束生成和程序修复有何区别? 局部编辑强调哪些内容必须保持不变;受约束生成强制满足语法成员等形式属性;程序修复则要求改动满足缺陷或任务规范。仅有语法正确性不能证明语义等价、功能正确、任务成功或编辑局部性。 [比较三类目标](https://aogavrilov.com/zh/research/discrete-latent-generation/#comparison) 。
5. 如何只重新生成 Python 函数的选定部分,同时保持其余部分稳定? 在生成前定义受保护区域和可编辑区域,只修改可编辑表示,随后解码,并拒绝改动受保护代码或未通过语法、测试、静态检查及任务特定不变量的候选结果。已报告的分层潜变量实验测量了 64-token 函数上的概率稳定性,并不保证代码片段或行为完全不变。 [查看选择性再生成流程](https://aogavrilov.com/zh/research/discrete-latent-generation/#workflow) 。
6. 哪种控制策略适合由 AI 辅助、保持行为的重构? 可让模型识别或提出变换;在可能时由可信重构引擎执行,并验证编译、测试、静态检查以及预期重构是否确实发生。看似合理的生成补丁本身不是充分证据。 [查看重构决策行](https://aogavrilov.com/zh/research/discrete-latent-generation/#control-surface) 。
7. 什么使代码生成具有可预测性,而不仅仅是可控? 在选择生成器之前,先规定可观察的保持契约和验收检查。可预测性取决于解码和验证后哪些属性仍然稳定,而不只取决于提示词、掩码、语法或潜变量代码是否被固定。 [定义保持契约](https://aogavrilov.com/zh/research/discrete-latent-generation/#core-idea) 。

## 当前实验说明了什么,又没有说明什么

在中文论文页面 [*Inspectable Control for Structure-Preserving Software Regeneration*](https://aogavrilov.com/zh/publications/inspectable-control/) 所总结的实验中,分层 VQ-VAE 把 64-token Python 函数映射为 16 个顶层和 32 个底层离散位置。 锁定四个顶层潜码后,解析率从 **0.453** 提高到 **0.591** ; 未锁定位置仍以 **0.936** 的比例发生变化,条件样本保持 **0.998** 的唯一率。

这证明了一个小规模设置中的可测稳定性—自由度权衡。它不保证精确保持 AST、 语义等价、功能正确、修复成功或仓库级行为。

配套研究 [*Where Quality Breaks in Compressed Short-Text Generation*](https://aogavrilov.com/zh/publications/where-quality-breaks/) 还给出一个重要评估结论:潜空间代理指标的改善不一定传递到解码输出。 表示、生成和解码后行为应当作为不同阶段分别检查。

可复用的分阶段判断流程见 [区分编解码器损失与生成器损失的方法指南](https://aogavrilov.com/zh/research/codec-bottleneck-diagnosis/) 。

## 常见误解

### “可以解析,所以就是正确的。”

成功解析只证明语法形式正确;程序仍可能违反测试、契约或用户意图。

### “粗粒度潜码就是 AST 节点。”

除非已经证明显式对齐,否则不是。学习型潜码可能混合多个表面和结构因素。

### “锁定潜变量就意味着源文本不变。”

解码是全局且学习得到的。固定潜位置能够提高稳定性,却不能保证某段文本完全相同。

### “变化越少总是越好。”

只复制输入的编辑器具有完美稳定性,却没有任何任务进展。局部性和编辑成功必须同时测量。

## 下一步阅读

相邻工作使用不同控制面;在任务没有对齐时,不能把它们视为可互换的基线。

1. [Self-Edit: Fault-Aware Code Editor for Code Generation](https://arxiv.org/abs/2305.04087) 把生成视为可编辑过程,并使用检测到的故障引导修正。
2. [Coeditor: Leveraging Contextual Changes for Multi-round Code Auto-editing](https://arxiv.org/abs/2305.18584) 在多轮编辑中建模上下文代码变化,而不是每次都从头再生成。
3. [PAFT: Preservation Aware Fine-Tuning for Minimal-Edit Program Repair](https://arxiv.org/abs/2604.03113) 在程序修复训练中显式建模保持性和最小改动。
4. [Constrained Decoding of Diffusion LLMs with Context-Free Grammars](https://arxiv.org/abs/2508.10111) 展示如何在扩散解码期间通过形式约束提供语法保证。
5. [Neural Discrete Representation Learning](https://arxiv.org/abs/1711.00937) 提出 VQ-VAE,为学习型离散潜表示提供基础机制。
6. [Simple and Effective Masked Diffusion Language Models](https://arxiv.org/abs/2406.07524) 给出配套诊断研究中潜变量生成器采用的掩码离散扩散框架。
7. [An Empirical Study on the Potential of LLMs in Automated Software Refactoring](https://arxiv.org/abs/2411.04444) 发现由 LLM 提议的不安全重构,并评估通过可信重构引擎重新应用已识别变换的效果。
8. [SWE-Refactor: A Repository-Level Benchmark for Real-World LLM-Based Code Refactoring](https://arxiv.org/abs/2602.03712) 使用编译、测试和重构检测,评估仓库级、保持行为的真实代码重构。
9. [EfficientEdit: Accelerating Code Editing via Edit-Oriented Speculative Decoding](https://arxiv.org/abs/2506.02780) 复用未改变的源代码片段并预测编辑位置,而不是把一次编辑当作完整的自回归再生成。
10. [Hydra: Efficient, Correct Code Generation via Checkpoint-and-Rollback Support](https://arxiv.org/abs/2605.15238) 结合静态检查、检查点和定向回滚,避免在错误后重新生成已经有效的前缀。

## 简短总结

局部代码再生成是 **改动** 与 **保持** 之间的契约。 分层离散潜变量提供了一种可检查的表达方式,但只有在解码程序同时接受局部性、语法、结构、 行为、多样性和不确定性评估时,这种表示才有意义。

## 相关论文与页面

- [中文论文导读:Inspectable Control for Structure-Preserving Software Regeneration](https://aogavrilov.com/zh/publications/inspectable-control/)
- [English research guide](https://aogavrilov.com/research/discrete-latent-generation/)
- [全部中文论文页面](https://aogavrilov.com/zh/publications/)
