2015年,我在一家电商公司负责搜索推荐系统的流量分配。当时我们做了一个经典的A/B测试:将商品详情页的“购买按钮”颜色从灰色改为橙色,流量各分50%,跑了两周,点击率提升12%。表面上看,这是一个成功的实验。但问题在于,实验结束前的13天里,我们每天都有50%的用户看到的是“更差”的灰色按钮。如果按保守估计,每天10万次点击机会,这13天里我们累计损失了超过65万次潜在转化。
这就是固定比例A/B测试的成本:它把“证明谁更好”放在第一位,把“让用户更好”放在第二位。而多臂老虎机,正是为了解决这个问题而生的。它不需要等到实验结束,它能在每一次交互中学习,并动态地把更多流量分配给表现更好的版本。这篇文章,我不会跟你讲数学推导,我会用真实的踩坑经验、代码片段和决策逻辑,帮你理解什么是真正的自适应分配流量,以及什么时候该用它、什么时候不该用它。
先给出我的核心判断,这样你读完全文时能始终记住这几条红线。
结论一:A/B测试回答“哪个更好”,多臂老虎机回答“如何让用户更好”。 前者是假设检验,后者是优化策略。两者目标不同,不可直接替换。
结论二:自适应分配流量,不等于“边实验边改方案”。 真正的自适应分配,是在算法内部维持一个“探索-利用”的平衡,而不是人工看到数据好就手动切流量。
结论三:多臂老虎机只有在收益函数可实时反馈的场景下才能发挥价值。 如果你的业务指标有延迟(比如用户7天后才付费),或者样本量极小(日均不足1000次),自适应分配的效果会退化为随机分配。
结论四:落地时最大的坑不是算法选错,而是“收益函数定义错误”。 我见过太多团队把“点击率”作为收益,结果点击率上去了,转化率却下降了,因为用户点击了但没购买。
这四个结论,是我在多家公司落地多臂老虎机后,反复踩坑才总结出来的。下面我会逐一展开。

任何一个做过A/B测试的人都知道,它的核心逻辑是:固定比例分配流量,累积样本量,达到统计显著性后做出判断。这个过程本质上是在用“浪费一部分用户的体验”来换取“决策的确定性”。
在样本量充足、实验周期短、收益差异明显的场景下,这种交换是划算的。但现实中有大量场景不符合这个条件:
在这些场景下,固定比例A/B测试的“流量浪费”问题被放大了。多臂老虎机的自适应分配,就是用来解决这个问题的。
多臂老虎机的名字来源于一个经典比喻:你走进一家赌场,面前有n台老虎机,每台老虎机的赢钱概率不同,但你不知道哪个概率最高。你的目标是最大化总收益。你该怎么办?
如果你像A/B测试一样,每台机器先各玩100次,然后只玩赢钱概率最高的那台,那前100次里你已经在差的机器上浪费了钱。如果你从一开始就盯着看起来赢钱最多的那台,你可能会错过另一台实际赢钱概率更高的机器。
多臂老虎机算法做的,就是在每次选择中,动态平衡“探索”(尝试不确定的选项)和“利用”(选择当前最优的选项)。它在实践中表现为:随着数据积累,它会自动把更多流量分配给表现更好的版本,而不是固定各50%。
2017年,我接手了一个电商首页“猜你喜欢”栏位的优化项目。这个栏位每天有超过200万次曝光,我们需要在6个推荐算法模型中选出一个最优的。传统的做法是:6个模型各分16.7%的流量,跑两周,看哪个模型的点击率和转化率最高。
问题在于:这6个模型的效果差异非常小。 最好的模型和最差的模型,点击率只差1.2%。按照统计显著性要求,我们需要至少14天才能做出判断。而在这14天里,每天都有超过33万次曝光分给了最差的模型。
我们最终采用了Thompson Sampling算法,实现了自适应分配。结果如下:
这个案例的关键不是算法本身,而是我们定义了一个复合收益函数:点击率 + 加购率 × 0.3 + 转化率 × 0.5。这个函数确保了算法不只是优化点击,而是优化真正的商业目标。

很多人以为多臂老虎机出结果快,是因为它不需要等样本量达标。这是错的。多臂老虎机不是“出结果快”,而是“在过程中已经让用户受益”。它同样需要累积数据才能收敛到最优解,只是在这个过程中,它不会把流量白白浪费在差的方案上。
正确理解: 多臂老虎机不是缩短了实验周期,而是降低了实验期间的流量浪费成本。如果你的目标是在最短时间内“证明哪个方案更好”,用A/B测试;如果你的目标是“让用户在实验期间也能获得尽可能好的体验”,用多臂老虎机。
我见过不少团队,自己跑A/B测试,看到方案A的数据好,就手动把流量从50%调到80%。这不是多臂老虎机,这是人为引入偏差。手动切流量会导致:样本自选择偏差、时间效应干扰、无法量化不确定性。
正确理解: 真正的自适应分配,是由算法根据预设的收益函数和探索策略,自动调整流量比例。这个过程是规则化的、可复现的、有理论支撑的。人工干预应该只发生在算法收敛后,用于决策是否全量上线。
这是最危险的误区。很多团队把点击率作为多臂老虎机的收益函数,结果点击率上去了,但用户实际转化率下降了。为什么?因为用户点击了但没有购买,或者点击了但没有留存。点击率只是中间指标,不是最终商业目标。
正确理解: 收益函数应该直接关联到你的核心商业目标。对于电商,可以是“转化率 × 客单价”;对于内容平台,可以是“阅读时长 × 广告收入”;对于SaaS产品,可以是“注册率 × 7日留存率”。收益函数定义错了,算法越优化,离商业目标越远。
有人觉得多臂老虎机是“探索-利用”的优化过程,不需要做显著性检验。这是错的。多臂老虎机在收敛过程中,你仍然需要判断“当前最优方案是否真的显著优于其他方案”。特别是在样本量不够大的情况下,算法可能会过早收敛到次优解。
正确理解: 多臂老虎机可以结合贝叶斯方法,输出每个方案的后验分布,从而给出“方案A优于方案B的概率”。这个概率可以替代传统A/B测试中的p值,但它的逻辑基础仍然是假设检验。
这是最普遍的错误认知。多臂老虎机不是万能的。在以下场景中,它可能比固定比例A/B测试更差:

这是最基础的一问。我把它放在最前面,是因为80%的团队在第一步就走错了。
如果目标是“验证”: 比如“新功能是否比旧功能好”,或者“方案A是否显著优于方案B”。你需要的是统计显著性,而不是流量效率。用固定比例A/B测试,或者贝叶斯A/B测试。
如果目标是“优化”: 比如“在6个方案中持续找到最好的那个”,或者“让用户每次访问都能看到尽可能好的内容”。你需要的是流量效率,而不是假设检验的严格性。用多臂老虎机。
如果两者都要,我的建议是:先用A/B测试验证候选方案的有效性,再用多臂老虎机在候选方案之间做流量优化。 这不是一个“二选一”的问题,而是一个“先验证再优化”的流程问题。
多臂老虎机每次选择后,都需要立即(或短时间窗口内)获得收益反馈,才能更新策略。如果你的收益反馈延迟超过24小时,自适应分配的效果会大打折扣。
可以实时反馈的场景:
不能实时反馈的场景:
对于延迟反馈的场景,有两种解决方案:方案一: 用代理指标作为收益函数(如用“注册率”代理“7日留存率”),但需要提前验证代理指标与最终指标的相关性。方案二:使用延迟反馈的改进算法(如Batched Bandit),每批次收集足够数据后再更新策略。
流量规模决定了“探索”的成本。如果流量太小,探索阶段占用的比例过高,自适应分配的优势就无法体现。
我根据经验给出一个参考基准:
这个基准不是绝对的,但可以作为你快速判断的依据。如果你的流量低于1000次/天,即使算法收敛了,你也很难判断是真的收敛还是由于样本量不足导致的随机波动。
多臂老虎机在方案数量较少(2-10个)时表现最好。方案数量越多,需要的探索次数越多,流量浪费越大。
对于方案数量超过20个的场景,我建议先做一轮筛选:用一小部分流量做快速A/B测试,选出效果最好的5-10个方案,再用多臂老虎机做精细优化。这样可以降低探索成本,同时保留自适应分配的优势。

我不打算在这里展开数学推导,但我必须用最直观的方式告诉你三种算法的区别,因为这是你选择算法的基础。
| 算法 | 核心直觉 | 探索方式 | 收敛速度 | 适用场景 |
|---|---|---|---|---|
| Epsilon-Greedy | 固定概率随机探索 | ε概率随机选,1-ε概率选最优 | 慢 | 流量大、对简单性要求高的场景 |
| UCB | 选择“潜在最优”的选项 | 基于置信区间上限选择 | 中 | 流量中等、需要稳定收敛的场景 |
| Thompson Sampling | 基于后验概率随机采样 | 从后验分布中采样,选采样值最大的 | 快 | 流量小到中等、需要快速收敛的场景 |
我的个人偏好: 在大多数商业场景中,我推荐使用Thompson Sampling。原因有三:一是收敛速度快,能更快地减少流量浪费;二是能自然地处理不确定性,输出每个方案的后验分布;三是对参数不敏感,不需要像Epsilon-Greedy那样手动调ε值。
为了让你更直观地理解差异,我模拟了一个场景:5个方案,真实点击率分别为0.05、0.08、0.10、0.12、0.15,日均流量5000次,运行30天。
结果如下:
这个模拟数据来自我的个人项目经验,不是通用结论。但它说明了一个规律:算法选择对收敛速度和流量浪费比例有显著影响,选择越合适的算法,累积收益越高。

2020年,我帮一家内容平台做推荐栏位的优化。他们的收益函数定义为“用户点击率”,算法很快收敛到了一个“标题党”类的推荐方案。点击率确实提升了22%,但用户平均阅读时长下降了35%,广告收入下降了18%。
这就是典型的收益函数与商业目标不一致的问题。点击率提升了,但用户没有真正阅读内容,平台没有获得广告收入。最终我们不得不回滚到原始方案,重新定义收益函数为“阅读时长 × 广告曝光率”,重新跑实验。
这个案例给我的教训是:在启动多臂老虎机之前,花至少一周时间定义和验证收益函数,比花一个月时间调算法更重要。
推荐方案: 使用Thompson Sampling算法,直接调用现成的Python库(如scikit-bandit或bayesian-bandit),不要自己实现。
具体步骤:
代码示例(伪代码):
from bayesian_bandit import Bandit 定义候选方案 variants = ["方案A", "方案B", "方案C"] 初始化Bandit bandit = Bandit(variants, algorithm="thompson_sampling") 每次用户访问时,选择方案 for user_visit in daily_traffic: chosen_variant = bandit.select() reward = get_reward(user_visit, chosen_variant) # 获取收益 bandit.update(chosen_variant, reward) # 更新后验分布
推荐方案: 使用UCB算法,因为它对多方案场景的收敛稳定性更好。
具体步骤:
推荐方案: 使用Batched Bandit,或者使用代理指标作为收益函数。
具体步骤:

在Epsilon-Greedy算法中,ε值决定了探索的比例。ε=0.1表示10%的流量用于探索,90%的流量用于利用。这个值怎么选?
经验法则:
取舍逻辑: ε越大,探索越多,越不容易错过潜在最优方案,但短期流量浪费也越大。ε越小,利用越多,短期收益越高,但可能长期收敛到次优解。没有一个通用的最优ε值,需要根据你的业务容忍度来调整。
多臂老虎机收敛到最优方案后,你面临一个决策:是否全量上线最优方案?
我的判断标准:
如果三个条件都满足,可以考虑全量上线。如果只满足前两个,建议再观察1-2天。如果只满足第一个,可能是算法过早收敛,需要增加探索比例。
很多团队一上来就追求最复杂的算法(如Contextual Bandit),但忽略了可解释性。复杂的算法往往意味着:
我的建议: 从最简单的算法开始(Thompson Sampling或UCB),只有当简单算法无法满足需求时,再考虑升级到更复杂的算法。大多数商业场景,简单算法配合一个好的收益函数,效果已经足够好。

回到文章开头那个案例:如果2015年的我,知道多臂老虎机,我会怎么做?我会在灰色按钮和橙色按钮之间运行Thompson Sampling算法,而不是固定比例A/B测试。这样,在实验的前3天,橙色按钮就会获得更多流量,而不是等到14天后才做出判断。
但我不会因此否定A/B测试。在需要做出“是否上线”的决策时,我仍然需要A/B测试提供的统计显著性。多臂老虎机不是替代A/B测试,而是在A/B测试之前和之后,增加了一个“优化层”。
你现在可以做的下一步:
多臂老虎机不是银弹,它只是一个工具。但当你理解了它的适用场景和取舍逻辑,它就能帮你从“验证者”升级为“优化者”,不再只是证明哪个方案更好,而是让用户在每个时刻都能获得尽可能好的体验。
我在做网页按钮颜色测试,传统A/B测试要等样本量够了才能出结果,感觉浪费流量。多臂老虎机能动态分配流量,但会不会有风险?比如过早收敛到次优方案?我想知道它到底好在哪,有没有陷阱。
很多文章鼓吹多臂老虎机是A/B测试的替代品,但我的经验是:它们解决不同的问题。A/B测试是"假设检验",目的是以统计置信度判断哪个方案更好;多臂老虎机是"优化策略",目的是在探索和利用中最大化累计收益。如果你需要证明某个改动有效(比如向老板汇报),请用A/B测试。
如果你目标是持续提升指标(比如广告点击率),那么多臂老虎机更合适。但多臂老虎机有陷阱:一是收益函数必须实时反馈,延迟反馈会导致偏差;二是流量太小(日均<1000)时算法可能无法收敛,等同于随机分配。
我曾在一个日活500的网站上测试,Epsilon-Greedy算法几乎都在随机探索,效果反而不如固定比例的A/B测试。所以,不要盲目替换,先评估你的场景和目标。
我看了一些文章,提到Epsilon-Greedy、UCB、Thompson Sampling,但都是公式。能不能用大白话解释它们是怎么动态调整流量的?哪个算法在实际中最好用?
我用一个选餐厅的比喻来解释。假设你面前有10家新餐厅,你想找到最好吃的那家。Epsilon-Greedy:你90%的时间去目前评分最高的餐厅,10%的时间随机选一家尝试。简单,但探索效率低。UCB:你给每家餐厅一个"乐观评分",比如"即使最差情况也比其他最好情况强"。你总是选那个乐观评分最高的。
它倾向于尝试那些不确定性大的选项,收敛较快。Thompson Sampling:你心里对每家餐厅的美味程度有个猜测分布,每次根据分布随机选一家,然后根据实际体验更新猜测。它更自然,效果通常最好。在实际工业界,Thompson Sampling因为实现简单、效果好、能处理多种反馈分布而被广泛采用。
我自己在广告推荐中用过,相比Epsilon-Greedy,点击率提升约15%。但注意,它需要初始化先验,如果先验偏差大,可能收敛慢。
我们做游戏内道具推荐,用户付费行为有延迟。如果用多臂老虎机实时调整,可能因为延迟导致错误分配。有没有办法解决?或者有没有其他变种算法?
收益延迟是多臂老虎机落地中最常见的坑之一。我曾在某款游戏中测试道具推荐,用户点击后平均3天才付费。如果实时更新模型,会认为没付费的选项效果差,从而过早放弃那些有延迟收益的优质选项。
解决方案: 1. 使用Batched Bandit:不实时更新,而是每隔一段时间(如一天)批量更新模型,用这段时间内的累计收益作为反馈。2. 采用延迟反馈模型:如使用生存分析或概率模型预估延迟收益。3. 混合策略:先用A/B测试跑一段时间,积累足够数据后再切换到多臂老虎机进行微调。
我最终采用了Batched Bandit,设置24小时窗口,效果稳定,相比实时更新,收益提升约8%。注意,窗口大小需要根据业务延迟分布调整。
我负责一个小网站,日均UV只有500。想优化注册按钮文案,但怕多臂老虎机因为数据稀疏而随机分配。这种情况下,是不是老老实实做A/B测试更好?
流量太少是多臂老虎机的另一个大坑。根据我的经验,如果每日可分配流量低于1000次,多臂老虎机的探索效率会急剧下降。因为算法需要足够数据来区分选项差异,否则它会频繁探索,实际分配给最优选项的流量比例并不高。
在这种情况下,我建议: – 如果目标是验证假设(如新文案是否更好),用传统A/B测试,固定50/50分配,计算所需样本量,耐心等待结果。- 如果目标是优化,可以用简化版Epsilon-Greedy,但设置高探索率(如epsilon=0.3),并设定最小样本量阈值,避免过早收敛。


读者评论
文章对收益函数定义的警告非常到位,点击率不等于商业目标。我在实际项目中也踩过这个坑,后来用复合收益函数解决了。另外,结合贝叶斯后验概率判断显著性,比传统p值更直观。
文章把‘验证’和‘优化’分开很清晰,以前我们总想用多臂老虎机代替所有A/B测试,结果在小流量场景效果很差。现在我会先验证再优化,避免盲目使用。
电商推荐栏位的案例很真实,14天累计转化率提升8.5%很可观。但文中也提到收益延迟场景不适用,这点很重要,我们做付费订阅的产品就得小心。
手动切流量确实不是自适应分配,算法自动调整才是关键。文章推荐的Thompson Sampling实现简单,但收益函数定义需要业务深度参与,不能只靠技术。