Skip to content

Feature-Flag → Cost-Flag: Engineering-Level Measurement of A/B Test's Real $/User Impact

You want to show a new AI feature to 50% of users to measure impact. Conversion is easy to measure — but the cost difference? This lesson covers adding a cost-flag to each A/B variant, statistical significance, and decision-making with LTV.

Şükrü Yusuf KAYA
18 min read
Intermediate
Feature-Flag → Cost-Flag: A/B Testin Gerçek $/User Farkını Mühendislik Düzeyinde Ölçmek
🎯 Yeni feature, yeni maliyet
AI feature'ları büyük çoğunlukla A/B test'le gönderiyorsun. "Convert rate %4 → %5" diyorsun ama her conversion sana ne kadara mal olduğunu bilmiyor olabilirsin. Bu derste o bilgi açığını kapatıyoruz.

Senaryo#

Bir e-ticaret sitesi yeni bir "AI Smart Search" feature'ı çıkarmak istiyor. Normal search yerine LLM-powered semantic search. A/B test:
  • Control (50%): Normal Elasticsearch search
  • Variant A (50%): GPT-5-mini ile reranked Smart Search

Klasik ölçüm#

MetrikControlVariant A
Conversion rate%2.8%3.6
AOV (avg order value)$45$48
Revenue per session$1.26$1.728
"Variant kazandı!" diyorsun. Ama bekle...

Maliyet katmanı#

MetrikControlVariant A
LLM cost per search$0$0.012
Searches per session33
LLM cost per session$0$0.036
Net per-session ekonomi:
Control: +$1.26 Variant: +$1.728 - $0.036 = +$1.692
Variant net olarak kazandı (1.692>1.692 > 1.26), ama gross kazanç ($0.468) ile beklenenden farklı. Maliyet sürprizini tanı.

Cost-Flag Pattern'ı#

A/B testin tüm telemetry'sine
variant
etiketi ekle.

Feature flag kütüphanesi (GrowthBook, LaunchDarkly, custom)#

from growthbook import GrowthBook def get_search_variant(user_id: str) -> str: gb = GrowthBook(api_host="...", client_key="...") gb.set_attributes({"user_id": user_id}) if gb.is_on("smart_search_experiment"): return "variant_a" return "control" # LLM çağrısı def perform_search(query: str, user_id: str): variant = get_search_variant(user_id) if variant == "control": return elasticsearch_search(query) # Variant A — LLM-powered response = completion( model="gpt-5-mini", messages=[ {"role": "system", "content": "Rerank search results semantically..."}, {"role": "user", "content": query}, ], metadata={ "tenant_id": ..., "user_id": user_id, "feature": "smart_search", "variant": variant, # ← KEY "experiment_id": "smart_search_experiment", }, ) return llm_rerank(response, base_results)
Variant tag artık her LLM çağrısının metadata'sında.

Variant Dashboard#

ClickHouse / Langfuse'a şu sorgu:
SELECT JSONExtractString(raw_metadata, 'variant') AS variant, count() AS total_requests, sum(cost_total_usd) AS total_cost, avg(cost_total_usd) AS avg_cost_per_request, count(DISTINCT user_id) AS users FROM llm_telemetry.requests WHERE ts >= '2026-04-01' AND JSONExtractString(raw_metadata, 'experiment_id') = 'smart_search_experiment' GROUP BY variant

Bir hafta sonraki rapor#

variantrequestscost$/requestusers$/user
control0$0$012.500$0
variant_a84.000$1.008$0.01212.300$0.082
Şimdi conversion ile çarp:
  • Control conversions: 12.500 × %2.8 = 350 → $0/conversion
  • Variant conversions: 12.300 × %3.6 = 443 → 1.008/443=1.008/443 = **2.28/extra-conversion**
Variant'ın maliyet-başına-conversion maliyeti 2.28.Eg˘erAOV2.28. Eğer AOV 48 ise, gross margin (önceki maliyetler hariç) $45.72. Hâlâ değer var.

Statistical Significance — Cost Boyutu#

Conversion için iyi bildiğin t-test, ki-kare. Cost boyutu için biraz farklı:

Per-user cost dağılımı#

Variant A 12.300 kullanıcının her birinin LLM maliyeti: 90 percentile: $0.20 50 percentile: $0.04 10 percentile: $0.01 Mean: $0.082 Std dev: $0.18 ← yüksek (power user'lar var)
Cost dağılımı log-normal. Standart Welch t-test ucundan tutar.

Pratik yaklaşım#

  1. Median ve P90'ı karşılaştır (mean'in yanı sıra)
  2. Power user'ları ayrı analiz et (top %10)
  3. Multiple metrics aynı anda — conversion ↑ ve cost/user ↓ aynı anda?
  4. Confidence interval'lar ile karar ver, p-value'ya saplanma

Kullanışlı statsmodels örneği#

import scipy.stats as st control_revenue_per_user = ... # array variant_revenue_per_user = ... control_cost_per_user = ... variant_cost_per_user = ... # Net (revenue - cost) farkı için Welch test control_net = control_revenue_per_user - control_cost_per_user variant_net = variant_revenue_per_user - variant_cost_per_user t, p = st.ttest_ind(variant_net, control_net, equal_var=False) print(f"Net mean lift: {variant_net.mean() - control_net.mean():.2f}") print(f"p-value: {p:.4f}")

LTV-Aware Karar#

Sadece o anki maliyet/conversion bakma — LTV (lifetime value) hesaba kat.
Variant A: Extra revenue per user (lifetime): $48 × 1.2× LTV multiplier = $57.6 Extra cost per user (lifetime): $0.082 × 12 ay = $0.984 Net LTV impact: +$56.6 per user
Bir feature short-term'de pahalı görünürse de LTV uzun-dönemde pozitif olabilir. Aksine — short-term ucuz feature LTV'yi düşürürse uzun-dönemde kötü.
Modül 16'da unit economics çerçevesinde detaylı.

A/B Testte Abuse İzleme#

A/B test sırasında dikkat: %0.1 kullanıcı toplam variant maliyetinin %30-50'sini yapar. Power user'lar abuse'a yakın.
SELECT user_id, sum(cost_total_usd) AS user_cost, count() AS requests FROM llm_telemetry.requests WHERE JSONExtractString(raw_metadata, 'variant') = 'variant_a' AND ts >= '2026-04-01' GROUP BY user_id HAVING user_cost > 50 -- anormal harcayanları yakala ORDER BY user_cost DESC
Bu listenin başındaki kullanıcılar:
  • Gerçek heavy user mı?
  • Otomasyon (bot) mı?
  • Prompt injection abuse mu?
Modül 4.5'te bu sorunu detaylı ele alıyoruz.
📋 A/B test karar checklist'i
Bir AI feature A/B testini "shipped" yapmadan önce: (1) Conversion lift istatistiksel anlamlı mı? (2) Cost per user dağılımı (P50, P90, P99) ne? (3) Net revenue per user (revenue - LLM cost) pozitif mi? (4) LTV projeksiyonu nedir? (5) Top 1% kullanıcı abuse'lu mu? Beş soruya beş 'EVET' = ship.
▶️ Sıradaki ders
4.3 — LiteLLM Virtual Keys. Cost attribution'ı altyapı seviyesinde otomatize et. Her tenant'a kendi virtual key'i, otomatik budget enforcement, model whitelist. Production-grade SaaS mimarisi.

Frequently Asked Questions

Yes, simple hash-based bucketing works: hash(user_id) % 100 < 50 ? 'control' : 'variant'. What matters is being deterministic and sticky. Feature flag tools add analytics and automation — not required for starting.

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

Related Content