AI 漏掉了最重要的那条约束:4 个原因 + 对症修复

你列了 5 条规则,模型守了 4 条,偷偷扔掉了真正最关键的那条。

你给了模型 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、无竞品名、无伪造数据)以备粘贴。

相关阅读

标签: #排查 #Prompt #Prompt 质量 #Prompt 工程