<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apply_patch on Codexer</title><link>https://codexer.com/tags/apply_patch/</link><description>Recent content in Apply_patch on Codexer</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 20 Sep 2026 08:00:00 +0800</lastBuildDate><atom:link href="https://codexer.com/tags/apply_patch/index.xml" rel="self" type="application/rss+xml"/><item><title>AI 改文件的三种流派：为什么换个编辑工具，同一个模型就变笨了</title><link>https://codexer.com/posts/2026-09-20-ai-coding-harness-edit-primitives/</link><pubDate>Sun, 20 Sep 2026 08:00:00 +0800</pubDate><guid>https://codexer.com/posts/2026-09-20-ai-coding-harness-edit-primitives/</guid><description>&lt;blockquote&gt;
&lt;p&gt;📄 本文综合改写自 Paul Pham 发布在 DEV Community 的《Deep Dive into Editing Tools in AI Coding Harnesses》，并补充了 Codex V4A 补丁格式的技术分析资料，原文链接见文末。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;同一个模型，在 Claude Code 里改代码顺顺当当，换到另一个 harness 上就开始频繁报错，错误信息还都长一个样：「String to replace was not found」。&lt;/p&gt;
&lt;p&gt;把模型换掉再试，换两三个，还是一样。&lt;/p&gt;
&lt;p&gt;但这不是模型变笨了。问题出在更下面一层：Agent 究竟是怎么把「我要改这里」这个意图，变成磁盘上真实发生的变动。&lt;/p&gt;
&lt;p&gt;这一层有个不太出名的名字，叫编辑原语（edit primitive）。它平时完全不露面，可一旦它不合格，再强的模型也会在「把 &lt;code&gt;print(&amp;quot;hello&amp;quot;)&lt;/code&gt; 改成 &lt;code&gt;print(&amp;quot;hello world&amp;quot;)&lt;/code&gt;」这种级别的活上翻车。&lt;/p&gt;
&lt;h2 id="一模型其实碰不到你的文件"&gt;一、模型其实碰不到你的文件&lt;/h2&gt;
&lt;p&gt;先说一个容易被忘记的事实：大语言模型不能直接操作文件系统。&lt;/p&gt;
&lt;p&gt;它唯一的输出通道是文本。所以它必须先把改动「描述」出来，再由外面的 harness 解析这段描述，落到真实文件上。描述格式设计得好不好，直接决定了落地的成功率。&lt;/p&gt;
&lt;p&gt;这件事有两个无法回避的设计张力。&lt;/p&gt;
&lt;p&gt;第一，&lt;strong&gt;行号不可信&lt;/strong&gt;。模型会幻觉行号，尤其是在前面几轮编辑已经让内容整体位移之后。任何依赖绝对行号的格式，早晚都会崩。&lt;/p&gt;
&lt;p&gt;第二，&lt;strong&gt;整文件重写太贵&lt;/strong&gt;。为了改一行代码而吐出整个文件，token 成本高，出错概率也不低，文件越大越明显。&lt;/p&gt;
&lt;p&gt;所以主流 harness 最后都收敛到了同一条路：用周围代码作为锚点，而不是用行号定位。方向一致，但格式细节上分岔得很厉害。而那些分岔的地方，恰好就是失败的来源。&lt;/p&gt;
&lt;h2 id="二三条路线三种代价"&gt;二、三条路线，三种代价&lt;/h2&gt;
&lt;h3 id="路线一精确字符串替换"&gt;路线一：精确字符串替换&lt;/h3&gt;
&lt;p&gt;Claude Code 走的是最直白的一条。它的结构化 Edit 工具接受一对参数：&lt;code&gt;old_string&lt;/code&gt; 和 &lt;code&gt;new_string&lt;/code&gt;。harness 拿着 &lt;code&gt;old_string&lt;/code&gt; 在文件里找，找到唯一匹配就替换。&lt;/p&gt;
&lt;p&gt;好处是心智模型极简。没有格式要学，模型不需要背任何语法，读起来也一目了然。&lt;/p&gt;
&lt;p&gt;代价藏在「唯一」和「逐字符」这两个词里。锚点必须在文件中唯一出现，而且必须完全一致。多一个空格、缩进从四个空格变成 tab、行尾多一个尾随空格、文件被 formatter 重排过一次，匹配立刻失败。&lt;/p&gt;
&lt;p&gt;这类失败在 Claude 自家模型上相对少见，因为这套 harness 是围着它们调优的，模型很熟悉这个工作流。可一旦换成通过 OpenRouter 接进来的其他模型，尤其是参数量较小的开源模型，失败率就明显上来了。&lt;/p&gt;</description></item></channel></rss>