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

ตัดสิน​ที่​ผลลัพธ์ ไม่ใช่​เส้นทาง

บท​ที่ 1 สรุป​ว่า agent ตัดสิน​กัน​ที่​ผลลัพธ์​เพราะ​มัน​หลาย​ขั้นตอน​และ​ไม่​นิ่ง​ข้าม​รอบ บท​ที่ 2 แยก​ความ​ล้มเหลว​ออก​เป็นหมวดๆ เพื่อ​รู้​ว่า​จะ​แก้​อะไร​ก่อน ทีนี้​พอ​ลงมือ​เขียน eval จริง สัญชาตญาณ​แรก​ที่​เกือบ​ทุก​คน​มี​คือ “จด​ลำดับ step ที่​ถูกต้อง​ไว้ แล้ว​เช็กว่า agent เดิน​ตามนั้นเป๊ะ​ไหม” — เรียก lookup_order ก่อน แล้ว​ค่อย check_refund_policy แล้ว​จึง issue_refund ถ้า​เดิน​ครบ​ตาม​ลำดับ​ก็​นับ​ผ่าน ฟัง​ดู​เข้มงวด​ดี แต่​บท​นี้​จะ​อธิบาย​ว่า​ทำไม​มัน​ถึง​เป็น​กับดัก และ​ทำไม Anthropic ถึง​ปฏิเสธ​วิธี​นี้​เป็น​ค่า​เริ่มต้น

📦 code ตัวอย่าง

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

ก่อน​อื่น​ตั้ง​ชื่อ​สิ่ง​ที่​เรา​กำลัง​พูด​ถึง​ให้​ชัด: TrajectoryTrajectoryลำดับ​ขั้นตอน​จริง​ที่ agent เดิน​ผ่าน​ระหว่าง​ทำงาน (เรียก tool ไหน คิด​อะไร ตัดสิน​ใจ​อย่างไร) ก่อน​ถึง​ผลลัพธ์​สุดท้าย — เช็ค​ที​ละ​ก้าว​ยัง​มี​ประโยชน์​เป็น​ตาข่าย​เสริม​ด้าน​ความ​ปลอดภัย (เช่น เช็ค​ว่า​ไม่​เคย​เรียก tool คืน​เงิน​โดย​ไม่มี​การ​อนุมัติ) แต่​ไม่​ควร​ใช้​แทน​การ​เช็ค outcome เป็น​หลัก เพราะ​เข้ม​เกิน​ไป​กับ agent ที่​มี​หลาย​เส้นทาง​ที่​ถูกต้อง​พร้อม​กันArchitecture คือ​ลำดับ​ขั้นตอน​จริง​ที่ agent เดิน​ผ่าน​ระหว่าง​ทำงาน — เรียก tool ตัว​ไหน ด้วย parameter อะไร คิด​อะไร ตัดสิน​ใจ​อย่างไร ก่อน​จะ​ถึง​ผลลัพธ์​สุดท้าย การ “diff เส้นทาง” คือ​การ​เทียบ trajectory ที่ agent เดิน​จริง​กับ​เส้นทาง​ทอง​ที่​เรา​วาง​ไว้​ล่วงหน้า ถ้า​ไม่​ตรง​เป๊ะ​ก็​ตก

Anthropic พูด​ถึง​สัญชาตญาณ​นี้ตรงๆ ว่า “There is a common instinct to check that agents followed very specific steps like a sequence of tool calls in the right order. We’ve found this approach too rigid and results in overly brittle tests.” — มัน​เข้ม​เกิน​ไป​และ​ได้ test ที่​เปราะ คำ​แนะนำ​ของ​เขา​คือ “grade what the agent produced, not the path it took.” คือ​ตัดสิน​จาก​สิ่ง​ที่ agent ทำให้​เกิด​ขึ้น ไม่ใช่​เส้นทาง​ที่​มัน​เดิน (ดู Anthropic, “Demystifying evals for AI agents”)

เหตุผล​ที่​มัน​พัง​กับ agent โดย​เฉพาะ​ย้อน​กลับ​ไป​ที่​คุณสมบัติ​จาก​บท​ที่ 1: agent ไม่ deterministic ให้ query เดิม​เป๊ะ มัน​ก็​เดิน​ไป​ถึง​คำ​ตอบ​ที่​ถูกต้อง​ได้​หลาย​เส้นทาง — เปลี่ยน​ลำดับ tool เปลี่ยน subagent ที่​เรียก เปลี่ยน​จำนวน​ก้าว แต่​ปลายทาง​ถูก​เหมือน​กัน Anthropic สรุป​ว่า “this variability requires evaluation methodologies that focus on outcomes rather than process compliance.” — ความ​แปรผัน​นี้​บังคับ​ให้​ต้อง​วัด​กัน​ที่​ผลลัพธ์ ไม่ใช่​ความ​ยอม​ตาม​กระบวนการ (ดู Anthropic, “How we built our multi-agent research system”)

ลอง​ดู​กับ ops-copilot: การ​คืน​เงิน​ออเดอร์​หนึ่ง​จะ​เช็ก policy ก่อน​แล้ว​ค่อย lookup ออเดอร์ หรือ lookup ก่อน​แล้ว​ค่อย​เช็ก policy ก็ได้​ทั้ง​คู่ — ผลลัพธ์​ที่​ถูกต้อง​อัน​เดียวกัน แต่​ถ้า​เรา​เอา trajectory ไป diff กับ​เส้นทาง​ทอง​เส้น​เดียว รอบ​ที่​สลับ​ลำดับ​อย่าง​ถูกต้อง​จะ​ตก​ทันที นี่​คือ ❌ version ดิบ: golden-trajectory diffing — มัน​ลงโทษ​ความ​หลากหลาย​ที่​ไม่​ได้​ผิด​อะไร​เลย

flowchart TB
  START["คำสั่ง: คืนเงินออเดอร์ 123 เป็นเงิน 120 บาท"]
  START --> A1["รอบ A ขั้นที่ 1: lookup_order"]
  START --> B1["รอบ B ขั้นที่ 1: check_refund_policy"]
  A1 --> A2["ขั้นที่ 2: check_refund_policy"]
  B1 --> B2["ขั้นที่ 2: lookup_order"]
  A2 --> A3["ขั้นที่ 3: issue_refund"]
  B2 --> B3["ขั้นที่ 3: issue_refund"]
  A3 --> ENDST["สถานะปลายทางเดียวกัน<br/>มีแถวคืนเงินออเดอร์ 123 จำนวน 120 บาท ในฐานข้อมูล"]
  B3 --> ENDST
  ENDST --> JUDGE["Outcome-based Eval ตัดสินที่นี่<br/>ผ่านทั้งสองเส้นทาง"]
  classDef good fill:#16a34a,stroke:#065f46,color:#f8fafc;
  classDef path fill:#1e3a5f,stroke:#1e40af,color:#f8fafc;
  class ENDST,JUDGE good;
  class A1,A2,A3,B1,B2,B3 path;

คำ​บรรยาย​ภาพ: คำ​สั่ง​เดียวกัน สอง​เส้นทาง​ที่​ถูกต้อง​ต่าง​กัน — รอบ A เช็กออเดอร์​ก่อน​แล้ว​ค่อย​เช็ก policy รอบ B สลับ​กัน ทั้ง​คู่​จบ​ลง​ที่​สถานะ​ปลายทาง​เดียวกัน​คือ​มี​แถว​คืน​เงิน​ออเดอร์ 123 จำนวน 120 บาท​ใน​ฐาน​ข้อมูล ถ้า​ตัดสิน​ด้วย​การ diff เส้นทาง​กับ​เส้นทาง​ทอง​เส้น​เดียว เส้น​ใด​เส้น​หนึ่ง​จะ​ตก​ทั้ง​ที่​คืน​เงิน​สำเร็จ แต่​ถ้า​ตัดสิน​ที่ end-state (กล่อง​เขียว) ทั้ง​สอง​เส้น​ทางผ่าน เพราะ​สิ่ง​ที่​เราสนใจจริงๆ คือ​ปลายทาง ไม่ใช่​ทาง​ที่​เดิน​มา

outcome คือ​สถานะ​จริง​ของ​สภาพ​แวดล้อม ไม่ใช่​คำ​พูด​ของ agent

หัวข้อ​ที่​มีชื่อ​ว่า “outcome คือ​สถานะ​จริง​ของ​สภาพ​แวดล้อม ไม่ใช่​คำ​พูด​ของ agent”

ทีนี้​มา​ถึง​หัวใจ: Outcome-based EvalOutcome-based Evalการ​ตัดสิน​จาก 'สถานะ​สุดท้าย​ของ​สภาพ​แวดล้อม​จริง' หลัง agent ทำงาน​เสร็จ เช่น มี​แถว​คืน​เงิน​ของออเดอร์​นั้น​ใน​ฐาน​ข้อมูล​จริง​หรือ​ยัง ไม่ใช่​จาก​คำ​บรรยาย​ว่า agent 'บอกว่า​ทำ​เสร็จ​แล้ว' — เป็น​ค่า​เริ่มต้น​ที่​แนะนำ เพราะ agent หลาย​เส้นทาง​ไป​ถึง​ผลลัพธ์​ที่​ถูกต้อง​เหมือน​กัน​ได้​โดย​ไม่​จำเป็น​ต้อง​เดิน​เหมือน​กันProcess คือ​การ​ตัดสิน​จาก​สถานะ​สุดท้าย​ที่​เกิด​ขึ้น​จริง​ต่อ​สภาพ​แวดล้อม​หลัง agent ทำงาน​เสร็จ ไม่ใช่​จาก​คำ​ที่ agent บรรยาย​ว่า​ตัวเอง​ทำ​สำเร็จ และ​ไม่ใช่​จาก​การ diff เส้นทาง​ที่​มัน​เดิน จุด​ที่​ต้อง​แยก​ให้​ขาด​มี​สอง​ด้าน — outcome ไม่ใช่ “คำ​พูด” และ outcome ไม่ใช่ “เส้นทาง”

τ-bench ทำ​สิ่ง​นี้​ให้​เห็น​เป็น​รูปธรรม: มัน​ไม่​ได้​อ่าน​ว่า agent พิมพ์​อะไร​ออก​มา แต่​ตัดสิน​ด้วย​การ​เทียบ “the database state at the end of a conversation with the annotated goal state” — เทียบ​สถานะ​ฐาน​ข้อมูล​ตอน​จบ​บทสนทนา​กับ​สถานะ​เป้าหมาย​ที่​มนุษย์​ระบุ​ไว้ (ดู τ-bench (arXiv 2406.12045)) สถานะ​เป้าหมาย​ที่​มนุษย์​ระบุ​ไว้​ก้อน​นั้น​คือ Ground TruthGround Truthคำ​ตอบ​หรือ​พฤติกรรม​ที่ 'ถูกต้อง​จริง' ตาม​การ​ตรวจสอบ​ของ​มนุษย์​ผู้เชี่ยวชาญ ใช้​เป็น​หลัก​อ้างอิง​เทียบ​กับ output ของ agent ใน Golden Dataset — ถ้า ground truth เอง​ยัง​คลุมเครือ eval ที่​เทียบ​กับ​มัน​ก็​เชื่อถือ​ไม่​ได้​ตั้งแต่​ต้นProcess ของ​เคส — คำ​ตอบ​ที่ “ถูกต้อง​จริง” ที่​เรา​เอา​ไว้​เทียบ ถ้า ground truth เอง​ยัง​คลุมเครือ eval ที่​วัด​เทียบ​กับ​มัน​ก็​เชื่อถือ​ไม่​ได้​ตั้งแต่​ต้น

กลับ​มา​ที่ ops-copilot คำถาม​ที่ eval ควร​ถาม​ไม่ใช่ “agent บอกว่า​คืน​เงิน​แล้ว​หรือ​ยัง” แต่​เป็น “ตอน​นี้​มี​แถว​คืน​เงิน​ของออเดอร์ #123 ใน​ฐาน​ข้อมูล​จริง จำนวน ฿120 หรือ​ยัง” เทียบ​สอง​สเก็ตช์​นี้:

// สเก็ตช์เพื่อสื่อไอเดีย ไม่ใช่ code ที่รันได้จริง — เทียบสองวิธีตัดสินผลเดียวกัน
// version ดิบ: golden-trajectory diffing — บังคับให้ลำดับ tool ตรงกับเส้นทางทองที่วางไว้
const goldenPath = ["lookup_order", "check_refund_policy", "issue_refund"];
markPass(deepEqual(agentTrace.toolCalls, goldenPath));
// ❌ รอบที่เช็ก policy ก่อน lookup (เส้นทางถูกต้องอีกเส้น) จะตกทั้งที่คืนเงินสำเร็จ — เปราะ
// version ที่วัด outcome: ดูสถานะจริงของฐานข้อมูลหลัง agent ทำงานเสร็จ
const row = db.refunds.findOne({ orderId: 123 });
markPass(row != null && row.amount === 120);
// ✅ สนใจแค่ว่าปลายทางถูกไหมเทียบกับ ground truth ไม่สนว่าเดินมาทางไหน

version ดิบ​ตก​ทุกรอบ​ที่ agent เดิน​เส้นทาง​ถูกต้อง​แต่​ไม่​ตรง​ลำดับ​ทอง — มัน​เปราะ​เพราะ​เข้าใจ​ผิด​ว่า “เส้นทาง​เดียว” เท่ากับ “ถูกต้อง” ส่วน version ที่​วัด outcome ถาม​คำถาม​ที่​ตรวจสอบ​ได้​กับ​สถานะ​จริง จึง​ยอมรับ​ทุก​เส้นทาง​ที่​พา​ไป​ถึง​ปลายทาง​ที่​ถูก นี่​คือ​เหตุผล​ที่​การ​ตัดสิน​จาก​ผลลัพธ์​เป็น​ค่า​เริ่มต้น​ของ​คอร์ส​นี้

เป็น​ค่า​เริ่มต้น ไม่ใช่​กฎ​ตายตัว — per-step check ยัง​มี​ที่​ยืน

หัวข้อ​ที่​มีชื่อ​ว่า “เป็น​ค่า​เริ่มต้น ไม่ใช่​กฎ​ตายตัว — per-step check ยัง​มี​ที่​ยืน”

แต่​ต้อง​ระวัง​อย่า​เหวี่ยง​สุด​ทาง “ตัดสิน​ที่​ผลลัพธ์” ไม่​ได้​แปล​ว่า “ห้าม​ดู​เส้นทาง​เลย” มัน​เป็น ค่า​เริ่มต้น ไม่ใช่​กฎ​สัมบูรณ์ แนวทาง​ของ Anthropic เอง​ก็​ยัง​เก็บ​บทบาท​ให้การ​เช็ก trajectory และ​การ​เช็กนโยบาย​ที​ละ​ก้าว​ไว้ — การ​ไล่​อ่าน transcript หรือ​เช็กว่า​แต่ละ​ก้าว​ไม่​ละเมิด​ข้อ​บังคับ​ด้าน​ความ​ปลอดภัย​นั้น “มี​ประโยชน์​บ่อย​ครั้ง” โดย​เฉพาะ​กับ coding agent

เส้น​แบ่ง​อยู่​ตรง​นี้: outcome เป็น​แกน​หลัก​ที่​ตัดสิน​ว่า​งาน​สำเร็จ​ไหม ส่วน per-step check เป็น ตาข่าย​เสริม​ด้าน​ความ​ปลอดภัย ที่​คอย​รักษา​ไม่​ให้ agent ทำ​สิ่ง​ที่​ยอมรับ​ไม่​ได้​ระหว่าง​ทาง — ต่อ​ให้​ปลายทาง​ถูก​ก็ตาม ตัวอย่าง​กับ ops-copilot ที่​ชัด​ที่สุด: “agent เคย​เรียก tool คืน​เงิน​โดย​ไม่​ผ่าน​การ​อนุมัติ​ของ​ผู้จัดการ​ไหม” ต่อ​ให้​จำนวน​เงิน​สุดท้าย​ใน​ฐาน​ข้อมูล​ถูก​เป๊ะ ถ้า​มัน​ข้าม​ขั้น​อนุมัติ​ไป​คืน​เงิน​ก้อน​ใหญ่​เอง​ก็​คือ​พฤติกรรม​ที่​รับ​ไม่​ได้ การ​เช็ก​แบบ​นี้​ต้อง​ดู​ที่​เส้นทาง ไม่ใช่​แค่​ปลายทาง

ความ​ต่าง​จาก version ดิบ​ข้าง​บน​อยู่​ที่​เจตนา: golden-trajectory diff เอา​เส้นทาง​มา​เป็น เกณฑ์​ตัดสิน​ความ​สำเร็จ (ผิด​ลำดับ = งาน​ไม่​สำเร็จ) ซึ่ง​เปราะ ส่วน per-step safety check เอา​เส้นทาง​มา​เป็น เกณฑ์​ด้าน​ความ​ปลอดภัย​ที่​เป็น​เกณฑ์​รอง (ละเมิด​ข้อ​บังคับ = เตือน​ภัย ไม่​ว่า​ผล​จะ​ถูก​ไหม) สอง​อย่าง​นี้​ดู​เส้นทาง​เหมือน​กัน​แต่​ถาม​คนละ​คำถาม จำ​ไว้​ว่า outcome คือ​เกณฑ์​หลัก per-step check คือ​เกณฑ์​รอง​ที่​รักษา​ความ​ปลอดภัย ไม่ใช่​ตัวแทน​ของ outcome

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

คำถาม​ถัด​ไป​คือ “แล้ว​ใคร​เป็น​คน​ตัดสิน​ว่า outcome ผ่าน​เกณฑ์” บาง​เคส​เทียบ​สถานะ​ฐาน​ข้อ​มูลตรงๆ ด้วย code ก็จบ (เหมือนสเก็ตช์​ข้าง​บน) แต่​หลาย​เคส​ผลลัพธ์​เป็น​ข้อความ​ยาวๆ ที่ “ถูก” ได้​หลาย​แบบ​จน​เขียน​เงื่อนไข​ตายตัว​ไม่​ไหว บท​ที่ 4 จะ​ว่าด้วย LLM-as-judge — เมื่อไร​ควร​ใช้ LLM อีก​ตัว​มา​เป็น​ผู้​ตัดสิน เมื่อไร​ตัว​เช็ก​แบบ deterministic ดี​กว่า และ​ทำไม judge ถึง​ไม่ใช่​ผู้​ตัดสิน​ที่​เชื่อ​ได้​เอง​โดย​อัตโนมัติ​จนกว่า​จะ calibrate กับ​มนุษย์​ก่อน


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

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

  • Anthropic, “Demystifying evals for AI agents” — คำ​แนะนำ​ให้ “grade what the agent produced, not the path it took” และ​เหตุผล​ว่า​การ​เช็กลำดับ step เป๊ะ​เป็น “too rigid… brittle”
  • Anthropic, “How we built our multi-agent research system” — agent เดิน​ได้​หลาย​เส้นทาง​ที่​ถูกต้อง จึง​ต้อง​วัด​ที่​ผลลัพธ์ ไม่ใช่​ความ​ยอม​ตาม​กระบวนการ (อ้าง​เพื่อ วิธีการ; ตัวเลข 90.2% ใน post นั้น​เป็น​ผล​จาก eval set ภายใน​ของ Anthropic เอง ไม่ใช่ benchmark อิสระ จึง​ไม่​หยิบ​มา​อ้าง​เป็น​ตัวเลข​สมรรถนะ)
  • τ-bench (arXiv 2406.12045) — ตัดสิน​ด้วย​การ​เทียบ​สถานะ​ฐาน​ข้อมูล​ปลายทาง​กับ​สถานะ​เป้าหมาย (ground truth) อ้าง​เพื่อ วิธีการ​เทียบ end-state; ตัวเลข​คะแนน​ของ GPT-4o ใน​เปเปอร์​เป็น​ผล​ปี 2024 ถือ​เป็น​ข้อมูล​เก่า

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

ข้อ 1 / 3

ทำไมการ diff เส้นทาง (เทียบลำดับ step กับเส้นทางทองเส้นเดียว) ถึงเปราะเมื่อใช้กับ agent?