
微服务的灰度是按流量切:新版本接 5% 请求,看错误率和延迟,没问题再往上加。
这套做法搬到 Agent 上会失灵,原因是 Agent 的一次调用里同时存在三种可以独立变化的东西:
这三样里任何一样变了,对外行为都可能变。而它们都不在代码里,走的是配置和外部依赖,所以版本号管不住它们。
结果是一个典型的场景:线上服务版本号没变,但某个上午行为突然变了——因为模型厂商做了静默升级,或者有人改了提示词。
我的做法是把三条通道各自的版本组合成一个不可变的快照,形如:
prompt:v42 | model:vendor-a/2.1 | tools:v18这个三元组就是灰度单位。发布时不是发布"新代码",而是发布"新快照",流量按快照分桶。
好处有三点:
提示词的问题不是版本管理,是变更太容易。改一句话不用评审、不用测试,直接生效。
我的约束是两条:
提示词必须有版本号和变更记录。 谁改的、改了什么、为什么改。这条不是为了流程好看,是因为出事时你需要把某一次改动和某一天的指标下滑对起来。没有记录就一定对不上。
提示词不进代码仓库的发布流程。 它应该走配置中心,带灰度能力。但这也意味着它绕过了 CI 的检查,所以需要单独的回归——上线前用固定的用例集跑一遍。
模型通道最需要克制,因为它的行为不可预测。
换模型不是换实现,是换了一个决策函数。同一个提示词,在 A 模型上能正确调用工具,在 B 模型上可能就不调了,或者调错参数。这类差异没法靠代码评审发现。
我的做法是:
模型变更必须整版切换,不做按比例灰度。
这条和常规做法相反。理由是模型行为差异是系统性的——如果新模型在 5% 流量上有问题,另外 95% 大概率也有,只是没暴露。按比例灰度给你的是虚假的安全感,而且会拉长不一致的时间窗。
正确做法是:用离线评测集全量跑一遍,通过就整版切,切完盯紧指标,出问题立刻切回。切换要能在分钟级完成,这是比灰度更重要的能力。
记录模型的确切版本串,不要只记别名。
厂商的 latest 类别名会静默指到新版本。我踩过这个坑:某天效果变差,查了半天发现是别名背后的实际版本换了。现在所有调用都记录返回里的确切版本号,并且别名不允许出现在生产配置里。
工具通道的问题是它有两层:Schema 和实现。
Schema 变了(加参数、改类型、改描述),模型看到的东西就变了,行为会跟着变。实现变了但 Schema 没变,模型看不出来,但副作用可能变。
所以要分开管:
还有一点容易被忽略:工具描述也是提示词的一部分。很多人改工具描述时以为是改文档,实际上是在改模型的行为依据。
前面说的都是发布层面。真正难处理的是运行时。
一个 Agent 任务可能跑十几步、几十分钟。如果在这期间发布把快照切了,同一个任务的前几步和后几步就跑在不同的配置上。后果是状态不兼容——按 v18 的工具 Schema 写入的数据,用 v19 的逻辑去读,就可能解析失败或语义错位。
所以必须做任务内版本锁定:任务开始时把快照固定下来,整个任务生命周期都用这一份,新快照只对新任务生效。
这需要一个前提:快照必须能被旧代码读到。也就是说快照不做原地修改,只追加。这是配置中心的基本要求,但经常被"删除旧版本"的清理策略破坏。
灰度看什么指标?如果是看线上业务指标,那太慢了——等你看出来,已经影响了一批用户。
Agent 的灰度判断必须靠离线评测集,而且要按通道分组:
评测集不需要大,五十到一百条覆盖主要路径就行。关键是它要稳定——同一份输入,同一份判定逻辑,这样才能比较两个版本。
没有这套东西的时候,我见过的最常见情况是:大家都不敢改提示词,或者改了也不知道变好还是变坏,最后靠"感觉还行"上线。
不建议做小比例(1%~5%)的提示词灰度。
提示词的改动通常是全有或全无的:改了一句话,要么这个场景就不犯了,要么还是犯。它不像性能优化那样有渐进分布,5% 流量上的结论不能线性外推到 100%。
而且小比例灰度会让你误以为风险可控,从而跳过评测。
我更倾向于:小改动可以直接全量,配快速回滚;大改动必须先跑评测,再全量。灰度在这个场景里提供的价值,小于它带来的复杂度。
Agent 的发布治理,核心不是"怎么切流量",而是"怎么知道变的是哪一样"。
提示词、模型、工具三条通道各自独立、各自有版本、组合成快照、任务内锁定。这四件事做到,灰度才有意义;做不到,灰度只是把一个说不清的变化分散到更多用户身上。
同系列:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。