你给了模型 5 条规则:不超过 200 字、用第二人称、要有 CTA、不要感叹号、不要提竞品名。它交回来 180 字,第二人称,有 CTA,没感叹号,然后第三段轻飘飘地点了两家竞品的名字。你最在意的那条恰好被丢了。
最快修法:把”违反就不能交付”的那一条单独拎出来,放进 prompt 顶部的独立小节,再在 底部重申一遍,并加一行自检让模型引出”我遵守了”的证据。光这一步就能解决大多数情况。
为什么会这样:prompt 里规则太多时,模型把它们近似当成等权处理,并倾向于丢掉”与其他规则冲突的”或”埋在中段的”那条。这就是有据可查的”lost in the middle”(中段失焦)效应(Liu et al. 2023,截至 2026 年 6 月在长上下文评测里仍可测到):模型对 prompt 的开头和结尾注意力最高,埋在中段的某个事实或规则,准确率可能掉 30% 以上。由于这种位置偏置是 transformer 注意力机制的结构性产物,目前没有任何在产模型彻底消除它。所以修法不是把那条规则重复一遍喊大声,而是把它挪到高注意力位置、写成硬二元、并在输出里自检。
常见原因
按命中率排序。
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
- 不要感叹号
# 提醒
上面那条竞品名规则是唯一的硬性要求。回答前再核一遍。
硬规则现在同时位于顶部和底部,也就是模型注意力最高的两个位置。
2026 年有个细节要注意:结构比音量管用。让规则独立成块才是关键,喊大声并不顶用。新一代 Claude 模型(Sonnet 4.6、Opus 4.7)反而可能对 CRITICAL!、YOU MUST、NEVER EVER 过度反应、产出更差,所以措辞要平静直接,别全大写、别堆感叹号。一个朴素的 # 不可妥协约束 标题,效果好过一整片大写字母。
如果你用的是 Claude,把各小节用 XML 标签包起来(<constraints>、<task>、<style>),而不是 Markdown 标题。Anthropic 官方指南把 XML 标签当作分隔指令、上下文和约束的首选方式,Claude 对标签化小节的遵守度比纯散文更高。
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。重写,去掉任何竞品名。"
如果约束是关于格式的(必须含某字段、某枚举值、最大长度、合法 JSON),最强的护栏根本不是 prompt。用厂商的结构化输出模式,它在 token 层约束生成,模型根本无法吐出破坏 schema 的输出:
- OpenAI:Structured Outputs,开
strict: true并配json_schema响应格式。截至 2026 年 6 月,纯 JSON mode 已被视为遗留方案,因为它只保证 JSON 语法合法、不保证符合 schema;strictjson_schema才是生产默认。 - Anthropic / Google:用 tool-use / function calling 配
input_schema来约束格式,然后读取校验过的工具参数,而不是读自由文本。
还要记住指令层级(instruction hierarchy):写在 system(或 developer)prompt 里的规则,优先级高于同一条写在 user 消息里的。如果某条约束绝不能被覆盖,就放进 system prompt,模型被训练成给它比后续 user 轮次更高的权限。
Step 6:先解决冲突再生成
“热情”规则与”不要感叹号”规则冲突,就决定哪条赢、去掉另一条,或显式协调:"热情通过动词选用和具体数字体现,不靠标点或最高级。"
怎么确认已经修好
- 不可妥协约束在连续 5 次运行中都被满足。
- 模型末尾自检能正确判断规则是否被遵守。
- 同事不看 prompt、只读输出,找不到违反点。
- 程序化检查(如果加了)全部通过。
如果还是没修好
- 把 prompt 缩到最小:拎出来的那条约束 + 任务 + 1 个示例。再往上加。
- 换更强的模型。约束遵循受能力上限,前沿模型对长规则列表的遵守度远好过小/快模型。截至 2026 年 6 月,Claude Opus 4.7 和 GPT-5.5(Thinking)在多规则 prompt 上明显优于更便宜的同门(Sonnet 4.6、GPT-5.5 Instant);用 Gemini 就选 Gemini 3.1 Pro。
- 把约束写进 system prompt,或 ChatGPT 的 Custom GPT / Project 指令,或 Claude Project,而不是写在一次性的 user 消息里——这样它优先级更高、还能跨轮持续生效。
- prompt 过长就拆:一次调用专门生成,另一次专门校规则、不通过就重写。
- temperature 降到 0.3-0.5;高 temperature 会让约束更容易丢。(部分
Thinking/推理模式不吃 temperature 这个旋钮;这种情况就靠上面的结构性修法。)
预防建议
- 默认纪律:每个 prompt 最多一个
# 不可妥协块,里面 1 条规则。 - 反复用的工作流,把约束写进 system prompt,而不是 user 消息。
- 把”约束被丢”当成 prompt bug 去修,不要纵容成模型问题。
- 每次 prompt 改完,跑 3 次确认规则稳定。
- 维护一个常见不可妥协项清单(无 PII、无竞品名、无伪造数据)以备粘贴。
常见问题
为什么模型偏偏丢掉我最在意的那条,反倒留着无关紧要的? 它不是按重要性给规则排序,而是按位置和好不好满足来排。位于中段的规则、或比竞争规则更难满足的规则,最容易溜走。把关键规则挪到顶部和底部,并让它最容易遵守(写成硬二元),而不只是最被强调。
那我把规则全大写、加 “CRITICAL!!!” 行不行?
不行。2026 年的共识是结构比音量管用,而且喊大声可能适得其反:新一代 Claude 模型对 CRITICAL!、YOU MUST、NEVER EVER 会过度反应、产出更差。一个平静、清晰标注、放在高注意力位置的小节,比一堆大写字母更有效。
这是模型 bug 还是我的 prompt 问题? 几乎总是 prompt。约束被丢可以从位置偏置和规则冲突里预测出来,而且可复现。把它当成能靠结构修掉的 prompt bug,而不是干等模型变乖。
我的约束是格式规则(必须是 JSON、必须有某字段),最可靠的修法是什么?
别在散文里硬磕。用厂商的结构化输出模式:OpenAI 的 Structured Outputs 开 strict: true 配 json_schema,或在 Claude、Gemini 上用 tool-use 配 input_schema。它们在生成层约束,模型根本吐不出破坏 schema 的输出。
短对话里好好的,长对话就崩,为什么? 长会话会丢约束锚点。4 轮前立的规则,本轮请求时可能没被重新激活。在发出请求的那一轮重申规则,或把它挪进 system prompt / Project 让它持续生效。
怎么确认是真修好了、不是碰巧? 同一 prompt 跑 5 次,不可妥协约束必须 5 次全中。单次通过只是噪声——采样意味着一次干净输出也可能只是擦边没翻车。