Panduan
Eksperimen online (uji A/B)
Perbandingan offline Anda mengatakan versi baru lebih baik. Uji A/B di produksi mengajukan pertanyaan yang sama kepada pengguna nyata. Router Anda sendiri mengacak unit (pengguna atau sesi) di antara dua lengan; oloproof experiment membaca lognya dan menjawab dengan empat status yang sama seperti setiap aturan lain. Metode ini diterima oleh audit independen dengan syarat yang dinyatakan: observed_until adalah pernyataan Anda tentang kapan log hasil diekstrak, unit diacak secara independen, hasil satu unit tidak bergantung pada lengan unit lain, hasil tidak bergeser selama pembagian berubah, dan setiap tinjauan membaca seluruh log. Di luar syarat itu, jawabannya tidak tercakup.
Log dan deklarasi
Dua berkas, CSV atau JSONL: log penugasan dengan satu baris per unit (kolom unit yang Anda deklarasikan, dan arm), dan log hasil dengan unit dan value-nya.
experiment:
name: checkout-v2
unit: user
allocation: {control: 0.5, treatment: 0.5}
control: control
treatment: treatment
assignments: logs/assignments.csv
outcomes: logs/outcomes.csv
kind: rate
rules:
- {id: lift, kind: superiority}
- {id: no-harm, kind: non_inferiority, margin: 0.01}oloproof experiment experiment.yaml --policy release.yaml --jsonkind: mean menerima range: [low, high] yang dideklarasikan; direction: max membaca yang lebih rendah sebagai lebih baik. Unit yang ditugaskan tanpa baris hasil dianggap hilang dan dibatasi pada nilai terburuknya di setiap sisi, kecuali missing_outcome: zero menyatakan bahwa tidak ada baris berarti nol. Catat satu baris untuk setiap unit, termasuk nol: log konversi yang hanya berisi yang berkonversi membaca setiap unit lain sebagai hilang, dan jawabannya tetap INSUFFICIENT_EVIDENCE. Pengisian nol mengasumsikan jendela hasil setiap unit yang dihitung sudah tertutup; unit yang ditugaskan satu jam lalu belum berkonversi, dan menghitungnya sebagai nol menguntungkan lengan yang berkonversi lebih cepat. Deklarasikan outcome_window_hours, as_of, dan observed_until (kapan log hasil diekstrak), dengan kolom assigned_at di log penugasan, dan hanya unit yang jendelanya tertutup pada as_of yang dihitung; missing_outcome: zero ditolak tanpa keduanya, apa pun pemantauannya. Tulis setiap waktu dengan offset atau Z (2026-10-11T00:00:00Z); waktu tanpa keduanya ditolak. as_of tidak boleh lebih lambat dari observed_until, dan keduanya tidak boleh berada di masa depan: hasil setelah ekstraksi tidak ada di log. Jendela menentukan pertanyaannya: jendela 48 jam menjawab "berkonversi dalam 48 jam", jadi jendela itu harus mencakup penundaan hasil yang Anda maksud. Id unit dibandingkan sebagai teks setelah spasi dipangkas, dengan 42.0 dibaca sebagai 42. Kode keluar adalah milik aturan terburuk: 0 PASS, 1 FAIL, 3 INSUFFICIENT_EVIDENCE, 4 MANUAL_REVIEW.
Apa yang diperiksa lebih dulu
- Rasio sampel. Jumlah unit tiap lengan diuji terhadap alokasi yang dideklarasikan (uji binomial eksak untuk dua lengan, khi-kuadrat untuk lebih, ambang 0,001). Ketidakcocokan membuat setiap aturan menjadi MANUAL_REVIEW: pembagian yang rusak berarti lengan-lengan tidak lagi dapat dibandingkan, dan lebih banyak data sejenis tidak memperbaikinya. Temukan penyebabnya (pengalihan yang menghilangkan pengguna, filter bot yang diterapkan pada satu lengan) sebelum membaca selisih apa pun.
- Satu unit di dua lengan. Penugasan bocor; setiap aturan terbaca MANUAL_REVIEW.
- Beberapa baris hasil untuk satu unit. Ditolak, karena peristiwa dari satu pengguna tidak independen. Deklarasikan aggregate: unit_mean agar rata-rata milik setiap unit menjadi hasilnya: jawabannya lalu tentang pengguna rata-rata, bukan peristiwa rata-rata.
- Lengan kosong. INSUFFICIENT_EVIDENCE sampai lengan itu memiliki hasil.
- Baris hasil yang tidak cocok dengan unit yang ditugaskan mana pun, di bawah missing_outcome: zero. Nol-nol itu bergantung pada penggabungan, jadi penggabungan yang rusak akan membaca unit nyata sebagai nol; setiap aturan membaca MANUAL_REVIEW sampai id-nya cocok. Pada bawaan, baris itu dihitung lalu dikesampingkan.
Cara memutuskan
Rata-rata setiap lengan mendapat interval yang sudah digunakan Oloproof untuk satu run (Clopper-Pearson eksak untuk suatu laju, rata-rata terbatas berbasis taruhan untuk lainnya), masing-masing dengan separuh anggaran galat, dan selisihnya dibatasi oleh ujung-ujung yang berlawanan dari keduanya. Interval ini berlaku pada setiap ukuran sampel dan lebih lebar daripada interval normal buku teks. Aturan superioritas lolos ketika seluruh interval berada di atas nol; aturan non-inferioritas lolos ketika ujung bawahnya berada pada atau di atas minus margin.
monitoring: anytime menggunakan interval taruhan untuk kedua lengan, yang berlaku seberapa sering pun Anda melihat dan kapan pun Anda berhenti. Ini berlaku selama setiap kali melihat Anda memberikan seluruh log sampai saat itu: jangan pernah membuang atau menyaring baris per periode setelah membacanya. Bawaannya, fixed, dibaca sekali pada ukuran sampel yang Anda rencanakan.
Beberapa perlakuan
Deklarasikan treatments: [b, c] sebagai ganti treatment: dan berikan setiap aturan perlakuan yang dibandingkannya (treatment: b). Interval setiap lengan diambil pada 1 - alpha/m untuk m lengan, sehingga setiap perlakuan dikurangi kontrol tercakup sekaligus oleh batas gabungan (union bound): satu aturan per perlakuan, masing-masing satu klaim, dan keluarganya berlaku bersama. Setiap interval lebih lebar daripada dengan dua lengan, karena setiap lengan membayar untuk lengan lainnya. Dengan beberapa perlakuan, laporan menyebutkan yang terbaik di antara perlakuan yang lolos setiap aturan yang menyebutkannya, dan apakah ia terpisah dari setiap perlakuan lolos lainnya: setiap selisih, dibatasi oleh interval simultan yang sama, tidak mencakup nol. Hasil seri mempertahankan urutan yang dideklarasikan dan tidak pernah dipisahkan. Pemeriksaan rasio sampel sudah membaca setiap lengan. Jaminan bersama mencakup lengan-lengan dari satu file eksperimen: membagi perlakuan ke beberapa file melepaskannya.
Metrik rasio
Click-through rate adalah klik dibagi sesi, dan satu pengguna dengan banyak sesi bukanlah banyak pengguna yang independen. Deklarasikan rasionya atas satu baris per unit, dengan rentang yang memuat nilai setiap unit:
ratio: {numerator: clicks, denominator: sessions, numerator_range: [0, 50], denominator_range: [1, 50]}
aggregate: unit_sum # only if a unit has several rows: they are addedEstimandnya adalah rata-rata pembilang setiap lengan dibagi rata-rata penyebutnya. Kedua rata-rata dibatasi oleh interval yang sudah diterima, masing-masing pada bagiannya dari anggaran galat, dan rasionya dengan membagi ujung-ujungnya, sehingga berlaku pada setiap ukuran sampel tanpa aproksimasi normal. Penyebut yang intervalnya mencapai nol tidak menghasilkan interval. Nilai di luar rentangnya adalah galat konfigurasi yang menyebutkan unitnya, tidak pernah dipotong. Interval metode delta, yang biasanya lebih sempit, ditampilkan di sampingnya dan tidak pernah memutuskan.
Kovariat dari sebelum uji
Hasil yang mengikuti sesuatu yang diukur sebelum uji (pengeluaran bulan lalu, sesi minggu lalu) bervariasi lebih sedikit setelah hal itu dikeluarkan. Bawalah nilai setiap unit dari sebelum uji dan koefisien yang ditetapkan sebelum hasil uji ini dibaca:
covariate: {values: logs/pre_period.csv, range: [0, 500], theta_from: logs/history.csv}Hasil yang diputuskan adalah Y - theta (X - c). theta dideklarasikan (theta:, dengan center: opsional, secara bawaan titik tengah rentang), atau dicocokkan pada file riwayat dari periode sebelum uji (kolom covariate dan outcome), tidak pernah pada hasil uji ini sendiri. Karena X diukur sebelum penugasan, dan unit mana yang memiliki X juga sudah ditetapkan sebelum penugasan, selisih yang disesuaikan memiliki estimand yang sama. Unit tanpa nilai di file tidak disesuaikan. Penyesuaian yang sah tetap bisa lebih lebar daripada tanpa penyesuaian, karena rentang hasil yang disesuaikan lebih lebar, sehingga laporan menampilkan kedua interval dan menyebutkan mana yang lebih sempit; laporan tidak mengklaim penghematan.
Kebaruan dan interferensi, ditampilkan
novelty: {exposure_column: exposed_at, time_column: at, days: 7} membaca paparan pertama setiap unit dari log penugasan dan waktu setiap baris hasil, lalu menampilkan selisih pada days pertama paparan dan sesudahnya. Selisih awal yang diputuskan dengan selisih kemudian yang belum diputuskan atau berlawanan disebut "possibly a novelty effect". Pemisahan ini tidak pernah memutuskan aturan: unit tanpa baris dalam suatu pita ditinggalkan darinya, tidak dibatasi pada nilai terburuknya. Ini menerima satu hasil per baris, bukan rasio atau kovariat.
cluster_column: team menghitung tim yang memuat unit dari beberapa lengan dan menanyakan apakah hasil satu unit dapat bergantung pada lengan unit lain. Jika bisa, acak menurut tim dan deklarasikan tim sebagai unit.
Beberapa perlakuan, rasio, dan kovariat diterima oleh audit independen dan konfirmasinya pada 3 November 2026, dengan ketentuan yang sama seperti dua lengan.
Offline dan online
Sebutkan perbandingan offline dan metriknya (offline_comparison: <id>, offline_metric: pass_rate) dan jawabannya melaporkan apakah dua arah yang diputuskan sepakat. Ini dilaporkan dan tidak pernah memutuskan apa pun: ketidaksepakatan adalah alasan untuk melihat suite, bukan putusan atas rilis.
Jebakan
- Mengintip. Membaca uji horizon tetap setiap hari dan berhenti pada hari yang baik menggelembungkan kemenangan palsu. Rencanakan ukuran sampel, atau deklarasikan monitoring: anytime.
- Kebaruan dan pembelajaran. Pengguna bereaksi terhadap apa pun yang baru, lalu tenang. Kenaikan di minggu pertama bisa memudar; jalankan cukup lama untuk mencakup siklus pengguna Anda, dan deklarasikan novelty: untuk melihat pemisahannya.
- Interferensi. Interval mengasumsikan hasil satu unit tidak bergantung pada lengan unit lain. Inventaris bersama, marketplace, fitur sosial, atau cache yang dihangatkan oleh satu lengan merusaknya; dalam hal itu, acak menurut unit yang lebih besar (wilayah, tim), dan deklarasikan cluster_column: untuk melihat seberapa bercampur klasternya.
- Pergeseran saat pembagian berubah. Interval mengasumsikan alokasi tetap konstan selama pengujian, atau hasil tidak bergeser selama alokasi berubah. Peningkatan bertahap dari 10% ke 50%, atau 90/10 lalu 10/90 pada hari kerja dan akhir pekan, memberi bobot periode secara berbeda di tiap lengan dan mencampurkan efek waktu ke dalam selisih; pemeriksaan rasio sampel membaca jumlah gabungan dan tidak melihatnya. Pertahankan pembagian tetap, atau putuskan hanya pada periode setelah peningkatan bertahap.
- Mengganti unit. Acak dan analisis menurut unit yang sama. Mengacak pengguna lalu menghitung sesi sebagai independen mempersempit interval secara keliru.
Yang tidak dapat diberitahukan oleh ini
- Apakah hasilnya berlaku untuk pengguna di luar jendela waktu, wilayah, atau lalu lintas uji.
- Apa pun tentang metrik yang tidak Anda deklarasikan sebelum uji; metrik yang dipilih setelahnya adalah deskripsi.
- Apakah router Anda benar-benar mengacak: pemeriksaan rasio sampel menangkap kesalahan besar, bukan yang halus.
- Perlakuan mana yang terbaik di antara yang tidak lolos: hanya perlakuan yang lolos yang diperingkat. Alokasi berstrata dan desain switchback belum dibangun.