文章

Prompt 不只是文本:先划清配置系统的边界

从一个配置表逐渐失控的设计场景出发,判断 Prompt 系统应该管理什么,以及为什么不能接管业务上下文。

Prompt 不只是文本:先划清配置系统的边界

这是 PromptWeave 系列第 1 篇。我们先不讨论数据库表和页面,而是回答一个更基础的问题:Prompt 系统到底要管理什么?

本系列讨论 PromptWeave 的架构设计和实现边界,不代表这些能力已经在生产环境上线。下面是一个设计场景,用来推演边界,也不代表已经发生的生产事故。

一个解题产品最初只有一个配置页面。业务传入 promptCode,系统读取 Prompt 文本和模型配置,然后发起请求。后来团队开始做三件事:给同一个 Prompt 换模型、让两套 Prompt 做 A/B 实验、主模型失败时切换备用方案。

每件事单独看都只是增加一个字段:模型名、流量比例、backup ID。问题在于,这些字段一起改变了请求的行为,却没有一个对象说明“这次发布到底包含什么”。

于是会出现几个问题:

  • Prompt 改了,模型是否也要重新验证?
  • backup 按名称查找,还是绑定一个确定版本?
  • 测试环境里的规则,生产是否加载了同一份?
  • 出问题时,只恢复 Prompt 能不能恢复原来的行为?
  • 一次请求结束后,能不能还原它实际用了什么?

贯穿整个系列的具体错误是:测试环境验证了“B Prompt + Model B + B backup + 实验规则”,生产发布时却只把 Prompt 切成 B。结果生产仍可能使用旧的 Model A 和旧 fallback;页面看起来已经切换,实际运行的却不是测试通过的组合。

如果只能靠发布人的记忆回答,系统就还没有真正的版本边界。

先分清:作者配置和业务上下文不是一回事

PromptWeave 应该拥有 Prompt 的版本、模型调用方式、受限路由、输入校验和执行记录;它不应该替业务服务拼装完整业务对象,也不应该为了补齐上下文去查询业务数据库。

参与者负责什么不负责什么
调用方提交变量、图片等输入,以及已归一化的路由事实把完整业务对象交给配置系统
PromptWeave管理 Prompt 版本、模型配置、规则、执行与审计查询业务库、评判业务答案
LLM 网关处理 Provider 传输、凭据和上游重试决定 Prompt 实验和发布
评测器在后续阶段运行数据集、生成比较证据直接把结果发布到生产

这个边界解决的是责任混乱:调用方知道自己要提交什么,PromptWeave 知道自己能改变什么,网关和评测器也不会绕过发布链路。

Prompt 需要自己的生命周期

Prompt 不应该只有“当前内容”一个状态。至少需要经历:

1
2
3
4
5
6
作者编辑
  → 保存版本
  → 校验输入声明
  → 在模型上执行
  → 记录结果
  → 进入测试发布

发布后的版本不能原地编辑。作者可以继续改草稿,但已经被测试或生产引用的 revision 必须保持不变。否则一次历史执行无法重新解释,回滚也只能重新拼出近似配置。

这也是 Prompt 和普通文本模板的差别:Prompt 的内容会影响模型输入,但模型、协议、通道和备用路径同样会影响运行结果。只保存文本,不足以保存一次调用的行为。

第一阶段应该做到什么

第一阶段先做一条窄闭环:

1
2
3
4
5
6
7
PromptAsset
  → immutable revision
  → ModelConfig
  → typed route
  → ExecutionPlan
  → main / fallback
  → release snapshot

这里的 PromptAsset 是作者编辑的 Prompt 和输入声明;ModelConfig 描述通过哪个服务和模型发送请求;ExecutionPlan 把主调用和备用调用绑定起来;release snapshot 保存一次可以被测试、审批、加载和回滚的完整版本。

第一阶段不做自动健康路由、任意规则表达式或自动晋级。先把“同一个版本能被解释、执行和恢复”证明清楚。

下一篇会继续回答:如果 Prompt、模型和路由分别由不同配置负责,一次请求到底由谁决定使用哪一套?

下一篇:PromptCode、ModelConfig 与路由:一次请求谁决定什么

返回完整学习路线 Prompt 系统设计:从文本管理到可回滚运行版本
本文由作者按照 CC BY 4.0 进行授权

搜索当前语言 ↵ 打开