Claude Opus 5 改长文档总在第三节跑偏,把约束分层写进系统提示再试

文章导读
改到第三节开始跑偏,通常不是模型改不动长文档,而是系统提示里的约束在中段没有被稳定执行:范围约束写得含糊、格式约束埋在自然语言里、禁区没有单独成句,三类约束挤在同一段话里,漏掉哪一条都看不出来。可以先做的判断是——把改动约束拆成范围、格式、禁区三层分别写进系统提示,再拿同一段原文跑两次对照,看越界改动的位置是否收窄。这个方法验证的是提示结构,不是模型能力上限;如果两次都在同一处跑偏,就要先怀疑上下
📋 目录
  1. A 在会话记录里定位跑偏发生的段落
  2. B 把改动约束拆成范围、格式、禁区三层写进系统提示
  3. C 用同一段落跑两次对照
  4. D 记录哪类约束仍然失效
A A

改到第三节开始跑偏,通常不是模型改不动长文档,而是系统提示里的约束在中段没有被稳定执行:范围约束写得含糊、格式约束埋在自然语言里、禁区没有单独成句,三类约束挤在同一段话里,漏掉哪一条都看不出来。可以先做的判断是——把改动约束拆成范围、格式、禁区三层分别写进系统提示,再拿同一段原文跑两次对照,看越界改动的位置是否收窄。这个方法验证的是提示结构,不是模型能力上限;如果两次都在同一处跑偏,就要先怀疑上下文被截断,或者任务本身给的信息不够。

长文档改到中段越界,先别急着换模型。从会话记录里截出第三节前后的输入与输出,标出越界改动落在哪几句;再把约束按范围、格式、禁区三层写进系统提示,用同一段落跑两次对照。分层的价值是让每类约束可以单独验证、失败时能定位到哪一层,而不是让模型改得更好。两次输出若在同一处仍然越界且输入片段完整,应转向补全任务描述,而不是继续堆提示词。

在会话记录里定位跑偏发生的段落

定位跑偏,先要有一份能对比的原始输出。建议在调用侧保存完整请求体与响应体,或者至少把系统提示、用户输入、模型返回三段分开落盘;只留一句“改得不对”的聊天记录,后面无法判断是约束没执行还是上下文被截断。落盘后按文档自身的层级切段,把第三节单独摘出来做 diff,越界改动会直接体现为第三节范围之外出现的新增行或删除行。

# 假设文档用标题分节,先各存一版原文与模型输出
sed -n '/^## 第三节/,/^## 第四节/p' draft.md > section3.before.md
sed -n '/^## 第三节/,/^## 第四节/p' model_output.md > section3.after.md
diff -u section3.before.md section3.after.md

# 再看第三节范围之外有没有改动
diff -u draft.md model_output.md | grep -E '^[+-]' | grep -v '^[+-][+-]'

读 diff 时重点看三件事:越界改动是出现在第三节标题之后(范围约束失效),还是出现在列表符号、加粗、编号上(格式约束失效),还是模型自行补了原文没有的事实或引用(禁区失效)。三种位置对应三种改法,混在一起改提示词很难判断有没有效果。另外要确认输入片段是完整的——如果日志里第三节被截断成半段,那越界属于上下文问题,调提示词没有意义,需要先改分节提交的方式。

Claude Opus 5 改长文档总在第三节跑偏,把约束分层写进系统提示再试

把改动约束拆成范围、格式、禁区三层写进系统提示

三层分开写的目的不是让提示更长,而是让每层有独立的判定位置。骨架里的花括号都是替换项,按实际文档结构和提交方式填;放在系统提示的最前面,用户消息只放原文和这次要改的句子。

# 角色
你在修改一份既有的长文档,只执行用户明确指出的改动。

# 第一层 范围约束
- 允许改动的段落:{段落标题 / 行号范围 / 用户引用的原句}
- 允许改动的幅度:{只改被指出的句子 / 允许重写整段}
- 范围外的段落原样返回,标点、换行、编号不变。

# 第二层 格式约束
- 输出结构:{返回全文 / 只返回改动段落 / 返回补丁}
- 保留原有标题层级、列表符号、代码块标记与缩进。
- 不新增小标题,不调整段落顺序。

# 第三层 禁区约束
- 不改变原意,不补充原文没有的事实、数据、引用。
- 不删除用户未要求删除的内容。
- 判断不了是否越界时停下来提问,不要自行决定。

# 执行顺序
先判断本次改动落在哪一层,再动笔;输出前逐条核对以上三层。

每层都要配一句可检查的判定语句,方便事后在输出里核对:范围层看“被改动的行是否全部落在用户引用的原句内”;格式层看“标题层级和列表符号与原文逐一对应”;禁区层看“输出里是否出现原文中不存在的名词、数字或引号内容”。判定语句写成能被 diff 或肉眼逐条打勾的形式,比“注意不要改错”这类叮嘱更好验证。

Claude Opus 5 改长文档总在第三节跑偏,把约束分层写进系统提示再试

用同一段落跑两次对照

对照实验的变量要压到一个:同一段原文、同一句修改指令、同一份文档位置。第一次用原来的提示,第二次只把系统提示换成三层骨架,其余不动。两次调用尽量连续发起,能调温度就固定同一个值,减少无关差异。

记录项第一次:原提示第二次:分层约束
输入段落第三节原文,含标题与列表同一份第三节原文
修改指令同一句,例如“把这句改得更简洁”同一句
提示差异约束混在一段自然语言里范围、格式、禁区分三段列出
改动落点逐行记录被改的句子,标出是否超出引用句同样逐行记录
越界位置记录越界发生在第几段、哪类内容同样记录
格式一致性列表符号、编号、粗体是否保留同样核对
人工返工量需回退或重写的句子数同样统计

记录成表之后,判断标准是看越界位置有没有从“第三节之后整段被重写”收敛到“引用句内部”,而不是看输出读起来顺不顺。如果第二次仍然在第三节范围内多改了几句,说明范围约束的幅度那一条没写死,可以把“只改被指出的句子”补成“引号内的原句之外一个字都不动”。

Claude Opus 5 改长文档总在第三节跑偏,把约束分层写进系统提示再试

记录哪类约束仍然失效

两次对照之后通常会发现,有的约束稳定了,有的照样失效。失效要分两类看:提示结构没写清楚,还是任务本身缺信息。前者可以通过改提示解决,后者只能回到任务描述里补。

约束类型常见表现触发条件判断方向
范围:改动幅度引用句之外顺带润色相邻句子文档段落之间语义强关联提示结构问题,把幅度写成“除引用句外不动”
格式:列表与编号长列表中途编号重排或符号变化列表跨越多个小节提示结构问题,要求输出后用 diff 核对格式行
禁区:不补事实输出出现原文没有的数字或引述原句本身信息不完整信息不足,需要先补上下文或允许提问
禁区:不删内容为“简洁”删掉限定条件修改指令只有风格要求、没有保留清单指令含糊,需要列出必须保留的关键词
范围:跨节引用改动引入前文未出现的术语第三节依赖第一节的定义,但输入只给了第三节信息不足,改为按节提交并附上必要前置段落

记录表填完再决定下一步:落在“提示结构”一列的问题,继续在系统提示里改措辞并重跑同一段落;落在“信息不足”一列的问题,加提示词作用有限,应该改成分节提交、附上前置段落,或者在提示里允许模型先提问再动笔。每次只改一层、只跑一次对照,才能把改动和结果对得上。