你写了 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,把非协商项往上推到 system 或 developer 角色——按指挥链,它们压过 user 轮。
Step 4:形容词翻成可测规则
保留形容词时让它可测,避免静默冲突:
差: "简洁。"
好: "全文 150 字以内。"
差: "温暖。"
好: "至少出现 2 次'我们'。避免用'个体'。"
Step 5:用故意冲突的输入测
喂一个约束明显打架的输入。如果模型还在硬凑全满足,说明排序没落地。再 prompt 时把优先级写更死,并加上 Anthropic 式的裁决句:“必须二选一时,优先 X 而非 Y。“
Step 6:拆成两步处理
两条约束真的不能共存时,把流程拆开:
Pass 1:生成完整全面的答案。无长度限制。
Pass 2:把 Pass 1 的输出压到 150 字以内。事实全部保留。
这把冲突分解成可顺序满足的子任务。对”完整推理 + 一句话”这种数学上不可能的组合,这是最可靠的修法。
怎么确认已经修好
- 第二个人读 prompt,能预测每个冲突谁赢。
- 重跑 5 次,模型 5 次都满足非协商项。
- 满足不了所有偏好时,按你声明的顺序放弃。
- 删掉优先级最低的偏好,输出不变(证明它本来就被悄悄放弃了)。
如果还是没修好
- 可能还有第三处隐性冲突,来自 system prompt、developer message 或项目指令——所有来源都查,不只你的 message。
- 约束在数学上不可能(一句话回答 + 完整推理)——改一条。
- 换模型试。不同模型对排序约束的服从度差很多,带推理模式的版本通常更能跟住多步优先级。
- 必须全满足时,拆成多步(见 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 Command 与 Anthropic prompting best practices。