改到第三节开始跑偏,通常不是模型改不动长文档,而是系统提示里的约束在中段没有被稳定执行:范围约束写得含糊、格式约束埋在自然语言里、禁区没有单独成句,三类约束挤在同一段话里,漏掉哪一条都看不出来。可以先做的判断是——把改动约束拆成范围、格式、禁区三层分别写进系统提示,再拿同一段原文跑两次对照,看越界改动的位置是否收窄。这个方法验证的是提示结构,不是模型能力上限;如果两次都在同一处跑偏,就要先怀疑上下文被截断,或者任务本身给的信息不够。
长文档改到中段越界,先别急着换模型。从会话记录里截出第三节前后的输入与输出,标出越界改动落在哪几句;再把约束按范围、格式、禁区三层写进系统提示,用同一段落跑两次对照。分层的价值是让每类约束可以单独验证、失败时能定位到哪一层,而不是让模型改得更好。两次输出若在同一处仍然越界且输入片段完整,应转向补全任务描述,而不是继续堆提示词。
在会话记录里定位跑偏发生的段落
定位跑偏,先要有一份能对比的原始输出。建议在调用侧保存完整请求体与响应体,或者至少把系统提示、用户输入、模型返回三段分开落盘;只留一句“改得不对”的聊天记录,后面无法判断是约束没执行还是上下文被截断。落盘后按文档自身的层级切段,把第三节单独摘出来做 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 时重点看三件事:越界改动是出现在第三节标题之后(范围约束失效),还是出现在列表符号、加粗、编号上(格式约束失效),还是模型自行补了原文没有的事实或引用(禁区失效)。三种位置对应三种改法,混在一起改提示词很难判断有没有效果。另外要确认输入片段是完整的——如果日志里第三节被截断成半段,那越界属于上下文问题,调提示词没有意义,需要先改分节提交的方式。
把改动约束拆成范围、格式、禁区三层写进系统提示
三层分开写的目的不是让提示更长,而是让每层有独立的判定位置。骨架里的花括号都是替换项,按实际文档结构和提交方式填;放在系统提示的最前面,用户消息只放原文和这次要改的句子。
# 角色
你在修改一份既有的长文档,只执行用户明确指出的改动。
# 第一层 范围约束
- 允许改动的段落:{段落标题 / 行号范围 / 用户引用的原句}
- 允许改动的幅度:{只改被指出的句子 / 允许重写整段}
- 范围外的段落原样返回,标点、换行、编号不变。
# 第二层 格式约束
- 输出结构:{返回全文 / 只返回改动段落 / 返回补丁}
- 保留原有标题层级、列表符号、代码块标记与缩进。
- 不新增小标题,不调整段落顺序。
# 第三层 禁区约束
- 不改变原意,不补充原文没有的事实、数据、引用。
- 不删除用户未要求删除的内容。
- 判断不了是否越界时停下来提问,不要自行决定。
# 执行顺序
先判断本次改动落在哪一层,再动笔;输出前逐条核对以上三层。
每层都要配一句可检查的判定语句,方便事后在输出里核对:范围层看“被改动的行是否全部落在用户引用的原句内”;格式层看“标题层级和列表符号与原文逐一对应”;禁区层看“输出里是否出现原文中不存在的名词、数字或引号内容”。判定语句写成能被 diff 或肉眼逐条打勾的形式,比“注意不要改错”这类叮嘱更好验证。
用同一段落跑两次对照
对照实验的变量要压到一个:同一段原文、同一句修改指令、同一份文档位置。第一次用原来的提示,第二次只把系统提示换成三层骨架,其余不动。两次调用尽量连续发起,能调温度就固定同一个值,减少无关差异。
| 记录项 | 第一次:原提示 | 第二次:分层约束 |
|---|---|---|
| 输入段落 | 第三节原文,含标题与列表 | 同一份第三节原文 |
| 修改指令 | 同一句,例如“把这句改得更简洁” | 同一句 |
| 提示差异 | 约束混在一段自然语言里 | 范围、格式、禁区分三段列出 |
| 改动落点 | 逐行记录被改的句子,标出是否超出引用句 | 同样逐行记录 |
| 越界位置 | 记录越界发生在第几段、哪类内容 | 同样记录 |
| 格式一致性 | 列表符号、编号、粗体是否保留 | 同样核对 |
| 人工返工量 | 需回退或重写的句子数 | 同样统计 |
记录成表之后,判断标准是看越界位置有没有从“第三节之后整段被重写”收敛到“引用句内部”,而不是看输出读起来顺不顺。如果第二次仍然在第三节范围内多改了几句,说明范围约束的幅度那一条没写死,可以把“只改被指出的句子”补成“引号内的原句之外一个字都不动”。
记录哪类约束仍然失效
两次对照之后通常会发现,有的约束稳定了,有的照样失效。失效要分两类看:提示结构没写清楚,还是任务本身缺信息。前者可以通过改提示解决,后者只能回到任务描述里补。
| 约束类型 | 常见表现 | 触发条件 | 判断方向 |
|---|---|---|---|
| 范围:改动幅度 | 引用句之外顺带润色相邻句子 | 文档段落之间语义强关联 | 提示结构问题,把幅度写成“除引用句外不动” |
| 格式:列表与编号 | 长列表中途编号重排或符号变化 | 列表跨越多个小节 | 提示结构问题,要求输出后用 diff 核对格式行 |
| 禁区:不补事实 | 输出出现原文没有的数字或引述 | 原句本身信息不完整 | 信息不足,需要先补上下文或允许提问 |
| 禁区:不删内容 | 为“简洁”删掉限定条件 | 修改指令只有风格要求、没有保留清单 | 指令含糊,需要列出必须保留的关键词 |
| 范围:跨节引用 | 改动引入前文未出现的术语 | 第三节依赖第一节的定义,但输入只给了第三节 | 信息不足,改为按节提交并附上必要前置段落 |
记录表填完再决定下一步:落在“提示结构”一列的问题,继续在系统提示里改措辞并重跑同一段落;落在“信息不足”一列的问题,加提示词作用有限,应该改成分节提交、附上前置段落,或者在提示里允许模型先提问再动笔。每次只改一层、只跑一次对照,才能把改动和结果对得上。