一句话定义
补丁式编辑(Diff / Patch)指模型不重写整个文件,只输出一段"变更说明"(diff),标出在哪些位置删掉哪几行、加上哪几行,再由工具(如 patch、git apply 一类程序)把这段说明合并回原文件。
为什么不让它重写整个文件
想象你请人改一份 200 页合同里的一处错别字。合理的做法是递一张便签:"第 12 页第 3 段,'定金'改成'订金'"。不合理的做法是让他把 200 页全部重抄一遍交给你——又慢又贵,而且抄的过程中极可能顺手改掉别处:漏个逗号、丢行注释、把两段合并。
补丁式编辑就是那张便签,它带来三个好处:
- 省:一个 800 行的文件只改 2 行,就不必吐出 800 行。
- 稳:重写等于让模型"复述"整个文件,复述就可能失真;diff 不碰的地方原样保留。
- 可读:人看 diff 一眼知道改了什么,看整个文件反而看不出来。
常见两种 diff 形态:一种是带行号和上下文行的 unified diff(用 @@ 标记位置,+/- 表示增删);另一种是"查找替换块"——给一段唯一的原文,再给出替换后的文本。后者不依赖行号,现在被广泛使用。
补丁为什么会"应用失败"
这是日常最常见的坑。patch 工具做的事是"按便签找位置",找不到就报错。常见原因:
| 失败原因 | 具体表现 |
|---|---|
| 上下文对不上 | 模型读到文件后,文件又被改过(人手动改、别的工具改),原文已不存在 |
| 空白差异 | 制表符与空格、换行符 CRLF/LF、行尾多一个空格 |
| 格式化工具介入 | 保存时自动格式化,缩进或引号被改动 |
| 上下文不唯一 | 同一段代码出现多次,工具不知道改哪一处 |
| 模型编造 | 模型"以为"文件里有某行,其实没有 |
可见绝大多数失败不是"模型不会写代码",而是"便签上的参照物过期了"。工程上的做法通常是:报错后重新读取文件最新内容、重新生成补丁;连续失败则退化成整文件重写(full rewrite)。具体行为以你所用的工具官方文档为准。
和相邻概念的区别
- 全量重写(full rewrite):输出完整文件,适合小文件或改动面积极大的情况。
- 补丁式编辑(diff / patch):只输出变更,适合大文件、局部修改。
- 合并(merge):把两条独立的变更线合到一起,冲突时需要人来判断。
对你意味着什么
对从业者:把文件的最新内容放进上下文,让模型生成足够唯一的定位片段;应用失败要有回读与重试机制;别把 apply 失败笼统归为"模型不行"。
对普通职场人:看到 AI 说"已修改",背后其实是一次补丁尝试;同一个文件被两个人(或两个 AI)同时改时,"冲突"就是这么来的。
