本文原发表于Drew Breunig的博客,经授权转载。
得益于自然语言界面,AI应用的原型设计变得极其迅速:只需用英语描述需求,交给前沿模型,一个下午就能得到工作原型。对于一次性任务,这种方法非常高效。然而,当用于构建可靠系统时,自然语言提示却是一个陷阱。
让原型设计毫不费力的简单英语提示,实际上是一种糟糕的系统行为规范方式。问题不会立刻显现,而是像账单一样慢慢累积,伪装成正常进展,直到应用几乎无法改动。问题不在于单个提示,而在于自然语言从未被设计为工程规范语言,将其视为规范会悄无声息地限制你所能构建的系统的复杂性。
提示债务的陷阱
提示债务的第一个症状是迭代变慢。随着用户发现错误和边界情况,你会在指令中添加额外指导,试图让模型就范。如果不良行为持续,你会重复指令,语气越来越严厉。很快,提示变得冗长臃肿,快速修复会破坏之前的指令。错误无法用一行“热修复”解决,开发周期陷入停滞。
例如,Fable的系统提示将版权指导重复多达六次,出现在名为search_instructions、search_usage_guidelines、mandatory_copyright_requirements、hard_limits、self_check_before_responding和critical_reminders的多个部分中。
其次,提示债务会瘫痪团队。充满边界情况和全大写威胁的脆弱提示,连你自己都难以理解,更不用说同事了。许多团队通过将提示拆分为运行时组装的复杂模板来缓解问题,每个模板专用于特定关注点。但这些提示片段也会演化,最终变成一片条件混杂的荆棘丛。
最后,提示债务让你绑定于单一模型。你的热修复在GPT-4o上有效,但当切换到GPT-5.4-mini时却会以全新方式失败。于是你只能留在4o上,祈祷推理提供商越来越频繁的弃用邮件只是虚张声势,并放弃更便宜、更快、更好的模型的可能性。Datadog最近一份报告表明这很常见:他们观测到流量中使用最多的模型是GPT-4o。
这三个问题单独来看都只是麻烦,但合在一起就决定了你拥有的是一个美化版原型还是能随着你、客户和业务一起成长的产品。你闪亮的AI新功能被冻结,只能通过完全重构来改进,并锁定在过时的模型上。
提示债务为何发生
自然语言界面很出色,适用于一次性任务和广泛对话。问题在于我们依赖自然语言来定义持久的系统行为。
自然语言的不精确性加上概率语言模型,意味着表达相同意图的不同词可能产生不同输出。在最近一项研究中,一个临床问题用患者的口吻和医生的口吻分别询问(事实相同),结果Opus从全部拒绝回答变为全部回答。
不仅措辞重要,提示中看似无关的陈述也会影响结果。在哈佛的一项研究中,研究人员发现仅声明用户支持的NFL球队,就会改变模型拒绝回答敏感话题的频率。虚假陈述以我们无法预测的方式影响推理过程。这就是为什么随着你添加修复,提示变得更脆弱:为了抑制一个顽固错误而添加的额外指令,可能会影响模型对另一个昨天还正常工作的指令的解释。
重复指令将我们推向提示债务,但当我们期望的行为与模型训练相悖时,重复又是必要的。这就是“对抗权重”,一旦认识到这一点,你会发现它无处不在。例如,ChatGPT的图像指令曾八次告诉LLM在返回生成图像时不要回复,因为它被训练成总是保持对话。
我们分析过的每个编码代理系统提示都包含重复指令、严厉警告和全大写要求。Claude Code七次告诉Opus在单个响应中返回多个工具调用。即使是最先进的模型也迫使提示作者对抗权重:Fable泄露的系统提示将一条特定版权规则重复了六次。
这些例子都不是孤立的。我们检查的系统提示中交织着多条重复规则。顽固错误使提示迅速膨胀,每次修改都增加脆弱性和回归风险。
更糟的是:这些修复是针对单一模型行为的。伯克利最近领导的一项研究发现,企业坚持使用旧模型,因为新模型会破坏现有的代理。这是因为模型不是干净的版本化软件,它们有不同的权重,以不可预测且未文档化的方式产生不同行为。在GPT-4o上完美运行的提示可能在GPT-5.5上失败。Anthropic自己的Fable发布说明警告,为先前模型开发的技能可能“降低输出质量”。
提示债务将应用锁定在单一模型上。无法轻松交换模型并非前沿实验室巧妙设下的护城河,而是因为我们对概率模型演化出的有损自然语言规范。
预防提示债务
幸运的是,我们不必空想如何缓解提示债务;一个领域已经指明了方向。使用编码代理的程序员站在模型能力的浪尖,是模型能力锯齿状边界上的异常值。过去几年,他们演化出了最佳实践,让模型编写更多代码,同时交付可维护、模块化的软件。
第一个原则是用度量而非描述来指定系统行为。当模型输出是概率性的且语言不精确时,我们需要构建硬边界来约束它们:评估、度量和类型规范。这些是可读、可共享的工件,同事可以阅读和贡献,从而实现脆弱提示所阻止的协作。
最优秀的工程师现在花在测试上的时间比以往更多,因为测试不再是安全网,而是让模型充分发挥作用的关键。
第二个原则是停止手动编写提示。一旦我们有了能对候选者评分的度量,提示就不再是需要手工雕琢的东西,而是需要搜索的对象。自然语言允许的潜在单词、短语和结构的表面区域太大,无法用人工时间来处理。这是LLM天生适合探索的地形,已经有系统(如DSPy和GEPA)为你管理这项工作,让提示对你的设计负责。
一旦提示由程序生成,系统行为由度量定义,你就不再受特定模型束缚。评估新模型只需数小时而非数周。当更快、更便宜的模型出现时,你可以尝试。当收到弃用邮件时,你可以在一天内找到替代方案。无论是因监管原因被撤下(如Anthropic的Fable),还是因版本过久被弃用(如Groq上周对Llama-3.1-8b的宣布),修复都只是日常杂务,而非紧急救火。
每一个成熟的工程学科最终都会停止手工完成那些曾经引以为傲的手工工作。汇编让位于编译器,手工调优的查询让位于规划器,手动内存管理(大部分)让位于机器。提示编写也不例外。
用恰到好处的词汇引导模型是一项真正的技能,对于一次性任务往往是最优的。但要构建可靠、可改进、可移植的系统,我们不应手工调优提示。
脚注:Datadog的数据来自今年3月,GPT-4o的集中度可能已有所下降。然而,我从多个大型推理提供商处得知,GPT-4o及类似版本模型的调用量仍可占总调用量的50%以上!