智能体面试准备(五十四):智能体线上实验与效果归因体系------上线决策科学
引言:为什么"离线评测高分"不等于"线上能发"
B31 讲过 Agent 评测体系(轨迹指标、LLM-as-Judge、benchmark),B20 讲过可观测性。但评测高分只是门票------真正决定一个智能体能不能上线的,是"线上实验能不能证明它比旧版好,且好在哪里、坏在哪里可解释"。本篇是工程实战深化的收官讲,讲清智能体上线前的实验设计(A/B、影子、渐进)和上线后的效果归因(因果分解、bad case 漏斗、上线门禁)。这是大厂面试里"有没有真把 Agent 跑过生产"的分水岭。
读完本篇,你应当能说清:Agent 的线上实验和普通推荐系统 A/B 有何不同、指标该怎么设计才不会骗自己、出问题时怎么归因到具体环节。
普通模型上线: 输入X -> 模型 -> 输出Y, 可随机分流做 A/B
Agent 上线: 输入X -> 多步规划/工具调用/环境交互 -> 输出Y
差异: 路径非确定(同输入不同轨迹)、状态有副作用(调了API/改了数据)、成本随步数变
所以: 实验设计要管"轨迹"和"副作用", 不只管最终 Y
第一节 离线到在线的鸿沟:Agent 特有的三类落差
1.1 分布落差
离线 benchmark 是静态题集,线上请求是真实、长尾、带噪的。离线答得好的 Agent,线上遇到没见过的工具报错、用户乱输入,可能直接崩。所以离线只能"证伪"(差的一律不过),不能"证真"(高分不代表线上稳)。
1.2 路径落差
Agent 同一个输入可能走出不同轨迹,离线评测只采样了几条,线上千奇百怪。要看"成功率"而非"某次对不对",更要看"最坏轨迹会不会造成破坏"。
1.3 副作用落差
普通模型输出文本无副作用;Agent 会调接口、写库、发消息。线上实验必须隔离副作用(影子模式/沙箱),否则 A/B 实验本身就在制造事故。
离线评测 -> 线上实验 的鸿沟
分布: 静态题集 vs 真实长尾
路径: 采样轨迹 vs 全轨迹分布
副作用: 无 vs 有(必须隔离)
结论: 离线过线只是"允许进实验", 不是"允许全量"
第二节 三种线上实验形态及其在 Agent 上的特殊性
2.1 A/B 实验(在线分流)
把流量按比例分给实验组(新 Agent)和对照组(旧版),对比指标。Agent 的特殊性在于:不能只看最终答案准确率,还要看过程成本 (平均步数、工具调用次数、token 消耗)和安全指标(错误动作率、需人工接管的次数)。一个"答案略好但成本是旧版 3 倍、且多调了两次危险接口"的版本,不能算赢。
2.2 影子模式(Shadow)
新 Agent 在线上"跑但不执行"------它和实际请求一起推理、生成动作,但动作不真正落地,只记录"它会怎么做"并与真实结果对比。这是上线前最安全的验证:零副作用,却能拿到真实分布下的轨迹和指标。
2.3 渐进发布(Canary / 渐进)
先放 1% 流量,看住指标,逐档放量到 5%、20%、100%。Agent 上线尤其需要渐进,因为长尾问题往往在量起来后才暴露。配合自动熔断(指标越界立即回滚),把事故半径控制在最小。
| 形态 | 副作用 | 能看什么 | 适用阶段 |
|---|---|---|---|
| A/B | 有(需隔离/分流) | 真实效果+成本+安全 | 已较有信心,要定胜负 |
| 影子 | 无 | 真实分布下的轨迹 | 上线前最后一道关 |
| 渐进 | 小(限流内) | 放量后的长尾表现 | 正式上线过程 |
第三节 指标设计:别被"准确率"骗了
3.1 四组指标缺一不可
- 效果指标:任务成功率、最终答案准确率、用户满意度;
- 过程指标:平均规划步数、工具调用次数、重试次数;
- 成本指标:平均 token 消耗、平均延迟(TTFT/TPOT)、单位请求成本;
- 安全指标:错误动作率、需人工接管率、危险操作次数、越权尝试。
面试常考:"只盯成功率有什么问题?" 答:可能掩盖成本爆炸或安全隐患。一个成功率 95% 但每次都调危险接口、成本是旧版 5 倍的版本,全量上线就是事故。
3.2 指标要分层、要可归因
每个指标应当能下钻到"是哪类子任务拖的"。例如成功率按"单跳/多跳""有无工具报错""长尾 query"分桶,才能知道新版到底在哪变好、在哪变差。
# 指标分桶记录示意
def record(run):
bucket = f"{run.hop_type}/{run.has_tool_error}/{run.is_longtail}"
metrics[bucket].success += run.ok
metrics[bucket].cost += run.token_cost
metrics[bucket].safe += (0 if run.danger_action else 1)
第四节 因果归因:出问题时知道"坏在哪"
4.1 bad case 漏斗
把失败按"发生在哪一步"建漏斗:规划错?检索错?工具调用错?结果组装错?这样一次失败能定位到具体环节,而不是笼统的"Agent 不行"。
失败归因漏斗
任务失败 100
├─ 规划阶段错 40 (子问题拆分/路由错)
├─ 检索阶段错 25 (召回不准/模态选错)
├─ 工具调用错 20 (参数错/超时/报错未处理)
└─ 生成组装错 15 (幻觉/格式错)
4.2 因素分解与对照
用 A/B 的对照数据做因素分解:实验组成功率比对照组低 5 个点,是"所有桶都低"(模型整体退化)还是"只在多跳长尾桶低"(特定能力缺口)?前者要回退,后者可以针对性补数据或加检索。归因结论要能指导下一步动作,而不是只给一个数字。
4.3 可观测性支撑归因
B20 讲的可观测性在这里是关键基建:每一次 Agent 运行都要有完整 trace(每步输入/输出/工具调用/耗时/错误信息),归因才能从"猜"变成"查日志"。没有 trace 的 Agent,线上出问题就是黑盒。
第五节 上线门禁与回滚:把"发不发"变成规则
5.1 门禁清单
上线不是拍脑袋,而是一组硬性门禁:效果不显著劣于对照、成本增幅在预算内、安全指标零越线、长尾桶无异常退化。任一门禁不达标即拦截。
5.2 自动熔断与回滚
实验跑起来后,实时监控门禁指标,一旦越界立即把流量切回旧版(自动回滚),并告警。Agent 上线尤其要快回滚,因为副作用可能随时间累积(如错误数据越写越多)。
上线决策流
离线过线 -> 影子验证(零副作用看轨迹) -> 渐进1% -> 门禁监控
├─ 全部门禁达标 -> 逐档放量 -> 100% 全量
└─ 任一越界 -> 自动熔断回滚 -> 归因 -> 修复 -> 重进实验
第六节 工程骨架:一个最小实验与归因框架
class AgentExperiment:
def __init__(self, control, treatment, gate):
self.control, self.treatment, self.gate = control, treatment, gate
def route(self, req):
return self.treatment if hash(req.id) % 100 < self.rollout else self.control
def evaluate(self, runs):
rep = summarize(runs) # 四组指标分桶
if not self.gate.pass_(rep): # 任一门禁不达标
self.rollback(); self.alert(rep) # 自动回滚+告警
return ("BLOCKED", attr_breakdown(runs)) # 返回归因
return ("PASS", rep)
这段代码把"分流---评估---门禁---回滚---归因"串成闭环,面试里能写出来就说明你真做过上线,而不只是调 prompt。
第七节 五个上线实验踩坑
坑一:用平均成功率掩盖长尾崩坏。整体成功率只掉 1%,但"多跳+长尾"桶掉了 20%,全量后投诉爆了。必须分桶看,长尾桶单独设门禁。
坑二:影子模式忘了隔离写操作。以为"不执行"就安全,但 Agent 还是调了带副作用的接口(发消息/写库)。影子必须走只读副本或沙箱,写操作一律 mock。
坑三:A/B 两组环境不一致。实验组用了新的检索器、对照组是旧的,指标差异分不清是谁的功劳。上线实验要保证除"被比较的变量"外,其他全一致。
坑四:回滚不及时,副作用累积。指标越界后没自动熔断,Agent 继续往生产库写错数据半小时。回滚触发条件要前置、要快,宁可误拦不可漏拦。
坑五:归因只给数字不给动作。复盘说"成功率降了 5%",但没人知道降在哪、怎么改。归因的终点必须是"下一步具体动作"(回退/补数据/加检索/改规划),否则等于没归因。
面试速答(本篇可直接背的 3 句)
- Agent 上线实验和普通 A/B 的根本差异:Agent 路径非确定、有副作用、成本随步数变,所以实验必须管"轨迹+副作用+成本+安全",不能只看最终答案。
- 离线评测只能"证伪"不能"证真";上线前要过影子模式(零副作用看真实分布轨迹),再渐进放量,配合自动熔断回滚。
- 效果归因靠 bad case 漏斗(规划/检索/工具/生成分步定位)+ 指标分桶对照,结论要能指导"回退还是针对性补",靠完整 trace 支撑。
高频追问清单
- Agent 的 A/B 实验怎么保证"同输入分到同组"以便对照?(提示:按请求 id 哈希分流)
- 影子模式下 Agent 不执行动作,那它调用的工具要不要真打?(提示:打只读/沙箱,禁写)
- 成功率提升 2% 但成本涨 3 倍,发不发?你的门禁怎么设?
- bad case 漏斗里"规划错"占比最高,下一步具体怎么改?
- 渐进发布从 1% 到 100%,每档要看多久、看哪些指标才放量?
- 没有可观测性 trace,归因只能靠什么?为什么这是硬伤?