AxeCrafted Blog

Pensamentos errantes de uma mente errante.

EN | PT

Vencendo com Multi-Armed Bandits: Experimentação Inteligente em Databricks

Publicado em 18 de agosto de 2025

Realizar experimentos muitas vezes parece um jogo de apostas. Você deve direcionar mais volume para a variante A ou dar outra chance para a variante B? O teste A/B tradicional divide o tráfego e espera — mas e se você pudesse adaptar continuamente, maximizando ganhos conforme aprende? Entre os Multi-Armed Bandits: uma elegante mistura de probabilidade, estatística e tomada de decisão que transforma experimentos em motores dinâmicos de otimização.

Assim como escolher a máquina certa em um cassino, Multi-Armed Bandits ajudam a decidir qual opção merece sua próxima moeda — aqui, a moeda é tráfego, impressões ou atenção do usuário. Vamos explorar como funcionam, por que superam os testes estáticos e como aplicamos isso no Databricks.

O Problema dos Testes A/B Estáticos

Testes A/B tradicionais dividem o tráfego entre variantes e esperam até que os resultados alcancem significância estatística. A divisão não precisa ser 50/50 — você pode usar 90/10 ou outras proporções — mas quanto menor a alocação para uma variante, mais tempo leva para reunir evidências suficientes.

Na nossa empresa, usamos bastante testes A/B para mudanças estruturais grandes na experiência do usuário. Pense em um novo fluxo de onboarding, uma página de pagamento redesenhada ou uma mudança de navegação no app. Nessas decisões, queremos o rigor e a certeza de um teste A/B tradicional.

Mas quando se trata de experimentação rápida — como testar assuntos de e-mail, templates de CRM ou novas propostas de valor — depender apenas de A/B estático nos atrasaria muito. Isso porque o A/B tradicional tem algumas desvantagens embutidas:

  • Oportunidade perdida: variantes mais fracas continuam recebendo tráfego até o fim do teste.
  • Aprendizado lento: alcançar significância pode levar dias ou semanas, especialmente com divisões desbalanceadas.
  • Sem adaptatividade: uma vez definida a divisão, o sistema não ajusta conforme o desempenho.

É aí que os Multi-Armed Bandits brilham: equilibram continuamente exploração (testar variantes incertas) com exploração (apostar nos melhores desempenhos), adaptando alocações em tempo real conforme os resultados chegam.

A Intuição dos Multi-Armed Bandits

Imagine-se entrando em um cassino com várias máquinas caça-níqueis. Cada máquina (ou "braço") tem uma probabilidade de pagamento desconhecida — algumas generosas, outras não. Você tem um número limitado de moedas, e cada moeda gasta é uma chance de aprender qual máquina é mais lucrativa.

O dilema: se você jogar apenas em uma máquina desde o início, pode perder uma melhor logo ao lado. Se espalhar suas moedas igualmente, vai desperdiçar jogadas nas máquinas ruins.

A estratégia ótima está no meio: experimentar o suficiente para explorar o cenário, mas também apostar mais nas que parecem promissoras (explorar).

Essa é a essência do problema dos Multi-Armed Bandits. Cada "tentativa" — seja puxar a alavanca de uma máquina ou enviar um assunto de e-mail — traz mais informação sobre o verdadeiro pagamento. Com o tempo, a estratégia ajusta, direcionando cada vez mais moedas para as máquinas que entregam os melhores retornos.

No marketing ou produto, cada "braço" é uma variante — um assunto de e-mail, um design de landing page, uma estratégia de recomendação. Cada "moeda" é uma unidade de atenção do usuário — um envio, uma impressão ou uma visita. O framework realoca o tráfego continuamente, recompensando bons desempenhos sem ignorar totalmente os incertos, para descobrir vencedores mais rápido e minimizar arrependimentos.

Uma Abordagem Bayesiana com Distribuições Beta

Ao experimentar, cada interação do usuário é basicamente um teste binário: sucesso ou fracasso (clicou ou não, converteu ou não). Isso se encaixa naturalmente na distribuição binomial, que descreve a probabilidade de observar um certo número de sucessos em um número fixo de tentativas.

Por exemplo:

  • Se enviarmos 1.000 e-mails e obtivermos 30 cliques, podemos pensar nisso como 1.000 testes de Bernoulli (cada usuário clica = 1 ou não = 0).
  • A distribuição binomial nos diz a probabilidade de ver exatamente 30 sucessos (ou 31, ou 29) dado uma taxa de clique (CTR) "verdadeira" subjacente.

O desafio: não sabemos a CTR verdadeira de antemão. É aí que entra a estatística bayesiana.

Entra a Distribuição Beta

A distribuição Beta é parceira natural da binomial porque serve como prior conjugado. Em outras palavras: permite atualizar nossas crenças suavemente conforme novos dados chegam.

Para cada variante i, modelamos o CTR como:

$$CTR_i \sim \text{Beta}(\alpha, \beta),$$

onde $\alpha$ representa o número de sucessos observados (cliques), $\beta$ o número de fracassos (não cliques), e juntos definem uma distribuição de probabilidade sobre o verdadeiro CTR.

Intuitivamente:

  • Uma variante com poucos dados tem uma curva larga e incerta — pode ser ótima ou péssima.
  • Uma variante com muitos dados tem uma curva estreita e precisa — estamos muito mais confiantes sobre seu CTR.

Exemplo

Vamos comparar três variantes, todas com ~3% de CTR mas tamanhos de amostra diferentes:

Envios Cliques CTR Intervalo de Confiança 95%
1.000 30 2,955% [2,11%, 4,25%]
10.000 300 2,995% [2,68%, 3,35%]
100.000 3.000 2,999% [2,90%, 3,11%]

Note que a média do CTR permanece igual, mas o intervalo de confiança diminui conforme os dados aumentam. Essa é a ideia central: nem todo CTR de 3% é igual — a quantidade de evidência muda o quanto devemos confiar nele.

Podemos visualizar isso plotando as distribuições Beta para cada caso. Com menos amostras, a curva é larga e incerta. Com mais amostras, fica estreita e concentrada em torno de 3%.

Distribuições Beta para Diferentes Tamanhos de Amostra

Thompson Sampling em Ação

Agora temos, para cada variante, uma distribuição posterior sobre seu verdadeiro CTR. Pense em cada curva Beta como nossa crença atualizada após observar sucessos e fracassos, ou seja, usando $\alpha = \alpha + \text{cliques}$ e $\beta = \beta + (\text{envios} - \text{cliques})$ para atualizar o prior.

Thompson Sampling transforma essa incerteza em ação:

  1. Para cada variante, sorteie uma amostra aleatória de sua posterior (curva Beta).
  2. Selecione a variante com o maior valor sorteado para aquela "tentativa".
  3. Repita muitas vezes; a proporção de "vitórias" por variante estima a probabilidade de ser a melhor.

Essas probabilidades de vitória são pesos naturais para o próximo lote. Variantes com posteriors mais largas (mais incertas) ainda vencem em alguns mundos simulados (exploração), enquanto variantes consistentemente fortes vencem com frequência e recebem mais tráfego (exploração).

Exemplo de alocação por simulação

Cenário: três variantes com ~3% de CTR e tamanhos de amostra diferentes
(1.000 envios / 30 cliques), (10.000 envios / 300 cliques), (100.000 envios / 3.000 cliques).

  • Parâmetros posteriores (assumindo prior Beta(1,1)): α = [31, 301, 3001], β = [971, 9701, 97001].
  • Probabilidade estimada de cada variante ser a melhor (via simulação Thompson): [0,491, 0,282, 0,228].
  • Alocação sugerida para o próximo lote: [49,1%, 28,2%, 22,8%].

Mesmo com médias de CTR semelhantes, a menor amostra tem posterior mais larga e às vezes sorteia alto, vencendo em muitos mundos simulados. Isso é exploração. Conforme a evidência cresce, os posteriors se estreitam e a variante boa começa a dominar a alocação. Isso é exploração.

Em produção, você pode adicionar limites mínimos de alocação e rampas máximas, mantendo o comportamento adaptativo.

Por trás dos panos, os sorteios vêm dos posteriors Beta atualizados (variáveis aleatórias Beta), e as contagens de vitórias nas simulações aproximam a probabilidade de cada variante ser o "melhor braço".

Arquitetura: Multi-Armed Bandits no Databricks + Engage (AWS)

Nossa ferramenta de CRM usada para enviar mensagens aos usuários se chama Engage e foi construída internamente. Ela usa principalmente AWS SES para enviar e-mails aos clientes, e os dados são rastreados em tempo real usando Kinesis com Databricks, alimentando tabelas Delta. Usuários podem configurar testes AB na ferramenta com N variantes e publicá-los — o percentual de volume alocado para cada variante será atualizado usando o framework acima.

Em alto nível, separamos dois loops: um loop de dados em tempo real que mantém as métricas do CRM atualizadas (≤ ~1 minuto), e um loop de decisão que periodicamente atualiza os pesos das variantes usando Bandits. O loop de decisão lê métricas agregadas do Delta (Gold), calcula novos pesos via Thompson Sampling e publica de volta no Engage, onde os usuários são atribuídos determinísticamente às variantes.

Arquitetura CRM + Bandit

Quadro A - Fluxo de Dados CRM em Tempo Real (≤ ~1 min de latência)

  • Engage dispara envios com experiment_id e variant_id.
  • E-mails saem via Amazon SES; eventos de rastreamento (envio, entrega, bounce, abertura, clique) chegam via SNS, que são alimentados no Amazon Kinesis e consumidos por um job de streaming no Databricks.
  • O job de streaming processa e enriquece eventos (user_id, experiment_id, variant_id, timestamps) e grava em tabelas na arquitetura Medallion.
  • Mantemos uma tabela Delta Gold por variante: envios, aberturas, cliques, descadastros e outras métricas por experiment_id × variant_id (atualização minuto a minuto).

Quadro B - Loop de Alocação Bandit (a cada X minutos)

  • Um agendador invoca o job Bandit para cada experimento ativo.
  • O job lê a tabela Gold e atualiza os posteriors (alpha, beta) por variante, usando a conversão configurada (clique, abertura ou conversão in-site).
  • O job executa Thompson Sampling para estimar a probabilidade de ser o melhor para cada variante e deriva novos pesos.
  • O job grava pesos e metadados em uma tabela Delta de alocações e publica os pesos atuais na configuração de AB Test do Engage (DynamoDB).

Trade-offs, Limites e Quando Usar o Quê

Bandits não são mágica; são uma escolha de política. Eles brilham quando velocidade de aprendizado e adaptação contínua importam — assuntos de e-mail, templates, ofertas rápidas. São menos interessantes para decisões lentas e de alto impacto (ex: redesign de checkout), onde o A/B clássico traz a defesa que você quer.

Dois pontos práticos mantêm os bandits honestos. Primeiro, priors: se você conhece o CTR histórico de um canal, use um prior baseado em dados para evitar explorar demais em cold start. Segundo, limites: imponha uma alocação mínima por braço, limite rampas entre ciclos e defina regras de parada (ex: graduar automaticamente um vencedor após alta probabilidade sustentada de ser o melhor). Se o agendador atrasar, use os últimos pesos conhecidos ou uma divisão conservadora. Essas práticas evitam o problema do "sorteio ruim inicial" e mantêm a produção estável.

O Que Aprendemos (e Próximos Passos)

Após adotar esse loop, duas coisas ficaram claras. Primeiro, tempo até o vencedor caiu — não por sorte, mas porque a política parou de desperdiçar volume em variantes ruins. Segundo, confiança ficou visível: ao plotar posteriors e intervalos, fica claro quando um "CTR de 3%" é respaldado por 1k ou 100k envios, permitindo decisões informadas para produto e CRM.

Uma próxima evolução natural é um recompensa composta, não um único métrico. O CRM precisa equilibrar reputação com provedores, conversão in-site e desengajamento. Uma recompensa escalar como

$$ \text{recompensa} = w_\text{abertura}\cdot \text{abertura} + w_\text{clique}\cdot \text{clique} + w_\text{conv}\cdot \text{conversao} \; - \; w_\text{descad}\cdot \text{descadastro} $$

permite capturar esses trade-offs explicitamente. Otimizar só CTR pode destacar variantes que também aumentam descadastros — já vimos esse padrão e não queremos promovê-lo. Na prática, os pesos devem ser normalizados e gerenciados com cuidado. Falaremos de recompensas compostas e bandits com restrições em um post futuro.

A próxima fronteira são os Bandits Contextuais — deixar que features (canal, dispositivo, segmento, horário) influenciem a política, tornando o "melhor braço" dependente do contexto. É o mesmo backbone bayesiano com uma camada de roteamento mais inteligente. Comece simples, instrumente bem e evolua quando os dados mostrarem que a complexidade extra vale a pena.

Considerações Finais

Se detecção de anomalias é sobre encontrar problemas rápido, Multi-Armed Bandits são sobre encontrar oportunidades mais rápido. Transformam experimentação de divisão fixa em um sistema vivo que aprende onde sua atenção gera retorno. Na prática, a matemática é modesta, o footprint operacional é pequeno e o ganho — menos envios desperdiçados, convergência mais rápida, confiança mais clara — se acumula com o tempo.

Ferramentas simples, bem combinadas, ainda vencem.

Foto de Leonardo Machado

Leonardo Machado

Um cara do Brasil. Ama sua esposa, gatos, café e dados. Frequentemente encontrado tentando dar sentido aos números ou cozinhando algo duvidoso.