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

ทำไม eval ของ agent ต่าง​จาก test ปกติ

ใน​คอร์ส Testing in Practice เรา​ตอบ​คำถาม​เดียว — “รู้​ได้​ยังไง​ว่า code ทำงาน​ถูก” — ด้วย​การ​ไล่ test ทุก​ชั้น​ของ domain Order ระบบ​ที่ input เดิม​ให้​ผล​เดิม​ทุก​ครั้ง แต่​พอ​เอา Order ตัว​เดิม​นั้น​มา​ห่อ​ด้วย agentAgentic Loopวงจร​ที่ agent ทำซ้ำ​จนกว่า​จะ​บรรลุ​เป้าหมาย: รับ input → วางแผน → เรียก tool → สังเกต​ผลลัพธ์ → วน​กลับ​ไป​ตัดสิน​ใจ​ใหม่ — ยิ่ง​วงจร​นี้​ยาว​และ​มี​หลาย​ขั้นตอน ยิ่ง​มี​โอกาส​ที่​ความ​ผิดพลาด​ต่อ​ขั้น​จะ​สะสมทบ​กัน (ผิด 5% ต่อ​ขั้น 10 ขั้น อาจ​เหลือ​ถูก​แค่​ราว 60%) จึง​ต้อง​มี Eval ที่​มอง​ทั้ง Trajectory เป็น​ตาข่าย​เสริม ไม่ใช่​มอง​แค่​ผลลัพธ์​สุดท้าย​อย่าง​เดียวArchitecture — ops-copilot ที่​รับคำ​สั่ง “คืน​เงิน​ออเดอร์​นี้” แล้ว​วางแผน เรียก tool คืน​เงิน และ​ลงมือ​แก้​สถานะ​จริง​ใน​ฐาน​ข้อมูล — สมมติฐาน “input เดิม​ให้​ผล​เดิม” ก็​พัง​ทันที คอร์ส​นี้​ถาม​คำถาม​เดิม​กับ​ระบบ​แบบ​ใหม่: รู้​ได้​ยังไง​ว่า agent ทำงาน​ได้​จริง คำ​ตอบ​คือ EvalEvalการ​วัดผล​อย่าง​เป็น​ระบบ​ว่า output ของ AI agent (เช่น ops-copilot) ถูกต้อง​และ​มี​ประโยชน์​จริง​หรือ​ไม่ ด้วย​ชุด​เกณฑ์​และ​กรณี​ทดสอบ​ที่​ชัดเจน แทน​การ​ดู​จาก​ความ​รู้สึก​ว่า 'ตอบ​ดู​ดี' — จำเป็น​เพราะ agent เป็น​ระบบ​หลาย​ขั้นตอน​ที่​ความ​ผิดพลาด​สะสมทบ​กัน​ได้ และ​แต่ละ​รอบ​ก็​ไม่​ได้​เดินทาง​เดิม​เป๊ะ​ทุก​ครั้งProcess

คอร์ส​นี้​ไม่ใช่​คอร์ส Testing version เขียน​ใหม่ test แบบ​เดิม​ตั้ง​อยู่​บน​สมมติฐาน​ว่า​ระบบ​เป็น deterministic — เรียก method เดิม​ด้วย input เดิม ต้อง​ได้​ผล​เดิม​เป๊ะ agent ละเมิด​สมมติฐาน​นี้​ด้วย​คุณสมบัติ​สาม​ข้อ: มัน​เป็น​ระบบ​หลาย​ขั้นตอน ความ​ผิดพลาด​ต่อ​ขั้น​จึง​ทบ​กัน, มัน​ไม่ deterministic รอบ​เดียวกัน​เดิน​คนละ​เส้นทาง​ที่​ถูกต้อง​ได้, และ​มัน​ลงมือ​กับ​สภาพ​แวดล้อม​จริง เรา​จึง​ต้อง​ตัดสิน​จาก​สิ่ง​ที่​มัน​ทำให้​เกิด​ขึ้น ไม่ใช่​จาก​คำ​พูด​ของ​มัน​เอง สาม​ข้อ​นี้​คือ​ราก​ของ​ทุก​บท​ที่​เหลือ — บท​นี้​อธิบาย​ว่า​ทำไม​มัน​ถึง​เปลี่ยน​เกม แล้ว​บท 2–8 จะ​สร้าง​วินัย eval ที​ละ​ชิ้น​บน​ราก​สาม​ข้อ​นี้

📦 code ตัวอย่าง

คอร์ส​นี้​ใช้ ops-copilot agent ที่​คืน​เงิน​ออเดอร์​ใน domain Order เดิม​จาก repo kaen-food-ordering (กำลัง​จัด​ทำ) เป็น​ตัวอย่าง​เดิน​เรื่อง​ตลอด​คอร์ส — บท​นี้​เป็น​บท​วาง​แนวคิด สเก็ตช์ code ที่​เห็น​เป็น​ภาพร่าง​ของ eval เพื่อ​สื่อ​ไอเดีย ไม่ใช่ eval harness ที่​รัน​ได้​ทันที

agent เป็น​ระบบ​หลาย​ขั้นตอน ความ​ผิดพลาด​จึง​ทบ​กัน

หัวข้อ​ที่​มีชื่อ​ว่า “agent เป็น​ระบบ​หลาย​ขั้นตอน ความ​ผิดพลาด​จึง​ทบ​กัน”

test domain Order วัด​การ​เรียก method ครั้ง​เดียว: Place(...) เข้า Order ออก จบ​ใน​ก้าว​เดียว แต่ agent ไม่​ได้​ทำงาน​ใน​ก้าว​เดียว มัน​วน​อยู่​ใน loop: รับ input → วางแผน → เรียก tool → สังเกต​ผล → วน​กลับ​ไป​ตัดสิน​ใจ​ใหม่ จนกว่า​จะ​บรรลุ​เป้าหมาย ยิ่ง​งาน​ซับซ้อน loop นี้​ยิ่ง​ยาว และ​ความ​ผิดพลาด​เล็กๆ ต่อ​ขั้น​ก็​ยิ่ง​มี​ที่​ให้​สะสม

Chip Huyen ยก​ตัวเลข​ไว้​ให้​เห็น​ภาพ​ว่า ถ้า​ความ​แม่นยำ​ต่อ​ขั้น​อยู่​ที่ 95% เดิน 10 ขั้น​ความ​แม่นยำ​จะ​เหลือ​ราว 60% และ​เดิน 100 ขั้น​จะ​เหลือ​เพียง 0.6% (ดู Chip Huyen, “Agents”)

ย้ำ​ให้​ชัด​ก่อน​เข้าใจ​ผิด: ตัวเลข​ชุด​นี้ ไม่ใช่​อัตรา​พัง​ที่​วัด​ได้​จริง จาก agent ตัว​ใด​ตัว​หนึ่ง มัน​คือ​การ​คำนวณ​แบบ​สมมติ​ว่า​ความ​ผิดพลาด​แต่ละ​ขั้น “เป็น​อิสระ​ต่อ​กัน” ล้วนๆ (0.95 ยก​กำลัง 10 ≈ 0.60 และ​ยก​กำลัง 100 ≈ 0.006) agent จริง​ไม่​ได้​เป็น​แบบนั้นเป๊ะ — มัน​กู้​คืน​จาก​ความ​ผิดพลาด​บาง​อย่าง​ได้​เอง และ​ใน​บาง​กรณี​ก็​พลาด​พร้อม​กัน​เป็น​ชุด​เพราะ​สาเหตุ​เดียวกัน ตัวเลข 95%→60%→0.6% จึง​มี​ค่า​ใน​ฐานะ สัญชาตญาณ ว่า “ยิ่ง​จำนวน​ขั้น​เยอะ ระบบ​ยิ่ง​เปราะ” เท่านั้น ห้าม​หยิบ​ไป​อ้าง​เป็น​ผล​วัด​ของ agent จริง บทเรียน​ที่​ได้​คือ: จำนวน​ขั้น​เป็น​ตัว​คูณ​ความ​เสี่ยง test ที่​วัด​แค่​ก้าว​เดียว​จึง​มอง​ไม่​เห็น​ความ​เปราะ​ที่​โผล่​มา​ตอน​หลาย​ก้าว​ต่อ​กัน

ต่อ​ให้ agent ทำงาน​ถูก​ใน​รอบ​ที่​เรา​ลอง ก็​ยัง​สรุป​ไม่​ได้​ว่า​มัน​เชื่อถือ​ได้ เพราะ​มัน​ไม่ deterministic Anthropic เขียนไว้ตรงๆ ว่า “Even with identical starting points, agents might take completely different valid paths to reach their goal.” — แม้​เริ่ม​จาก​จุด​ตั้งต้น​เดียวกัน agent ก็​อาจ​เดิน​ไป​ตาม​เส้นทาง​ที่​ถูกต้อง​คนละ​เส้น​จนถึง​เป้าหมาย​ได้ (ดู Anthropic, “How we built our multi-agent research system”) นั่น​แปล​ว่า​รอบ​ที่​ผ่าน​กับ​รอบ​ที่​พัง​อาจ​มา​จาก input เดียวกันเป๊ะ การ​ผ่าน​หนึ่ง​ครั้ง​จึง​เป็น​แค่​ตัวอย่าง​หนึ่ง​จาก​การ​แจกแจง ไม่ใช่​ข้อ​สรุป​เรื่อง​ความ​น่า​เชื่อถือ

ความ​น่า​เชื่อถือ​ต้อง​วัด​จาก​การ​รัน​ซ้ำ​หลาย​รอบ ไม่ใช่​รอบ​เดียว งาน τ-bench เสนอ metric ใหม่​ชื่อ Pass^kPass^kตัว​ชี้​วัด​ความ​น่า​เชื่อถือ​ที่​นับ​ว่า agent ต้อง​ผ่าน 'ทุก​ครั้ง' ใน k รอบ​ที่​รัน​ซ้ำ​เคส​เดิม ไม่ใช่​แค่​ผ่าน​สัก​ครั้ง​ใน k ครั้ง​แบบ pass@k — มา​จาก​งาน τ-bench ที่​ชี้​ว่า agent ที่​สุ่ม​ถูก​บาง​ครั้ง​ยัง​ใช้งาน​จริง​ไม่​ได้ ต้อง​วัด​ความ​นิ่ง​ข้าม​หลาย​รอบ​จึง​จะ​เชื่อถือ​ได้Process มา “evaluate the reliability of agent behavior over multiple trials” — วัด​ว่า agent ผ่าน ทุก​ครั้ง ใน k รอบ​ที่​รัน​เคส​เดิม​ซ้ำ​หรือ​ไม่ (ดู τ-bench (arXiv 2406.12045)) จุด​ที่​ต้อง​แยก​ให้​ขาด: pass^k ต่าง​จาก pass@k — pass@k แค่​ผ่าน “อย่าง​น้อยหนึ่ง​ครั้ง” ใน k รอบ​ก็​นับ​ผ่าน (เหมาะ​กับ​งาน​ที่​ลอง​หลาย​คำ​ตอบ​แล้ว​เลือก​อัน​ดี​ได้) แต่ ops-copilot ที่​ไป​แก้​เงิน​จริง​ใน​ฐาน​ข้อมูล​ไม่มี​สิทธิ์​พลาด​แม้​รอบ​เดียว เรา​จึง​วัด​ด้วย pass^k ที่​โหด​กว่า: พลาด​รอบ​ใด​รอบ​หนึ่ง​คือ​ตก

flowchart TB
  Q["เคสเดียวกัน: คืนเงินออเดอร์ 123 เป็นเงิน 120 บาท"]
  Q --> ONE["รันครั้งเดียว<br/>รอบนั้นผ่าน จึงสรุปว่า agent ใช้ได้"]
  Q --> MANY["รันซ้ำ 5 รอบ วัดแบบ Pass^k"]
  ONE --> V1["สรุปว่าเชื่อถือได้ — แต่เป็นภาพลวงตา"]
  MANY --> R["ผ่าน 3 รอบ พลาด 2 รอบ<br/>รอบ 3 เรียก tool ผิดตัว รอบ 5 คืนเงินผิดจำนวน"]
  R --> V2["Pass^k ไม่ผ่าน — สรุปตามจริงว่ายังเชื่อถือไม่ได้"]
  classDef bad fill:#dc2626,stroke:#7f1d1d,color:#f8fafc;
  classDef good fill:#16a34a,stroke:#065f46,color:#f8fafc;
  class V1 bad;
  class V2 good;

คำ​บรรยาย​ภาพ: เคส​เดียวกัน​สอง​วิธี​สรุป เส้น​ซ้าย (แดง) รัน​รอบ​เดียว​เห็น​ผ่าน​ก็​ปักใจ​ว่า agent เชื่อถือ​ได้ — เป็น​ภาพลวงตา​เพราะ​รอบ​ถัด​ไป​อาจ​เดิน​คนละ​เส้น เส้น​ขวา (เขียว) รัน​เคส​เดิม​ซ้ำ 5 รอบ​แล้ว​วัด​ด้วย pass^k เจอ​ว่า​ผ่าน​แค่ 3 จาก 5 (รอบ​หนึ่ง​เรียก tool ผิด​ตัว อีกรอบ​คืน​เงิน​ผิด​จำนวน) pass^k จึง​ไม่​ผ่าน และ​สรุป​ตาม​จริง​ว่า​ยัง​ปล่อย​ขึ้น​โปร​ดัก​ชัน​ไม่​ได้ ความ​น่า​เชื่อถือ​อยู่​ที่​ความ​นิ่ง​ข้าม​หลาย​รอบ ไม่ใช่​ผล​ของ​รอบ​ที่​โชค​ดี

eval คือ​วิธี​รู้​ว่า agent ทำงาน​ได้​จริง — วัด​ที่​ผลลัพธ์

หัวข้อ​ที่​มีชื่อ​ว่า “eval คือ​วิธี​รู้​ว่า agent ทำงาน​ได้​จริง — วัด​ที่​ผลลัพธ์”

รวม​สอง​ข้อ​ข้าง​บน​เข้า​ด้วย​กัน — หลาย​ขั้นตอน​จน​เปราะ และ​ไม่​นิ่ง​ข้าม​รอบ — จะ​เห็น​ว่า “ลอง​แล้ว​ดูเหมือน​ทำงาน” ไม่ใช่​หลักฐาน​เลย eval คือ​การ​แทน​ความ​รู้สึก​นั้น​ด้วย​การ​วัด​ที่​เป็น​ระบบ: เกณฑ์​ชัดเจน เคส​ทดสอบ​ที่มา​จาก​งาน​จริง และ​รัน​ซ้ำ​ได้ มัน​คือ​เครื่องมือ​ที่​ช่วย​รักษา​ความ​น่า​เชื่อถือ​ของ agent เอา​ไว้​ระหว่าง​ที่​เรา​แก้ prompt เปลี่ยน model หรือ​เพิ่ม tool ไป​เรื่อยๆ

คุณสมบัติ​ข้อ​ที่​สาม — agent ลงมือ​กับ​สภาพ​แวดล้อม​จริง — เป็น​ตัว​ชี้​ว่า eval ควร​วัด “อะไร” คำ​ตอบ​คือ​วัด​ที่ ผลลัพธ์​ที่​เกิด​ขึ้น​จริง​ต่อ​สภาพ​แวดล้อม ไม่ใช่​คำ​บรรยาย​ของ agent เอง ลอง​ดู​สอง​วิธี​เช็ค​ผล​เดียวกัน​สำหรับ​คำ​สั่ง “คืน​เงิน​ออเดอร์ #123 จำนวน ฿120”:

// สเก็ตช์เพื่อสื่อไอเดีย ไม่ใช่ code ที่รันได้จริง — เทียบสองวิธีเช็คผลเดียวกัน
// version ดิบ: เชื่อคำบรรยายของ agent เอง
if (agentReply.includes("คืนเงินเรียบร้อย")) markPass();
// ❌ agent "พูด" ว่าทำ ไม่ได้แปลว่าฐานข้อมูลเปลี่ยนจริง — ผ่านลวงตา
// version ที่วัด outcome: ดูสถานะจริงของฐานข้อมูลหลัง agent ทำงานเสร็จ
const row = db.refunds.findOne({ orderId: 123 });
markPass(row != null && row.amount === 120);
// ✅ มีแถวคืนเงินของออเดอร์นั้นจริง และจำนวนถูกต้อง จึงนับว่าผ่าน

version ดิบ​ผ่าน​ได้​ทั้ง​ที่ agent อาจ​ไม่​ได้​คืน​เงิน​เลย ขอ​แค่​มัน​พิมพ์​ประโยค​ที่​ถูก ส่วน version ที่​วัด outcome ถาม​คำถาม​ที่​ตรวจสอบ​ได้: “มี​แถว​คืน​เงิน​ของออเดอร์ #123 ใน​ฐาน​ข้อมูล​จริง จำนวน ฿120 หรือ​ยัง” — นี่​คือ​หัวใจ​ที่​คอร์ส​นี้​จะ​กลับ​มา​ย้ำ​ตลอด และ​เป็น​เหตุผล​ว่า​ทำไม​การ​ตัดสิน​จาก​ผลลัพธ์​ถึง​เป็น​ค่า​เริ่มต้น ส่วน​การ​ไล่​เช็ค​เส้นทาง (trajectory) ที​ละ​ก้าว​จะ​กลาย​เป็น​ตาข่าย​เสริม​ด้าน​ความ​ปลอดภัย ไม่ใช่​เกณฑ์​หลัก — บท​ที่ 3 จะ​เจาะ​เรื่อง​นี้​เต็มๆ

บท​นี้​วาง​แค่​ราก — ทำไม agent ต้องการ eval ที่​ต่าง​จาก test ปกติ เพราะ​มัน​หลาย​ขั้นตอน ไม่​นิ่ง​ข้าม​รอบ และ​ตัดสิน​กัน​ที่​ผลลัพธ์​จริง จาก​นี้​เรา​จะ​สร้าง​วินัย eval ที​ละ​ชิ้น:

  1. หมวด​หมู่​ความ​ล้มเหลว​ของ agent (บท​ที่ 2) — planning / tool-execution / efficiency แต่ละ​แบบ​แก้​กัน​คนละ​จุด
  2. ตัดสิน​จาก​ผลลัพธ์ ไม่ใช่​เส้นทาง (บท​ที่ 3) — ทำไม outcome เป็น​เกณฑ์​หลัก และ​เมื่อไร​การ​เช็ค trajectory ยัง​มี​ประโยชน์
  3. LLM-as-judge (บท​ที่ 4) — เมื่อไร​ใช้​ตัว​ตัดสิน​ที่​เป็น LLM และ​เมื่อไร​ตัว​เช็ค​แบบ deterministic ดี​กว่า
  4. เริ่ม​จาก eval set เล็กๆ (บท​ที่ 5) — 20–50 เคส​จาก​ความ​ล้มเหลว​จริง ก่อน​ขยาย​เป็น​ชุด​ใหญ่
  5. Human-in-the-loop กับ error analysis (บท​ที่ 6) — หัวใจ​ของ​คอร์ส: อ่าน trace จริง​เพื่อ​หา​ว่า​อะไร​พัง​จาก​อะไร
  6. offline eval กับ online eval (บท​ที่ 7) — วัด​ก่อน​ปล่อย กับ​วัด​ต่อ​เนื่อง​บน​โปร​ดัก​ชัน
  7. eval-driven development (บท​ที่ 8) — ข้อ​ถกเถียง​ที่​ยัง​ไม่​จบ​ระหว่าง Anthropic กับ Hamel

ทุก​บท​กลับ​มา​ที่ ops-copilot ตัว​เดิม​เสมอ — ไม่มี agent ใหม่ ไม่มี domain ใหม่ มี​แต่​การ​ไล่​วัด​ให้​แน่ใจ​ว่า​มัน​ทำงาน​ได้​จริง


🔗 อ้างอิง​ต้นทาง​ของ​บท​นี้

บท​นี้​สังเคราะห์​จาก​สาม​แหล่ง​หลัก อ่าน​ต่อ​ได้ที่​ต้นทาง​โดยตรง:

  • Chip Huyen, “Agents” — สัญชาตญาณ​เรื่อง​ความ​ผิดพลาด​ที่​ทบ​กัน​ตาม​จำนวน​ขั้น (ตัวเลข 95%→60%→0.6% เป็นการ​คำนวณ​เชิง​สมมติ ไม่ใช่​ผล​วัด​จริง)
  • Anthropic, “How we built our multi-agent research system” — agent เดิน​ได้​หลาย​เส้นทาง​ที่​ถูกต้อง จึง​ต้อง​วัด​กัน​ที่​ผลลัพธ์
  • τ-bench (arXiv 2406.12045) — metric pass^k สำหรับ​วัด​ความ​น่า​เชื่อถือ​ข้าม​หลาย​รอบ
  • คอร์ส Testing in Practice บท​ที่ 1 — คู่หู​ของ​คอร์ส​นี้ วินัย​พิสูจน์​ว่า code ทำงาน​ถูก ก่อน​ขยับ​มา​พิสูจน์ agent

เช็กความเข้าใจ — บทที่ 1

ข้อ 1 / 3

ตัวเลข 95% ต่อขั้น → ~60% ที่ 10 ขั้น → 0.6% ที่ 100 ขั้น ของ Chip Huyen ควรเข้าใจว่าเป็นอะไร?