A04 编辑应用机制·diff-apply 与 fast-apply
模型把代码改对了,不等于这次改动会被正确地”落”进文件——本节点解决的问题是:从”LLM 生成正确的修改意图”到”磁盘上的文件被准确无误地改成那个样子”,中间隔着一层被绝大多数人忽视的工程,叫编辑应用(edit application)。视角/框架名:生成对 ≠ 应用对,edit locality(编辑定位精度)是一种隐形产品力。把它讲清楚,你就能在选型会上回答一个 90% 的人答不上来的问题——“为什么同一个 Claude Opus,在 Cursor 里改大文件又快又准,在某个套壳工具里却把文件改烂了?”
§0 为什么是”应用机制”这个框架,而不是”模型能力”框架
读者脑中的默认框架是:代码改得好不好,取决于模型强不强。这个框架在这一节点是错误的,必须先挡掉。
真相是:一次成功的代码编辑被拆成两个正交的能力——生成(generation):模型决定”要把这段改成什么”;应用(application):系统把这个意图无损地写进目标文件的正确位置。前者是模型问题,后者主要是工程问题。一个 SWE-bench Verified 88.6% 的 Claude Opus 4.8〔分数来源:BenchLM.ai,2026-06-02,volatile〕,如果配一个糟糕的编辑应用层,照样会在生产里”改丢半个函数”。
这就是为什么本专题把”编辑应用机制”单列成一个概念辨析节点,而不是塞进 c10 - Agent 技术栈与工具调用 的工具调用一段带过。c10 把”编辑文件”当成 Function Calling 的一种 tool(str_replace/write_file),停在”agent 能调用编辑工具”这个 G3 截面;本节点要升高一个抽象层,逼问:这个编辑工具的内部格式选择(whole-file / diff / search-replace / fast-apply),如何决定了产品的速度、成本、准确率和用户信任——这是一个被 tool schema 抽象掉、却直接决定产品体感的设计变量。
辨析的对立框架还有一个:“既然模型越来越强,应用层迟早不重要”。这是把应用层误当成模型能力的临时补丁。下文 §4 会用 Cursor 的 speculative edits 与 Morph 的专用模型证明:应用层不是补丁,而是一条独立演化、且专门化(specialized)程度越来越高的基础设施赛道。
§1 四种编辑格式:从”重写整个文件”到”语义合并”
LLM 要表达”我想怎么改这个文件”,历史上收敛出四种格式,它们在 token 成本、准确率、失效模式上差异巨大。
| 编辑格式 | 准确率〔Morph 自评·volatile〕 | 核心机制 | 典型失效 | 代表工具 |
|---|---|---|---|---|
| Whole-file rewrite(整文件重写) | 60–75% | 让模型重新输出整个文件 | 大文件 token 爆炸;“中段遗忘”(lost-in-the-middle)导致内容静默消失 | 新建文件场景、部分早期 agent |
| Unified diff(标准 patch) | 80–85% | 模型输出带行号的 @@ -x,y +a,b @@ 补丁 | LLM 对行号极度不可靠,偏移一行即 apply 失败 | 早期 SWE-agent |
| Search/Replace block(精确字符串匹配) | 84–96% | 模型给”原文片段 + 替换片段”,系统做精确字符串查找替换 | 原文有细微出入(空格/缩进)即失配 | OpenHands、SWE-agent、Codex CLI、Claude Code 的 str_replace |
| Semantic / Fast Apply(语义合并) | ~98% | 模型只产出”草稿编辑”,由专用小模型把草稿合并进原文件 | 需要专门的模型基础设施 | Cursor、Morph、Relace |
(来源:Morph Edit Formats 指南;DEV Community 5 种编辑策略基准)
[!note] 行业收敛点:
str_replace为什么赢了 diff 多个主流 agent(OpenHands、SWE-agent、Codex CLI、Claude Code)不约而同地选择了精确字符串 search/replace 作为默认编辑工具。原因是一个朴素但关键的认知:LLM 不会数行号,但会复述代码。Unified diff 要求模型精确报出-行所在的行号区间,而模型的自回归生成对绝对位置极不敏感——稍有偏移,patch 工具就拒绝应用。Search/replace 把”定位”从”行号”换成了”内容片段”,绕开了模型最弱的能力。这是一个典型的”用工程约束去适配模型弱点”的设计,而不是等模型变强。
§2 Fast Apply:把”应用”本身做成一个专门模型
当编辑规模变大(跨函数重构、多作用域修改、几百行的合并),前沿模型直接做编辑会暴露三个问题:懒惰(偷工,输出 // ... 其余不变)、不准(合并时改错位置)、慢(逐 token 重新生成整个文件,延迟高到破坏心流)。Fast Apply 的思路是把”应用”从前沿模型手里拿走,交给一个专门训练、专门优化推理的小模型。
Cursor Speculative Edits(2024-08 公开)
- 基础模型:Llama-3-70B 定制微调(
llama-70b-ft-spec),训练数据用 CMD+K 提示 + instant apply 合成。 - 核心技术:Speculative Edits——区别于标准 speculative decoding 用一个独立 draft 模型猜测,它把”开发者提供的原文件本身”当作 speculation(投机草稿),服务端找到模型生成与原文匹配的最长前缀,在温度=0 下做确定性验证,只在”断点”处(真正要改的地方)才让模型从头生成。绝大多数没改的代码直接”投机命中”,跳过逐 token 生成。
- 速度:约 1,000 tok/s(约 3,500 字符/秒),比 vanilla Llama-3-70B 快 13×,比此前的 GPT-4 speculative edits 方案快 9×。基础设施:Fireworks AI 的 speculative decoding API。
- (来源:Fireworks × Cursor 工程博文;Bind AI 解析)
Morph Fast Apply(2025,商用 API)
- 7B 参数专用模型 + 定制 CUDA kernel + 262K 上下文窗口。
- 速度:10,500 tok/s(500 行文件约 0.8 秒完成合并);成本 $0.80/M input tokens〔Morph 产品页·volatile〕;自评准确率 98%。已被 JetBrains、Vercel、Webflow 采用。
- 对比:Claude Sonnet 直接输出约 80 tok/s,GPT 系列约 100 tok/s——专用模型快约 100×。
- (来源:Morph Fast Apply 产品页)
Relace Apply(2025)是同一赛道的竞争者,主打”A Year of Fast Apply”的持续迭代路线(来源:Relace 博文)。
[!note] 关键产品分解:为什么是”两段式” Fast Apply 把一次编辑分成”前沿模型出草稿 + 小模型做合并”两段。前沿模型(贵、慢、聪明)只负责”改成什么”这个高价值判断,且允许它偷懒——它可以写
// ... existing code ...占位;小模型(便宜、快、专精)负责把这个偷懒的草稿”展开”成完整正确的文件。这是一次教科书级的任务分解 + 模型分层(呼应 多模型分层),把不同认知负荷的子任务匹配给成本/速度/能力曲线不同的模型。PM 应该把它读成一个单元经济学决策,而不是一个炫技。
§3 判断主轴:90% 的人会在这四个点上搞错
这是本节点的命门。“生成对 ≠ 应用对”在实践中以四种方式咬人。
错位一:用 SWE-bench 分数选工具,却忽略 scaffold 里的编辑层
- 症状:选型会上比较”哪个模型 SWE-bench 高”,据此拍板工具。
- 为什么会错:SWE-bench 榜单测的是”模型 + scaffold”的联合体,不是纯模型。同一个模型,仅改变 agent scaffold(含编辑应用策略),SWE-bench Pro 分数可波动 22+ 个百分点(来源:particula.tech;arxiv.org/pdf/2506.17208)。编辑层是 scaffold 的核心组件之一。(SWE-bench 评测信任危机的系统拆解归属规划中的评测专题,本专题不展开。)
- 正确做法:把”模型分”与”工具的编辑应用质量”拆开评估。问供应商:你们用什么编辑格式?编辑失败时怎么 retry?有没有 apply 后的语法/诊断校验?
- 真实反例:一个 Verified 80.9% 的 Claude Opus 4.5,换到抗污染的 SWE-bench Pro 上只剩 45.9%(差 35 个百分点,来源:MorphLLM,2026-04)。分数崩塌的一部分正来自更难任务对编辑应用鲁棒性的更高要求——大改动、多文件,正是 whole-file 和 naive diff 最容易翻车的地方。
错位二:以为”模型懒”是模型的锅
- 症状:抱怨”模型又偷懒了,只给我
// 其余不变,把我代码删了”。 - 为什么会错:在两段式架构里,前沿模型输出占位符是设计预期,不是 bug——它本就该把”展开”交给 apply 层。文件被改烂,通常是 apply 层没接住(或根本没有 apply 层,直接把占位草稿当最终内容写盘)。
- 正确做法:区分”草稿格式”和”落盘内容”。判断一个工具是否有真正的编辑应用层,看它能否正确处理”带占位符的草稿”。
- 真实反例:一些早期套壳工具直接把模型输出(含
...)写入文件,导致函数体被省略号替换——这不是模型懒,是工具没有 apply 层。
错位三:把 whole-file rewrite 当”最安全”的选择
- 症状:“让模型重写整个文件最保险,不会漏改。”
- 为什么会错:大文件全量重写触发 lost-in-the-middle——模型在长输出的中段会静默丢失内容,且这种丢失没有报错,比 diff 失败更危险(diff 失败至少会报 apply error,而内容静默消失你可能到测试挂了才发现)。whole-file 准确率仅 60–75%,是四种格式最低。
- 正确做法:whole-file 只用于新建文件或极短文件;改动既有大文件用 search-replace 或 fast-apply。
- 真实反例:Chroma 的 Context Rot 研究(2025)显示,即便最先进模型,长上下文/长输出下准确率也非线性衰减;编码任务的极端案例里 Llama-3.1-8B 的 HumanEval 在 30K tokens 时从 57.3% 跌到 9.7%(来源:arXiv 2510.05381;Chroma Context Rot)。
错位四:把”应用快”误读为”只是体验糖”
- 症状:“apply 快 100× 又怎样,反正后台跑批不在乎那 0.8 秒。”
- 为什么会错:在交互式场景(IDE 里你盯着光标等代码出现),延迟直接决定心流是否被打断——哪怕 10% 的中断率,因非线性复利,总任务时间可能接近翻倍(来源:BNY Mellon + GitHub Copilot 研究,arXiv 2602.03593,2026-06)。这是 edit locality 作为”隐形产品力”的核心:用户感知不到”编辑应用层”的存在,但它的延迟和准确率,直接塑造了”这个工具好不好用”的整体判断。
- 正确做法:区分交互式(延迟敏感,fast-apply 价值高)与批处理/后台 agent(延迟不敏感,准确率与成本优先)两类场景分别选型。
- 真实反例:这也正是 §4 反方观点成立的边界——见下。
§4 对手框架回应:专用 Fast Apply 模型真的必要吗
业界反方立场(接受其合理内核):有一派工程观点认为,前沿模型(如 Claude Sonnet/GPT-5 系列)通过精细的 search/replace 提示工程,已能达到 84–96% 的实用应用精度;专用 7B 模型那”100× 速度优势”在延迟不敏感的批量/后台场景里并不构成决定性价值,反而引入额外的模型基础设施、供应商依赖和一个新的故障点。
我接受的部分:这个批评在两处是对的。其一,场景依赖——后台 agent 跑夜间批任务时,0.8 秒 vs 8 秒对总产出无差别,此时为速度引入专用模型是过度工程。其二,自评数字不可尽信——Morph 98%、Cursor、Relace 的高准确率全是厂商自评,缺乏独立第三方 benchmark;search/replace 的 84–96% 区间同样来自私有评测,横向不可比(争议点见接地简报)。
我坚持的边界与赌注:在交互式 IDE 这个 Cursor/Devin Desktop 主战场,延迟就是产品力,fast-apply 不是可选项。而且这条赛道的存在本身(Cursor 自研 speculative edits、Morph/Relace 做成独立 API 生意、JetBrains/Vercel 采购)已经证明了市场给它定了价。我赌的是:只要”人在环里盯着光标”的交互式编辑还是主流形态,专门化的编辑应用层就会持续存在并加深;一旦主流形态彻底转向”全异步后台 agent”(Background Agent / Agent Teams 方向),这条赌注的价值会下降——这是它明确的 failure scenario。
§5 产品 PM 视角补盲:用户心理模型、商业模式、合规
工程视角只看到”准确率和延迟”,PM 还要看到三个盲点。
- 用户心理模型(信任):编辑应用的失败是信任杀手且不对称。一次”把我代码改烂”的体验,需要十次成功才能挽回。fast-apply 的高准确率本质是在买信任的稳定性——它让”auto-accept”成为心理上可接受的选项(呼应 dx-trust:Claude Code 用户批准 93% 的权限请求,审查已沦为橡皮图章——前提是应用层值得信任)。edit locality 差的工具,用户会本能地拒绝放权,自主模式就推不动。
- 商业模式:Fast Apply 催生了一个 B2B2C 中间件市场——Morph/Relace 不直接面向开发者,而是把”编辑应用”作为 API 卖给做 agent 产品的公司(JetBrains/Vercel)。这是 m208 - AI 基础设施与中间件选型 意义上的典型中间件机会:一个被前沿模型”做不好又不想自己做”的窄能力,被专门化公司收编成基础设施。PM 的问题是:这层该自建还是采购?(Cursor 选择自建 speculative edits,因为它是核心体验;多数工具应该采购。)
- 合规边界:编辑应用涉及把代码送到第三方 apply API。对 Rick 关注的字节 TRAE 这类数据合规优先的国产工具,以及金融/政企客户,“代码不出域”是硬约束——这意味着 fast-apply 要么自研、要么私有化部署,采购外部 apply API 在这些场景里直接出局。这是国产工具与海外工具在编辑层架构上可能分叉的一个真实变量。
§6 跨域呼应:Polanyi 默会知识与”应用层的不可言说”
调度 Polanyi 默会知识与提示工程的认识论张力。Polanyi 的命题是”我们知道的比我们能说出来的多”(tacit knowledge)。编辑应用层是这个命题在工程上的精确镜像:一个熟练程序员”把改动落到正确位置”是高度默会的——他不会数行号,而是凭对代码结构的整体感知,瞬间定位”该改哪、改完上下文还对不对”。
这恰好解释了为什么 unified diff(显式行号,把默会的”定位”强行编码成可言说的坐标)对 LLM 是反人性的,而 search/replace(用”复述一段你认得的代码”来定位)更贴合模型从人类代码里习得的那种默会的、基于内容相似性的定位直觉。Fast apply 更进一步:它把”展开占位符、合并进上下文”这个最默会的动作,专门训练成一个小模型的隐式能力——你无法用提示词把它”说”清楚,只能用合成数据”练”出来。这是一个”默会知识无法靠 prompt 传授、只能靠专门训练内化”的强证据,反过来也警示:凡是试图用更详尽的 prompt 去逼前沿模型精确应用编辑的努力,本质是在用可言说的规则去逼近一个默会的能力,会撞到 Polanyi 张力的天花板。
§7 PM 决策启示:面试、选型、复现三类落地
- 面试:被问”如何评估一个 AI 编程工具的好坏”,别只说 SWE-bench。先抛出”生成对 ≠ 应用对”,再用四种编辑格式 + edit locality 这个框架,30 秒说清”为什么同一个模型在不同工具里体感天差地别”。这是一个能立刻把你和”只会背 benchmark 分数”的候选人区分开的判断。对字节 TRAE 方向,可追问:TRAE 作为 VS Code fork,其编辑应用层是自研还是依赖底层 IDE 的 apply 机制?这是一个可以体现你”看得比 feature list 深一层”的问题。
- 选型:把”编辑应用质量”列为独立评估维度,问三个问题——用什么编辑格式?apply 失败的 retry/校验机制?交互式延迟实测多少?对延迟敏感的交互式产品,fast-apply 能力是加分项;对后台批处理,准确率与成本优先。
- 复现:自己用 Aider(开源、纯 CLI)做实验时,Aider 默认用 search/replace block 编辑格式,可对照本节点的格式表观察 apply 失败的真实样子;想体验 fast-apply 可接 Morph API。Claude Code 用
str_replace工具——Rick 作为深度用户,可以留意它在大文件、跨多处改动时的 apply 行为(2025-12 v2.0.74 后 Claude Code 接入原生 LSP,每次编辑后自动诊断,这是”apply 后校验”的产品化)。
§8 与已有节点的关系
- 对照 c10 - Agent 技术栈与工具调用(深化 + 纠偏):c10 把”编辑文件”当成 Function Calling 的一种工具,停在”agent 能调用
str_replace/write_file”的 G3 截面。本节点不复述工具调用机制,而是钻进那个被 tool schema 抽象掉的内部——编辑格式的选择如何决定速度/成本/准确率/信任。纠偏点:c10 隐含”编辑就是调个工具”的简化,本节点指出编辑应用是一条独立演化的基础设施赛道。 - 对照 m207 - Agent 产品化:场景推演与失败模式(补缺):m207 讲 agent 的失败模式,本节点补上一类常被忽略的失败——编辑应用失败(改丢代码、占位符落盘、行号错位),它不是模型推理失败,而是落地环节失败,且因常静默发生而更隐蔽。
- 对照 m208 - AI 基础设施与中间件选型(对话):本节点提供了一个具体的中间件案例(Morph/Relace 的 fast-apply API),为 m208 的”自建 vs 采购”决策框架贡献一个真实样本。
- 对照本专题 A03 Codebase 理解机制·repo-map RAG-over-code LSP(互补):A03 解决”把正确的上下文喂给模型”(输入侧),本节点解决”把模型的输出无损落盘”(输出侧),二者共同构成 coding agent 的”输入-生成-输出”完整回路的两个端点。
§9 关联节点
核心(必读)
- c10 - Agent 技术栈与工具调用 — 编辑作为工具调用的基础视角,本节点的升级起点
- m208 - AI 基础设施与中间件选型 — fast-apply 作为中间件的自建/采购决策
- 多模型分层 — 两段式(前沿出草稿 + 小模型合并)的成本/能力分层本质
- Polanyi 默会知识与提示工程的认识论张力 — 应用层不可言说性的认识论根基
- Function Calling — 编辑工具的接口契约层
延伸(可选)
- m207 - Agent 产品化:场景推演与失败模式 — 编辑应用失败作为一类隐蔽失败模式
- Claude Code —
str_replace+ LSP 诊断的产品化实例 - Claude / Anthropic — 前沿模型在两段式中承担”出草稿”角色
- Agent — coding agent 输入-生成-输出回路的输出端
- 字节 TRAE 团队人物图谱 — 国产工具编辑层自研/合规分叉的观察对象
- AI PM 知识图谱·总索引 — 回主索引
修订日志
- R0(2026-06-07):首稿。建立”生成对 ≠ 应用对”判断主轴;四种编辑格式对照表;Cursor speculative edits 与 Morph/Relace fast-apply 接地;四点判断主轴四件套;对手框架回应(专用模型必要性争议 + 自评数字不可信边界);Polanyi 跨域呼应;c10/m207/m208 升级对照。待后续 grounding pass 复核 Morph/Cursor volatile 数字与 SWE-bench 分数日期口径。