跳到主要内容

你在无意中为 Prompt 构建了一个功能开关系统 —— 但却缺少治理

· 阅读需 12 分钟
Tian Pan
Software Engineer

打开你团队用来发布提示词(prompt)变更的配置仓库。看看最近的 30 个 commit。其中有多少个经过了代码审查(code review)?有多少个在 CI 中设置了评估门禁(eval gate)?有多少个你能——肯定地——归因为对看到它们的用户的生产环境行为产生了可衡量的变化?如果你的答案是“绝大多数”,那你是个例外。对于其他人来说,这些 commit 此刻正在生产环境中运行,而读取它们的系统所做的事情与特性标志(feature-flag)服务完全一致:热加载一个值,分发给用户,改变产品行为。区别在于,你的特性标志服务拥有审计日志、曝光追踪、熔断开关(kill switches)以及针对特定分群的定向投放。而你的提示词发布流水线只有 git push

这并非隐喻。这是对你团队正在运行的生产系统的准确描述。提示词配置仓库、你的 worker 轮询的 S3 存储桶、数据库中的 “prompts” 集合、你的应用在启动时获取的 LangSmith/PromptLayer/Braintrust 资产——这些全都是特性标志服务。它们具有相同的运行时形态:一个存在于二进制文件之外的值,二进制文件在热路径(hot path)上读取它,更改该值即可在无需部署的情况下改变真实用户的行为。唯一缺少的,是你的 SRE 团队在批准“真正的”特性标志服务之前所要求的所有控制措施。

这种差距是致命的,因为提示词变更带来的爆炸半径与普通的配置微调完全不同。对系统提示词(system prompt)的一个单词修改,就能让你的助手在一夜之间变得谄媚——OpenAI 在 2025 年 4 月的 GPT-4o 更新中公开吸取了这一教训:受奖励模型变更和提示词级别行为调优的共同驱动,该版本在用户报告模型支持从“棍子上的屎”作为商业点子到停用精神科药物等一切行为后,不得不被迫回滚。修复方案是调整系统提示词。这就是证据:如果修复方案是修改提示词,那么引发故障的原因同样也是修改提示词,而发布该故障的流水线却完全没有任何能够拦截同等级别代码变更的防护栏。

意外形成的特性标志形态

看看你的提示词发布流水线在运行时实际上做了什么。应用启动。在请求路径的早期阶段,代码读取一个字符串——可能来自镜像中固化的配置文件、数据库行、远程键值存储,或者是针对提供商进行缓存的 SDK。该字符串被插值到模型调用中。字符串的更改会传播到下一个请求、下一个用户、下一个分群。无需重新构建。没有编排器强制执行的发布窗口。没有渐进式流量切换。只要配置源确认,该字符串就会立即生效。

这是教科书般的特性标志行为。整个行业花了十年时间构建平台——LaunchDarkly、Unleash、Statsig、GrowthBook、Flagsmith、Datadog Feature Flags,以及每家大型科技公司的内部等效系统——专门用于管理以这种方式运行的数值。这些平台在公认的控制平面上达成了一致:

  • 曝光追踪(Exposure tracking):每次为用户评估标志时,系统都会记录他们看到的变体,以便你之后回答“14:32 时谁在 A 组?”
  • 发布遥测(Rollout telemetry):百分比放量、分群定向、地理围栏以及熔断开关,所有这些都实时可见。
  • 审计日志(Audit log):谁在何时、为什么更改了哪个标志,以及经过了谁的批准。
  • 回滚原语(Rollback primitives):一键回滚,存储并可定向投放之前的变体。
  • 针对单个用户的准入控制(Per-user gating):能够针对特定用户或细分群体关闭标志,同时让其他用户看到它。
  • 环境晋级(Environment promotion):开发 → 测试 → 生产,强制执行流程,而非仅仅是 git 分支约定。

现在请问:你的提示词流水线中具备其中的哪几项?如果你使用的是提示词管理 SaaS,也许有一两项。如果你使用的是配置仓库和热加载,可能一项都没有。该流水线满足了特性标志系统的机械定义——二进制文件之外的值、实时更改、行为分发——却不满足任何使此类系统安全运行的操作要求

为什么“提示词发布”不是“配置更改”

运维团队将提示词发布与配置更改区别对待是正确的,但大多数团队的理由搞反了。通常的观点认为提示词比代码更“软”,因此更安全,也就需要更少的仪式感。实际情况恰恰相反:提示词的爆炸半径比大多数配置更改更大,回滚路径更糟糕,且故障模式更难观察。如果说有什么不同的话,它们理应比典型的特性标志受到更严格的治理。

更大的爆炸半径。 配置标志通常切换的是代码路径。提示词更改则会切换模型生成的每一个响应的概率分布。这包括了你本不想触碰的行为:一个语气更严厉的提示词可能会让工具调用的召回率下降 10 个百分点;一个关于“乐于助人”的微调可能会让模型开始胡编乱造一些它之前拒绝提供的引用。提示词是一个密集的、非正交的控制平面。你无法一次只编辑一个维度。

更糟糕的回滚路径。 回滚特性标志会返回一个已知的正常变体。回滚提示词返回的是一个已知的字符串,但该字符串现在运行在已经打过补丁的模型、已经偏移的工具 schema 以及已经发生变化的用户群体之上。“撤销”按钮实际上并没有撤销——它只是将旧的提示词重新发布到一个新的环境中。团队经常发现,回滚后的提示词产生的输出与一周前不同,因为底层的模型发生了变化。

更难观察的故障模式。 特性标志切换如果破坏了代码路径,会触发 500 错误率告警。而降低回答质量的提示词切换则什么都不会触发——模型依然返回 200 状态码,延迟保持不变,Token 数量仅有极小幅度的漂移。故障会呈现在下游指标中:用户点踩、留存率、支持工单量、法律审核队列长度。当信号传达时,变更已经上线数日,而“上一个 commit”已经是四个 commit 之前的事了。

这三个属性共同表明,提示词变更理应受到比普通特性标志更多而非更少的治理。事实上,团队在发布提示词时普遍缺乏治理,这只是提示词进入生产环境方式的一种遗留产物——通过配置文件被“走私”进来,被当作内容对待,从未被平台团队归类为运行时行为。

最小可行治理层

你不需要为了填补这一差距而去购买提示词管理(prompt-management)SaaS,尽管这会有所帮助。你需要做的是停止假装你的提示词仓库只是一个配置仓库,并开始将其视为一个恰好存储字符串的特性标志(feature-flag)系统。一个合理的最小化方案包括:

1. 具有稳定 ID 的版本化、不可变提示词。 在生产环境中运行的每个提示词都有一个版本哈希。应用程序在每次调用时都会记录该哈希。“生成此响应的提示词是什么”应当是一个可以解决的问题,而不是一次 Git 考古练习。内容寻址存储(Content-addressed storage)是正确的默认选择,而不是分支名称。

2. 记录评估阶段的曝光日志,而不仅仅是部署阶段。 在每次模型调用时记录 (user_id, prompt_id, prompt_version, timestamp, response_hash),就像记录标志评估(flag evaluation)一样。当发生回归(regression)时,这套数据集能让你回答“在 14:00 到 14:30 之间,哪些用户看到了 v42 版本的提示词?”如果没有它,你无法进行同期群分析(cohort analysis),无法进行有意义的事件取证,也无法运行受控的回滚。

3. 晋级标准,而非晋级“感觉”。 一个提示词只有在通过了针对冻结黄金集(frozen golden set)的固定评估套件(eval harness)后,才能从实验环境迁移到预发环境,再到生产环境。这些标准应被记录下来,与提示词一起进行版本化管理,并在 CI 中进行检查。“我跑了几个例子,看起来不错”是 2022 年的水准;到 2026 年,这种做法是站不住脚的,尤其是在任何受监管的领域。

4. 具备爆炸半径意识的灰度发布。 变更应通过流量切分(traffic split)落地。1% 运行一小时,10% 运行一天,在质量指标处于容差范围内后再 100% 发布。这种切分由提供特性标志的相同基础设施驱动——这是你可以做的成本最低的统一,它能让你立即免费获得曝光跟踪、定向分发和熔断开关(kill-switch)。如果你的标志平台无法根据提示词版本进行门控,那是标志平台的 Bug,而不是将提示词排除在外的理由。

5. 敏感提示词的审批审计日志。 并非每个提示词都需要变更咨询委员会。但面向客户的助手的系统提示词(system prompt)、驱动审核决策的提示词,以及任何监管机构或审计员会查看的内容中嵌入的提示词——这些都需要与同一界面的代码变更相同的审批门控。通过 git push 到配置仓库来完成变更,其实是披着工作流外衣的政策违规。

6. 每个提示词都有负责人。 每个提示词都有指定的负责人、陈旧性 SLA,以及未使用的删除日期。提示词的泛滥速度比标志泛滥快得多,因为提示词的创建成本更低,且更难检测是否已失效。每季度进行一次审计,删除任何没有负责人或在过去 60 天内没有曝光的提示词,这种做法运行成本极低,且能立即产生回报。

这些都不需要购买新平台。所有这些都可以逐步添加到现有的“仓库加轮询”(repo-plus-poll)流水线中。昂贵的部分是文化的转变:让团队停止将提示词编辑视为文档更新,并开始将其视为运行时行为变更,这些变更需要与任何其他生产环境变更相同的审批、门控和遥测。

如果你从零开始,首要衡量什么

如果你目前还没有这些东西,两个指标将在一个季度内证明你的努力是有价值的。首先是提示词回归的归因时间(time-to-attribution)——从指标下降的那一刻起到你能确定负责的提示词版本的那一刻。如果超过一小时,说明你的可观测性已失效。其次是回滚周期时间(revert cycle time)——从决定回滚到旧版本在受影响的群体中上线并经过验证。如果超过五分钟,说明你的运行时已失效。

一旦你开始在每次模型调用时记录 prompt_version 并保持最后 N 个版本可热切换,这两个数字都会大幅下降。对于大多数团队来说,这是一个为期一周的项目。之上的治理层——审批、晋级门控、审计——需要更长时间,但遥测必须先行。你无法治理你看不见的东西。

工业界已经对如何在不重新部署代码的情况下安全地更改运行时行为进行了深入思考——特性标志社区拥有十年的指南、失败模式和工具。提示词团队不断在重新发明一个更糟糕的版本,因为“它只是一个字符串”是一个极具诱惑力的陷阱。它不仅仅是一个字符串。它是一个运行时拨盘,其传递函数比布尔值更诡异,爆炸半径也比你的直觉所认为的更大。你的用户已经这样对待它了。你的运维工具应该跟上。

References:Let's stay in touch and Follow me for more thoughts and updates