你写了 prompt 里两条都很合理的规则:“简洁” + “覆盖所有边界情况”。模型给你的既不简洁(列了 6 个边界),也不完整(恰好漏掉最关键那个)。去掉”简洁”,答案真的全面。去掉”覆盖所有边界”,答案真的精炼。单独一条都管用,合在一起就互抵。这是约束打架:模型没法同时最大化两个,于是折中,折中就平庸。
本文讲怎么找出 prompt 里隐藏的约束打架,以及怎么排序让模型知道无法全满足时该放弃哪条。
常见原因
1. 软形容词 vs 硬规则
“简洁”(软) vs “包含全部 7 个字段”(硬)。硬规则赢,“简洁”被牺牲但模型还在试——结果既不短也不结构化。
如何判断:一条可数、另一条凭口味。
2. 风格 vs 格式
“温暖口语” + “严格 JSON”——JSON 没地方装温暖。模型选一个,通常选格式。你拿到的是平板 JSON,字符串里硬塞拗口字眼。
如何判断:格式约束是结构(JSON、表、schema),风格约束是语气(温暖、友好、有说服力)。
3. 推理 vs 长度
“逐步展示思考” + “一句话回答”——数学上相反。模型一般选长度短的,把推理藏起来。
如何判断:同时出现长度上限和 chain-of-thought 要求。
4. 语气目标冲突
“正式但俏皮”、“专家但易懂”、“权威但谦逊”——本就是张力,不是组合。模型平均到”商务腔”。
如何判断:两个形容词用”但”或”又”连接。
5. 来自 system prompt 的隐式冲突
你 message 写”口语化”,system prompt 写”用正式英语”。模型听 system prompt 忽略 message 规则,但你看不到为什么。
如何判断:同一 prompt 换平台/项目跑,行为不一样。
动手前先确认
- 把完整 prompt(含 system prompt、project 指令)打印出来。
- 把每条约束一行一条列清楚。
- 每两两对:“打架时谁赢?”
- 试着去掉一条约束,看冲突是否是瓶颈。
- 重新 prompt 之前先定好优先级。
需要收集的信息
- system prompt + project + user message 里所有约束。
- 你得到的输出 + 它满足了哪条、忽略了哪条。
- 一次去掉某条约束的实验——质量上去了吗?
- 模型、temperature、平台。
- 冲突是数学性的(长度 vs 细节)还是解读性的(语气)。
最短修复路径
Step 1:把所有约束列在一张纸上
让它们全可见。常常你写了 8 条规则,3 条在拽另外 5 条。
Step 2:配对排序
每对打架的对,宣布一个赢家:
简洁 vs 全面 → 全面赢。砍掉长度上限。
温暖语气 vs JSON 输出 → JSON 赢。本 prompt 删掉"温暖"。
展示推理 vs 一句话 → 推理赢。长度变成"≤5 句"。
正式 vs 俏皮 → 选一个。(两个都要不可能。)
Step 3:把赢家挪到”非协商”块
Prompt 顶部:
非协商:
1. 输出必须是符合 schema X 的合法 JSON。
2. 7 个必填字段全在。
3. 事实陈述必须给来源。
偏好(与上述冲突就放弃):
- 字段描述尽量短。
- 描述字符串用日常语言。
模型对排序约束的服从远好于平权约束。
Step 4:形容词翻成可测规则
保留形容词时让它可测,避免静默冲突:
差: "简洁。"
好: "全文 ≤150 字。"
差: "温暖。"
好: "至少出现 2 次'我们'。避免用'个体'。"
Step 5:用故意冲突的输入测
喂一个约束明显打架的输入。模型还在硬凑,说明排序没落地。再 prompt 时把优先级写更死。
Step 6:拆成两步处理
两条约束真的不能共存,把流程拆开:
Pass 1:生成完整全面答案。无长度限制。
Pass 2:把 Pass 1 的输出压到 ≤150 字。事实不变。
把冲突分解成可顺序满足的子任务。
怎么确认已经修好
- 第二个人读 prompt 能预测每个冲突谁赢。
- 模型 100% 满足非协商项。
- 满足不了所有偏好时按你声明的顺序放弃。
- 删掉优先级最低的偏好不影响输出(说明它本来就被悄悄放弃了)。
如果还是没修好
- 可能还有第三处隐性冲突(system prompt 或 project 指令)——两边都查。
- 约束在数学上不可能(一句话回答 + 完整推理)——改一条。
- 换模型试——不同模型对排序约束服从度差很多。
- 必须全满足时拆成多步(见 Step 6)。
预防建议
- 维护约束分级模板:非协商 / 偏好 / 加分项。
- 每个 prompt 显式给取舍:“必须二选一时优先 X 而非 Y”。
- 让同事帮扫一遍矛盾。
- 警惕形容词之间的”但”和”又”——通常藏冲突。
- 每季度审一次生产 prompt 里累积的约束冲突。
- 同时用 system prompt 和 user prompt 时确认它们不打架。