一个漂亮的做对率,盖住了几十个会动钱的错——上线判定该怎么读数

Yaqin Hei··17分钟阅读
中文EN
一个漂亮的做对率,盖住了几十个会动钱的错——上线判定该怎么读数

《Agent 上线之后》系列第四篇。 前三篇:抽哪些标多少标得准不准。这一篇是最后一步——把标好的样本,变成一个不自欺的上线决定。English version: Reading the Eval to Ship

有了可信的标注、把每个意图标够了,现在到最后一步:把这些标好的样本,变成一个「能不能上线、能不能放量」的决定。这一步最容易栽。

我带过的一个零售客服 Agent 的资损场景——退款、取消、改地址、拦截物流这类会真金白银动钱的写操作。上线判定时,供应商拿来一个漂亮的总做对率申请放量。我做了一件事:把资损意图从那个总数里单独拆出来算。

拆出来那一刻数字很难看:资损意图的误操作率高得吓人,几十个会动钱的错一直留在里面——而那个漂亮的总做对率,把它们稀释进了几万条无害的「物流到哪了」里,看着一点事没有。

会动钱的错,被一个总数藏起来了。 这就是上线判定的第一课:一个笼统的「做对率」或「自助率」,是 money-losing 错误最好的藏身处。

会动钱的错,要单独设一道盯「误操作率」的闸

上线判定不能只看一个总数——会动钱的写操作,要单独拎出来,盯的是误操作率,而且门槛比咨询类严得多。

一个总数为什么会骗人:资损写操作在全流量里只占千分之几(这是第一篇说的长尾)。把它和几万条只读查询混进一个做对率里,就算资损意图错得一塌糊涂,加权到总数上也只动了小数点后一位。你盯着 95% 的总做对率点头,而那千分之几里,正躺着几十个会退错钱、错放合规的单子。

咨询类答错,客户再问一句;资损类误操作一次,就是真金白银的损失、甚至合规事故。所以资损意图要单独成轨、单独设闸,而且盯的不是「做对率」,是误操作率(错误执行了一个会动钱动作的比例),门槛按零容忍设——不是「做对率过 90%」,是「误操作率必须压到某条极低的线以下」。

两轨两把闸:咨询轨盯做对率、下界过 90% 就绪;资损轨盯误操作率、按零容忍压到红线以下才放行

一个总做对率会把资损轨的翻车稀释进几万条只读查询里——两条轨,两种错误代价,必须两把不同的闸。

检测动作:任何人拿一个总做对率 / 自助率申请上线,先问一句——把会动钱的那几个写操作单独拆出来,误操作率是多少? 答不上来、或者「没单独算过」的,这个上线申请不能批。

而且那几十个错里,一部分是修好前的旧账

就绪不是看点估计过没过,是看置信区间下界过门槛——而且要逐场景切掉修复前的旧账,否则你既看不清现在的真实水平,也证明不了修复有没有用。

那几十个错还藏着一层麻烦:里面有一部分,是你上周才修好的那个 bug 留下的旧错答。做对率 = 对的 / 总数,如果分母里还塞着修复前的旧账,一个已经修好的 agent,会被自己的历史拖成「没达标」——你要么因此卡住一个本该放量的 agent,要么干脆分不清「这次修复到底有没有用」。

解药是逐场景版本切点:某个场景修过 bug,就把该场景修复前的旧数据从分母里切掉——只切这个场景,别的场景不动。全局一刀切会误删掉那些没受影响、依然有效的标注;外科式地切,才既洗掉历史旧账、又不误伤。判定再叠上 Wilson 区间,不看点估计:

误操作率(资损意图, 渠道) = 误执行会话 / 总会话
  where 会话.时间 ≥ 该场景最近一次修复的版本切点     # 逐场景切旧账,别的场景不切
判定:Wilson 上界压到红线以下 才算「就绪」            # 看区间,不看点估计

检测动作:问一句——「这个做对率的分母,切掉修复前的旧数据了吗?切的是全局,还是逐场景?」

上线不是一次性 ship,是分级放量

上线判定的输出不是「能不能上」,是「哪个渠道、放到多少量」——每个渠道各自过闸,达标才放量那个渠道。

上线不是一个开关,是一条放量曲线:10% 灰度 → 50% → 全量,每一步都是一道独立的闸。而且第一篇说过,渠道是做对率的真实变量——私域达标不代表抖音公域达标。所以放量是分渠道的:

for 渠道 in 各渠道:
    if 资损误操作率(渠道) 未压到红线:     → 不放量,回去改 agent
    elif 做对率下界(渠道) ≥ 门槛:          → 放量到下一档(10%→50%→全量)
    else:                                → 维持当前档,继续标注逼近结论

分渠道分级放量状态机:资损误操作率未压红线→不放量回去改;做对率下界过门槛→进下一档 10%→50%→全量;否则维持当前档继续标

最坏也只是某个渠道停在 10% 灰度——而不是一个漂亮总数把所有渠道一起推上全量、再在某个渠道的资损意图上翻车。

这样最坏的情况,也只是某个渠道停在 10% 灰度,而不是一个漂亮的总数把所有渠道一起推上全量、然后在某个渠道的资损意图上翻车。

这周能做的三件事

  1. 把会动钱的写操作从总数里拆出来,单独算误操作率。 任何总做对率 / 自助率,先按「资损 vs 咨询」拆两轨;资损盯误操作率、按零容忍设闸。
  2. 给做对率的分母做逐场景版本切点。 修过 bug 的场景,把修复前的旧数据从分母里切掉,只切该场景;判定看 Wilson 下界 / 上界,不看点估计。
  3. 把上线改成分渠道分级放量。 别用一个总数一次性放全量;每渠道各自过闸(下界过门槛 + 误操作率压住),达标才放量那个渠道,10%→50%→全量。

上线判定不是给 agent 打一个分,是回答一个更难的问题:在哪个渠道、放到多少量,我有多大把握它不会在会动钱的地方翻车。 把它拆成「误操作单独设闸 + 下界 + 切旧账 + 分渠道放量」四件事,你才有一个不自欺的闸门。

抽哪些、标多少、标得准不准、怎么判上线——这套「上线之后」的机制,到这里凑齐了一个能诚实测量 agent 的闭环。但上线只是开始:一个今天达标的 agent,六周后可能悄悄滑下去。下一篇讲上线之后的静默退化——怎么在它变笨之前发现。


这一篇如果帮你把上线判定从「一个总数点头」改成「误操作单独设闸 + 下界 + 切旧账 + 分渠道放量」,回复关键词「放量准入」,我把资损双轨闸门 + 逐场景切点 + 分级放量的模板发给你。

Subscribe for updates

Get the latest AI engineering posts delivered to your inbox.

评论