你的 AI 功能在上线时运行良好。六个月后,它有时给出简短的一两句话,有时写出五段长文,偶尔还会拒绝回答上个季度毫无障碍地处理过的问题。代码库中没有任何变化——至少你是这么认为的。实际上,系统提示在悄然改变,经过四名工程师跨两个团队提交的十一个拉取请求,逐步演变。每次改动单独来看都合情合理,但合在一起,却将你的提示变成了一台矛盾制造机。
这就是指令冲突问题。它不会抛出异常,不会出现在错误日志中,而是以行为漂移的形式表现出来——模型在细微不同的情境下做出细微不同的事,难以复现,更难溯源。等到用户提交 bug 报告时,提示可能已经被再次打过两个补丁了。
系统提示如何积累矛盾
想想提示在生产代码库中实际是如何变化的。产品经理要求更详细的解释,开发者追加了"始终逐步解释你的推理过程"。两周后,一起关于冗长回复的支持升级促使另一位开发者在前面插入"简洁直接地回答"。没有人删除旧的指令;它们分布在一个 600 token 提示的不同部分,代码审查早已合并。
这并非疏忽——这是将系统提示当作只追加配置文件的自然结果。每位贡献者只关注自己的改动,提示没有强制结构使冲突在代码差异中显而易见,矛盾只在推理时才会浮现,此时模型必须调和两条从未被训练过要分优先级的指令。
同样的积累模式在每个提示关注点上反复出现:
语气 :一月份添加了"友好随意",三月份又添加了"始终保持专业语气"
格式 :一处要求"列表使用项目符号",另一处却要求"倾向流畅散文而非碎片化列表"
范围 :开头要求"有帮助地回答任何用户问题",第 40 行才埋着"只回答关于我们产品的问题"
安全与功能 :一个团队写道"绝不拒绝用户请求",另一个团队写道"拒绝可能被滥用的请求"
对开源 LLM 项目中提示债务的研究发现,指令块式提示是失败率最高的类别之一,原因正是它们在没有任何结构机制来显示冲突的情况下不断积累。提示越长,潜在矛盾的密度就越高。
模型如何解决你未曾解决的问题
当模型遇到冲突指令时,它不会报错,而是做出选择——而那个选择未必是你期望的。
几种有据可查的偏差决定了模型如何处理冲突:
近因偏差。 出现在提示后部的指令权重更高,在长上下文中尤为明显。这意味着矛盾中的"赢家"往往是最近追加指令的工程师——一套你从未设计过的隐性优先级系统。
位置效应。 模型对上下文的开头和结尾关注度高,对中间部分关注度低。埋在 1000 token 提示中间的指令,与处于两端的指令竞争时,可能在功能上被忽视。多指令遵循研究发现,位于上下文窗口中间的指令准确率下降超过 30%。
指令干扰。 当用户输入本身带有指令性质时(例如以指令方式提出的问题),它可能无视位置而覆盖系统级指令。这意味着你的系统提示权威并不像系统/用户提示分离所暗示的那样绝对。
不可预测的仲裁。 当上述偏差都无法产生明确赢家时,模型会依赖预训练中的模式。结果行为单独看可能合理,但与任何一条指令的规定都有出入。没有可依赖的"平局裁决规则";行为实际上是涌现出来的。
其后果是,系统提示中的矛盾会产生一个不确定性行为包络。不同的输入、温度设置,甚至模型版本的静默更新,都会改变哪条指令占优。一个看似能优雅处理冲突的生产模型,可能在一次无声的模型版本升级后开始偏向另一条指令。
生产故障的真实面貌
指令矛盾导致的行为漂移很少以清晰的 bug 形式出现,它看起来像:
客服机器人时而简洁时而冗长,找不到明显规律,导致客户满意度分数波动
代码助手在被要求解释时会写注释,但在被要求生成时却跳过注释,因为两条指令对文档风格的规定相互矛盾
内容审核功能对某些类别的标记不一致,因为安全指令与帮助性指令在边缘情况下发生冲突
智能体在单轮评估中表现正常,但在多轮对话中逐渐退化,因为状态积累改变了模型将哪条指令视为权威
这些故障尤其难以诊断,因为它们在统计上是分散的。任何单一响应看起来都可能是正确的,只有在大量响应中或对比提示变更前后的行为时,问题才会变得可见。由于提示变更很少像代码变更那样附带评估门控,回归往往在数周内未被察觉。
一项多智能体系统研究发现,行为退化在长时间交互中会累积——在早期轮次表现稳定的智能体,随着对话进展,对系统提示约束的偏离越来越大。同样的动态适用于具有长上下文的单智能体系统:在短会话中潜伏的矛盾,随着上下文增长而被激活,模型有更多表面积来调解冲突。
程序化检测矛盾 最简单的方法是在部署前用 LLM 作为提示本身的矛盾检测器。提示一个能力较强的模型阅读系统提示,并识别在合理用户输入下可能产生冲突的指令对。这对表面级矛盾(明显的语气冲突、格式冲突、范围冲突)效果良好,可以接入 CI 流水线作为提示 lint 步骤。
对于更深层的语义矛盾,自然语言推理(NLI)提供了更有原则的方法。将系统提示分割为单独的指令单元(通常每句话或每个分句为一个),然后使用经过微调的 NLI 模型进行逐对蕴含检验。如果两条指令互不蕴含,且都可能适用于同一类输入,则将该对标记供人工审查。
更有针对性的方法是行为测试:生成一组多样化的合成提示,合理地激活每条指令,运行模型,并按行为特征对输出进行聚类。对相似输入产生不一致输出特征的指令,是矛盾的候选者。这种方法较慢,但能捕获经过语义分析仍能存活的矛盾,因为它们只在上下文中才显现。
这些方法都不是万无一失的。基于 LLM 的检测受到与被测模型相同的位置和近因偏差影响。NLI 模型经常会遗漏需要对下游行为进行推理的隐式矛盾。行为测试需要维护测试套件,且规模扩展成本高昂。在实践中,最好的保护是架构层面的——设计提示,使矛盾在结构上无法被静默引入。
分层提示架构:结构化解决方案 积累问题的根源在于扁平架构。扁平提示是单一文本块,关注点之间没有强制分离。任何指令可以放在任何位置,任何贡献者都可以追加任何内容,没有任何模式能在审查中使冲突显而易见。
分层提示架构将系统提示分为具有明确语义和修改规则的显式部分:
不可变约束 是最内层。它们编码从不能被覆盖的硬性要求:安全规则、范围限制、输出格式契约。这些内容一次设定,只能通过明确的审查流程更改,并需要 AI 功能可靠性契约所有者的明确签字。它们位于提示顶部,被视为承重基础设施。
角色与语气 定义模型的声音和交互风格。这些内容稳定但可协商——新的产品方向可能改变语气,但不应与约束层发生无声冲突。语气指令应放在约束之后,约束改变时需审查其兼容性。
功能级覆盖 是最外层。这是修改最频繁的部分——"针对此特定任务,将输出格式化为 JSON"、"在此上下文中,优先考虑简洁性"。由于明确限定在功能级关注点,它们不会隐式与不可变约束竞争。每个覆盖应包含范围注释——适用于哪些用户意图或上下文——以便审查者能够推理重叠情况。
使这一切奏效的机制纪律是差异审查。当分层提示被更改时,差异是可读的:你可以看到哪一层被修改,以及更改是否可能与相邻层中的现有指令冲突。追加到功能覆盖层的约束在视觉上是异常的。与现有约束相矛盾的语气指令,无需阅读整个提示,就可以对照约束层进行审查。
版本控制增加了第二层结构执行。提示的语义化版本控制——约束变更为主版本,语气或范围变更为次版本,措辞澄清为补丁版本——创建了将提示版本与行为观察关联起来的审计追踪。当检测到回归时,可以像对代码变更日志进行二分查找一样,对提示历史进行二分查找。
所有权问题 即使架构良好的提示,在没有明确所有权的情况下也会退化。指令冲突问题在一定程度上是社会问题:没有人像代码所有者对 API 契约负责那样,对提示的全局一致性负责。
实际所有权意味着一个人或团队拥有修改约束层的权力,所有其他层的修改都需要他们的审查。意味着提示更改在合并前根据行为基线进行评估,而不仅仅是审查语法正确性。意味着提示有一份活的规范——它应该做什么,在哪些上下文中,以什么语气——审查者对照它检查更改。
没有这些,拉取请求驱动的积累模式必然导致最终矛盾。每位贡献者局部优化;没有人全局优化。提示变成无人设计、人人头疼的问题。
将提示视为契约 解决大多数问题的思维模式转变,是将系统提示视为行为契约,而非配置字符串。契约有层次(不可协商条款、可协商条款、实现细节),有变更流程(双方必须同意修改不可协商条款),有审计机制(可以检查历史并推理当前状态)。
这不需要新工具,只需要将同样的工程纪律应用于任何外部行为所依赖的接口:模式、版本控制、所有权和审查。使系统提示陷入矛盾与保持一致的区别不在于 LLM——而在于工程团队是否像对待任何其他用户所依赖的生产产物一样,以同等的严格性对待提示。
模型不会感到困惑,是提示让它困惑的。
会员专享
余下内容仅对会员开放。 会员可读完整内容 —— 每一个公开发布的观点背后,那些框架、决策与推理的全貌。
— 完整文章,包含未公开存档的部分 — 可落地的工作框架,附带权衡与决策依据 — 新文章抢先看,先于公开发布 登录以继续阅读→ 随时取消 · 一次订阅,畅读全部