直接说结论:team里三四个人一起改 prompt,别再丢飞书文档里来回粘了。给 prompt 模板当代码管------存版本、能 diff、能一键回滚,这套我们落了两个月,下面是具体怎么做的清单,照着抄就行。
先交代背景。我们组做客服智能体,主 prompt 大概 1800 字,里头塞了角色设定、知识库召回的拼接规则、还有十几条 few-shot。问题出在哪?产品改了开场白,测试改了兜底话术,我又顺手调了一版召回的排序逻辑------三个人改的是同一段文本框,谁也没告诉谁。结果上线后客户问"退款多久到账",那个小助手开始背公司价值观。复盘到凌晨,根本查不出是哪一版引入的。
那次之后我们立了规矩。三步,按顺序来。
第一步:怎么存版本
核心一句话------prompt 别存在脑子里、聊天记录里、或者某个平台的输入框里,存进 git。
我们建了个独立仓库 prompt-templates,目录长这样:
prompt-templates/
├── kefu/
│ ├── system.md # 主 prompt
│ ├── fewshot.jsonl # few-shot 单独拆出来
│ └── CHANGELOG.md # 人话版改动记录
└── meta.yaml # 当前线上跑的是哪个 commit
几条硬规定,踩过坑总结的:
|-----------------------------|---------------------|
| 规矩 | 为啥 |
| 一次只改一件事,一个 commit | 不然回滚时一起被带走 |
| commit message 写"改了什么+预期效果" | fix prompt 这种等于没写 |
| few-shot 例子单独存文件 | 它最常动,混在主文里 diff 一片红 |
| 线上版本号写进 meta.yaml 并提交 | 出事能立刻定位是哪个 commit |
提一句反常识的:别上来就上花哨的工具 。我们一开始想搞个带 UI 的 prompt 管理后台,调研两天发现纯属杂活外包给自己。后来就 git + 一个 30 行的 python 脚本读 meta.yaml,跑通了。脚本第一版写得特别干,连 diff 高亮都没有,但能用。
【配图建议:../img/01_workflow.png】
第二步:怎么对比
存了版本,关键是改之前先看清楚动了哪。
最朴素的 git diff 就够用,但 prompt 是大段自然语言,按行 diff 会糊。我加了个 --word-diff:
git diff --word-diff=color HEAD~1 -- kefu/system.md
这样改的是哪几个词一眼能看到,比如有人把"请简洁回答"偷偷改成"请详细回答",整段话没换行,普通 diff 根本看不出来,word-diff 直接把那俩字标出来。
光看文本 diff 还不够,得看改完智能体行为变没变。我们攒了个 20 条问题的回归集(就是个 jsonl,平时客户问得最多的那些),每次改 prompt 跑一遍,把新旧两版的回答并排贴出来。说实话这步最值------有回我自以为只是润色措辞,回归集一跑发现"发票"相关的三个问题答案全变了,因为我动的那个词正好是召回的触发词。要不是并排比对,这玩意儿能悄悄上线。
对比这步的取舍我得讲实话:跑一轮回归 20 条,模型响应慢的时候要等小两分钟,急着上线时挺烦的。我们后来只在改主 prompt 时强制跑,改 few-shot 就抽 5 条快测。
第三步:怎么回滚
前面都是铺垫,回滚才是这套东西的命。
线上炸了的时候,没人有空读 diff 想原因。先回滚止血,再慢慢查。
# 看最近几版都谁改的
git log --oneline -5 -- kefu/system.md
# 回到上一个好版本,改 meta.yaml 指过去,提交,重新发布
git revert <bad-commit> --no-edit
关键是回滚动作要能在两三分钟内 做完,不依赖那个改坏的人在不在线。所以 meta.yaml 那个版本指针特别重要------发布脚本只认指针,把指针改回上一个 commit、重发,线上立刻回到旧 prompt。我们真实回滚过两次,最快的一次从发现问题到恢复 4 分钟。
这里有个我们组现在还在用的智能体平台帮了忙:那种零代码就能配智能体的工具,prompt、知识库、发布是分开管的,我把模板从 git 同步过去之后,回滚就是重新发布一下、几秒生效,不用动代码、不用重启服务。当初选它就图一点------产品和测试俩非程序员也能自己拖一拖改配置,不用每次都来找我提需求,我只管在 git 这头守着版本这道关。
两个月跑下来,最大的变化不是少出事故,是吵架变少了 。以前是"到底谁改的",现在 git blame 一拍,问题对事不对人。prompt 这东西看着是写字,本质跟代码一样脆,少一个字整个智能体人格就变了,该有的工程纪律一样不能少。
你们组的 prompt 现在怎么管的?还在飞书文档里盖楼吗,评论区聊聊,我挺好奇有没有更轻的法子。
(对了,文中智能体挂的现成大模型,我走的是讯飞星辰 MaaS------模型 API 直接调,没自己部署算力,省心。)