文件编辑工具
文件编辑工具的核心难点是什么?
- 难点: 不在编辑操作本身,而在如何让 LLM 以高效又可靠的方式告诉系统“改哪里、怎么改”;
- 张力: 人类语言表达的灵活性与机器精确执行之间的根本矛盾;
- 五种方案: 差异描述 + Apply Model、旧字符串→新字符串、行号定位、类 Vim 编辑命令、字符串首尾匹配;
五种编辑方案各自怎么工作、代价是什么?
| 方案 | 机制 | 优势 | 代价 |
|---|---|---|---|
| 差异描述 + Apply Model | 主模型产出 diff 或带省略标记的代码骨架,由更小更快的“应用模型”与原文件合并 | 职责分离,主模型专注高层逻辑 | 合并环节脆弱:微小出入需判断是否同一位置,多个相似片段可能合并错位 |
| 旧字符串→新字符串 | 提供 old string 与 new string,框架做字符串查找替换 | 可预测、透明;old string 存在且唯一则成功,否则失败,无模棱两可 | 删大段代码需完整输出原文,一个字符偏差就失败;重复片段需更长上下文消歧 |
| 行号定位 | 指定“删除第 X 到 Y 行,插入新内容” | 精确无歧义,大段删除只需首尾两个数字 | 每次编辑后行号变化;一次输出多处编辑时须统一使用初始行号 |
| 类 Vim 编辑命令 | 借鉴 Vim 的复制、剪切、粘贴等命令 | 重组代码(函数搬家)高效 | 语法学习负担大,小模型错误率上升;一次输出多命令不友好,模型难预判编辑后的行号 |
| 字符串首尾匹配 | 只给删除区域的开头几行与结尾几行,框架按首尾定位替换区 | 兼顾文本替换的可靠性与行号方案的效率;大段删除只展示边界 | 需保证“首尾”组合在文件中唯一 |
- 现状: 旧字符串→新字符串是 Claude Code、Codex 与今天 Cursor 采用的方案;
- 路线变迁: Cursor 曾是差异描述 + Apply Model 的代表,后因基础模型能力提升不再使用该路线;
为什么为人类设计的 Vim 式命令不适合模型?
- 人类模式: 需要不断看到当前状态,并规划下一步的简单操作——写一行,或删几行;
- 模型模式: 经过较长时间思考,再批量进行较复杂的操作——例如一次写几百行代码;
- 推论: 要求模型提前计算多步编辑后的行号,与它的工作模式根本错位;