ข้ามไปยังเนื้อหา

Namespaces & Holdouts

เมื่อคุณรัน experiment สองอันพร้อมกันที่กระทบหน้าหรือ user journey เดียวกัน ผู้ใช้อาจถูกกำหนดให้อยู่ในทั้งสองอัน ทำให้เกิด interaction effects — ผลของ experiment B ปนเปื้อนจาก treatment ของ experiment A ข้อมูลดูเหมือนสะอาดแต่ข้อสรุปผิด

GrowthBook แก้ปัญหานี้ด้วย namespaces

namespace คือ bucketing pool ที่ใช้ร่วมกัน ทุก experiment ที่กำหนดให้กับ namespace จะตัดแบ่ง traffic range 0–1 ออกเป็นส่วนที่ไม่ซ้อนทับกัน user ที่ตกที่ตำแหน่ง 0.42 ใน namespace จะอยู่ได้เพียง experiment ที่เป็นเจ้าของ slice นั้น — ไม่มีวันอยู่สองอันพร้อมกัน

  1. ใน GrowthBook sidebar ไปที่ Settings → Namespaces
  2. คลิก Add Namespace
  3. ตั้งชื่อที่มีความหมาย เช่น checkout-flow
  4. คลิก Save
  1. เปิด experiment ที่ต้องการกำหนด
  2. คลิก Edit ในส่วน targeting ของ experiment
  3. ใต้ Namespace เลือก namespace จาก dropdown
  4. ตั้ง Range — slider สองอันที่กำหนดจุดเริ่มต้นและจุดสิ้นสุดของ traffic slice ที่ experiment นี้เป็นเจ้าของ (เช่น 0.00–0.50)
  5. คลิก Save

เคล็ดลับ: experiment สองอันใน namespace เดียวกันที่มี range ไม่ซ้อนทับกันจะไม่มีวัน share user กัน experiment ใน namespace ต่างกัน คือ bucketing pool อิสระและสามารถซ้อนทับกันได้อย่างเสรี

holdout คือกลุ่ม user ที่ถูกแยกออกจาก experiment ทั้งหมดใน namespace โดยตั้งใจ ในช่วงเวลาที่กำหนด เมื่อ holdout สิ้นสุด คุณเปรียบเทียบ metrics ของกลุ่ม holdout กับประชากรส่วนที่เหลือ เพื่อวัด ผลกระทบสะสมระยะยาว ของ experiment ทั้งหมดที่พวกเขาพลาดไป

หากไม่มี holdout ผลลัพธ์ของ experiment สะท้อนแค่ผลกระทบระยะสั้น แต่ด้วย holdout คุณตอบได้ว่า “ฟีเจอร์ทั้งหมดที่เรา ship ในช่วงนี้ส่งผลต่อ metrics จริงหรือเปล่า?”

GrowthBook จำลอง holdout เป็น experiment ปกติที่กลุ่ม control ไม่ได้รับ treatment และถูกแยกออกจาก experiment อื่นๆ ทั้งหมดใน namespace

  1. ไปที่ Experiments → Add Experiment และเลือก Holdout
  2. กำหนดให้กับ namespace และให้ range ที่กว้าง เช่น 0.90–1.00 (10% บนสุดของ traffic กลายเป็น holdout)
  3. ตั้งระยะเวลา (เช่น 90 วัน)
  4. คลิก Start Experiment

experiment ใดๆ ใน namespace เดียวกันที่ ไม่ ซ้อนทับกับ 0.90–1.00 จะไม่มีวันถึง holdout users

// SDK-side: namespaces are transparent.
// You configure them in the GrowthBook UI;
// the SDK assignment hash already respects namespace ranges.

const gb = new GrowthBook({
  apiHost: 'https://cdn.growthbook.io',
  clientKey: 'sdk-YOUR_DEV_KEY',
  attributes: { id: 'user-123' },
});

await gb.init({ timeout: 2000 });

// This assignment will NEVER conflict with another
// experiment in the same namespace that owns a
// non-overlapping range.
const result = gb.runInlineExperiment({
  key: 'checkout-cta',
  variations: [0, 1],
});
console.log('Variation:', result.value);
ตัวเลือกBenefitCost
ใช้ Namespace แยก experimentป้องกัน user เจอหลาย experiment ที่ conflict กันลด traffic ที่ใช้ได้ต่อ experiment
ไม่ใช้ Namespaceได้ traffic เต็มต่อ experimentเสี่ยง experiment ปนกันโดยไม่รู้ตัว
  • รัน experiment ที่แก้ layout เดียวกันในสอง experiment คนละ namespace โดยไม่ตั้งใจ ทำให้ผลปนกัน
  • ไม่ตั้ง holdout group ทำให้วัด long-term impact ของ feature ทั้งหมดไม่ได้
  • ลืมว่า namespace แบ่ง traffic แบบ fixed — เปลี่ยนกลาง experiment ทำให้ sample เพี้ยน

💡 ตัวอย่างจากของจริง

Facebook ใช้ namespace/layer system ที่แนวคิดคล้ายกันเพื่อรันหลายพัน experiment พร้อมกันโดยไม่ให้ผลกระทบกัน

GrowthBook namespace รับประกันอะไร?
การตั้ง traffic range 0.00–0.50 กับ 0.50–1.00 ให้สอง experiment ใน namespace เดียวกันได้ผลอย่างไร?
จุดประสงค์หลักของ holdout group คืออะไร?
experiment ใน namespace ต่างกันมีผลต่อกันหรือไม่?