直接切换版本的风险
新版提示词/模型上线最危险的做法是直接切 ✗:效果无法对比、出问题无从归因、回滚靠临时改配置 ✗。
影子模式(shadow)就是让新版本在不影响用户的前提下先跑一段。
影子模式的三种形态
- 双跑对比(最常用):真实请求同时发给新旧两版,只返回旧版结果,新版结果只记录;
- 离线回放:把历史请求重放给新版,与当时的旧版输出逐条对比(不需要线上流量);
- 小流量并行:把 1% 流量真实走新版(用户看得见),其余走旧版 —— 这已属灰度,不是严格影子。
双跑对比最适合高风险改动(提示词大改、模型换代)。
双跑对比要比什么
- 逐条输出来源:同一输入,两版结果的差异类型(更准 / 更差 / 不同但都行);
- 格式合规率(新版是否更容易破格式);
- 长度与成本(新版往往更长更贵);
- 失败类型分布(有没有引入新的坏模式);
- 延迟(新版可能更慢,尤其是换了更大的模型)。
⚠️ 成本提醒:双跑会让成本与并发翻倍 ✗ —— 必须限时(例如 3 天)、限比例(例如 10% 流量)、
并提前把额度与告警准备好 ✔。
上线判据要事先写死
✓ 格式合规率 ≥ 旧版
✓ 逐条对比中「更差」占比 ≤ 5%
✓ 失败类型没有新增的严重类别(编造、越权)
✓ P95 延迟 ≤ 旧版 × 1.2
✓ 单位成本 ≤ 预算线
任一不达标 → 不上线(而不是"再看看" ✗)。
影子模式的两个陷阱
- 影子里的输入与线上不同 ✗:只挑"看起来难"的请求进影子 → 结论不可迁移 ✔;
正确做法是按比例随机采样真实请求 ✔。
- 影子结果没人看 ✗:每天要有人(或脚本)过一遍差异清单 ✔,否则等于白跑 ✗。
落地顺序
- 先做离线回放(零成本、零风险,能用历史请求先筛掉明显更差的版本);
- 通过后再做双跑对比(限时、限比例、有告警);
- 达标后小流量灰度 → 全量;
- 全程保留一键回滚开关 ✔(没有回滚就不要全量 ✗)。