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

Failure taxonomy — ตั้ง​ชื่อ​ความ​พลาด​ก่อน​วัด

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

บท​นี้​สร้าง Failure TaxonomyFailure Taxonomyหมวด​หมู่​ความ​ผิดพลาด​ที่​ได้​จาก​การ​ทำ Open Coding ซ้ำ​หลาย​รอบ​จน​เห็น​แพทเทิร์น​ซ้ำ ๆ เช่น วางแผน​ผิด (Planning Failure), เรียก tool ถูก​ตัว​แต่​ได้​ผลลัพธ์​ผิด​เอง (tool-execution failure), หรือ​แผน​ถูก​แต่​ใช้​ขั้นตอน/เวลา/ต้นทุน​เกิน​จำเป็น (efficiency failure) — ใช้​จัด​ลำดับ​ว่า​จะ​แก้​ปัญหา​ไหน​ก่อน​เพราะ​กระทบ​มาก​ที่สุดProcess — ชุด​หมวด​หมู่​ที่​ตั้ง​ชื่อ​ไว้​ชัดเจน​สำหรับ​เรียก​ความ​ล้มเหลว​ของ agent Chip Huyen จัด​ความ​พลาด​ออก​เป็น​สาม​ชั้น​หลัก: planning failure (วางแผน/ให้​เหตุผล​ผิด), tool-execution failure (เรียก tool ถูก​ตัว​แต่ tool คืน​ผล​ผิด​เอง), และ efficiency failure (แผน​ถูก​แต่​เปลือง​ขั้น/เวลา/ต้นทุน​เกิน​จำเป็น) (ดู Chip Huyen, “Agents”) ทั้ง​บท​นี้​จะ​เดิน​เรื่อง​ด้วย ops-copilot ตัว​เดิม — agent ที่​รับคำ​สั่ง​ดูแล​ออเดอร์​อาหาร คืน​เงิน และ​ยกเลิก​ออเดอร์

📦 code ตัวอย่าง

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

Planning FailurePlanning Failureความ​ผิดพลาด​หมวด​หลัก​ที่​เกิด​ตอน agent วางแผน​ผิด​ตั้งแต่​ต้น เช่น เลือก​เรียก tool ที่​ไม่มี​อยู่​จริง เรียก tool ถูก​ตัว​แต่​ใส่ parameter ผิด​ชนิด/ผิด​ค่า (เช่น คืน​เงิน ฿100 ทั้ง​ที่​ควร​เป็น ฿120) หรือ​บรรลุ​เป้าหมาย​ผิด​ไป​เลย — ต่าง​จาก tool ที่​ทำงาน​ถูก​คำ​สั่ง​แต่​คืน​ผลลัพธ์​ผิด​เอง ต้อง​แก้​กัน​คนละ​จุดProcess คือ​ความ​พลาด​ที่​เกิด​ใน​หัว​ของ agent ตอน​มัน​แปลง​คำ​สั่ง​เป็น​แผน — เลือก tool ผิด กำหนด​ค่า​ให้ tool ผิด หรือ​เข้าใจ​เป้าหมาย​ผิด ทั้งหมด​นี้​เป็น​ความ​ผิดพลาด​เชิง​การ​ให้​เหตุผล ไม่ใช่​ความ​ผิด​ของ tool Huyen แยกซับไทป์ของ​มัน​ไว้​ชัด และ​แต่ละ​อัน map เข้า​กับ ops-copilot ได้ตรงๆ:

  • invalid tool — วางแผน​เรียก tool ที่​ไม่มี​อยู่​ใน​คลัง Huyen ยก​ตัวอย่าง​ว่า “it generates a plan that contains bing_search, which isn’t in the tool inventory” กับ ops-copilot ก็​เช่น วางแผน​เรียก bing_search เพื่อ​หา​ที่​อยู่​ลูกค้า ทั้ง​ที่​ระบบ​มี​แค่ getOrder, issueRefund, cancelOrder, notifyCustomer
  • valid tool + parameter ผิด​ชนิด/จำนวน — เรียก tool ที่​มี​จริง แต่​ใส่ argument ผิด​โครงสร้าง Huyen ยก​ว่า “it calls lbs_to_kg with two parameters, but this function requires only one”
  • valid tool + ค่า parameter ผิด — เรียก​ถูก​ตัว โครงสร้าง​ถูก แต่ “ค่า” ที่​ใส่​ผิด Huyen เขียนไว้ตรงๆ ว่า “uses the value 100 for lbs when it should be 120” — ซึ่ง​เป็น​ภาพ​เดียว​กับ ops-copilot เป๊ะ: สั่ง​คืน​เงิน​ออเดอร์ #123 เป็น ฿100 ทั้ง​ที่​ยอด​จริง​คือ ฿120 tool issueRefund ทำงาน​ถูก​ทุก​อย่าง มัน​แค่​ถูก​ป้อน​ตัวเลข​ผิด​มา
  • goal failure — บรรลุ​เป้าหมาย​ผิด​ไป​เลย หรือ​ทำ​สำเร็จ​แต่​ละเมิด​เงื่อนไข (Huyen ยก​ตัวอย่าง​ทริป​ที่​จอง​สำเร็จ​แต่​เกิน​งบ) กับ ops-copilot คือ คืน​เงิน​สำเร็จ ยอด​ถูก แต่ คืน​ผิด​ออเดอร์ — ไป​คืน​ออเดอร์ #124 แทน #123

จุด​ที่​ต้อง​เน้น: ทั้ง​สี่ซับไทป์นี้​อยู่​หมวด​เดียวกัน​หมด เพราะ​ราก​ของ​มัน​คือ “การ​วางแผน​ผิด” invalid tool กับ ค่า parameter ผิด แม้​ดู​คนละ​เรื่อง แต่​ทั้ง​คู่​คือ agent คิด​แผน​มา​ผิด ไม่ใช่ tool ทำงาน​เพี้ยน — และ​นั่น​ชี้​ว่า​จะ​ไป​แก้​ที่ prompt กับ​คำ​อธิบาย tool ไม่ใช่​ไป​แก้ตัว tool

หมวด​ที่​สอง​ต่าง​กัน​คนละ​ขั้ว: agent วางแผน​ถูก เลือก tool ถูก ใส่​ค่า​ถูก​ครบ แต่​ตัว tool เอง​คืน​ผลลัพธ์​ผิด — Huyen ยก​ตัวอย่าง​เช่น image caption ที่​บรรยาย​ผิด หรือ SQL ที่ generate มา​แล้ว malformed กับ ops-copilot คือ agent สั่ง issueRefund(orderId: 123, amount: 120) มา​ถูก​ทุก​ตัว​อักษร แต่​ตัว tool ต่อ​ฐาน​ข้อมูล​แล้ว​สร้าง query ผิด​รูป จน​แถว​คืน​เงิน​ไม่​ได้​ถูก​บันทึก​จริง

ความ​พลาด​แบบ​นี้ ไม่มี​ทาง​แก้​ได้​ด้วย​การ​ปรับ prompt เพราะ agent ทำ​หน้าที่​ของ​มัน​ครบ​แล้ว ปัญหา​อยู่​ที่ code ของ tool หรือ integration ปลายทาง นี่​คือ​เหตุผล​ว่า​ทำไม​ต้อง​แยก planning ออก​จาก execution ให้​ขาด: อาการ​ปลายทาง​อาจ​ดูเหมือน​กัน (“คืน​เงิน​ไม่​สำเร็จ”) แต่​ต้นตอ​และ​วิธี​แก้​อยู่​คนละ​โลก

หมวด​ที่​สาม​คือ​กรณี​ที่ agent ทำงาน​สำเร็จ ผลลัพธ์​ถูกต้อง แต่​ใช้​ทรัพยากร​เกิน​จำเป็น Huyen บอก​ให้​ติดตาม​สาม​ตัว: “how many steps… on average,” “how much does the agent cost, on average,” และ “how long does each action typically take” — นั่น​คือ จำนวน​ขั้น, ต้นทุน, และ​เวลา (latency)

ตัว​อย่างชัดๆ ใน ops-copilot: มัน​ยกเลิก​ออเดอร์​เดียว​ได้​สำเร็จ แต่​ใช้​การ​เรียก tool ถึง 8 ครั้ง — ดึง​ออเดอร์​ซ้ำ​ไป​มา ถาม​สถานะ​ซ้ำ กว่า​จะ​ยิง cancelOrder ทั้ง​ที่​งาน​นี้​ทำ​จบ​ได้​ใน​ไม่​กี่​ขั้น ผลลัพธ์​สุดท้าย​ถูก แต่​ถ้า​ปล่อย​ไว้ ต้นทุน​ต่อ​คำ​สั่ง​กับ​เวลา​รอ​ของ​ลูกค้า​จะ​บาน​เมื่อ​สเกล​ขึ้น

จำนวน​ขั้น​ไม่​ได้​แพง​แค่​เรื่อง​เงิน​และ​เวลา — บท​ที่ 1 ชี้​ไว้​แล้ว​ว่า​ยิ่ง​ขั้น​เยอะ ความ​ผิดพลาด​ต่อ​ขั้น​ยิ่ง​มี​ที่​สะสม (ตัวเลข 95% ต่อ​ขั้น → ~60% ที่ 10 ขั้น​ใน​บท​นั้น​เป็นการ​คำนวณ​เชิง​สมมติ​ว่า​ความ​ผิดพลาด​เป็น​อิสระ​ต่อ​กัน ไว้​สร้าง​สัญชาตญาณ ไม่ใช่​อัตรา​พัง​ที่​วัด​จริง) efficiency failure จึง​เป็น​ทั้ง​เรื่อง​ต้นทุน​และ​เรื่อง​ความ​เสี่ยง​ที่​เพิ่ม​ตาม​ความ​ยาว​ของ agentic loop

flowchart TD
  ROOT["ความล้มเหลวของ agent<br/>Failure Taxonomy"]
  ROOT --> P["planning failure<br/>วางแผน/ให้เหตุผลผิด"]
  ROOT --> T["tool-execution failure<br/>เรียก tool ถูกตัว แต่ tool คืนผลผิดเอง"]
  ROOT --> E["efficiency failure<br/>แผนถูก ผลถูก แต่เปลืองเกินจำเป็น"]

  P --> P1["invalid tool<br/>เรียก tool ที่ไม่มีในคลัง เช่น bing_search"]
  P --> P2["valid tool + parameter ผิดชนิด/จำนวน"]
  P --> P3["valid tool + ค่า parameter ผิด<br/>คืนเงิน 100 บาท ทั้งที่ควรเป็น 120 บาท"]
  P --> P4["goal failure<br/>บรรลุเป้าผิด/ละเมิดเงื่อนไข เช่น คืนผิดออเดอร์"]

  E --> E1["steps — เรียก tool 8 ครั้งเพื่อยกเลิก 1 ออเดอร์"]
  E --> E2["cost — ต้นทุนต่อคำสั่งสูงเกิน"]
  E --> E3["latency — ใช้เวลาต่อขั้นนานเกิน"]

  classDef plan fill:#dc2626,stroke:#7f1d1d,color:#f8fafc;
  classDef exec fill:#d97706,stroke:#78350f,color:#f8fafc;
  classDef eff fill:#2563eb,stroke:#1e3a8a,color:#f8fafc;
  class P,P1,P2,P3,P4 plan;
  class T exec;
  class E,E1,E2,E3 eff;

คำ​บรรยาย​ภาพ: หมวด​ความ​ล้มเหลว​สาม​ชั้น​หลัก — planning (แดง), tool-execution (ส้ม), efficiency (น้ำเงิน) โดย planning failure แตก​เป็น​สี่ซับไทป์ที่​ราก​เดียวกัน​คือ “วางแผน/ให้​เหตุผล​ผิด” (invalid tool, parameter ผิด​ชนิด, ค่า​ผิด, และ goal failure) ส่วน efficiency แตก​เป็น​สาม​มิติ​ที่​วัด​ได้ (ขั้น/ต้นทุน/เวลา) สังเกต​ว่า “คืน​เงิน 100 บาท​แทน 120” อยู่​ใต้ planning ไม่ใช่ tool-execution เพราะ tool ทำงาน​ถูก แค่​ถูก​ป้อน​ค่า​ผิด

ทำไม​ต้อง​ตั้ง​ชื่อ​ให้​ถูก​หมวด — เพราะ​แต่ละ​หมวด​แก้​คนละ​จุด

หัวข้อ​ที่​มีชื่อ​ว่า “ทำไม​ต้อง​ตั้ง​ชื่อ​ให้​ถูก​หมวด — เพราะ​แต่ละ​หมวด​แก้​คนละ​จุด”

คุณค่า​ของ taxonomy ไม่​ได้​อยู่​ที่​การ​จัด​กล่อง​ให้​สวย แต่​อยู่​ที่​มัน​ชี้ จุด​ที่​ต้อง​ลงมือ​แก้ ให้​ต่าง​กัน อาการ​ปลายทาง​ของ ops-copilot อาจ​เหมือน​กัน​หมด (“ลูกค้า​ไม่​ได้​เงิน​คืน”) แต่​ต้นตอ​กับ​วิธี​แก้​อยู่​คนละ​ที่:

หมวด​ความ​ล้มเหลวตัวอย่าง​จาก ops-copilotจุด​ที่​ลงมือ​แก้
planning — invalid toolวางแผน​เรียก bing_search ที่​ไม่​ได้​ต่อ​ไว้คลัง tool + คำ​อธิบาย tool ใน prompt
planning — ค่า parameter ผิดคืน​เงิน ฿100 แทน ฿120prompt / การ​ให้​เหตุผล / guard ตรวจ​ค่า​ก่อน​ยิง tool
planning — goalคืน​เงิน​ผิด​ออเดอร์ (#124 แทน #123)prompt / นิยาม​เป้าหมาย / ยืนยัน​ก่อน​ลงมือ
tool-executionissueRefund ถูก​เรียก​ถูก แต่​คืน SQL ผิด​รูปตัว tool หรือ integration เอง — ไม่ใช่ prompt
efficiencyเรียก tool 8 ครั้ง​เพื่อ​ยกเลิก 1 ออเดอร์ออกแบบ tool ใหม่/รวม​ขั้น ลด​รอบ​ใน loop

ถ้า​เจอ “คืน​เงิน ฿100 แทน ฿120” แล้ว​เผลอ​ไป​นับ​เป็น tool-execution failure เรา​จะ​เสีย​เวลา​ไล่​แก้ code issueRefund ทั้ง​ที่ tool ไม่​ได้​ผิด​อะไร​เลย — ปัญหา​อยู่​ที่ agent ป้อน​ค่า​ผิด​ตั้งแต่​ตอน​วางแผน การ​ป้าย​ผิด​หมวด​จึง​พา​ไป​แก้​ผิด​จุด นี่​คือ​เหตุผล​ที่​ต้อง​ตั้ง​ชื่อ​ความ​พลาด​ให้​ถูก​ก่อน​จะ​ลงมือ​แก้

แต่​ก่อน​จะ​ป้าย​หมวด​ได้ ต้อง เห็นความพลาดจริงๆ ก่อน — และ​นี่​คือ​จุด​เชื่อม​กลับ​ไป​ที่​บท​ที่ 1: เรา​จะ​เห็น​ว่า agent คืน ฿100 แทน ฿120 ก็​ต่อ​เมื่อ​เรา​ไป​ดู สถานะ​จริง​ของ​ฐาน​ข้อมูล ไม่ใช่​เชื่อ​คำ​ที่ agent พิมพ์​ว่า “คืน​เงิน​เรียบร้อย” ถ้า eval เช็ค​แค่​ว่า agent พูด​ว่า done หรือ​ยัง ความ​พลาด wrong-value ทั้ง​หมวด​จะ​ล่องหน คำถาม​ที่ eval ต้อง​ถาม​คือ “มี​แถว​คืน​เงิน​ของออเดอร์ #123 ใน​ฐาน​ข้อมูล​จริง จำนวน ฿120 หรือ​ยัง” — outcome ที่​ตรวจสอบ​ได้​แบบ​นี้​เท่านั้น​ที่​เผย​หมวด​ความ​ล้มเหลว​ออก​มา​ให้​เรา​จัด​กลุ่ม​ได้

taxonomy นี้​มา​จาก​ไหน

สาม​หมวด​ของ Huyen เป็นกรอบ​ตั้งต้น​ที่​ดี แต่ taxonomy ของ​ระบบ​จริง​ไม่​ได้​หล่น​มา​จาก​ตำรา — มัน​โต​ขึ้น​จาก​การ​นั่ง​อ่าน trace ที่ agent ทำงาน​จริง​ที​ละ​เคส แล้ว​ค่อยๆ จัด​กลุ่ม​ความ​พลาด​ที่​เจอ​ซ้ำๆ เป็น​หมวด​ของ​ตัวเอง (กระบวนการ​นี้​คือ error analysis กับ open coding ที่​บท​ที่ 6 จะ​เจาะ​เต็มๆ) หมวด​สาม​ชั้น​ใน​บท​นี้​จึง​เป็น​โครง​เริ่ม ไม่ใช่​รายการ​ปิดตาย​ที่​ห้าม​เพิ่ม

บท​นี้​ให้​ภาษา​กลาง​ไว้​เรียก​ความ​พลาด — planning / tool-execution / efficiency พร้อมซับไทป์ — และ​ย้ำ​ว่า​แต่ละ​หมวด​แก้​กัน​คนละ​จุด บท​ต่อ​ไป​กลับ​ไป​ที่​คำถาม “แล้ว​วัด​ยังไง​ให้​เห็น​หมวด​พวก​นี้”:

  • ตัดสิน​จาก​ผลลัพธ์ ไม่ใช่​เส้นทาง (บท​ที่ 3) — ทำไม outcome เป็น​เกณฑ์​หลัก และ​การ​ไล่​เช็ค trajectory ที​ละ​ก้าว​เข้า​มา​ช่วย​ตรง​ไหน
  • Human-in-the-loop กับ error analysis (บท​ที่ 6) — วิธี​สร้าง taxonomy ของ​คุณ​เอง​จาก​การ​อ่าน trace จริง แทน​การ​ยืม​หมวด​สำเร็จรูป​มา​ทั้งดุ้น

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


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

หมวด​หมู่​ความ​ล้มเหลว​ใน​บท​นี้​อ้างอิง​จาก​แหล่ง​หลักแหล่ง​เดียว อ่าน​ต่อ​ได้ที่​ต้นทาง​โดยตรง:

  • Chip Huyen, “Agents” — ต้นทาง​ของ taxonomy สาม​ชั้น (planning / tool-execution / efficiency) รวม​ถึง​ตัวอย่าง invalid tool (bing_search), parameter ผิด (lbs_to_kg), ค่า​ผิด (100 แทน 120) และ​สาม​มิติ​ของ efficiency (ขั้น/ต้นทุน/เวลา)
  • คอร์ส​นี้ บท​ที่ 1 — ที่มา​ของ​การ​วัด​ที่ outcome จริง ซึ่ง​เป็น​เงื่อนไข​ที่​ทำให้​เรา​เห็น​ความ​พลาด​แต่ละ​หมวด​ได้​ตั้งแต่​แรก

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

ข้อ 1 / 3

การวางแผนเรียก tool ที่ไม่มีอยู่จริง (invalid tool) กับการใส่ค่า parameter ผิด (คืนเงิน ฿100 แทน ฿120) — สองอย่างนี้จัดอยู่ในหมวดความล้มเหลวใด?