Thử nghiệm A/B và nền tảng experimentation
Bài toán
Khi nhiều team cùng thay đổi một sản phẩm, "ship rồi xem metric" không còn trả lời được thay đổi nào gây ra gì. Thí nghiệm có đối chứng trả lời được, nhưng ở quy mô lớn nó thành một hệ thống: gán người dùng vào biến thể (ngẫu nhiên thật, ổn định, không để các thí nghiệm nhiễm nhau), phân phối cấu hình tới mọi service và app mà không cần deploy, tính metric hằng ngày cho hàng nghìn thí nghiệm, và quyết định đúng (đủ mẫu, không nhìn trộm, không chọn metric sau khi xem kết quả, không hại metric của team khác).
Trang này giữ phần hạ tầng và quy trình của thí nghiệm. Canary và rollout dần cho mục tiêu an toàn ở Deploy và release an toàn; pipeline batch tính metric chung ở Pipeline dữ liệu và analytics; feature flag như một nguồn nợ code ở Quản lý fleet và migrate code hàng loạt.
Diễn tiến theo thời gian
- 2009→2013 · LinkedIn: từ
member_id mod 1000và xin dải bucket qua email (chi phí phối hợp O(số test²), định nghĩa test rải trong code, bật một test mất hàng giờ vì phải deploy config, báo cáo tính tay) sang nền tảng tập trung khoảng 2010: tách test (interface với ứng dụng) khỏi experiment (một bậc ramp bất biến), deploy experiment dưới 5 phút, targeting và Lix DSL thuộc về nền tảng; tới 2013 evaluate cục bộ với cache nhiều tầng (dưới 2% lần gọi qua mạng). Năm 2020: tới 41.000 test cùng lúc trên hơn 700 triệu thành viên. LinkedIn 2020 - 2012→2020 · LinkedIn (Lix Engine): DSL thí nghiệm kiểu Lisp tất định, cố ý hạn chế, giao tới service độc lập với deploy (nên cũng làm feature flag). Năm 2020: 35.000 thí nghiệm, 23 nghìn tỷ evaluate/ngày. Viết lại Clojure → Java nhanh 20 lần; tránh remote call bằng thử nhánh cục bộ của
and/ortrước; rollout engine mới bằng chính một A/B test (37 vòng, 8 tháng). LinkedIn 2020 - 2015 · Wix: PETRI, hệ experiment thế hệ ba: A/B test và feature toggle cùng là một
Experimentvới eligibility filter, server lưu, thư viện Laboratory trong mỗi app tự tung đồng xu theo ngữ cảnh request; loại filter mới làm mọi service chưa deploy lỗi deserialize và kẹt ở danh sách cũ, sửa bằngUnrecognizedFilter(experiment không hợp lệ, trả giá trị dự phòng). Wix 2015 - 2019 · Airbnb: guardrails toàn công ty: ba điều kiện (Impact theo ngưỡng, Power theo sai số chuẩn, Stat Sig Negative cho metric quan trọng nhất), ngưỡng co giãn theo độ phủ, trượt thì escalation cho người quyết. Năm 2021: khoảng 25 thí nghiệm/tháng bị escalate, 20% trong đó bị dừng. Airbnb 2021
- 2019 · Tinder: Phoenix: experiment family (trong một family, user chỉ vào một thí nghiệm), gán bằng hash có salt là experiment ID (để không cùng một nhóm luôn gánh control), shuffle ID để xáo lại; tách feature gating (kiểm soát) khỏi thí nghiệm (so sánh). Tinder 2019
- 2019 · Tinder: Levers: remote config cho app mobile với manifest kiểu phía client, giá trị dự phòng, chính sách khoá; Config Service không biết "thí nghiệm" là gì, mỗi lần đọc Lever tự ghi lại giá trị đã dùng nên metric phân bổ có sẵn. Tinder 2019
- 2019 · LinkedIn: chọn ứng viên feed được đánh giá bằng recall so với second pass ranker; ngẫu nhiên hoá đầu ra cho một phần nhỏ traffic để tránh selection bias; khoảng 100 biến thể model qua A/B. LinkedIn 2019
- 2020 · Tinder: pipeline metric: hơn 80 job Spark mỗi ngày trên EMR, khối gán thí nghiệm tăng từ 2 lên 25 job (pre-auth/post-auth, loại bot); hiệu chỉnh so sánh bội trong hệ thống, chỉ tô ý nghĩa thống kê sau 2 tuần để chống nhìn trộm. Tinder 2020
- 2020→2023 · Zillow: từ gần một chục công cụ thí nghiệm rời rạc sang ZEXP: mua phần gán bucket, tự xây thư viện phân tích PySpark có checkpoint, hub tự phục vụ và một API nguồn sự thật; số thí nghiệm gấp 3 sau 2 năm. Zillow 2023
- 2021 · Spotify: nhóm Search đưa thực hành vào thói quen bằng template điền sẵn, điều phối thí nghiệm loại trừ nhau, quy tắc quyết định đặt trước, champion mỗi team, và holdback theo quý để đo tổng tác động của mọi thay đổi đã ship. Spotify 2022
- 2021 · Etsy: A/B test hệ giá thầu quảng cáo: đánh giá offline bằng PR AUC trước, rồi online (CTR +6,19%, ROAS +7,02% theo Etsy); theo Etsy không cô lập được hoàn toàn các biến thể vì chúng dùng chung một ngân sách quảng cáo, và tiền thật buộc chỉnh rất thận trọng. Etsy 2021
- 2022 · Twitter: thay đổi hạ tầng mạng (vị trí edge) không A/B theo người dùng được; dựng phản thực bằng CausalImpact từ các nước không đổi, thiết kế trước (chốt metric, chạy đủ dài), xác nhận thay đổi kỹ thuật thật sự xảy ra rồi mới đo doanh thu. Twitter 2022
- 2023→2025 · Zalando: quảng cáo retail media là thị trường hai phía có ngân sách dùng chung, treatment tiêu ngân sách của control (cannibalization bias, vi phạm SUTVA); Budget Split chia mỗi chiến dịch thành sub-campaign theo tỉ lệ traffic, Orthogonal Concurrency chia thành ô trực giao khi nhiều thí nghiệm chồng nhau; từ 8 thí nghiệm tuần tự (2023) lên hơn 60 (2025); vẫn liệt kê vòng phản hồi còn nối hai biến thể (auto-bidding, model huấn luyện lại, người vận hành). Zalando 2026
- 2023→2025 · Mercari: dịch listing bằng LLM: mỗi lần đổi model (DeepL → GPT-3.5 → GPT-4o mini → Gemini 1.5 Flash) là một A/B test trên metric kinh doanh, metric đi ngang nên chọn theo giá (chi phí ÷100 sau hai năm). Hai lần đổi model do nhà cung cấp cho nghỉ mà bỏ A/B vì gấp: latency tăng, output thêm câu thừa. Mercari 2025
- 2024 · Zillow: StreetEasy gắn thí nghiệm và nhánh vào bảng session đã chuẩn hoá, nên đọc kết quả A/B chỉ là group by và có dashboard tự kiểm định ý nghĩa. Zillow 2024
- 2024 · Zillow: Next Best Action thay A/B tuần tự "người thắng lấy hết" bằng contextual bandit (GBT + epsilon-greedy, train lại hằng ngày); cold start ngang warm start sau 5 ngày; đổi trọng số phần thưởng lúc chạy, hội tụ trong 3 ngày. Zillow 2024
- 2025 · Mercari: assignment của Experiment Platform trong modular monolith: client mobile/web lấy một lần rồi cache, backend mỗi request một khách nên chỉ BFF gọi, rồi truyền xuống module dưới qua gRPC metadata và
context.Context; định nghĩa bằng Protobuf vớioptional boolđể phân biệt "chưa gán" vớifalsevà để header không phình theo tên tham số. Mercari 2025 - 2026 · WhatsApp: thử model Scam Alert mà không cho server nhắm một user: client tự chia nhóm bằng số ngẫu nhiên cục bộ, cấu hình thí nghiệm chỉ được mở rộng, nhóm có kích thước tối thiểu, metric nhóm đi qua pipeline TEE và nhóm quá nhỏ bị chặn. WhatsApp 2026
Các lựa chọn và đánh đổi
| Lựa chọn | Được | Mất | Nguồn |
|---|---|---|---|
| Bucket cố định theo modulo | Đơn giản | Không ngẫu nhiên đúng nghĩa; cùng nhóm người luôn chịu cùng thí nghiệm; phải phân dải tay | LinkedIn 2020 |
| Hash định danh + salt theo thí nghiệm | Độc lập giữa các thí nghiệm, không cần lưu bảng gán | Muốn xáo lại phải thêm shuffle ID | Tinder 2019 |
| Experiment family / thí nghiệm loại trừ nhau | Quy được tác động về đúng thí nghiệm | Tiêu hao user khả dụng, cần điều phối giữa team | Tinder 2019 Spotify 2022 |
| Evaluate cục bộ có cache | Thí nghiệm không thêm latency vào đường request | Cấu hình tới chậm vài phút; cần kho thuộc tính phía sau | LinkedIn 2020 |
| Client tự evaluate từ danh sách experiment do server gửi | Không thêm round-trip | Client cũ gặp loại điều kiện mới phải có đường thất bại an toàn, nếu không kẹt cả danh sách | Wix 2015 |
| Remote config cho client mobile | Đổi và rollback trong vài giây thay vì chờ app store | Phải có manifest kiểu và giá trị dự phòng cho app cũ | Tinder 2019 |
| Guardrail tự động + escalation | Thấy đánh đổi giữa các team trước khi launch | Thêm thời gian chạy (Power) và công review; nhiều metric thì nhiều báo giả | Airbnb 2021 |
| Bất biến thống kê nhúng vào hệ thống | Khó dùng sai (nhìn trộm, chọn metric sau) | Chậm thấy kết quả (2 tuần) | Tinder 2020 |
| Holdback dài hạn | Đo được tổng tác động và tương tác | Một nhóm người dùng không nhận cải tiến cả quý | Spotify 2022 |
| Chia luôn tài nguyên dùng chung theo biến thể (Budget Split) | Khôi phục độc lập khi hai biến thể tranh cùng ngân sách; chạy được nhiều thí nghiệm song song (ô trực giao) | Mỗi thí nghiệm thêm làm số ô nhân lên; vòng phản hồi tự động và người vận hành vẫn nối hai biến thể | Zalando 2026 |
| Phản thực từ chuỗi thời gian | Đo được thay đổi không chia theo user được | Nhạy với cú sốc ngoài, cần dữ liệu lịch sử dài | Twitter 2022 |
Quy tắc rút ra
- Tách định nghĩa thí nghiệm khỏi code: ứng dụng chỉ hỏi "user này nhận biến thể nào", còn phân bổ, targeting, ramp là dữ liệu của nền tảng; khi đó thí nghiệm và rollout dùng chung một cơ chế. LinkedIn 2020 Tinder 2019
- Phép gán phải độc lập giữa các thí nghiệm và loại trừ được khi cần: salt theo thí nghiệm, family cho các thí nghiệm có thể nhiễm nhau. Tinder 2019
- Bất biến rẻ thì nhúng vào hệ thống, bất biến đắt thì để quy trình: thời gian tối thiểu, hiệu chỉnh so sánh bội, quy tắc quyết định đặt trước; template điền sẵn là cách nhân rộng. Tinder 2020 Spotify 2022
- Cổng an toàn cho thí nghiệm cần ngân sách báo giả: ít metric được bảo vệ, ngưỡng theo cái phát hiện được, đủ mẫu trước khi kết luận "không xấu đi"; trượt thì đưa cho người quyết thay vì chặn cứng. Airbnb 2021 Xem Deploy và release an toàn.
- Tổng hiệu ứng từng thí nghiệm không phải tổng tác động: đo cộng dồn bằng holdback. Spotify 2022
- Kiểm SUTVA trước khi tin kết quả: khi đơn vị gán (user) khác đơn vị dùng chung tài nguyên (ngân sách, kho hàng, tài xế), chia luôn tài nguyên theo biến thể và liệt kê các vòng phản hồi còn nối hai bên. Zalando 2026
- Dữ liệu cấu hình thí nghiệm gửi xuống client phải tương thích tiến: loại điều kiện lạ thì thí nghiệm vô hiệu và trả giá trị dự phòng, không bỏ qua điều kiện. Wix 2015 Xem Yelp 2026.
- Thay đổi không chia theo người dùng được thì dựng phản thực và xác nhận thay đổi kỹ thuật đã xảy ra trước khi đo tác động nghiệp vụ. Twitter 2022
Câu hỏi mở
- Chi phí hạ tầng của nền tảng thí nghiệm (pipeline metric, kho gán) so với hạ tầng sản phẩm: chưa nguồn nào nêu.
- Thí nghiệm có hiệu ứng mạng: Zalando 2026 (Zalando 2026) trả lời phần marketplace hai phía bằng cách chia ngân sách theo biến thể, nhưng không có số đo độ lệch trước/sau hay chi phí của việc chia; gán theo cụm hay theo thời gian (switchback) vẫn chưa có nguồn. Etsy 2021 là nguồn thứ hai gặp đúng bài toán (biến thể quảng cáo dùng chung ngân sách nên không cô lập được) nhưng chỉ nêu là khó, chưa nêu cách xử lý Etsy 2021.
- Phần tiếp của series T-REX (engine nhanh 20 lần, pipeline phân tích offline) và nền tảng mới của Spotify (2020) chưa ingest.
- Feature flag sinh từ thí nghiệm thành nợ code (DoorDash 2026 dọn bằng agent, DoorDash 2026): chưa nguồn nào nói nền tảng thí nghiệm nên tự dọn flag khi thí nghiệm kết thúc thế nào.
- Liên hệ: Deploy và release an toàn, Pipeline dữ liệu và analytics, Kiến trúc frontend, Observability và monitoring, Nền tảng ML (feature, training, serving, giám sát model) (shadow model, mỗi phiên bản model một cột gắn feature flag ở Instacart 2023).