Başlık Testlerinde Klasik A/B'yi Terk Etmek: Optimizely'nin Çok Kollu Haydut (MAB) Geçişi
Statik A/B testlerinde, 'kaybeden' varyasyonun getirdiği trafik ve dönüşüm kaybını sessizce kabullenmek zorunda değilsiniz.

Yükleniyor...
Statik A/B testlerinde, 'kaybeden' varyasyonun getirdiği trafik ve dönüşüm kaybını sessizce kabullenmek zorunda değilsiniz.
Dijital optimizasyonun altın standardı olarak kabul edilen geleneksel A/B testleri, büyük dil modellerinin (LLM) hayatımıza girmesiyle birlikte ciddi bir ölçeklenebilirlik kriziyle karşı karşıya kaldı. Klasik t-testi ve p-değeri yaklaşımları, iki ya da üç varyasyonu test etmek için tasarlanmıştır. Ancak elinizde GPT-4 API'si ile saniyeler içinde üretilmiş 50 farklı başlık varyasyonu olduğunda, geleneksel hipotez testleri işlevsizleşir.
Optimizely, bu mühendislik çıkmazını aşmak için statik trafik dağıtımına dayanan klasik A/B testi modelinden, dinamik ve gerçek zamanlı bir optimizasyon tekniği olan Çok Kollu Haydut (Multi-Armed Bandit - MAB) algoritmasına geçiş kararı aldı. Bu karar, yalnızca istatistiksel bir tercih değil; aynı zamanda öğrenme sürecinde kaybedilen dönüşüm fırsatlarını (regret) minimize etmeyi hedefleyen finansal bir zorunluluktu.
Geleneksel A/B testlerinde, test süresi boyunca tüm varyasyonlara eşit oranda (örneğin 4 varyasyon için %25/%25/%25/%25) trafik gönderilir. İstatistiksel anlamlılığa (örneğin %95 güven aralığına) ulaşana kadar bu oranlar değiştirilmez. Bu durum, test tamamlanana kadar zayıf performans gösteren varyasyonlara da binlerce kullanıcının yönlendirilmesine, dolayısıyla doğrusal bir dönüşüm kaybına (linear regret, O(T)) yol açar.
İşin içine LLM'lerin ürettiği yüzlerce içerik varyasyonu girdiğinde ise istatistiksel bir felaket yaşanır: Çoklu Karşılaştırma Problemi (Multiple Testing Problem). Optimizely Stats Engine teknik dökümantasyonuna göre, %5 anlamlılık seviyesinde (alpha=0.05) 100 farklı LLM varyasyonunun aynı anda test edilmesi durumunda en az bir yalancı pozitif (Tip I hata) elde etme olasılığı %99.4'e fırlar. Bu hatayı engellemek için kullanılan Bonferroni düzeltmesi gibi yöntemler ise ihtiyaç duyulan örneklem boyutunu (sample size) o kadar devasa seviyelere çıkarır ki, testleri pratikte imkansız kılar.
Multi-Armed Bandit algoritmaları, keşif (exploration) ve sömürü (exploitation) arasındaki dengeyi dinamik olarak yönetir. Algoritma, yüksek performans gösteren varyasyonların ağırlığını gerçek zamanlı olarak artırarak kümülatif kaybı logaritmik seviyeye (O(log T)) indirger.
Optimizely, bu süreçte Thompson Örneklemesi (Thompson Sampling) algoritmasını kullanır. Thompson Örneklemesi, Bayesyen bir yaklaşımdır ve olasılık dağılımlarını temel alır. Dönüşüm oranlarını tek bir statik değer olarak tahmin etmek yerine, her varyasyon için bir Beta Dağılımı (Beta Distribution) tanımlanır.
Beta dağılımı iki parametre ile yönetilir:
Her yeni kullanıcı sisteme geldiğinde, her varyasyonun Beta dağılımından rastgele bir olasılık değeri örneklenir (sample edilir). En yüksek değeri alan varyasyon, o kullanıcıya gösterilir. Kullanıcının aksiyonuna göre (tıklama veya dönüşüm) ilgili varyasyonun $\alpha$ veya $\beta$ parametresi güncellenir. Böylece, başarılı varyasyonların dağılımı sağa (1'e doğru) kayarken, başarısız varyasyonlarınki sola (0'a doğru) kayar ve sonraki örneklemelerde seçilme şansları dinamik olarak azalır.
Sistem, şu adımlarla gerçek zamanlı bir döngü halinde çalışır:
"Abonelik sayfasındaki ana başlık için dönüşüm odaklı 50 farklı varyasyon üret.") zengin bir havuz oluşturulur.Optimizely'nin klasik A/B testlerinden Thompson Sampling tabanlı MAB modeline geçişiyle elde edilen performans verileri şu şekildedir:
Kendi içerik altyapınızda bu sistemi uygulamak için karmaşık SaaS araçlarına bağımlı değilsiniz. Fidelity tarafından açık kaynaklı olarak geliştirilen mabwiser Python kütüphanesi, Thompson Sampling ve Contextual Bandit algoritmalarını hızlıca hayata geçirmenizi sağlar.
İşte basit bir Thompson Örneklemesi uygulaması için kullanabileceğiniz Python şablonu:
from mabwiser.mab import MAB, LearningPolicy, NeighborhoodPolicy
# LLM tarafından üretilen 3 farklı başlık varyasyonu (kollar)
variations = ["baslik_1", "baslik_2", "baslik_3"]
# Thompson Sampling ile MAB modelinin başlatılması
mab = MAB(arms=variations,
learning_policy=LearningPolicy.ThompsonSampling())
# Soğuk başlangıç verileri (Geçmiş tıklama/tıklamama verileri)
# Her satır: [varyasyon, ödül (1=tıklandı, 0=tıklanmadı)]
historical_decisions = ["baslik_1", "baslik_2", "baslik_3", "baslik_1"]
historical_rewards = [1, 0, 1, 0]
# Modeli eğit
mab.fit(decisions=historical_decisions, rewards=historical_rewards)
# Bir sonraki kullanıcıya hangi başlığın gösterileceğini seç
next_best_variation = mab.predict()
print(f"Gösterilmesi gereken başlık: {next_best_variation}")
Önemli Risk Uyarısı: MAB algoritmaları dönüşümü maksimize etmek için mükemmeldir ancak nedensellik (causality) analizi için uygun değildir. Eğer amacınız akademik olarak "hangi kelimenin neden daha iyi performans gösterdiğini" kesin istatistiksel güven aralıklarıyla kanıtlamaksa, MAB kullanımı yanıltıcı olabilir. Çünkü sistem zayıf varyasyonlara giden trafiği hızla kestiğinden, o varyasyonlar hakkında yeterli veri toplanamaz ve uzun vadeli bilimsel çıkarımlar yapılamaz.