本节摘要:《Jev 决策编程》8.2 节在决策系统语境给出"影子模式 + A/B"的安全上线法;本节把它推广到一切 LLM 应用。影子模式(shadow mode):新版本对真实流量旁路运行但不生效——用户看到的仍是线上版本的输出,新版本的输出只留给裁判打分对照。它回答"新版本在真实分布上表现如何"这一离线回归集回答不好的问题(回归集终归是历史的快照,第 3.1 节)。工程三件事:旁路不改线(复制请求、超时放弃)、成本要记账(推理成本近似翻倍,示意按 20%~30% 流量采样)、对照要裁判(第 5 章裁判给新旧输出打分,成对比较须换序)。A/B 测试则是真刀真枪的分流实验,统计纪律四条:单一变量、事先算样本量(本节附两比例样本量脚本,纯标准库)、跑满完整周期(至少一周,覆盖周内节律)、停止规则先定(不许天天偷看 p 值)。最后拼出晋级流水线:离线回归 → 影子 → 小流量 A/B → 全量,每级都有明确的晋级判据与回退点(8.3 节)。
阅读完本节,你应当能够:
用户请求 ──▶ 线上版本(v12)──▶ 用户看到 │ └─旁路复制──▶ 影子版本(v13)──▶ 输出仅入库 │ 裁判对 (v12 输出, v13 输出) 成对打分(换序) │ 影子日志(3.1 节)+ 对照报表
工程三条纪律(与第 3.1 节影子日志同源,多一层"跑模型"):
晋级判据(示意,按业务定):
| 检查项 | 通过条件 |
|---|---|
| 裁判成对胜率 | 影子版本胜率 ≥ 45%(不要求碾压,不显著变差即可进下一级) |
| 红线指标 | 拒答率、空输出率、幻觉抽检(4.3)均不劣化超 1pp |
| 成本与延迟 | 单请求成本 ≤ 基线 × 1.1;p95 延迟不超基线 +500ms(示意) |
| 影子时长 | ≥ 7 天且覆盖一个完整周期(周内节律) |
💡 影子模式与影子日志(3.1 节)的区别只有一句话:前者跑新版本留输出,后者只留输入。基础设施(旁路、脱敏、元数据)完全复用。
影子通过后进入小流量对照:一部分真实用户拿 v13,其余拿 v12,比较在线指标。
纪律一:单一变量。一次实验只改一个东西(prompt 或模型或检索参数),否则赢了也不知道该谢谁。
纪律二:样本量事先算。在线指标多为比例(负反馈率、采纳率),两比例检验的样本量:
# ab_sample_size.py(纯标准库,可直接运行) """两比例 A/B 样本量估算:正态近似,双侧 95% 置信、80% 功效。""" import math def sample_size(p_base: float, mde: float, alpha: float = 0.05, power: float = 0.80) -> int: """p_base: 基线比例;mde: 想检出的最小绝对提升(如 0.02)。""" z_a = 1.959964 # 双侧 95% 的 z 值 z_b = 0.841621 # 80% 功效的 z 值 p_alt = p_base + mde p_bar = (p_base + p_alt) / 2 var = p_bar * (1 - p_bar) * 2 # 两组各贡献一份方差 n = ((z_a * math.sqrt(var) + z_b * math.sqrt( p_base * (1 - p_base) + p_alt * (1 - p_alt))) ** 2) / (mde ** 2) return math.ceil(n) if __name__ == "__main__": for mde in [0.01, 0.02, 0.03, 0.05]: n = sample_size(p_base=0.10, mde=mde) # 基线负反馈率 10%(示意) print(f"基线 10%,想检出 {mde:.0%} 绝对提升:" f"每组约需 {n:,} 次 request")
运行输出(实测,本机 Python 3.12):基线 10% 时,检出 1pp 提升每组约需 1.5 万次请求,2pp 约 3.8 千次,5pp 约 7 百次——想看的效应越小,弹药越贵;样本量算完发现攒不够,就调大 MDE 或延长周期,而不是硬跑一个检不出的实验。
纪律三:跑满完整周期。至少 7 天:工作日与周末的用户行为差异巨大,只跑周三到周四的实验结论不可迁移。
纪律四:停止规则先定。开跑前写下"第 N 天、达到多少样本才看结果";天天偷看 p 值,碰上显著就停,等于在噪声里反复抽奖——多重比较会把假阳性当战果(观点:A/B 里最贵的错误不是没检出来,是把噪声当成改进发版)。
| 指标 | 定义 | 采集 | 注意 |
|---|---|---|---|
| 负反馈率 | 👎 / 总评价 | 用户反馈(6.2 第 1 路评分) | 评价本身有偏(爱评价的用户偏极端) |
| 采纳率 | 用户复制/使用了输出 | 前端埋点 | 任务型应用最硬的代理指标 |
| 重试/改写率 | 同一会话立即重问 | trace 会话聚合(6.2) | 隐性不满的信号 |
| 转人工率 | 低置信路由触发比例 | 第 7.2 节阈值网关 | 阈值变了要归一化再比 |
| 会话解决率 | 会话无升级、无重复 | 客服工单系统 | 滞后指标,适合做结论不适合做告警 |
⚠️ 在线指标全是代理指标:它们距离"用户真的满意"都隔着一层。结论要三角互证——在线指标、裁判抽检、季度问卷,两条腿以上的证据才发版(观点)。
离线回归(第 3~5 章考卷,第 9.2 节 CI 门禁) │ 通过:通过率红线、hard 子集、安全子集 ▼ 影子模式(7 天,20%~30% 流量) │ 通过:裁判胜率 + 红线 + 成本延迟 ▼ A/B(5%~10% 真实流量,样本量与周期算好) │ 通过:主指标不劣化且至少一个次指标显著改善 ▼ 全量(灰度推进:10% → 50% → 100%,每步观察 24~48h) └─ 任一级失败 → 回退点:关掉分流开关即回上一版(8.3 节)
版本换上去了,接下来要有一双眼睛盯住它——技术层、语义层、漂移层三层指标怎么摆进一页面板、告警阈值怎么定,下一节展开。