只要轻改,AI 却大改特改:如何逼它做最小改动

让它"润色一下",结果换了一篇文章,语气全丢了。本文教你把 ChatGPT、Claude、Gemini 约束成手术级、逐字节最小的编辑。

你写了一封 200 字的邮件,90% 满意,让模型”把第二段紧凑一下,顺便改掉拗口的地方”。回来一封 230 字的邮件,无可否认更顺,但已经不是你的了。第一句被重写,第四句的梗丢了,第二段从四句变三句,你专门用的 buggy 被换成了”间歇性故障”。你没要这些。

最快的修法:别再让它把整段返回。把唯一要改的部分用方括号圈出来,加一句保留规则,再要它输出”修订标记”而不是重写。一行就能解决大半:

Edit ONLY the text inside [[ ]]. Return everything else byte-identical.
Show changes as CriticMarkup: {--deleted--}{++added++}. Do not rewrite anything I did not flag.

模型过度编辑,是因为它把”改掉拗口的地方”解读成”凡是它觉得不够好的都可以改”,而它觉得不够好的几乎是全部。经过 RLHF 调过的聊天模型,被奖励去产出一份”完整、打磨过”的回答,所以你把整篇文档丢给它,它就会重新生成整篇文档,而重新生成必然漂移。下文讲清楚为什么会这样,以及把模型钉死在真正 diff 上的具体 prompt 和工具(ChatGPT Canvas、Claude、Gemini)。

你属于哪一类

把你看到的现象对到最可能的原因,直接跳到对应步骤。

你观察到的现象最可能的原因去看
整篇文档都返回了,连没动的段落也在你要的是完整文本,不是 diffStep 3
你特意挑的词被换成了近义词没声明”不许动”清单Step 2
句数/段数变了没锁结构,也没配额Step 5-6
输出像换了个更”官腔”的人写的system prompt 或自定义指令在拉平语气Step 7
在聊天里改得好,在 app 文档视图里却不听你没用”按选区”编辑Step 4
加了约束还是什么都重写动词仍然开放;该换工具了Step 1、“如果还是没修好”

常见原因

1. 动词范围开放

“润色”、“改进”、“紧凑”、“编辑”——这些都是无界的。它们暗示”能改的地方都改”,模型听话。

如何判断:你的动词没有约束对象。“润色” vs “只润色方括号里标注的句子”——前者开放,后者受限。

2. 没声明”不许动”的范围

如果你只说要改什么,你就没说要保留什么。RLHF 让模型偏好”完整产出”,所以它什么都动。

如何判断:你的 prompt 写了要改什么,但没列出哪些必须 byte 级保留。

3. 输出格式是”完整文本”而不是 diff

你让它把整段返回,它就得生成每一句——包括不该动的——重新生成就引入漂移。要 diff 才能强制最小改动。

如何判断:你要的是完整新版,不是改动列表也不是 unified diff。

4. 模型以为它在协作,不知道被约束

默认聊天人格是”乐于助人的助手”。乐于助人的助手会”主动改进”。你没明说”别碰”,“乐于助人”就过火。

如何判断:有些地方确实改好了,但你没要那些改动。

5. system prompt 里装了风格模板

如果你有个”专业写作”system prompt,它会按那个模板理解编辑任务——把语气往模板拉,而不是往你的原文拉。

如何判断:改后语气像你的 system prompt 风格,不像你的原稿。

动手前先确认

  • 保存原文和被过度编辑的输出,方便 diff。
  • 标清楚你想保留的具体词/句。
  • 同一 prompt 换一个模型试一下——确认不是某个模型独有的行为。
  • 检查 system prompt 或 project 指令是不是在偏向”大改”。
  • 再次 prompt 之前先想清楚:你想要 diff、tracked-changes 列表、还是有约束的完整新版?

需要收集的信息

  • 原文,逐字节准确。
  • 你用的 prompt。
  • 你得到的输出。
  • 想保留不动的句子/词清单。
  • 模型、temperature、system prompt 或 project 上下文。

最短修复路径

Step 1:开放动词换成有界操作

不要说”润色”,给手术级指令:

差:  "润色这封邮件。"
好:  "只改第二段的第 3 句。其他句子 byte 级保持。返回完整邮件,
       只有那一句变了,并另起一行写:'已改:<旧> -> <新>'。"

Step 2:声明”不许动”清单

加显式保留条款:

保留规则:
- 不要重写任何我没明确标出的句子。
- 以下词原样保留:"buggy"、"老实说"、"上线"。
- 段落分隔保持现状。
- 我的口语缩略("don't"、"咱")保留。
- 句子可以不改的就 byte 级返回。

Step 3:把输出改成修订标记(CriticMarkup),别要重写

要 Git 那种 unified diff 对代码管用,但对散文不靠谱:模型经常把 @@ 这种 hunk 头和行号搞错。改文字就用 CriticMarkup——一套纯文本的”修订标记”语法,当前的模型能照着做,而且你能逐条审。你需要的四个标记:

{++ 插入的文字 ++}
{-- 删除的文字 --}
{~~ 旧文字 ~> 新文字 ~~}   (替换)
{>> 编辑批注 <<}            (只是注释,不算改动)

于是 prompt 变成:

返回我的原文,除了你的编辑,其余原样不动;编辑用 CriticMarkup 标出:
- 新增写成 {++ ... ++}
- 删除写成 {-- ... --}
- 替换写成 {~~ 旧 ~> 新 ~~}
不要输出干净的重写版。任何你没标记的句子都不要碰。
某句没问题就不加任何标记,原样留着。

这样”最小改动”就成了默认,因为每处编辑现在都得带可见的标记,而且你可以逐条接受或拒绝。Obsidian、VS Code、MultiMarkdown 都能原生渲染 CriticMarkup,方便在编辑器里审;不想用工具,直接当纯文本读也清楚。

Step 4:用 app 自带的”按选区”编辑器(最稳)

最可靠的一招是:根本别把整篇文档粘进聊天。用一个能把编辑范围锁到”选区”的文档界面:

  • ChatGPT Canvas(截至 2026 年 6 月,付费档位有,包括 Plus 和 Pro;具体是否覆盖你的套餐以账户为准):输入 “open in canvas” 或在工具菜单里选 Canvas,然后只高亮你要改的那一段。弹出的就地编辑框只重写高亮的文字并原位替换,文档其余部分根本不会被重新生成,所以不会漂移。这彻底避开了”重新生成幻觉”。
  • Claude:Artifacts 会把所在的整块重新生成,所以散文要做逐字节最小编辑,更建议用下面的”粘贴并约束”prompt(方括号编辑区 + CriticMarkup)。改代码时,Claude 的编辑器工具确实是做定点替换而非整段重写。
  • Gemini(Canvas):和 ChatGPT 类似,支持对选区做高亮即改。

如果你只能待在纯聊天里,就把唯一要改的部分用方括号圈出来:

邮件如下。只改 [[ ]] 内的文字。其他全部原样保留,包括标点、
换行、大小写。

团队:

简单同步发布进度。[[第二段讲时间线,目前拗口,请紧凑。]]
有问题明天对齐。

方括号加 CriticMarkup 输出,是纯聊天里最稳的组合。

Step 5:给编辑配额

总改动量封顶:

约束:
- 每段最多改 1 句。
- 净字数变化 ±10 字以内。
- 原文里有的具体名词不许删。

配额逼模型挑重点。

Step 6:只改语气时锁住结构

要语气改、内容不改:

只改语气。保留句数、段数、所有事实陈述。每句最多换 1 个词。
如果某句不需要语气调整,原样返回。

Step 7:压制会拉平语气的 system prompt

如果输出总是像换了个更”官腔”的人写的,问题通常出在某条保存下来的风格指令,而不是你这次的编辑 prompt。逐一检查:

  • ChatGPT:Settings -> Personalization -> Custom instructions;如果你在某个 Project 里,还要看 Project 级指令。
  • Claude:账号的 personal preferences / styles,以及 Project 自定义指令。
  • API / 你自己的 app:你代码里发出的 system prompt。

要么在做编辑任务时清掉风格,要么在这一轮里就地覆盖:

For this turn, ignore any saved style or tone instructions. Match the
voice of the text I pasted, not any default writing style. Preserve my
word choices and contractions exactly.

怎么确认已经修好

  • 如果用了 CriticMarkup,每处改动都以 {++...++} / {--...--} 可见;扫一遍标记,逐条接受或拒绝。编辑区外没有任何标记,就说明别的地方都没动。
  • 用编辑器,或 diff -u original.txt revised.txt 比对原文和新输出;改动只应在你声明的编辑区内。
  • 编辑区外的句子 byte 级一致。
  • 字数变化在配额内。
  • 语气还是你的:把新版本读出声核对,确认你想保留的那几个词还在。

如果还是没修好

  1. 模型可能对约束就是不敏感。Thinking/推理模型通常更死板地照编辑约束执行,但它也更爱”主动改进”;如果你这个一直在重写,就换成另一种模式试试。
  2. 换成”按选区”编辑(ChatGPT Canvas / Gemini Canvas),让模型根本看不到、也无法重新生成文档其余部分。
  3. 长文档逐段独立改,自己拼回去。
  4. 如果是 system prompt 或自定义指令在拉偏语气,按 Step 7 给本次会话清掉,别每轮都去硬抗。
  5. 把温度调低。如果你能控制(API 或 playground),temperature: 0 能减少编辑任务里那些多余的改词。

预防建议

  • 存一份个人”最小改动 prompt 模板”,保留规则和 diff 输出都内置。
  • 编辑动词永远不要用”润色”或”改进”。一定说手术级操作。
  • 协作编辑永远要求 diff 输出。审完你自己再合成完整文本。
  • 高风险编辑(法律、代码、品牌文案)一定用方括号标注编辑区。
  • 养成习惯:每个编辑 prompt 之前先声明”不许动”清单。
  • 语气重要时贴 2-3 句你自己的原文作为语气锚。

常见问题

为什么它会重写我根本没让它碰的句子? 聊天模型被调成要返回一份”完整、打磨过”的答案。你把整篇文档粘进去,“完整”就意味着重新生成每一句,而重新生成会漂移。解法是去掉”重新生成”这一步:要它输出 CriticMarkup 修订标记(Step 3),或用”按选区”编辑器(Step 4),让没改的文字根本不被再生成一遍。

最有效的一条防过度编辑的 prompt 是什么? “Edit ONLY the text inside [[ ]]. Return everything else byte-identical. Show changes as CriticMarkup {--deleted--}{++added++}. Do not rewrite anything I did not flag.” 方括号锁定编辑范围,CriticMarkup 让每处改动都可见、可拒。

ChatGPT Canvas 真的只改高亮的那部分吗? 是的。在 Canvas 里高亮一段,就地编辑只作用于这段选区;其余部分被原样留着,而不是重新生成,所以不会漂移。截至 2026 年 6 月,Canvas 在付费档位(包括 Plus 和 Pro)可用;具体是否覆盖你的套餐以账户为准。

为什么 Claude 老是把我整篇文档重新生成? Claude 的 Artifacts 设计上就会把所在的整块重新生成,所以散文要做逐字节最小编辑,把文字粘进普通聊天、配合方括号编辑区和 CriticMarkup 输出,效果更好。改代码时,Claude 的编辑器工具确实是做定点替换。

它把我精确的用词换成了近义词,怎么治? 把要冻结的词列出来,并要求 byte 级原样返回:Keep these words unchanged: "buggy", "shipped", "honestly". If a sentence does not need a flagged change, return it byte-identical. 再配上 CriticMarkup,任何换词都会显示成可见标记,你可以拒掉。

在 API 里改得干净,在 app 里却过度编辑(或反过来),为什么? app 可能带着一条 API 调用没有的自定义指令或风格,或者 app 默认用了不同的模型/模式。检查自定义指令(Step 7),并确认两边用的是同一个模型和同样的温度。

相关阅读

标签: #排查 #Prompt #Prompt 质量 #误改重写