Prompt 如何从字符串变成工程资产

很多 AI 功能的第一个版本,都是从一段字符串开始的。

const prompt = `请帮我总结这段内容:${content}`;

这没有问题。原型阶段最重要的是快速验证任务是否成立。但一旦功能进入真实产品,Prompt 就会变成一个持续变化的东西:产品要改语气,业务要补规则,安全要加约束,模型升级后要重新调优,前端还要稳定解析输出。

这时 Prompt 就不应该继续藏在代码里的某个字符串里。它需要像接口协议、设计系统 token、数据库 migration 一样,被当成工程资产管理。

工程资产的意思不是“把 Prompt 写得更复杂”,而是让它具备几个能力:可查、可改、可审、可测、可发布、可回滚、可观测。

从字符串到资产的分界线

一个 Prompt 是否需要工程化,可以看它有没有进入这些状态:

  • 被多个功能或多个团队复用。
  • 影响用户可见输出或业务决策。
  • 需要多人评审后才能上线。
  • 需要灰度、回滚或 A/B 测试。
  • 需要追踪某次输出到底用了哪个版本。
  • 包含安全、合规、品牌语气或业务口径。

如果只是本地脚本,字符串足够。如果它已经影响线上体验,就应该被纳入资产管理。

前端工程师可以把 Prompt 类比成组件。一个随手写在页面里的按钮可以先跑起来,但当按钮承载统一交互、权限、埋点和设计规范时,它就会沉淀成组件资产。Prompt 也是一样。

Prompt 资产包含什么

Prompt 资产不只是 content 字段。一个可管理的 Prompt 至少应该包含内容、变量、元数据、发布状态和测试结果。

资产字段含义
key稳定标识,例如 article.summary
version版本号,例如 1.3.0
contentPrompt 模板正文
variables模板变量定义和类型
owner负责人或团队
statusdraft、reviewing、staging、production、archived
model_policy可用模型、温度、最大 token 等策略
safety_policy安全规则、敏感信息处理、工具权限
test_suite绑定的测试集
changelog修改原因和影响范围

这些字段的价值在排查线上问题时最明显。用户反馈“今天总结质量变差了”,你需要知道:是不是 Prompt 改了,模型改了,变量缺失了,还是上下文拼接策略变了。

工程化设计

Prompt 工程化通常会从三个层次展开:模板层、编排层和运行层。

模板层负责保存 Prompt 内容和元数据。它要解决“谁在什么时候改了什么”。

编排层负责把模板、变量、用户输入、历史消息、检索结果和输出协议组装成最终请求。它要解决“这次调用实际给模型看到了什么”。

运行层负责调用模型、处理超时、streaming、工具调用、日志和错误。它要解决“这次运行是否可靠,是否可追踪”。

前端通常会参与模板编辑、预览、Diff、测试报告和发布审批这些界面。不要把 Prompt 管理后台做成一个大 textarea。它更像配置发布系统,需要状态、权限和反馈。

变量要有类型和边界

Prompt 资产最容易失控的地方是变量。字符串插值很方便,但没有类型和边界时,变量会悄悄污染指令。

type SummaryPromptInput = {
  language: 'zh-CN' | 'en-US';
  audience: 'frontend' | 'product' | 'support';
  content: string;
};

变量定义至少要说明:

  • 是否必填。
  • 类型和枚举范围。
  • 最大长度或 token 预算。
  • 是否来自用户输入。
  • 是否需要脱敏。
  • 是否允许进入系统指令区。

一个关键原则是:用户输入应该进入明确的“数据区”,不要和系统指令混在一起。Prompt 模板里可以用分隔符、XML 风格标签或结构化消息把指令和数据分开。

[任务]
总结用户提供的文章。

[规则]
- 不要编造原文没有的信息。
- 输出面向前端工程师。

[用户文章]
<article>
{{content}}
</article>

这不能彻底防止攻击,但可以让 Prompt 的结构更清楚,也方便测试和审计。

流程与权限

Prompt 资产需要发布流程,而不是“谁有权限谁就改线上”。

一个可落地的流程可以是:

权限可以按动作拆分:

动作建议权限
查看生产 Prompt工程、产品、审核人员
编辑草稿Prompt owner 和协作者
修改安全片段安全或平台负责人
发布到 staging工程负责人
发布到 production双人审批或自动门禁通过
回滚值班工程师和 owner

对于包含系统指令、工具规则和敏感业务口径的 Prompt,权限不要只按页面入口控制,还要按字段控制。比如运营可以调整语气片段,但不能修改工具调用权限。

测试与观测

Prompt 测试不一定一开始就很复杂,但必须存在。

最小测试集可以包含:

  • 正常输入:验证任务完成质量。
  • 边界输入:超长文本、空文本、多语言、格式异常。
  • 回归输入:历史线上问题样例。
  • 安全输入:越权指令、提示泄露、注入攻击。
  • 输出协议输入:验证 JSON、Markdown、字段枚举是否稳定。

测试结果不应该只看“模型答得好不好”。工程里更需要可执行的门禁:

  • 输出能否被解析。
  • 必填字段是否完整。
  • 是否出现禁止内容。
  • 是否引用不存在的信息。
  • token 是否超过预算。
  • 与上一版本相比是否有明显退化。

观测层也要记录 Prompt 版本。每一次 AI run 至少应该带上 prompt_keyprompt_versionmodelinput_tokensoutput_tokenslatencystatuserror_code。否则线上质量变化很难归因。

常见坑

第一个坑是把 Prompt 管理等同于 CMS。CMS 关注内容编辑,Prompt 管理还要关注变量、权限、测试、模型参数、输出协议和运行日志。

第二个坑是只保存最新版本。Prompt 改动不是普通文案修改,必须能回滚,也必须能解释历史输出。

第三个坑是让前端直接拼最终 Prompt。前端可以负责编辑和预览,但生产请求里的系统指令、权限上下文和安全策略应该在后端受控环境组装。

第四个坑是没有把 Prompt 和模型参数一起管理。Prompt 版本相同,但 temperature、model、max tokens 变化,也可能导致输出完全不同。

第五个坑是把测试留到线上反馈。Prompt 变化会引发隐性回归,尤其是格式、语气、安全和边界输入。没有固定样例集,就很难判断一次修改到底是优化还是碰运气。

小结

Prompt 从字符串变成工程资产,核心不是形式变高级,而是生命周期变清楚。

当一个 Prompt 有版本、有 owner、有变量协议、有发布流程、有测试集、有运行日志,它才真正进入工程系统。前端工程师参与这件事的价值很大:我们熟悉组件化、配置化、发布门禁、可观测性和用户体验,这些能力正好可以迁移到 Prompt 管理上。

在 AI 应用里,Prompt 不是写完就结束的文本,而是会持续演进的产品逻辑。把它当资产管理,后面的版本、测试、安全和回滚才有基础。