冰封提示词:当你的团队不敢修改一个仍然奏效的系统提示词时
每个成熟的 AI 产品最终都会演变成一个当前团队中没人能完全理解的系统提示词(system prompt)。起初它只是 40 个 token 的纯英文,20 个月后,它变成了一堵 4,000 token 的“高墙”,堆满了条件句、拒绝模板、格式规则、角色强化、边缘情况警告,以及一句没人能解释的关于周二的奇特句子。每一行都是为了应对特定的失败:客户投诉、法务发来的 Slack 消息、评估(eval)中发现的回归,或者在投资者演示期间出现的偶发 bug。写下第 37 行的工程师已经转岗到其他团队。写下第 112 行的工程师是一名外包人员,他的 Notion 文档已被归档。评估套件覆盖了提示词所主张行为的大约三分之一,但没人确定是哪三分之一。
于是,这个提示词以一种最糟糕的方式成为了系统的“承重墙”:它能用,团队也知道它能用,但团队已经不再碰它了。本该对提示词进行迭代的工程师,反而绕过它来处理变更——这里加一个后处理过滤器,那里加一个 few-shot 封装,或者做一个并行的“v2 提示词”并用特性标志(feature flag)关闭,以防有人哪天有勇气进行 A/B 测试来替换它。提示词不再是软件,而成了遗迹。一旦发生这种情况,提示词就不再是你用来改进产品的杠杆,而是塑造产品的约束条件。
这就是“凝固的提示词”(frozen prompt)失效模式,它正成为生产环境 LLM 系统中最常见的技术债形式之一。最近一项对 LLM 项目中 93,000 多个 Python 文件进行的学术调查发现,提示词设计是该领域中自认技术债(self-admitted technical debt)里最大的单一类别,其中位寿命为 553 天,且移除率在所有债务类别中最低——不到 50%。一旦写下了与提示词相关的 TODO,它几乎永远不会被解决。它只会随着时间慢慢老去。
系统提示词是如何凝固的
“凝固”很少发生在瞬间。它是三种力量随着时间的推移朝同一方向拉动的累积效应。
第一种力量是事件驱动的增生(incident-driven accretion)。当一个由 LLM 驱动的产品在生产环境中遇到行为失效时,最快的补丁几乎总是在系统提示词中加上一句话。“绝不推荐竞争对手的产品。”“如果用户提到退款,务必先确认订单 ID。”“不要将 'leverage' 一词用作动词。”每一句话都解决了一个真实的、可见的问题。但它们都没有对应的评估案例(eval case),因为编写评估比写下这句话耗时更长,而且值班工程师还有另外六张工单要处理。两年后,提示词本质上成了产品历次客户可见故障的账本——但唯一的文档就是提示词本身。
第二种力量是作者轮换(author rotation)。增加第 37 行的那个人在添加的那一刻,非常清楚那一行为什么要在那儿。他们知道是哪个用户投诉触发了它,是哪个模型版本产生了糟糕的输出,以及这一行在暗中补偿哪个下游渲染 bug。他们没有把这些记下来,因为当时觉得显而易见。18 个月后,他们已经去了另一家公司,而当前团队读到这一行时,感觉它可能可以删掉,但也可能是防止集体诉讼的唯一屏障。从提示词本身根本无法分辨。
第三种力量是评估不充分(eval underdetermination)。即便是有着严格评估纪律的团队,也会发现他们的套件只覆盖了提示词实际主张的一小部分。一个写着“除非用户用西班牙语写,否则始终用英语回答”的提示词,至少需要四个评估案例——英文入/英文出、西语入/西语出、西语入伴随英文后续、以及含糊的混合语言情况——而大多数团队只有一个或一个也没有。因此,当工程师考虑编辑提示词时,他们无法确定自己的修改是否安全。评估套件会显示“全部通过”,但他们知道套件并没有涵盖提示词执行的大部分内容。理性的反应就是不去碰它。
这些力量中的每一种单独来看都是可以管理的。但合在一起,它们就会产生棘轮效应。每一个事件都让提示词变得更长;每一次人员轮换都让它变得更晦涩;每一次没有对应评估的提示词修改,都让下一次修改变得更令人恐惧。提示词凝固并不是因为有人决定让它凝固。它凝固是因为没人能证明修改是安全的,而犯错的代价是这种行为回归(behavioral regression)会同时推送到每一位用户面前。
