相互矛盾的指令削弱 AI 输出:5 个原因 + 对症修复

Prompt 里两条规则互相打架,模型只能折中,结果谁都不满意。给约束排序,告诉它该放弃哪条。

你写了 prompt 里两条都很合理的规则:“简洁” + “覆盖所有边界情况”。模型给你的既不简洁(列了 6 个边界),也不完整(恰好漏掉最关键那个)。去掉”简洁”,答案真的全面;去掉”覆盖所有边界”,答案真的精炼。单独一条都管用,合在一起就互抵。这就是约束打架:模型没法同时最大化两个,于是折中,而折中就平庸。

最快修复: 找出打架的那一对,用文字明确宣布谁赢,把赢家放进 prompt 顶部的 NON-NEGOTIABLE(非协商)块,把输家降级到 PREFERENCES (drop if conflict)(冲突就放弃的偏好)。两家厂商现在都确认这是解决矛盾的正确做法:Anthropic 的指南说要”在 prompt 之前先消除矛盾,或显式给一条优先级(例如 ‘Provide detail, but if in doubt, favor brevity’)“;OpenAI 的 Model Spec 则按来源给指令排序,让模型知道谁压过谁。下文讲怎么找出隐藏的打架、怎么排序。

为什么会折中(以及为什么位置很关键)

两个原因在起作用,都已在 2026 年 6 月核实:

  • 没有裁决依据。 两条规则权重相等时,模型没有可依据的取舍标准,只能各打五十大板。约束式 prompt 之所以有效,就是因为排序给了它一个裁决依据。
  • 位置偏置。 模型会更看重 prompt 的开头和结尾,忽略中间(即”lost in the middle”效应,生产模型至今未解决)。关于指令遵循的研究显示:单轮 prompt 有首因偏置(第一条指令更容易赢),而多轮来回修改则有近因偏置(你最后说的那句赢)。所以同样两条规则,放的位置不同、是新一轮还是长对话里,结果都可能不一样。这也是为什么埋在 prompt 中段的矛盾最危险:既被忽略,又不可预测。

你遇到的是哪种打架?

输出里的症状可能的冲突修复
又长又啰嗦,却还不完整简洁 vs 全面排一个赢家;把输家换成数字
合法 JSON/表格,但语气平板、机械风格 vs 格式格式赢;删掉语气形容词
一句话答案、不展示任何推理推理 vs 长度拆成两步,或放宽上限
千篇一律的”商务腔”两个形容词用”但”/“又”连接只留一个形容词
ChatGPT 里和项目/API 里表现不同message 内规则 vs system/developer 规则对齐它们;来源更高者赢

常见原因

1. 软形容词 vs 硬规则

“简洁”(软) vs “包含全部 7 个字段”(硬)。硬规则赢,“简洁”被牺牲,但模型还在试着兼顾——结果既不短也不结构化。

如何判断:一条可数、另一条凭口味。

2. 风格 vs 格式

“温暖口语” + “严格 JSON”——JSON 没地方装温暖。模型选一个,通常选格式。你拿到的是平板 JSON,字符串里硬塞拗口字眼。

如何判断:格式约束是结构(JSON、表、schema),风格约束是语气(温暖、友好、有说服力)。

3. 推理 vs 长度

“逐步展示思考” + “一句话回答”——数学上相反。模型一般选短的,把推理藏起来。

如何判断:同时出现长度上限和 chain-of-thought 要求。

4. 语气目标冲突

“正式但俏皮”、“专家但易懂”、“权威但谦逊”——这些本就是张力,不是组合。模型平均到”商务腔”。

如何判断:两个形容词用”但”或”又”连接。

5. 来自 system / developer prompt 的隐式冲突

你的 user message 写”口语化”,但某个 system prompt(或 Custom Instructions / 项目设置)写”用正式英语”。模型听更高一级的来源、忽略你 message 里的规则,而你光看 message 看不出为什么。

这已经不用靠猜了。OpenAI 的 Model Spec 定义了明确的指挥链(chain of command),从高到低:

Root  >  System  >  Developer  >  User  >  Guideline  >  Tool/被引用文本

User 和 developer message 同等对待,“除非两者同时出现在一次对话里,此时 developer message 拥有更高权限”。所以一条项目指令、或 API 里的 system/developer message,会悄悄压过你在聊天框里敲的内容。Anthropic 的 Claude 思路一致:更清晰、上下文更高的指令赢,并要求你自己消除矛盾、而不是让模型去猜。

如何判断:同一 prompt 换平台、换项目、换 Custom GPT、换 API 角色跑,行为不一样。

动手前先确认

  • 把完整 prompt 打印出来,含 system prompt、developer message、项目/Custom Instructions。
  • 把每条约束一行一条列清楚。
  • 每两两对照:“打架时谁赢?”
  • 试着去掉一条约束,看冲突是不是瓶颈。
  • 重新 prompt 之前先定好优先级。

需要收集的信息

  • system prompt、developer message、项目设置、user message 里所有约束。
  • 你得到的输出,以及它满足了哪条、忽略了哪条。
  • 一次去掉某条约束的实验——质量上去了吗?
  • 模型、temperature、平台(聊天界面 vs API vs 项目)。
  • 冲突是数学性的(长度 vs 细节)还是解读性的(语气)。

最短修复路径

Step 1:把所有约束列在一张纸上

让它们全可见。常常你写了 8 条规则,却忘了有 3 条在拽另外 5 条。把从 system/developer 层继承来的约束也算进去,不只是你 message 里的。

Step 2:配对排序

每对打架的,宣布一个赢家:

简洁 vs 全面        -> 全面赢。砍掉长度上限。
温暖语气 vs JSON 输出 -> JSON 赢。本 prompt 删掉"温暖"。
展示推理 vs 一句话   -> 推理赢。长度改成"最多 5 句"。
正式 vs 俏皮        -> 选一个。(两个都要不可能。)

Step 3:把赢家挪到”非协商”块

放在 prompt 顶部(放顶部还能躲开 lost-in-the-middle 效应):

NON-NEGOTIABLE(非协商):
1. 输出必须是符合 schema X 的合法 JSON。
2. 7 个必填字段全在。
3. 事实陈述必须给来源。

PREFERENCES(偏好,与上述冲突就放弃):
- 字段描述尽量短。
- 描述字符串用日常语言。

模型对排序约束的服从远好于平权约束。如果你走 API,把非协商项往上推到 systemdeveloper 角色——按指挥链,它们压过 user 轮。

Step 4:形容词翻成可测规则

保留形容词时让它可测,避免静默冲突:

差:  "简洁。"
好:  "全文 150 字以内。"

差:  "温暖。"
好:  "至少出现 2 次'我们'。避免用'个体'。"

Step 5:用故意冲突的输入测

喂一个约束明显打架的输入。如果模型还在硬凑全满足,说明排序没落地。再 prompt 时把优先级写更死,并加上 Anthropic 式的裁决句:“必须二选一时,优先 X 而非 Y。“

Step 6:拆成两步处理

两条约束真的不能共存时,把流程拆开:

Pass 1:生成完整全面的答案。无长度限制。
Pass 2:把 Pass 1 的输出压到 150 字以内。事实全部保留。

这把冲突分解成可顺序满足的子任务。对”完整推理 + 一句话”这种数学上不可能的组合,这是最可靠的修法。

怎么确认已经修好

  • 第二个人读 prompt,能预测每个冲突谁赢。
  • 重跑 5 次,模型 5 次都满足非协商项。
  • 满足不了所有偏好时,按你声明的顺序放弃。
  • 删掉优先级最低的偏好,输出不变(证明它本来就被悄悄放弃了)。

如果还是没修好

  1. 可能还有第三处隐性冲突,来自 system prompt、developer message 或项目指令——所有来源都查,不只你的 message。
  2. 约束在数学上不可能(一句话回答 + 完整推理)——改一条。
  3. 换模型试。不同模型对排序约束的服从度差很多,带推理模式的版本通常更能跟住多步优先级。
  4. 必须全满足时,拆成多步(见 Step 6)。

预防建议

  • 维护约束分级模板:非协商 / 偏好 / 加分项。
  • 每个 prompt 都显式给取舍:“必须二选一时优先 X 而非 Y。”
  • 让同事帮扫一遍矛盾再跑。
  • 警惕形容词之间的”但”和”又”——通常藏冲突。
  • 每季度审一次生产 prompt 里累积的约束冲突。
  • 同时用 system/developer prompt 和 user prompt 时,确认它们不打架,并记住来源更高者赢。

常见问题

为什么模型不理我的长度限制,却照着格式规则做? 格式约束(JSON、schema、表)是结构化的、好验证,模型会锚定在上面;而”简洁”这种软形容词没有固定目标,于是输掉。把”简洁”换成硬数字(“150 字以内”),它就变得可执行了。

同一 prompt 在 API 里管用、在 ChatGPT App 里不管用(或反过来),为什么? 不同入口注入的高优先级指令不一样。App 可能带 Custom Instructions 或记忆;项目或 Custom GPT 会加自己的 system 文本;API 用显式的 system/developer 角色。按 OpenAI 的指挥链,这些都压过你的 user message,所以一条继承来的规则会悄悄盖掉你的。把每一层都打印出来,对齐它们。

叫模型”所有规则一视同仁”能修好吗? 不能。平权正是病因,不是解药——它抽走了模型需要的裁决依据。永远要排序,哪怕只有两条规则。

“if in doubt, favor brevity” 是正经技巧还是花招? 是有据可查的做法。Anthropic 的 prompting 指南就用这句原话作为化解”细节 vs 简洁”张力的方法。一句裁决句往往就足以止住折中。

我的两条约束真的没法同时满足,怎么办? 别再想在一次调用里两个都满足。用 Step 6 的两步法:第一步完整生成,第二步做转换(压缩、改格式、改风格)。每步只有一个、可满足的目标。

相关阅读

外部参考:OpenAI Model Spec — Chain of CommandAnthropic prompting best practices

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