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

Integration & handoffs → agent คุย​กัน​ยังไง

เดิน​มา​ถึง​บท​นี้ แผนที่​ใหญ่​ถูกวาง​ไว้​แล้ว — ใน​บท​ก่อนๆ เรา​วาด Context MapContext Mapแผนภาพ​ที่​วาด​ทุก Bounded Context และ​ความ​สัมพันธ์​ระหว่าง​กัน — ใน​ระบบ multi-agent คือ​แผนภาพ​ที่​วาด​ว่า agent ไหน​คุย​กับ agent ไหน ใคร​เป็นต้น​น้ำ (กำหนด​รูปแบบ​ข้อมูล) ใคร​เป็น​ปลาย​น้ำ ก่อน​จะ​ปล่อย​ให้ agent เรียก​กันเอง​มั่ว ๆStrategic Design ว่า​ระบบ ops-copilot มี agent อะไร​บ้าง​และ​ใคร​เป็นต้น​น้ำ-ปลาย​น้ำ (บท​ที่ 5) และ​สร้าง Anti-Corruption LayerAnti-Corruption Layer (ACL)ชั้น​แปล​ภาษา/model ที่​กั้น​ระหว่าง context สอง​อัน ไม่​ให้ model ของ​อีก​ฝ่าย​รั่ว​เข้า​มา​ปน​เปื้อน — เมื่อ agent เรียก tool หรือ agent อื่น​จาก​ภายนอก ควร​มี​ชั้น​แปล​ผลลัพธ์​กลับ​มา​เป็น​ภาษา​ของ agent เรา​เอง ไม่​ปล่อย​ให้ schema แปลก ๆ ของ​ฝั่ง​นู้น​ไหล​เข้า​มา​ปน​ใน context ของ​เราStrategic Design ให้ tool คอย​แปล​ความ​รก​ของ backend ไม่​ให้​ไหล​เข้า​มา​ปน​ใน context ของ agent (บท​ที่ 6) คำถาม​ที่​ยัง​ค้าง​คือ ตอน​ที่ agent สอง​ตัว​ต้อง​ส่ง​งาน​ข้าม​ขอบเขต​กันจริงๆ มัน​คุย​กัน​ยังไง — และ​ตรง​นี้​เอง​ที่​คำ​ศัพท์​สอง​คำ​มัก​ถูก​เรียก​ปน​กัน​จน design เพี้ยน

ย้ำ​ก่อน​เข้า​เรื่อง: การ​ที่ agent ต้อง​คุย​กัน​เป็น​ดิน​แดน​ของ ข้อ​ยกเว้น​ที่​มี​เหตุผล​แล้ว ไม่ใช่​ค่า​เริ่มต้น คุณ​มา​ถึง​บท​นี้​ได้​เพราะ Multi-agentMulti-agentระบบ​ที่​มี agent มากกว่า​หนึ่ง​ตัว​ทำงาน​ร่วม​กัน แต่ละ​ตัว​ควร​มี Bounded Context ของ​ตัวเอง​ชัดเจน​และ​เชื่อม​กัน​ผ่าน context map/handoff ที่​ออกแบบ​ไว้ — ไม่ใช่​คำ​ตอบ​สำเร็จรูป​สำหรับ​ทุก​ปัญหา หลาย​งาน​ทำ​ด้วย agent เดียว​หรือ workflow ธรรมดา​ก็​เพียงพอ​และ​เชื่อถือ​ได้​กว่าArchitecture ผ่าน​ประตู​เหตุผล (รักษา context / ขนาน​งาน / ความ​เชี่ยวชาญ​เฉพาะ + ประตู​ต้นทุน​ราว ~15×) มา​แล้ว​ใน​บท​ก่อน งาน​ส่วน​ใหญ่​ยัง​ควร​จบ​ใน AgentAgentระบบ​ซอฟต์แวร์​ที่​รับ​เป้าหมาย​แล้ว​วางแผน-ตัดสิน​ใจ-เรียก​ใช้ tool ได้​เอง​หลาย​รอบ (agentic loop) โดย​ไม่​ต้อง​มี​มนุษย์​กำกับ​ทุก​ก้าว ต่าง​จาก​โปรแกรม​ทั่วไป​ที่​รัน​ตาม​ลำดับ​คำ​สั่ง​ตายตัว — ใน​คอร์ส​นี้​มอง​แต่ละ agent เหมือน1 Bounded Context ที่​ต้อง​มี​ขอบเขต ภาษา และ​หน้าที่​ของ​ตัวเอง​ชัดเจนArchitecture ที่​มี​ขอบเขต​ดี​ตัว​เดียว​หรือ workflow ธรรมดา บท​นี้​ว่าด้วย กลไก​การ​ส่ง​ต่อ เมื่อ​การ​แตก​ตัว​ถูก​พิสูจน์​แล้ว​เท่านั้น

📦 code ตัวอย่าง

คอร์ส​นี้​เป็น คอร์ส​ออกแบบ ไม่ใช่​ทัวร์ SDK — code ใน​บท​นี้​คือ ภาพร่าง ของ​สัญญา handoff, schema ของ tool และโทโพโล​ยี (Thai Mermaid + pseudo-config สั้นๆ) ไม่ใช่ app ที่​รัน​ได้​จริง ตัวอย่าง LangGraph / OpenAI Agents SDK / Claude ที่​พูด​ถึง​เป็น​เชิง​อธิบาย​เท่านั้น ทุก​อย่าง​ต่อยอด​จาก domain เดิม​ที่ repo kaen-food-ordering (กำลัง​จัด​ทำ) โดย​มอง​มัน​ผ่าน​เลนส์ ops-copilot ที่​ช่วย​ทีม​ปฏิบัติการ

DelegationDelegationการ​ที่ agent หนึ่ง​มอบหมาย​งาน​ย่อย​ให้ agent หรือ tool อื่น​ทำ​แทน โดย​ตัวเอง​ยัง​ถือ​ความ​รับผิดชอบ​ต่อ​ผลลัพธ์​รวม ต่าง​จาก handoff ตรง​ที่​ผู้​มอบหมาย​ไม่​ได้​ปล่อย​การ​ควบคุม​ทั้งหมด แต่​รอ​ผลกลับ​มา​ประกอบ​ต่อProcess กับ HandoffHandoffการ​ส่ง​ต่อ​การ​ควบคุม​บทสนทนา/งาน​จาก agent หนึ่ง​ไป​อีก agent หนึ่ง​อย่าง​มี​สัญญา​ชัดเจน​ว่า​ส่ง​อะไร​ไป​พร้อม​บริบท​เท่า​ไหร่ — คือ​จุด​ที่ Published Language ระหว่าง2 Bounded Context ถูก​ใช้งาน​จริง ถ้า handoff ไม่​ชัด บริบท​จะ​หาย​หรือ​ปน​กัน​ระหว่าง​ทางProcess ฟัง​ดูเหมือน​กัน — “agent หนึ่ง​ส่ง​งาน​ให้​อีก​ตัว” — แต่​เป็นคนละโทโพโล​ยี​ที่​ต่าง​กัน​สิ้นเชิง​ตรง ใคร​ถือ​ความ​เป็น​เจ้าของ​งาน​หลัง​ส่ง

Delegation (แบบ orchestration) คือ model ที่ How we built our multi-agent research system (Anthropic, Jun 2025) ใช้: มี lead agent ตัว​หนึ่ง​แตก​งาน​ใหญ่​เป็น subtask แล้ว​มอบ​ให้ subagent ทำ พอ subagent ทำ​เสร็จ ผลลัพธ์​คืน​กลับ​มา​ที่ lead แล้ว lead เอา​ไป​ประกอบ​ต่อ lead ไม่​เคย​ปล่อย​ความ​เป็น​เจ้าของ​บทสนทนา​เลย — นี่​คือ Orchestrator-WorkersOrchestrator-Workersโทโพโล​ยี​ที่ agent ตัว​หนึ่ง (orchestrator) แตก​งาน​ใหญ่​เป็น​งาน​ย่อย​แล้ว​มอบหมาย​ให้ agent ลูก​ทีม (worker) แต่ละ​ตัว​ที่​มี Bounded Context แคบ​และ​ชัดเจน​ของ​ตัวเอง ก่อน​รวม​ผลลัพธ์​กลับ — ต่าง​จาก​การ​ปล่อย​ให้ agent หลาย​ตัว​คุย​กันเอง​แบบ​ไม่มี​ใคร​คุม​ภาพ​รวมArchitecture ที่​เกริ่น​ไว้​ตอน​ต้น​คอร์ส subagent เป็น​เหมือน​ลูกน้อง​ที่​หัวหน้า​ใช้​ให้​ไป​หา​ข้อมูล​มา ไม่ใช่​คน​ที่​รับช่วง​ไป​คุย​กับ​ลูกค้า​แทน

ใน domain เรา: Customer-Support รับ​เรื่อง “ทำไม​ออเดอร์ #4821 ช้า” มัน​ไม่​ได้​ถือ tool อ่าน​สถานะ​เอง จึง delegate งาน​ย่อย “ดึงสถานะ + ETA ของ #4821 คืน​มา​เป็น JSON” ให้ Order-Tracking แล้ว​รอ​ผลกลับ พอได้ ETA มา Customer-Support ก็​ร่าง​คำ​ตอบ​เอง​แล้ว​ตอบ​ลูกค้า — Order-Tracking ไม่​เคย​เห็น​หน้า​ลูกค้า และ Customer-Support ยัง​เป็น​เจ้าของ​บทสนทนา​ตั้งแต่​ต้น​จน​จบ

Handoff (แบบ​โอน​การ​ควบคุม) เป็น​คนละ​เรื่อง OpenAI Agents SDK — Handoffs นิยาม handoff เป็น tool call ชนิด​พิเศษ​ที่ “คืน” Agent อีก​ตัว​กลับ​มา​แทน พอ agent เรียก handoff การ​ควบคุม​บทสนทนา โอน​ถาวร ไป​ยัง agent ปลายทาง — agent เดิม​ออก​จาก​ภาพ ไม่​ได้​รอ​ผล​อะไร​กลับ​มา​ประกอบ​ต่อ (คำ​ว่า handoff ถือ​กำเนิด​จาก Swarm ซึ่ง​เป็น project ทดลอง​ที่​เลิก​ใช้​ไป​แล้ว Agents SDK คือ​รุ่น​สืบทอด — อ้าง​ถึง​ใน​ฐานะ​ต้น​กำเนิด​ของ​คำ​เท่านั้น ไม่ใช่ API ที่​ต้อง​ยึด)

ใน domain เรา: ลูกค้า​เข้า​มา​ที่ agent คัด​กรอง (triage) พิมพ์​ว่า “ขอ​ปรับ​ราคา​เมนู​ใน​ร้าน​ฉัน” triage รู้​ว่า​นี่​คือ​ภาษา​ของ​อีก context จึง handoff ให้ Restaurant-Ops แล้ว​ถอย​ออก จาก​วินาที​นั้น Restaurant-Ops เป็น​เจ้าของ​บทสนทนา​เต็ม​ตัว triage ไม่​กลับ​มา​อีก

สอง​อย่าง​นี้ อย่า​เรียก​ด้วย​คำ​เดียว เพราะ​มัน​ตอบ​คนละ​คำถาม​ใน design: delegation ตอบ​ว่า “lead จะ​ยืม​มือ​ใคร​ไป​ทำงาน​ย่อย” ส่วน handoff ตอบ​ว่า “ควร​ส่ง​ไม้​ต่อ​ให้​ใคร​เป็น​เจ้าของ​เรื่อง​นี้​แทน” การ​สลับ​สอง​คำ​นี้​ทำให้​ทีม​วาง flow ผิด เช่น สร้าง handoff ใน​ที่​ที่​ควร​เป็น delegation แล้ว​จู่ๆ agent ต้นทาง​ก็​หาย​ไป​ทั้ง​ที่​ยัง​ต้อง​รับผิดชอบ​ผล​รวม

flowchart TB
  subgraph DEL["Delegation (Anthropic): ผลคืนกลับ lead"]
    direction LR
    LEAD["Customer-Support (lead)<br/>เป็นเจ้าของบทสนทนาตลอด"]
    SUB["Order-Tracking (subagent)<br/>อ่านสถานะอย่างเดียว"]
    U1["ลูกค้า"]
    LEAD -->|"delegate: ดึง ETA #4821 คืนเป็น JSON"| SUB
    SUB -->|"ผลลัพธ์คืนกลับ lead"| LEAD
    LEAD -->|"ประกอบคำตอบเองแล้วตอบ"| U1
  end
  subgraph HAND["Handoff (OpenAI): ความเป็นเจ้าของโอนถาวร"]
    direction LR
    TRI["Triage agent<br/>รับเรื่องเข้ามา"]
    RO["Restaurant-Ops agent<br/>เป็นเจ้าของต่อจากนี้"]
    U2["ลูกค้า"]
    GONE["control โอนไปแล้ว"]
    TRI -->|"handoff: tool call คืน Agent ใหม่"| RO
    RO -->|"คุยกับลูกค้าต่อโดยตรง"| U2
    TRI -.->|"ออกจากภาพ ไม่กลับมา"| GONE
  end
  classDef lead fill:#c7d2fe,stroke:#3730a3,color:#1a1a1f;
  classDef sub fill:#bbf7d0,stroke:#166534,color:#1a1a1f;
  classDef gone fill:#fed7aa,stroke:#9a3412,color:#1a1a1f;
  class LEAD,TRI lead;
  class SUB,RO sub;
  class GONE gone;

คำ​บรรยาย​ภาพ: ซ้าย​คือ delegation — Customer-Support (lead, น้ำเงิน) ยืม​มือ Order-Tracking (subagent, เขียว) ไป​ดึง ETA แล้ว ผล​คืน​กลับ lead ซึ่ง​ประกอบ​คำ​ตอบ​เอง​และ​เป็น​เจ้าของ​บทสนทนา​ตลอด ขวา​คือ handoff — triage โยน​การ​ควบคุม​ให้ Restaurant-Ops แบบ ถาวร แล้ว​ออก​จาก​ภาพ (ส้ม) ทั้ง​สอง​เป็น​ดิน​แดน​ของ​ข้อ​ยกเว้น​ที่​พิสูจน์​แล้ว ไม่ใช่​ค่า​เริ่มต้น — และ​ย้ำ​ตาม​วินัย​เดิม: เส้น​ที่​แบ่ง lead ออก​จาก subagent ใน​ภาพ​นี้​ลาก​บน​จุด​ที่ ภาษา​และ​ระดับ​ความ​ไว้ใจ​เปลี่ยน ไม่ใช่​ตาม​ตำแหน่ง​งาน​หรือ subdomain “subagent” บางตัวจริงๆ อาจ​เป็น​แค่ workflow หรือ tool ที่​ยัง​ไม่​ต้อง​เป็น agent เต็ม​ตัว และ​บาง​กล่อง​อาจ​ยุบ​รวม​กัน​ได้ งาน​ส่วน​ใหญ่​ยัง​ควร​จบ​ใน agent ที่​มี​ขอบเขต​ดี​ตัว​เดียว ภาพ​นี้​เพียง​อธิบาย กลไก​ส่ง​ต่อ เมื่อ​การ​แตก​ตัว​ถูก​พิสูจน์​แล้ว​เท่านั้น

ไม่​ว่า​จะ delegation หรือ handoff สิ่ง​ที่​ข้าม​เส้น​แบ่ง​ไป​ไม่ใช่ “ข้อความ” ลอยๆ แต่​คือ สัญญา และ​สัญญา​นั้น​คือ Published LanguagePublished Languageภาษา​กลาง​ที่​เอกสาร​ไว้​ชัดเจน​สำหรับ​แลกเปลี่ยน​ข้อมูล​ข้าม context — คือ schema ของ tool call ข้อความ handoff และ output format ที่ agent หนึ่ง​ส่ง​ให้​อีก agent หนึ่ง ต้อง​นิ่ง​และ​มี​สัญญา​ชัดเจน​เหมือน API ระหว่าง​ทีม ไม่ใช่​ข้อความ​ธรรมชาติ​ที่​ตีความ​เอา​เองStrategic Design — ภาษา​กลาง​ที่​เอกสาร​ไว้​ชัด​สำหรับ​แลกเปลี่ยน​ข้าม context เหมือน API ระหว่าง​ทีม ไม่ใช่​ภาษา​ธรรมชาติ​ที่​ปลายทาง​ตีความ​เอา​เอง

สัญญา​ที่​ดี​ต้อง​พก​ของ​ครบ​สี่​อย่าง:

  1. objective — เป้าหมาย​ชัด​ว่า​จะ​ให้​ทำ​อะไร วัดผล​ได้
  2. รูปแบบ​ผลลัพธ์ (output format) — คืน​กลับ​มา​เป็น​อะไร มี field อะไร​บ้าง (schema ที่​นิ่ง)
  3. ให้​ใช้ tool/source ไหน — ดึง​จาก​แหล่ง​ไหน ไม่​ปล่อย​ให้ subagent เดา​เอง​ว่า​จะ​ไป​เอา​ข้อมูล​จาก​ที่​ใด
  4. ขอบเขต​ชัด — ทำ​แค่​ไหน หยุด​ตรง​ไหน อะไร​ที่​ห้าม​แตะ
ภาพร่าง: delegation contract = published language ที่​พก​ครบ​สี่​อย่าง
delegate_to: order-tracking # subagent ปลายทาง
task:
objective: "ดึงสถานะปัจจุบันและ ETA ของออเดอร์ #4821" # 1) objective ชัด วัดผลได้
output_format: # 2) รูปแบบผลลัพธ์ที่ต้องคืน
status: enum[cooking, picked_up, delivering, delivered]
eta_minutes: int
last_event_at: iso8601
source: order-status-service # 3) ดึงจากแหล่งนี้เท่านั้น ห้ามเดา
scope: "อ่านอย่างเดียว ห้ามแก้สถานะ ห้ามติดต่อลูกค้าเอง" # 4) ขอบเขตชัด

ทำไม​ต้อง​ละเอียด​ขนาด​นี้ Anthropic เล่าตรงๆ ใน post เดียวกัน​ว่า​คำ​สั่ง delegation ที่​กำกวม​คือ​สาเหตุ​ความ​พัง​ที่​พบ​บ่อย — subagent ที่​ได้​โจทย์​คลุมเครือ​จะ ทำงาน​ซ้ำ​กัน (สอง​ตัว​ไป​ดึง​ข้อมูล​ก้อน​เดียวกัน) หรือ ตกหล่น (ทุก​ตัว​คิด​ว่า​อีก​ตัว​จะ​ทำ) สัญญา​ที่​คม​ชัด​คือ​สิ่ง​ที่​รักษา​ไม่​ให้ context และ​งบ​ของ​ทั้ง​ระบบ​เปลือง​ไป​กับ​งาน​ซ้ำ​และ​ช่อง​โหว่

❌ version ดิบ: delegation กำกวม → งาน​ซ้ำ/ตกหล่น
delegate_to: order-tracking
task: "เช็กออเดอร์ #4821 ให้หน่อย"
# ไม่บอก objective ให้ชัด ไม่บอก output format ไม่บอกแหล่ง ไม่บอกขอบเขต
# → subagent เดาเอง: อาจไปแก้สถานะ หรือติดต่อลูกค้าซ้ำกับ lead
# → subagent อีกตัวที่ได้โจทย์คลุมเครือคล้ายกันก็ดึงข้อมูลก้อนเดียวกันซ้ำ

สังเกต​ว่า field ใน​สัญญา​ก็​คือ Ubiquitous LanguageUbiquitous Languageภาษา​กลาง​ที่​ทีม​และ​ผู้เชี่ยวชาญ​ธุรกิจ​ใช้​ร่วม​กัน อิง​กับ model โดยตรง — สำหรับ agent แล้ว ภาษา​นี้​คือ​คำ​ศัพท์​ที่​ปรากฏ​ใน system prompt ชื่อ tool และ schema ของ​มัน​ด้วย ถ้า​คำ​ใน code agent ไม่​ตรง​กับ​คำ​ที่​ผู้เชี่ยวชาญ​ธุรกิจ​ใช้ แปล​ว่า​กำลัง​หลง​ทางStrategic Design ของ​เส้น​แบ่งนั้นตรงๆ — ถ้า​คำ​ว่า “order” ของ Customer-Support กับ​ของ Order-Tracking หมาย​คนละ​อย่าง ตรง​นี้​แหละ​ที่ ACL จาก​บท​ที่​แล้ว​ต้อง​แปล published language จึง​วาง​อยู่​บน context map อีก​ที ไม่ใช่​สอง​สิ่ง​แยก​กัน

handoff มี​จุด​อ่อน​ที่ delegation ไม่มี: พอ​โอน​การ​ควบคุม​ไป ถ้า​เรา​ส่ง​ไป​แค่ ข้อความ​สุดท้าย หรือagent ปลายทาง​จะ​ไม่​เห็น “เหตุผล​ระหว่าง​ทาง” ที่​พา​เรื่อง​มา​ถึง​จุด​นี้ Cognition — Don’t Build Multi-Agents ชี้​จุด​นี้​คม​มาก: ระหว่าง​ที่ agent ทำงาน มัน​ตัดสิน​ใจ​โดย​นัย​เต็ม​ไป​หมด — เลือก​ตีความ​คำขอ​แบบ​หนึ่ง เลือก​เชื่อ​ข้อมูล​ชิ้น​หนึ่ง ถ้า handoff ส่ง​ไป​แค่​ประโยค​สุดท้าย agent ตัว​ใหม่​จะ​ตัดสิน​ใจ​บน​ข้อมูล​ไม่​ครบ และ​ลงเอย​ด้วย​การ​ตัดสิน​ใจ​ที่ ขัด กับ​สิ่ง​ที่​ทำ​มา​แล้ว

ทาง​แก้​ของ Cognition ตรง​ไป​ตรง​มา: เมื่อ​ส่ง​งาน​ต่อ ให้ share trace เต็ม — ประวัติการ​ตัดสิน​ใจ ข้อความ และ​ผล​ของ tool ทั้ง​เส้น ไม่ใช่​แค่ message ก้อน​เดียว agent ปลายทาง​จะ​ได้​สืบสาย​ว่า​ทำไม​ถึง​มา​ถึง​ตรง​นี้ ก่อน​ตัดสิน​ใจ​ก้าว​ต่อ​ไป

ตรง​นี้​ต้อง​พูด​ความ​จริง​ข้อ​หนึ่ง​ให้​ชัด แม้​ทั้ง​คอร์ส​จะ​เทียบ agent กับ bounded context: agent ไม่ใช่ aggregate ใน DDD, aggregate รักษา invariant ของ​มัน​แบบ atomic — ผ่าน​ขอบเขต​แล้ว​การันตี​ว่า​กฎ​ไม่มี​วัน​แตก แต่ context ของ agent ไม่ใช่​แบบ​นั้น หลัง​ผ่าน compaction หรือ summarization “ขอบเขต” ของ​มัน​เป็น​แค่ best-effort — บท​สรุป​อาจ​ตัด​ข้อเท็จจริง​ชิ้น​เดียว​ที่​สำคัญ​ที่สุด​ทิ้ง​ไป การ handoff ข้าม agent จึง​เปราะ​กว่า​การ​ข้าม​ขอบเขต aggregate เสีย​อีก เพราะ​เรา​สมมติ​ไม่​ได้​เลย​ว่า invariant รอด​ผ่าน​บท​สรุป​มา ด้วย​เหตุ​นี้​วินัย​เรื่อง​นี้​จึง​ต้อง​พึ่ง​สาม​อย่าง​เสมอ: Agent MemoryAgent Memoryกลไก​ที่ agent เก็บ​ข้อมูล​ข้าม​รอบ​ของ agentic loop หรือ​ข้าม session เช่น สรุป​บทสนทนา​เก่า บันทึก​ข้อเท็จจริง​ระยะ​ยาว หรือ​ผลลัพธ์​ก่อน​หน้าที่​ต้อง​อ้างอิง​ต่อ — ออกแบบ​ให้​ดี​ต้อง​เลือก​ว่า​อะไร​ควร​เก็บ อะไร​ควร​ทิ้ง ไม่ใช่​ยัด​ประวัติ​ทั้งหมด​กลับ​เข้า context ทุก​ครั้ง​จน​เกิด context rotArchitecture ภายนอก​ที่​จำ​สิ่ง​สำคัญ​ไว้​แบบ​คงทน, GuardrailGuardrailกติกา​ที่​ควบคุม​ไม่​ให้ agent ทำ​เกิน​ขอบเขต​หรือ​ก่อ​ความ​เสียหาย เช่น จำกัด tool ที่​เรียก​ได้ ตรวจ output ก่อน​ส่ง​ออก บังคับ human approval สำหรับ​การกระทำ​ที่​ย้อน​กลับ​ไม่​ได้ — เป็น​สิ่ง​ที่​รักษา​ขอบเขต​ของ Bounded Context ของ agent ให้​ไม่​ล้ำเส้นProcess ที่ re-check กฎ​ซ้ำ​ตรง​ขอบเขต, และ EvalEvalการ​วัดผล​อย่าง​เป็น​ระบบ​ว่า agent ทำงาน​ตรง​ตาม​ที่​ออกแบบ​ไว้​จริง​หรือ​ไม่ ด้วย​ชุด​กรณี​ทดสอบ​และ​เกณฑ์​ที่​ชัดเจน แทน​การ​ดู​จาก​ความ​รู้สึก​ว่า 'ตอบ​ดู​ดี' — จำเป็น​เพราะ agentic loop มี​ความ​ไม่​แน่นอน​สูง​กว่า code ทั่วไป ต้อง​มี eval ก่อน​เชื่อ​ว่า Bounded Context ของ agent ทำงาน​ถูกต้อง​ตาม​สัญญาProcess ที่​วัด​ว่า handoff รักษา​สิ่ง​ที่​ต้อง​รักษา​ไว้​ได้​จริง — การ​บังคับ​กฎ​เป็น best-effort ไม่ใช่ atomic นี่​คือ​ราคา​ของ​การ​ทำงาน​บน​ภาษา​ธรรมชาติ

มี​ข้อ​ควร​ระวัง​กลับ​ด้าน​ซ่อน​อยู่: “share trace เต็ม” ใช้​กับ การ​ส่ง​ต่อ​งาน​ที่​ทำ​ค้าง​ไว้ (handoff หรือ delegation ที่​ต้อง​สาน​ต่อ) — ปลายทาง​ต้อง​ตัดสิน​ใจ​แบบ​เดียว​กับ​ที่​ต้นทาง​จะ​ตัดสิน จึง​ต้อง​เห็น​เท่า​กัน แต่​มี​งาน​อีก​แบบ​ที่​ตรง​กัน​ข้าม: งาน​ที่ เป็น​ก้อน​ปิด​ใน​ตัว เช่น​การ​ตรวจ​งาน ยิ่ง​โอน context น้อย​ยิ่ง​ดี — และ​นั่น​พา​ไป​สู่ pattern ที่​ดี​ที่สุด​ของ​ทั้ง​บท

ใน​บรรดา pattern multi-agent ทั้งหมด ตัว​ที่​คุ้ม​ค่า​สม่ำเสมอ​ที่สุด​คือ verification / reviewer subagent — agent แยก​ตัว​หนึ่ง​ที่​มี bounded context เดียว​คือ “ตัดสิน​ว่า​ผล​งาน​ชิ้น​นี้​ผ่าน spec ไหม” มัน​ได้​ผล​เพราะ​สาม​อย่าง​พร้อม​กัน: (1) โอน context น้อย​มาก — ส่ง​ไป​แค่ ตัว​ชิ้น​งาน + เกณฑ์​รับ ไม่​ต้อง​ส่ง​เหตุผล​ของ​คน​ทำ (ที่​จริง​การ​เห็น​เหตุผล​ของ​คน​ทำ​ยิ่ง​ทำให้​ผู้​ตรวจ ลำเอียง ตาม), (2) bounded context สะอาด — ภาษา​ของ​มัน​คือ “ผ่าน / ไม่​ผ่าน + เหตุผล” เท่านั้น, และ (3) มัน​เป็น delegation ไม่ใช่ handoff — ผล​คืน​กลับ lead ความ​เป็น​เจ้าของ​ไม่​ย้าย ด้วย​สาม​ข้อ​นี้ reviewer subagent จึง​เป็นการ​แตก multi-agent ที่​คุ้ม​ค่า​สม่ำเสมอ​ที่สุด — จับ​ของ​เสีย​ได้​จริง​โดย​แทบ​ไม่​เพิ่ม​ความ​เสี่ยง​เชิง​ขอบเขต เพราะ​มัน​ไม่​เคย​ถือ​ความ​เป็น​เจ้าของ​งาน​เลย

ใน domain เรา: ก่อน Restaurant-Ops จะ commit การ​ปรับ​ราคา​เมนู มัน​ส่ง​ข้อ​เสนอ (เมนู, ราคา​ใหม่) + เกณฑ์ (ห้าม​ต่ำ​กว่า​ต้นทุน, อยู่​ใน​ช่วง​ที่​ร้าน​อนุญาต) ให้ verification subagent ตรวจ subagent คืน “ผ่าน” หรือ “ไม่​ผ่าน + เพราะ​ราคา​ต่ำ​กว่า​ต้นทุน 12%” กลับ​มา Restaurant-Ops ยัง​เป็น​เจ้าของ​การ​ตัดสิน​ใจ และ Human-in-the-loopHuman-in-the-loopการ​ออกแบบ​ให้​มนุษย์​เข้า​มา​ตรวจสอบ​หรือ​อนุมัติ​ใน​จุด​ที่​การกระทำ​ของ agent มี​ความ​เสี่ยง​สูง​หรือ​ย้อน​กลับ​ไม่​ได้ เช่น ก่อน​โอน​เงิน​หรือ​ลบ​ข้อมูล​จริง — เป็น guardrail ชนิด​หนึ่ง​ที่​ยัง​จำเป็น​แม้ agent จะ​ฉลาด​ขึ้น​เรื่อย ๆ เพราะ​บาง​การ​ตัดสิน​ใจ​ไม่​ควร​ปล่อย​ให้ agent ตัดสิน​ใจ​เอง​ทั้งหมดProcess ยัง​กั้น​การ commit จริง​ที่​ย้อน​กลับ​ไม่​ได้​อยู่ดี — verification subagent แค่​กรอง​ของ​เสีย​ออก​ก่อน​ถึง​มือ​คน

นี่​คือ​หน้าตา​ของ “multi-agent ที่​คุ้ม​จริง”: แคบ, มูลค่า​สูง, โอน context น้อย, เป็น delegation ไม่ใช่ handoff — ไม่ใช่ การ​ตั้ง agent หนึ่ง​ตัว​ต่อ​หนึ่ง SubdomainSubdomainส่วน​ย่อย​ของ​ปัญหา​ทาง​ธุรกิจ (problem space) แบ่ง​เป็น core, supporting, generic — ก่อน​จะ​ออกแบบ​ว่า​จะ​มี agent กี่​ตัว​และ​แต่ละ​ตัว​ทำ​อะไร ต้อง​วิเคราะห์ subdomain ของ​ธุรกิจ​ก่อน​เสมอ ไม่ใช่​เริ่ม​จาก​อยาก 'มี agent' แล้ว​ค่อย​หา​เรื่อง​ให้​มัน​ทำStrategic Design แล้ว​ปล่อย​ให้​คุย​กัน​มั่ว

บท​นี้​ปิด​กลไก​การ​ส่ง​ต่อ — delegation กับ handoff เป็น​คนละ topology, สัญญา​ข้าม​ขอบเขต​คือ published language ที่​พก​ครบ​สี่​อย่าง, และ​การ​ส่ง​ต่อ​งาน​ค้าง​ต้อง share trace เต็ม​เพราะ​ขอบเขต​ของ agent เป็น best-effort ไม่ใช่ atomic บท​สุดท้าย (บท​ที่ 8) ปิด​คอร์ส​ด้วย​คำถาม​ที่​ตรง​ข้าม​กับ​ความ​ตื่นเต้น​ทั้งหมด​นี้: เมื่อไร​ไม่​ควร​ใช้ agent เลย — ประตู​ต้นทุน, งาน​ที่ workflow หรือ code ธรรมดา​ชนะ​ขาด, และ​การ​วัดผล​ด้วย eval ที่​ดู​ปลายทาง​ไม่ใช่​เส้นทาง


🔗 อ้างอิง​เพิ่มเติม​ใน DevIQ

เจาะ​ลึก​แนวคิด DDD ที่​บท​นี้​ยืม​มา​ใช้​กับ​การ​ส่ง​ต่อ​งาน​ข้าม agent ได้ที่​คลัง​อ้างอิง DevIQ:

  • Context Map — แผนที่​ความ​สัมพันธ์​ระหว่าง bounded context ทุก​อัน; published language คือ​สัญญา​ที่​วิ่ง​อยู่​บน​เส้น​ความ​สัมพันธ์​เหล่า​นี้​ระหว่าง agent
  • Anti-Corruption Layer — เมื่อ handoff พา​บทสนทนา​ข้าม​เข้าไป​ใน​ภาษา​ของ​อีก context ฝั่ง​รับ​ยัง​ต้อง​มี ACL แปลกลับ ไม่​ให้ model แปลกๆ ของ​ต้นทาง​รั่ว​เข้า​มา​ปน

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

ข้อ 1 / 3

delegation ต่างจาก handoff อย่างไร?