你给了模型 5 条规则:不超过 200 字、用第二人称、要有 CTA、不要感叹号、不要提竞品名。它交回来 180 字,第二人称,有 CTA,没感叹号——然后第三段轻飘飘地点了两家竞品的名字。你最在意的那条恰好被丢了。这是常见的”约束塌方”:当 prompt 里规则太多,模型把它们近似当成等权处理,并把”与其他规则冲突的”或”埋在中段的”那条悄悄丢掉。修法不是把那条规则重复一遍喊大声,而是把它提到独立顶部块、写成硬二元、并在输出里自检。
常见原因
按命中率排序。
1. 关键约束埋在 prompt 中段
你写了 400 字的 brief,关键规则在第 3 段。模型对长 prompt 的开头和结尾注意力高,中段是规则悄悄死掉的地方。
如何判断:打开 prompt 定位被丢掉的约束。如果它在过半位置、又没有独立小节标签,那就是原因。
2. 这条约束与另一条冲突
规则 A:"语气要热情有活力";规则 B:"不要感叹号、不要最高级形容词"。模型挑一个去做,另一个就悄悄违反——通常它会挑就近更好满足的那条。
如何判断:把规则列出来,看是否有两条互相拉扯。被丢的常常是那对中”更难满足”的一半。
3. 软措辞让规则变可选
"尽量不要提竞品" 读起来像偏好。"不得出现以下名字:X、Y、Z" 读起来像规则。软措辞换来软遵守。
如何判断:回看约束。尽量、最好、理想情况下、如果可能 都是”可商量”的信号。
4. 长上下文把约束挤出注意力
6k token 的 system prompt,第 8 行的规则要和后面 200 行竞争。等到生成时,规则可能已经滚出高注意力区。
如何判断:prompt 很长,被丢的规则不在前 500 / 后 500 字符里。
5. 规则在另一轮,不在当前请求那轮
你 4 轮之前说过 "始终用第二人称",现在说 "写一封跟进邮件",规则可能没有被重新激活。长会话会丢约束锚点。
如何判断:往上翻。约束是在另一轮立的,本轮请求时没重申。
6. 规则是否定的,但示例里恰好出现了被禁的行为
"不要包含法务免责声明",紧接 "示例:<底部带免责声明的示例>"。模型常常模仿示例形态,忽略否定。
如何判断:检查 prompt 里的示例或参考文档是否违反了你立的规则。
动手前先确认
- 确认哪条约束被丢了、并且它真的写进了 prompt。
- 记下完整 prompt、模型、以及之前立过规则的轮次。
- 把错误输出原样保存——把违反规则的行引出来。
- 记下其他哪些约束被满足了,以排查冲突。
- 同一 prompt 跑多次看是否每次都丢同一条(确定性 vs 采样)。
需要收集的信息
- 完整 prompt 和 system prompt。
- 规则清单按出现顺序排好,附原文措辞。
- 违反规则的输出,并标出违反点。
- 模型、temperature、tool-use 设置。
- 任何可能暗中削弱该规则的示例或参考文档。
最短修复路径
按收益排序。
Step 1:识别”那一条不可妥协的约束”
N 条规则里,挑出”违反就不能交付”的那 1 条。其他都次要。如果挑不出来,说明 prompt 优先级本身就乱,那也是病根。
Step 2:提到独立顶部块
重组 prompt:
# 不可妥协
不得提及以下竞品名:Acme Corp、BetaCo、Gamma Inc。
若有冲动提到任何一个,用 [REDACTED] 代替。
# 任务
<实际任务>
# 风格规则
- 不超过 200 字
- 第二人称
- 含 CTA
- 不要感叹号
硬规则独立成块、置顶、大写或加粗。
Step 3:用二元硬措辞,不用软措辞
| 软(容易丢) | 硬(不易丢) |
|---|---|
"尽量别提 X" | "任何情况下都不得包含 X" |
"最好 200 字以内" | "输出必须在 180-200 字;超出就重写" |
"优先第二人称" | "只用'你''你的';不得用'我们''我''他们'" |
"保持专业" | "不要俚语、emoji、口语缩写或感叹号" |
Step 4:加输出自检
prompt 末尾:
收尾前请逐条核对:
1. 是否提到了 Acme、BetaCo、Gamma?(是/否)
2. 引出一行证明你遵守了规则 1。
任意一条不通过,重写输出并重新核对。
自检逼模型回读自己的输出,对照规则。
Step 5:Agent 系统加程序化护栏
自动化场景别只靠 prompt。生成后做正则/关键词检查:
banned = ["Acme Corp", "BetaCo", "Gamma Inc"]
if any(b.lower() in output.lower() for b in banned):
raise ConstraintViolation("竞品名出现")
违反就带着违反点重试 prompt:"上次输出第 4 行提到了 BetaCo。重写,去掉任何竞品名。"
Step 6:先解决冲突再生成
“热情”规则与”不要感叹号”规则冲突,就决定哪条赢、去掉另一条,或显式协调:"热情通过动词选用和具体数字体现,不靠标点或最高级。"
怎么确认已经修好
- 不可妥协约束在连续 5 次运行中都被满足。
- 模型末尾自检能正确判断规则是否被遵守。
- 同事不看 prompt、只读输出,找不到违反点。
- 程序化检查(如果加了)全部通过。
如果还是没修好
- 把 prompt 缩到最小:hoist 的那条约束 + 任务 + 1 个示例。再往上加。
- 换更强模型——约束遵循受能力上限。
- 把约束写进 system prompt 或 Custom GPT / Project 指令,不要写在 user message。
- prompt 过长就拆——一次调用专门校规则,另一次专门生成。
- temperature 降到 0.3-0.5;高 temperature 会让约束更容易丢。
预防建议
- 默认纪律:每个 prompt 最多一个
# 不可妥协块,里面 1 条规则。 - 反复用的工作流,把约束写进 system prompt,而不是 user 消息。
- 把”约束被丢”当成 prompt bug 去修,不要纵容成模型问题。
- 每次 prompt 改完,跑 3 次确认规则稳定。
- 维护一个常见不可妥协项清单(无 PII、无竞品名、无伪造数据)以备粘贴。