Dijital pazarlama ve büyüme mühendisliği ekiplerinin yıllardır ezbere uyguladığı bir kural vardır: "Yeni bir başlığı test etmek istiyorsan, trafiği yarı yarıya böl ve istatistiksel anlamlılığa (p-value < 0.05) ulaşana kadar bekle." Ancak bu yaklaşım, özellikle binlerce içerik varyasyonunun üretilebildiği modern yapay zeka çağında ciddi bir finansal ve operasyonel verimsizlik doğurur.
Klasik A/B testleri, test süresince trafiği %50/%50 gibi sabit oranlarda bölerek düşük performans gösteren varyasyonlara gereksiz trafik gönderir ve yüksek bir "fırsat maliyeti" (regret) yaratır. Peki, kazanan varyasyonu ararken kaybettiğimiz bu trafiği kurtarmak matematiksel olarak mümkün mü?
Bu yazıda, büyük dil modelleri (LLM) ile üretilen yüzlerce başlık varyasyonunu, klasik A/B testlerinin hantal süreçlerine takılmadan optimize etmenin teknik altyapısını ve Çok Kollu Haydut (Multi-Armed Bandit - MAB) algoritmasının matematiksel motorunu inceliyoruz.
Keşif ve Sömürü İkilemi: Klasik A/B Neden Trafik Kaybettirir?
Geleneksel test senaryolarında süreç iki aşamadan oluşur: Önce sadece veri toplarsınız (keşif / exploration), ardından kazanan varyasyonu seçip tüm trafiği ona yönlendirirsiniz (sömürü / exploitation). Bu iki aşama arasında keskin bir duvar vardır.
Örneğin, elinizde bir e-ticaret sitesinin sepet dönüşüm oranını artıracak iki farklı başlık olsun. A başlığı %5, B başlığı ise %2 dönüşüm oranına sahip olsun. İstatistiksel olarak güvenli bir karara varmak için her iki varyasyona da 10.000'er kullanıcı göndermeniz gerekir. Bu süreçte, bariz şekilde daha kötü performans gösteren B varyasyonuna 10.000 kullanıcıyı bilerek göndermiş olursunuz.
Çok Kollu Haydut (MAB) algoritmaları ise bu iki aşamayı birleştirir. Trafiği performansa göre dinamik olarak yönlendirerek keşif ve sömürü süreçlerini eş zamanlı yürütür. Google Research tarafından yapılan çalışmalar, Thompson Örneklemesi tabanlı MAB algoritmalarının, geleneksel sabit oranlı A/B testlerine kıyasla optimizasyon sürecinde kaybedilen potansiyel dönüşüm oranını (regret) %30 ila %40 oranında azalttığını göstermektedir.
Thompson Örneklemesi ve Beta Dağılımının Matematiği
MAB algoritmalarının kalbinde, Bayesyen olasılık teorisine dayanan Thompson Örneklemesi (Thompson Sampling) yatar. Bu yaklaşım, her bir varyasyonun dönüşüm oranını tek bir statik değer yerine bir olasılık dağılımı olarak modeller.
Bu modellemede, başarı (tıklama/dönüşüm) ve başarısızlık (gösterim yapılmasına rağmen tıklanmaması) sayılarını tutmak için Beta Dağılımı (Beta Distribution) kullanılır. Matematiksel olarak, bir varyasyonun performansı $Beta(\alpha, \beta)$ parametreleri ile güncellenir.
Burada:
- $\alpha$ (Alfa): Başarı sayısı (Örn: Tıklama)
- $\beta$ (Beta): Başarısızlık sayısı (Örn: Tıklamama)
Sisteme hiçbir veri henüz toplanmamışken, Microsoft Research bünyesindeki Vowpal Wabbit dokümantasyonunda da belirtildiği gibi, başlangıç (prior) parametreleri olarak Beta(1, 1) kullanılır. Bu, tamamen düz ve her ihtimalin eşit derecede olası olduğu bir dağılımı temsil eder.
Başlangıç Durumu (Veri Yok):
Başlık 1: Beta(1, 1) -> Ortalama dönüşüm beklentisi %50 (Belirsizlik maksimum)
Başlık 2: Beta(1, 1) -> Ortalama dönüşüm beklentisi %50
100 Gösterim Sonrası Güncelleme:
Başlık 1: 10 Tıklama, 90 Tıklamama -> Beta(1 + 10, 1 + 90) = Beta(11, 91)
Başlık 2: 2 Tıklama, 98 Tıklamama -> Beta(1 + 2, 1 + 98) = Beta(3, 99)
Her yeni kullanıcı sisteme girdiğinde, her başlığın güncel Beta dağılımından rastgele birer sayı çekilir (sampling). En yüksek değeri getiren başlık o kullanıcıya gösterilir. Başlık 1'in dağılımı artık daha yüksek değerler üretmeye meyilli olduğu için, sonraki kullanıcılarda otomatik olarak daha fazla trafik almaya başlar. Ancak Başlık 2'nin üzerindeki belirsizlik (varyans) tamamen yok olmadığı için, algoritma küçük bir ihtimalle de olsa ona da şans vermeye (keşif yapmaya) devam eder.
LLM ile Yüksek Çeşitlilikte Varyasyon Üretimi
MAB motorunun gücü, beslendiği varyasyonların kalitesiyle doğrudan ilişkilidir. OpenAI GPT-4o API'si üzerinden başlık varyasyonları üretirken temperature parametresini 0.7 ile 0.9 arasında konumlandırmak kritik bir dengedir.
- Düşük Sıcaklık (< 0.5): Birbirine çok benzeyen, semantik çeşitliliği düşük başlıklar üretir.
- Yüksek Sıcaklık (> 0.9): Yaratıcı ancak marka dilinden uzaklaşan, dil bilgisi hatalarına açık çıktılar üretir.
0.8 sıcaklık değeriyle üretilen 100+ başlık, kullanıcıların farklı psikolojik tetikleyicilerine (fiyat hassasiyeti, aciliyet, sosyal kanıt) hitap eden geniş bir havuz oluşturur.
Ancak burada teknik bir risk mevcuttur: LLM'ler tarafından üretilen binlerce başlık varyasyonunun semantik benzerliği yüksek olduğunda, MAB algoritmalarının "soğuk başlangıç" (cold start) ve keşif (exploration) süreleri uzayabilir. Algoritmanın ilk aşamada birbirine çok benzeyen 50 farklı başlığı tek tek denemeye çalışması ciddi bir zaman kaybıdır. Bu riski önlemek için varyasyonlar önce semantik gömmelerle (embeddings) kümelenmeli ve her kümeden sadece temsilci başlıklar ilk aşamada teste sokulmalıdır.
Python ve Redis ile MAB Karar Motoru Altyapısı
Gerçek zamanlı bir MAB karar motoru kurmak için düşük gecikmeli (low-latency) bir veri deposuna ihtiyaç duyarız. Redis, atomik artırma (atomic increment) yetenekleriyle bu mimari için biçilmiş kaftandır.
Aşağıdaki Python kodu, Redis üzerinde çalışan temel bir Thompson Örneklemesi karar mekanizmasını simüle etmektedir:
import numpy as np
import redis
class ThompsonBanditRedis:
def __init__(self, redis_client, experiment_id):
self.r = redis_client
self.exp_id = experiment_id
def _get_params(self, variant_id):
# Redis'ten alfa (clicks) ve beta (impressions - clicks) değerlerini oku
clicks = int(self.r.hget(f"{self.exp_id}:{variant_id}", "clicks") or 0)
impressions = int(self.r.hget(f"{self.exp_id}:{variant_id}", "impressions") or 0)
# Başlangıç parametresi Beta(1,1)
alpha = 1.0 + clicks
beta = 1.0 + (impressions - clicks)
return alpha, beta
def choose_variant(self, variant_ids):
best_sample = -1
selected_variant = None
for v_id in variant_ids:
alpha, beta = self._get_params(v_id)
# Beta dağılımından rastgele örneklem al
sample = np.random.beta(alpha, beta)
if sample > best_sample:
best_sample = sample
selected_variant = v_id
return selected_variant
def record_impression(self, variant_id):
self.r.hincrby(f"{self.exp_id}:{variant_id}", "impressions", 1)
def record_click(self, variant_id):
self.r.hincrby(f"{self.exp_id}:{variant_id}", "clicks", 1)
MAB Ne Zaman Kesin Üstünlük Sağlar?
MAB algoritmaları her senaryo için sihirli bir değnek değildir. Eğer amacınız iki tasarım arasındaki kesin istatistiksel farkı ölçüp akademik bir rapor yazmaksa, klasik A/B testi hala en güvenli limandır.
Ancak MAB, özellikle şu senaryolarda klasik yaklaşımlara karşı kesin bir üstünlük sağlar:
- Kısa Ömürlü Kampanyalar: Hafta sonu sürecek bir flaş indirim kampanyasında, klasik A/B testinin istatistiksel anlamlılığa ulaşmasını bekleyecek vaktiniz yoktur. MAB, ilk birkaç saat içinde kötü varyasyonları eleyerek trafiği doğrudan kazananlara yönlendirir.
- Haber Portalları ve İçerik Siteleri: Bir haber başlığının ömrü genellikle 12 ila 24 saattir. En çok tıklanan başlığı bulana kadar geçen sürede haberin güncelliği yitirilir.
- Çok Varyasyonlu (MVT) Testler: LLM'ler sayesinde dakikalar içinde üretilen 200 farklı başlık varyasyonunu klasik yöntemlerle test etmek imkansızken, MAB bu havuzu gerçek zamanlı olarak eritebilir.
Sonuç olarak; statik test yapılarıyla trafik kaybetmek yerine, Thompson Örneklemesi tabanlı dinamik karar motorlarını veri altyapınıza entegre etmek, dönüşüm oranlarında doğrudan %30'u aşan bir verimlilik artışını beraberinde getirecektir.