老张的餐厅经营了五年,老主厨手艺稳定,可客人总说“菜式有点腻”。一位新主厨带着时髦的创意菜来应聘,试菜惊艳了老张,但老张不敢直接换人——万一客人不买账,招牌就砸了。于是他想了个办法:先让新主厨负责30%客人的菜,其余70%仍由老主厨做,月底对比两拨客人的满意度,再决定去留。这就是AI领域里的“模型AB部署”:当新模型准备上线时,不直接全部替换旧模型,而是把线上流量按比例分成两组,一组继续走旧模型(对照组),一组交给新模型(实验组),用真实业务数据比较两者的表现,让数据替你做决策。这套方法能帮你在生产环境安全验证新模型效果,避免“拍脑袋上线”带来的风险。

岗位关联

对AI从业者来说,掌握模型AB部署意味着你拥有了“带刹车”的上线能力——既能用真实流量证明新模型价值,又能在效果不佳时快速回滚,这是MLOps工程师与算法工程师最核心的工程素养之一。

目录
  1. 可视化演示
  2. 初识AB部署——新旧模型同台竞技
  3. 流量分流设计——把客人公平分给两位厨师
  4. 实验组隔离——杜绝厨房里的“串味”
  5. 效果评估体系——让运气和实力各归其位
  6. 部署架构方案——双厨并行的后厨工程
  7. 上线演进策略——从试菜到正式换主厨
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

动态演示模型AB部署的核心机制,通过基础/核心/应用/扩展四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

模型AB部署:AB部署 AB部署架构设计与组件 流量分配策略与路由控制 核心机制可视化 模型AB部署整体架构与关键组件

初识AB部署——新旧模型同台竞技

老张的餐厅经营了五年,主厨手艺稳定,但客人最近总说“菜式有点腻”。一位新主厨带着时髦的创意菜来应聘,试菜时让老张眼前一亮。可老张不敢直接换人——万一客人不买账,招牌就砸了。他想了个办法:接下来一个月,让新主厨负责30%客人的菜,其余70%仍由老主厨做,月底比较两拨客人的满意度,再决定去留。这个“同时用两位厨师、对比评价再决策”的思路,就是AB部署的雏形。

老张的这个办法,在AI领域有一个专门的名字:模型AB部署。当一个训练好的新模型准备上线时,我们不会冲动地把线上流量全部交给它,而是把它和正在服务的旧模型“同时摆上桌”:一部分线上请求继续走旧模型,称为对照组;另一部分请求走新模型,称为实验组。跑一段时间,通过真实业务指标对比两组表现,让数据来回答“新模型到底值不值得全量替换”。

AB部署的核心要素可以拆解为三点:新旧模型同台、流量按组切分、数据对比决策。新旧同台意味着旧模型服务不能下线,而是保留为新模型的“参照系”;流量按组切分要求有一条稳定的分流规则,让用户被确定性地分到某一组;数据对比决策则要求我们提前定义好衡量指标,比如点击率、转化率、响应延迟等,并设定统计显著性的判断标准,而不是凭感觉拍板。

回到老张的餐厅。月底店长统计了两拨客人的复购率:老主厨是40%,新主厨是46%。代入提升率公式,(46%-40%)÷40%=15%——新主厨确实更有吸引力。有了这个数字,老张心里有底,决定开始规划后面的“渐进式换主厨”方案。这就是AB部署给工程师的底气:不靠感觉赌上线,而是靠分流后的真实数据,稳稳地验证模型价值。

Lift=Mnew−MoldMold×100%\displaystyle \text{Lift} = \frac{M_{\text{new}} - M_{\text{old}}}{M_{\text{old}}} \times 100\%
提升率Lift衡量“新模型相对旧模型提升了百分之多少”,是AB部署中最常用的效果度量:正值代表新模型更好,数值越大提升越明显。
  1. 基线指标 M_old旧模型在对照组上测得的业务指标值,比如转化率,相当于老主厨的稳定口碑。
    Mold\displaystyle M_{\text{old}}
  2. 实验指标 M_new新模型在实验组上测得的同一指标值,相当于新主厨交出的成绩单。
    Mnew\displaystyle M_{\text{new}}
  3. 两值相减计算新模型相对旧模型的绝对增量,正值代表新模型更好。
    Mnew−Mold\displaystyle M_{\text{new}} - M_{\text{old}}
  4. 除以基线将增量除以旧模型指标,去除量纲,得到相对提升比例。
    Mnew−MoldMold\displaystyle \frac{M_{\text{new}} - M_{\text{old}}}{M_{\text{old}}}
  5. 化为百分比乘以100%把比值变成直观的百分比,便于团队对比和汇报。
    ×100%\displaystyle \times 100\%

流量分流设计——把客人公平分给两位厨师

要让这场比试公平,老张必须先解决一个问题:怎么把客人分给两位厨师?如果让服务员凭喜好推荐,回头客全跑去老主厨那边,比试就失去了意义。老张用取号牌做文章:每位客人进门取一个号,号码尾数小于3的去新主厨那边,其余留给老主厨。这样客人被分到哪组,完全取决于号码,而不是任何人的偏好。

在线上系统中,“取号牌”就是用户ID的哈希分桶。分流规则要满足两个条件:确定性——同一用户每次请求都应进入同一组;均匀性——两组用户特征大致相似。最简单有效的做法是计算 bucket = hash(user_id + salt) % 100,然后规定桶号小于某个阈值(比如30)的请求进入实验组。

为什么用哈希而不是直接随机?因为“随机”对同一用户每次请求都可能不同,导致用户一会儿被新模型服务、一会儿被旧模型服务,体验错乱且效果被稀释。哈希则保证了同一个用户永远落进同一个桶,行为可复现。加盐(salt)是为了防止某些特定ID因为哈希规律天然聚集在某一组;权重的调整也很简单——把阈值从30改成50,新模型流量就从30%升到50%,不需要重新部署模型。

老张的取号规则后来也升级了:不按简单的尾号,而是把号码做一次随机打散再取最后两位,就算客人扎堆来,也能均匀分成两组。服务员只需记住一条规则:分配结果由号码决定,永不改变。这套规则,就是线上分流系统的雏形。

bucket_id=hash(user_id+salt) mod 100\displaystyle \text{bucket\_id} = \text{hash}(\text{user\_id} + \text{salt}) \bmod 100
这个公式把任意用户ID映射到0到99的整数桶号,桶号小于“分流比例×100”的用户进入实验组,其余进入对照组。
  1. user_id 用户标识用户的唯一编号,相当于客人进店领到的取号牌。
    user_id\displaystyle \text{user\_id}
  2. salt 盐值一个固定字符串,作用是给哈希加一点“随机佐料”,防止特定ID规律性地落入同一组。
    salt\displaystyle \text{salt}
  3. hash 散列把任意长度的字符串映射成整数,让分布看起来足够均匀。
    hash(user_id+salt)\displaystyle \text{hash}(\text{user\_id} + \text{salt})
  4. mod 100 取模将哈希值映射到0到99的整数区间,形成100个均匀的桶。
     mod 100\displaystyle \bmod 100
  5. 阈值比较桶号小于100×分流比例的用户进入实验组,其余进入对照组。
    bucket_id<100×ratio\displaystyle \text{bucket\_id} < 100 \times \text{ratio}

实验组隔离——杜绝厨房里的“串味”

两位厨师共用一间厨房,最容易出问题:新主厨熬的酱汁不小心洒进了老主厨的锅里,客人会抱怨“今天的鱼味道不对”。实验组隔离要杜绝的,就是这种“串味”。它要求两组实验互不干扰,各自独立运行,否则得出的结论就像被酱汁污染过的菜——说不清是主厨的手艺问题还是食材串味的问题。

“串味”在AB部署里有三种典型形态:用户级串组、特征不一致、数据链路串扰。用户级串组指同一用户在不同请求中被分配到不同模型;特征不一致指新模型在离线训练时的输入特征与线上推理时不一致,导致实验指标失真;数据链路串扰指两组的埋点日志互相污染,统计时无法区分来源。

用户级隔离的解法是确定性哈希:同一用户在任何时刻都映射到同一个桶。特征一致性要求特征计算逻辑在训练和上线时保持完全一致,最好使用同一个特征服务。数据链路隔离要求两组的日志带上组ID,并在统计层按组ID聚合,不允许交叉读取。这三层隔离做扎实了,AB实验的结论才是“干净”的。

厨房管理手册写清楚了:老主厨用自己的灶台和锅铲,新主厨用自己的,食材和菜单虽然共享,但每一道菜出自哪口锅都有记录。客人满意度的回访表上也印了“厨师编号”,数据不会混在一起。老张看到这些规矩,才放心让两位厨师同时开工。

b(u)=hash(u+salt) mod B,∀t, bt(u)=b0(u)\displaystyle b(u) = \text{hash}(u + \text{salt}) \bmod B, \quad \forall t,\ b_t(u) = b_0(u)
这个表达式说明:用户u的分桶结果由确定性哈希决定,且在任何时刻t,用户都留在最初分到的那个桶里,不会中途“串组”。
  1. 分桶函数 b(u)输入用户唯一ID,输出该用户所在桶号,每位客人只有一个固定座位。
    b(u)\displaystyle b(u)
  2. 确定性哈希相同输入永远得到相同输出,不随时间和请求次数改变。
    hash(u+salt)\displaystyle \text{hash}(u + \text{salt})
  3. 模运算取桶对总桶数B取模,所有用户被均匀分配到B个桶。
     mod B\displaystyle \bmod B
  4. 全程稳定条件任意时刻t的分桶结果都与初始时刻一致,保证用户不会中途“串组”。
    ∀t, bt(u)=b0(u)\displaystyle \forall t,\ b_t(u) = b_0(u)

效果评估体系——让运气和实力各归其位

实验跑了两周,老张手里有两堆评价卡:新主厨这边“非常满意”占46%,老主厨这边是40%。看起来多了6个百分点,但老张不敢马上下结论——万一只是这周来了一批刚好爱吃创意菜的客人呢?这里的问题,正是AB评估中的核心:统计显著性。两组指标的差异可能来自真实效果,也可能来自随机波动。

要区分二者,我们需要三样东西:明确的业务指标、足够的样本量、显著性检验。业务指标要具备可衡量性与稳定性,例如转化率、点击率、留存率。然后利用双样本比例检验计算z分数:若|z|大于1.96,说明在95%置信水平下两组差异不是单纯随机波动,新模型的领先是“统计显著”的;若|z|小于1.96,则需要继续积累数据或承认当前证据不足。

老张找来学统计的表妹帮忙。表妹把两堆评价卡的数据代入公式,算出z分数是2.3,松了一口气:“这个差异不是运气,你的新主厨确实有两下子。”老张问样本量够不够、观察期会不会太短,表妹说这就是显著性检验存在的意义——让运气和实力各归其位。

z=pnew−poldpnew(1−pnew)nnew+pold(1−pold)nold\displaystyle z = \frac{p_{\text{new}} - p_{\text{old}}}{\sqrt{\frac{p_{\text{new}}(1-p_{\text{new}})}{n_{\text{new}}} + \frac{p_{\text{old}}(1-p_{\text{old}})}{n_{\text{old}}}}}
z分数是“两组差异”除以“差异的标准误”:它回答的是“这个差距有多少概率是运气造成的”。|z|>1.96表示在95%置信水平下差异显著。
  1. 实验组转化率 p_new新模型服务用户中完成目标行为(如下单)的比例。
    pnew\displaystyle p_{\text{new}}
  2. 对照组转化率 p_old旧模型服务用户中的同样比例。
    pold\displaystyle p_{\text{old}}
  3. 分子两率相减两组转化率的差值,直接反映新模型效果的方向与大小。
    pnew−pold\displaystyle p_{\text{new}} - p_{\text{old}}
  4. 比例方差单个比例自身的方差,比例越接近两端波动越小。
    p(1−p)\displaystyle p(1-p)
  5. 标准误方差除以样本量后得到均值的抽样误差,样本越多误差越小。
    p(1−p)n\displaystyle \frac{p(1-p)}{n}
  6. 合成标准误两组标准误平方相加再开方,得到两比例之差的总误差。
    pnew(1−pnew)nnew+pold(1−pold)nold\displaystyle \sqrt{\frac{p_{\text{new}}(1-p_{\text{new}})}{n_{\text{new}}} + \frac{p_{\text{old}}(1-p_{\text{old}})}{n_{\text{old}}}}

部署架构方案——双厨并行的后厨工程

决定给新主厨更多机会后,老张发现后厨不是添一口锅那么简单。两位厨师都需要备菜台、调料架和出菜口,菜单和采购单要共享,还要有个店长统一调度,免得客人点的菜被两位厨师重复做。工程上的AB部署,同样是一场“后厨改造”。

部署架构的目标是:在不重启、不迁移线上服务的前提下,让新旧两个模型并行服务,并支持随时调整流量比例。典型架构包含三部分:网关分流、模型服务层、配置中心。网关根据分桶结果把请求路由到旧模型服务或新模型服务;两个模型服务独立部署、互不依赖;配置中心保存分流比例,修改配置即可动态调流。

监控与告警是这位“店长”的眼睛。需要实时观测两组模型的响应延迟、错误率、资源占用和核心业务指标;当实验组错误率明显升高时,告警应立即触发,甚至可以联动配置中心自动把流量切回旧模型。有了这套架构,线上的“双厨并行”才称得上安全可控。

老张站在后厨门口,看到每位客人的订单上都有店长填写的“厨师分配表”,出菜口有两个,监控屏上实时显示两位厨师各接了多少单、退菜率是多少。他手里的“调流旋钮”轻轻一转,新主厨接单比例就从30%变成50%——餐厅安然运转。这套后厨系统,就是他敢继续实验的底气。

Etotal=r×Enew+(1−r)×Eold\displaystyle E_{\text{total}} = r \times E_{\text{new}} + (1 - r) \times E_{\text{old}}
总错误率是两种模型错误率按流量占比的加权平均。这个公式让你在调流前就能估算:把多少流量切给新模型,会给线上整体带来多大的风险。
  1. 新模型流量占比 r例如0.3表示30%的线上流量由新模型处理。
    r\displaystyle r
  2. 新模型错误率 E_new新模型预测错误或请求超时的比例。
    Enew\displaystyle E_{\text{new}}
  3. 旧模型错误率 E_old旧模型在同口径下的错误率。
    Eold\displaystyle E_{\text{old}}
  4. 加权求和总错误率等于两种错误率按流量比例的加权平均。
    r×Enew+(1−r)×Eold\displaystyle r \times E_{\text{new}} + (1-r) \times E_{\text{old}}

上线演进策略——从试菜到正式换主厨

第二个月,新主厨的复购率依然领先。老张决定让他正式接班,但依旧没有搞“一夜换人”。他先用10%的客人试运行一周,确认稳定后调到30%,再过一周调到60%,最后才100%交给新主厨。每一步都盯着退菜率和客人投诉。这种逐步放量的过程,在工程上叫作灰度发布,是AB部署的“下半场”。

当实验数据证明新模型显著优于旧模型后,我们会按阶梯把流量从实验比例逐步提升:常见节奏是1%→5%→25%→50%→100%。每一档停留若干天,观察指标是否随放量持续保持优势。为什么要这么慢?因为AB实验的小流量结论,未必能完全代表全量场景下的复杂情况,比如缓存命中率变化、负载冲击、用户群体结构差异。

放量不是不可逆的。如果放量过程中任何指标触及红线,例如转化率相对旧模型下降超过2%,或错误率超过5%,系统应自动触发回滚,把流量瞬间切回旧模型。回滚速度远比“修Bug再发布”快,因为它只是把配置中心的阈值改回0%,旧模型服务一直在线待命。

第三个月的某天,菜单上所有菜品都换成了新主厨的版本,老主厨正式退休。但老张没有拆掉老主厨的灶台——万一新主厨因为季节食材变化发挥失常,他随时可以再把老主厨请回来,重新开启“双厨并行”。这就是AB部署留给团队的安全绳:新老模型永远保留一键切换的能力,业务价值在分流验证中被稳稳地实现。

rollback=1 if (Mnew−MoldMold<−δ) or (Enew>ε)\displaystyle \text{rollback} = 1 \ \text{if} \ \left(\frac{M_{\text{new}} - M_{\text{old}}}{M_{\text{old}}} < -\delta \right) \ \text{or} \ \left( E_{\text{new}} > \varepsilon \right)
回滚条件是“业务红线”和“技术红线”的或判断:新模型相对旧模型稳定变差,或错误率超过安全阈值,任一条件触发,立即切回旧模型。
  1. 回滚触发条件当新版指标明显变差或错误率超标时,立刻把流量切回旧模型。
    rollback=1\displaystyle \text{rollback} = 1
  2. 归一化差低于负阈值新模型相对旧模型的提升率低于负的容忍阈值(如-2%),说明它在稳定变差。
    Mnew−MoldMold<−δ\displaystyle \frac{M_{\text{new}} - M_{\text{old}}}{M_{\text{old}}} < -\delta
  3. 错误率超限新模型错误率超过安全红线(如5%),说明系统健康已受威胁。
    Enew>ε\displaystyle E_{\text{new}} > \varepsilon
  4. 或条件两者任一触发即回滚,防止只盯业务指标而忽略系统稳定性。
    or\displaystyle \text{or}

AI 应用场景

电商推荐系统换新排序模型

阶段:模型上线与评估

解决的问题:推荐团队训练了新的深度学习排序模型,离线AUC提升2%,但直接全量上线可能影响实时点击和GMV。传统做法是凭离线指标直接替换,风险不可控。AB部署先用小流量验证线上真实效果,避免“离线好看、线上翻车”。

具体案例:某电商平台将新排序模型AB部署,30%流量进入实验组。实验组点击率提升8%,但人均GMV下降3%。平台没有盲目上线,而是结合提升率与商业指标综合评估,最终优化了新模型的价格偏好策略后才全量上线。

智能客服新版问答引擎

阶段:模型效果验证

解决的问题:客服机器人准备换用大语言模型驱动的问答引擎,担心新引擎在敏感问题上回复质量不稳定,直接替换可能影响用户体验。

具体案例:某金融公司把10%的在线咨询流量切给新问答引擎,通过“用户满意度评分”和“转人工率”两个指标对比。实验两周发现转人工率下降12%,但满意度无显著差异,于是继续阶梯放量至50%,后再全量。

风控反欺诈模型迭代

阶段:模型安全上线

解决的问题:新反欺诈模型对未知攻击的召回率更高,但可能误伤正常用户。风控团队不敢贸然全量,需要在不影响大多数用户体验的前提下验证新模型。

具体案例:某支付平台将5%的实时交易请求交给新模型,同时监控“拦截率”和“误伤投诉率”。实验一周后新模型拦截率提升15%,误伤率微升但仍在容忍区间,团队决定阶梯放量至50%。

Python 演示

python60 行
import hashlibimport mathimport random SALT = "ab_test_v1" def bucket(user_id, num_buckets=100):    # 按用户ID哈希, 映射到0-99号桶    digest = hashlib.md5((SALT + str(user_id)).encode("utf-8")).hexdigest()    return int(digest[:8], 16) % num_buckets class ABTester:    def __init__(self, new_ratio=0.3, old_cvr=0.05, new_cvr=0.065):        self.new_ratio = new_ratio        self.old_cvr = old_cvr        self.new_cvr = new_cvr        self.old_imp = 0        self.old_conv = 0        self.new_imp = 0        self.new_conv = 0     def serve(self, user_id):        bucket_id = bucket(user_id)        is_new = bucket_id < self.new_ratio * 100        base = self.new_cvr if is_new else self.old_cvr        convert = random.random() < base        if is_new:            self.new_imp += 1            if convert:                self.new_conv += 1        else:            self.old_imp += 1            if convert:                self.old_conv += 1     def report(self):        old_p = self.old_conv / self.old_imp if self.old_imp else 0        new_p = self.new_conv / self.new_imp if self.new_imp else 0        se = math.sqrt(old_p * (1 - old_p) / self.old_imp + new_p * (1 - new_p) / self.new_imp)        z = (new_p - old_p) / se if se else 0        lift = (new_p - old_p) / old_p * 100 if old_p else 0        return old_p, new_p, z, lift def main():    random.seed(42)    tester = ABTester(new_ratio=0.3)    for uid in range(10000):        tester.serve(uid)    old_p, new_p, z, lift = tester.report()    print("对照组转化率: %.4f" % old_p)    print("实验组转化率: %.4f" % new_p)    print("提升率: %.2f%%" % lift)    print("z分数: %.3f" % z)    if abs(z) > 1.96:        print("结论: 差异显著, 建议全量上线新模型")    else:        print("结论: 差异不显著, 继续实验") if __name__ == "__main__":    main()
目的:模拟一个简化版AB部署实验——按用户ID哈希分桶,30%流量进入实验组,分别统计新旧模型转化率,输出提升率和z分数,并给出是否全量上线的建议。
  1. SALT = "ab_test_v1"固定盐值给哈希加佐料,防止特定ID扎堆进同一组。
  2. return int(digest[:8], 16) % num_buckets取哈希前8位转整数再对100取模,得到0-99的稳定桶号。
  3. is_new = bucket_id < self.new_ratio * 100桶号小于阈值就算实验组,阈值即新模型流量占比。
  4. base = self.new_cvr if is_new else self.old_cvr给不同组分配不同的真实转化率,模拟模型效果差异。
  5. self.new_imp += 1累计实验组样本量,供后续统计计算。
  6. se = math.sqrt(...)计算两组转化率之差的标准误。
  7. z = (new_p - old_p) / se if se else 0z分数越大,越说明差异不是随机波动。
  8. if abs(z) > 1.96:95%置信水平下判定差异显著。

常见误区

误区我用了random.random()来分流,每个用户有50%概率进实验组,这不就是AB部署吗?

正解随机分流会让同一用户在不同请求中进入不同组,等于客人一会儿吃老主厨的菜、一会儿吃新主厨的菜,两组体验被“串味”,真实差异也被平均化稀释。正确做法是用户级确定性分流,如hash(user_id+salt)%100,保证同一用户永远落进同一组,两组样本才真正独立。

为何常见:从直觉出发“随机=公平”,但忽略了线上场景里“同一用户多次访问”的重复测量问题。

误区新模型离线指标好,线上跑了2天转化率也高,直接全量上吧。

正解2天的数据包含星期效应、活动促销等噪声,样本量也不足以支撑显著性检验。AB评估必须提前设定观察期(如7-14天)和样本量,用z检验等统计方法判断差异是否显著。数据不足时的高指标可能只是随机波动,就像一两天内来了一群恰好爱吃创意菜的客人。

为何常见:人们习惯“快赢”,容易把小样本的偶然优势误当成真实效果。

误区离线AUC提升了2%,线上AB实验还测什么?直接上线省时间。

正解离线指标和线上业务指标之间隔着特征一致性、数据分布、用户行为反馈等鸿沟。离线AUC高不代表线上转化率一定提升,反例是模型过拟合历史数据,线上召回太激进,用户反而流失。AB部署就是给这种不确定性兜底的“试菜环节”。

为何常见:把离线评估的“相关”误当作“因果”,忽略了线上系统反馈闭环的复杂性。

误区反正新模型离线测试没问题,直接把50%甚至80%流量切给它,实验更快结束。

正解实验流量越大,新模型潜在负面影响的范围越大。推荐的节奏是从小比例(1%-10%)起步,确认无异常后再逐步放量。即使效果好,也应阶梯放量而非一步到位,给监控和回滚留出反应时间。

为何常见:只看到“样本越多结论越快”,忽略了生产环境安全性和用户体验的代价。

误区把新旧两个模型服务分别部署好,配好分流就行了,监控以后再补。

正解没有监控的AB部署等于盲飞行。必须实时跟踪两组模型的延迟、错误率、资源占用和业务指标,并预先配置自动回滚条件。当实验组错误率上升或转化率跌破阈值时,系统要能自动把流量切回旧模型,而不是等工程师睡醒才发现。

为何常见:把AB部署简化成“路由配置”,忽略了它作为上线安全保障的核心职责。

面试题

Q1. AB部署的核心目标是什么?

单选题 · easy

  • A.同时部署多个模型以提升系统吞吐量
  • B.用真实流量对比新旧模型并安全决策← 正确答案
  • C.离线训练新模型后直接替换旧模型
  • D.多服务器部署以增强系统的并发能力

答案:B。AB部署的本质是让新旧模型在同一份真实流量中对比表现,用数据支撑上线决策。A歪曲了目的(提升吞吐量不是AB部署的目标),C跳过了线上验证环节很危险,D描述的是部署形式而非AB部署的核心目标。

Q2. 哈希分桶中“加盐”的作用是什么?

单选题 · mid

  • A.加密用户ID防止流量数据泄露
  • B.扰动哈希分布避免特定ID族群聚集← 正确答案
  • C.压缩用户ID字符串以降低存储开销
  • D.规定每组流量所占比例的上下限

答案:B。加盐是为哈希输入额外拼一段固定字符串,打散输入分布,防止特定ID因哈希规律天然聚集到同一组。它不负责加密(A),也不压缩存储(C),流量比例的上下限由配置阈值控制(D)。

Q3. 为什么同一用户必须始终进入同一实验组?

单选题 · mid

  • A.避免同一用户被系统重复计费
  • B.保持两组样本独立防止体验串扰← 正确答案
  • C.便于按用户维度统计访问日志
  • D.避免两组指标出现数值相同情况

答案:B。同一用户固定在同一组,才能保证对照组和实验组的样本互相独立,用户不会因体验过两种模型而导致两组指标混杂。A与计费无关,C只是日志统计的便利性,D是结果层面的巧合而非原因。

Q4. 某AB实验对照组转化率5.00%,实验组5.20%,各组5万样本,z=2.01显著,但实验组推理成本是旧模型的3倍,最佳决策是什么?

单选题 · extreme

  • A.差异显著应立即全量上线
  • B.差异不显著要延长观察期
  • C.提升有限需结合成本审慎决策← 正确答案
  • D.样本不足需加大分流比例

答案:C。z=2.01说明统计上显著,但统计显著不等于业务上划算。0.2个百分点的绝对提升(相对提升4%)在推理成本翻3倍的前提下未必值得全量。A忽视了成本,B误判了统计结论,D歪曲了样本量已经足够的事实。

Q5. 新模型首次上线AB部署时,推荐的流量比例通常是?

单选题 · easy

  • A.百分百流量直接全量替换
  • B.新旧模型各承接一半流量
  • C.从百分之一到十的低比例灰度← 正确答案
  • D.百分之零只做离线指标评估

答案:C。首次上线应以低比例(1%-10%)起步,确认无异常后再逐步放量。A风险太大,B对半分流也偏激进,D则完全没有线上验证价值。低比例灰度既能积累数据,又能把风险控制在最小范围。

Q6. 一个完整的AB部署方案必须包含哪些能力?

多选题 · mid

  • A.确定性分流规则← 正确答案
  • B.实验组与对照组数据隔离← 正确答案
  • C.全流程监控与告警← 正确答案
  • D.自动扩充训练样本

答案:ABC。确定性分流让同一用户稳定进同一组(A),数据隔离保证两组日志不串扰(B),监控告警是安全上线的前提(C)。D属于自动学习能力,与AB部署本身的验证机制无关。

Q7. 实验期间同一用户在不同请求中被分配到不同组,会导致什么?

单选题 · hard

  • A.样本量翻倍实验结论更快
  • B.两组体验混杂差异被稀释← 正确答案
  • C.分流随机性增强结果更准
  • D.对照组指标会自然同步上升

答案:B。用户级污染使两组样本不再独立,每个用户体验了两种模型,真实的模型差异被平均化稀释,就像客人每道菜都混着两位厨师的手艺,根本无法评价谁更好。A、C是错误直觉,D没有依据。

Q8. 下列哪些指标适合作为AB部署的效果评估依据?

多选题 · easy

  • A.平均响应时长← 正确答案
  • B.订单转化率← 正确答案
  • C.七日留存率← 正确答案
  • D.服务器内存占用

答案:ABC。效果评估应关注影响用户体验和业务价值的指标:延迟(A)、转化(B)、留存(C)。内存占用(D)是资源运维指标,可作为监控项但不应是判断模型效果的核心依据。

Q9. 某AB实验连续3天新模型转化率均低于对照组,正确做法是什么?

单选题 · mid

  • A.忽略负面指标直接全量上线
  • B.扩大实验流量再次验证效果
  • C.停止实验并回滚到旧模型← 正确答案
  • D.只保留新模型的高光时段数据

答案:C。连续多日稳定为负,说明新模型在当前业务场景下不占优,止损回滚比继续扩大流量更稳妥。B扩大了负面暴露面;A无视数据;D是自欺欺人的数据处理。

Q10. 关于AB部署实验效果评估的说法,正确的有哪些?

多选题 · hard

  • A.样本量越大越容易检验出微小差异← 正确答案
  • B.方差越大同等样本更难得出显著结论← 正确答案
  • C.z分数大于一点九六即能保证指标领先
  • D.提升率需要与业务成本结合来判断← 正确答案

答案:ABD。样本量越大标准误越小,微小差异也能被检验(A对);方差越大噪声越大,需要更多样本才能显著(B对);z>1.96只说明统计显著,不保证业务上一定划算(C错);最终上线需要结合成本收益做决策(D对)。