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

Bounded Context → agent หนึ่ง​ตัว (memory + guardrails)

บท​ก่อนๆ ปั้น ข้าง​ใน ของ agent ที่​มี​ขอบเขต — บท​ที่ 2 ใช้ subdomain เลือก​ว่า​กล่อง​ไหน​ควร​เป็น agent จริง บท​ที่ 3 แปลง ubiquitous language ให้​กลาย​เป็น system prompt ที่​ระดับ​ความ​สูง​พอดี​กับ​ชุด tool ที่​ตั้ง​ชื่อ​ชัด ทั้ง​สอง​บท​ตั้ง​อยู่​บน​สมมติฐาน​เงียบๆ ข้อ​หนึ่ง: ว่า​พอ​ประกาศ​ขอบเขต​แล้ว agent จะ​อยู่​ใน​ขอบเขต​นั้น​เอง บท​นี้​แตะ​สมมติฐาน​ข้อนั้นตรงๆ เพราะ​มัน​ไม่​จริง​โดย​อัตโนมัติ

ต่าง​จาก Bounded ContextBounded Contextขอบเขต​ที่ ubiquitous language และ model หนึ่ง​ชุด​มี​ความหมาย​คง​เส้น​คง​วา นอก​ขอบเขต​นี้​คำ​เดียวกัน​อาจ​หมาย​ถึง​คนละ​อย่าง — เมื่อ​ออกแบบ​ระบบ agent ให้​คิด​ว่า​แต่ละ agent (หรือ​กลุ่ม agent ที่​ทำงาน​ร่วม​กัน) ควร​รับผิดชอบ Bounded Context เดียว ไม่ใช่​ยัด​ทุก​หน้าที่​ไว้​ใน agent เดียว หรือ​กระจาย agent ตาม​อำเภอ​ใจStrategic Design ใน code ที่​มี compiler กับ type system คอย​บังคับ​ขอบ​ให้ ขอบเขต​ของ agent ไม่มี​ใคร​บังคับให้ฟรีๆ Agentic LoopAgentic Loopวงจร​ที่ agent ทำซ้ำ​จนกว่า​จะ​บรรลุ​เป้าหมาย: รับ input → วางแผน/ตัดสิน​ใจ → เรียก tool → สังเกต​ผลลัพธ์ → วน​กลับ​ไป​ตัดสิน​ใจ​ใหม่ — ต่าง​จาก​โปรแกรม​ทั่วไป​ที่​รัน​เส้นทาง​เดียว​จบ วงจร​นี้​เอง​ที่​ทำให้ agent ยืดหยุ่น แต่​ก็​เสี่ยง context rot ถ้า​วน​นาน​เกิน​ไป​โดย​ไม่มี​ขอบเขตProcess ทำให้ context โต​ทุกรอบ และ​คำ​ที่​เรา​ประกาศ​ไว้​ใน system prompt ก็​เป็น​แค่ ข้อความ ใน​บริบท​ที่​ยาว​ขึ้น​ต่อ​เนื่อง ไม่ใช่ constraint ที่ runtime บังคับ วิทยานิพนธ์​ของ​บท​นี้​จึง​คม​กว่า​บท​ก่อน: bounded context ของ agent คือ ความ​ตั้งใจ​ใน​การ​ออกแบบ ไม่ใช่​การ​รับประกัน​เชิงกลไก — และ​เรา​บังคับ​ความ​ตั้งใจ​นั้น​ได้​แค่​แบบ best-effort ด้วย​สาม​อย่าง​ที่​ทำงาน​ร่วม​กัน คือ agent memory ภายนอก, กอง​ของ guardrail และ eval

📦 code ตัวอย่าง

คอร์ส​นี้​เป็น คอร์ส​ออกแบบ ไม่ใช่​ทัวร์ SDK — code ใน​บท​คือ ภาพร่าง ของ memory topology, guardrail config และ Mermaid ขอบเขต ไม่ใช่ app ที่​รัน​ได้​จริง (LangGraph, OpenAI Agents SDK, Claude ยก​มา​เป็น​ตัวอย่าง​ประกอบ​เท่านั้น) ตัวอย่าง​ต่อยอด​จาก domain เดิม​ที่ repo kaen-food-ordering (กำลัง​จัด​ทำ) โดย​เดิน​เรื่อง​ด้วย agent Customer-Support จาก3 agent ตั้งต้น​ใน​บท​ที่ 1

ย้อน​กลับ​ไป​ที่ agent Customer-Support ของ ops-copilot มัน​พูด​ภาษา​แคบ (เคส/นโยบาย/ประวัติ​สนทนา) แต่​บริบท​ของ​งาน​ยาว — ประวัติ​แชต​ทั้ง​เส้น บวก​คู่มือ​นโยบาย บวก​ผล​ของ​ทุก tool ที่​มัน​เรียก​ระหว่าง​ทาง ทุกรอบ​ของ agentic loop เอา​ผล tool กลับ​เข้า context บริบท​จึง​พอง​ขึ้น​ต่อ​เนื่อง และ​นี่​คือ​จุด​ที่ Context RotContext Rotอาการ​ที่​คุณภาพ​การ​ตอบ​ของ agent เสื่อม​ลง​เมื่อ context window ยาว​ขึ้น​และ​สะสม​สิ่ง​ไม่​เกี่ยวข้อง​มาก​ขึ้น​เรื่อย ๆ ระหว่าง​วน agentic loop หลาย​รอบ — เป็น​เหตุผล​เชิง​เทคนิค​ข้อ​หนึ่ง​ที่ agent ควร​มี​ขอบเขต​หน้าที่​แคบ (เหมือน Bounded Context) แทนที่​จะ​ยัด​ทุก​อย่าง​ไว้​ใน agent เดียว​ที่ context ยาว​ขึ้น​เรื่อย ๆProcess เริ่ม​ทำงาน: งบ attention ที่​จำกัด​ถูก​เกลี่ย​บาง​ลง จน​กฎ​เดียว​ที่​สำคัญ ณ ตา​นี้ (“ห้าม​คืน​เงิน​เกิน​ยอด​ที่​จ่าย​จริง”) อาจ​ถูก​กลบ​ใต้​ข้อความ​ที่​ไม่​เกี่ยว​แล้ว​สิบ​รอบ​ก่อน

สังเกต​ว่า​ปัญหา​ไม่ใช่ “context ยาว” เฉยๆ แต่​คือ เรา​ไม่​ได้​เลือก​ว่า​อะไร​อยู่ อะไร​ไป — ปล่อย​ให้​ทุก​อย่าง​สะสม​ไป​ตาม​ธรรมชาติ​ของ loop การ​ควบคุม working context จึง​เป็น​งาน​ออกแบบ ไม่ใช่​ผลพลอยได้ Effective context engineering for AI agents (Anthropic, Sep 2025) ให้​มอง​มัน​เป็นการ curate: เลือก​ใส่ token ที่​ให้​ผล​สูงสุด​ใน​แต่ละ​ก้าว ไม่ใช่​เติม​ถัง​จน​ล้น (มี​ฉบับ​แปล​ไทย​ใน​เว็บ​นี้​ที่​บทความ Context Engineering ที่​ได้​ผล​สำหรับ AI Agents)

มี​สาม​กลไก​หลัก​ที่​ใช้​กัน​ขอบเขต​ไม่​ให้​พัง​เพราะ context บวม และ​ใน​ทาง​ปฏิบัติ​มัก​ใช้​พร้อม​กัน:

  1. Compaction — เมื่อ context ใกล้​เต็ม ให้​สรุป​บีบ​อัด​ช่วง​ที่​ผ่าน​มา​แทนที่​จะ​แบก​ดิบ​ทั้งหมด​ต่อ เก็บ​ข้อ​ทิ้ง​รายละเอียด​ที่​ไม่​ต้อง​ใช้​แล้ว นี่​คือ​กลไก​ที่​ทรง​พลัง​ที่สุด — และ​อันตราย​ที่สุด เพราะ​มัน​คือ​จุด​ที่​ข้อมูล​ถูก ตัด​ทิ้ง (เดี๋ยว​เรา​จะ​กลับ​มา​ที่​จุด​นี้)
  2. Agent MemoryAgent Memoryกลไก​ที่ agent เก็บ​ข้อมูล​ข้าม​รอบ​ของ agentic loop หรือ​ข้าม session เช่น สรุป​บทสนทนา​เก่า บันทึก​ข้อเท็จจริง​ระยะ​ยาว หรือ​ผลลัพธ์​ก่อน​หน้าที่​ต้อง​อ้างอิง​ต่อ — ออกแบบ​ให้​ดี​ต้อง​เลือก​ว่า​อะไร​ควร​เก็บ อะไร​ควร​ทิ้ง ไม่ใช่​ยัด​ประวัติ​ทั้งหมด​กลับ​เข้า context ทุก​ครั้ง​จน​เกิด context rotArchitecture ภายนอก — เขียน​สิ่ง​ที่​ต้อง​ไม่​ลืม​ออก​ไป นอก context: file โน้ต, progress file ของ​เคส​ที่​ยัง​ค้าง, หรือ commit ลง git แล้ว​อ่าน​กลับ​เข้า​มา​เฉพาะ​เมื่อ​จำเป็น context window กลาย​เป็น​พื้นที่​ทำงาน​ชั่วคราว ไม่ใช่​ที่​เก็บ​ถาวร
  3. Sub-agent isolation — โยน​งาน​ย่อย​ที่ context หนัก (เช่น ไล่​อ่าน​ล็อก​ยาวๆ เพื่อ​หา​สาเหตุ) ไป​ให้ sub-agent ทำ​ใน​หน้าต่าง​ของ​มัน​เอง แล้ว​รับ​กลับ​มา​แค่ ข้อ​สรุป ไม่ใช่​ทุก token ที่​มัน​เห็น​ระหว่าง​ทาง context หลัก​จึง​ไม่​ต้อง​แบก​งาน​สกปรก​นั้น
sub-agent isolation ≠ ใบอนุญาต​ให้​แตก multi-agent

กลไก​ที่ 3 ทำ​เพื่อ รักษา context ของ agent หลัก ไม่ใช่​เพื่อ​แตก​เป็น Multi-agentMulti-agentระบบ​ที่​มี agent มากกว่า​หนึ่ง​ตัว​ทำงาน​ร่วม​กัน แต่ละ​ตัว​ควร​มี Bounded Context ของ​ตัวเอง​ชัดเจน​และ​เชื่อม​กัน​ผ่าน context map/handoff ที่​ออกแบบ​ไว้ — ไม่ใช่​คำ​ตอบ​สำเร็จรูป​สำหรับ​ทุก​ปัญหา หลาย​งาน​ทำ​ด้วย agent เดียว​หรือ workflow ธรรมดา​ก็​เพียงพอ​และ​เชื่อถือ​ได้​กว่าArchitecture ตาม subdomain เหตุผล​ใน​การ​มี sub-agent ตรง​นี้​คือ “context-protection” ล้วนๆ — ไม่ใช่ specialization และ​ไม่ใช่ parallelization ประตู​ต้นทุน​ของ multi-agent (ราว 15 เท่า​ของ​แชต​เดี่ยว) กับ​การ​ตัดสิน​ใจ​ว่า​จะ​แตก​จริง​ไหม เป็น​เรื่อง​ของ​บท​ที่ 5 บท​นี้​ยัง​คุย​เรื่อง agent ตัว​เดียว อยู่

กลไก​ทั้ง​สาม​ข้าง​บน​ตกผลึก​เป็น​หลัก​ออกแบบ​ข้อ​เดียว: agent memory ควร​มี​สอง​ชั้น​ที่​แยก​หน้าที่​กัน​ชัด อย่า​ยัด​ทุก​อย่าง​ไว้​ชั้น​เดียว

short-term (thread-scoped)long-term (external)
อยู่​ที่ไหนใน context window ของ thread/session นี้นอก context — file โน้ต, progress file, git
อายุชั่วคราว หาย​เมื่อ​จบ thread หรือ​ถูก compactionคง​อยู่​ข้าม session
ใคร​แตะagentic loop เขียน/อ่าน​เอง​อัตโนมัติagent เลือก เขียน​ออก สิ่ง​สำคัญ แล้ว อ่าน​กลับ เมื่อ​ต้อง​ใช้
ตัวอย่าง​ใน​เคส Supportประวัติ​แชตล่า​สุด​ของ​ตั๋ว​นี้นโยบาย​คืน​เงิน, สรุป​เคส​ก่อนหน้า​ของ​ลูกค้า​คน​นี้, runbook ที่ track ใน git
ความ​เสี่ยง​ถ้า​ปล่อยโตจน context rot ถ้า​ไม่​บีบข้อมูล​เก่า/ผิด​ถ้า​ไม่​ดูแล

ชั้น​สั้น​คือ​หน่วย​ความ​จำ​ใช้งาน — เร็ว แต่​หาย​และ​ถูก​บีบ​ได้ ชั้น​ยาว​คือ​หน่วย​ความ​จำ​ที่​เรา ตั้งใจ ให้​อยู่​รอด: มัน​คือ​ที่​ที่​ข้อเท็จจริง​ห้าม​ลืม​ถูก​ปัก​หมุด​ไว้ เพื่อ​ว่า​ถ้า compaction ตัด​มัน​ออก​จาก​ชั้น​สั้น เรา​ยัง​อ่าน​กลับ​มา​ได้ Effective harnesses for long-running agents (Anthropic) เรียก​กลุ่ม​นี้​ว่า​สถานะ​ภายนอก​ของ harness — progress file, artifact และ git history ที่​ทำให้ agent ทำงาน​ยาวๆ ต่อ​เนื่อง​ข้าม​รอบ​ได้​โดย​ไม่​พึ่ง context window เป็น​ความ​จำ​ถาวร (มี​ฉบับ​แปล​ไทย​ที่​บทความ Harness Engineering)

❌ version ดิบ: memory ชั้น​เดียว + guardrail ด่าน​เดียว
agent: customer-support
memory:
strategy: replay_everything # ยัดประวัติแชตทั้งเส้น + ทุกผล tool กลับทุกรอบ
guardrail:
- check: final_output_only # ตรวจแค่ข้อความสุดท้ายก่อนส่งออก
# ผล 1: context โตทุกรอบจน context rot — กฎ "ห้ามคืนเงินเกินยอดจริง" ถูกกลบ
# ผล 2: ด่านเดียวไม่เห็น issue_refund ที่ tool-call ล้ำเส้นไปแล้วกลางทาง
✅ agent มี​ขอบเขต: memory สอง​ชั้น + guardrail เป็นกอง
agent: customer-support
memory:
short_term: # thread-scoped — อยู่ใน context window
window: recent_turns
compaction: summarize_near_limit # บีบอัดเมื่อใกล้เต็ม
long_term: # external — อยู่นอก context
notes: policy_and_case_notes.md # โน้ตนโยบาย/สรุปเคส
progress: ticket_progress.md # progress file ของเคสที่ค้าง
provenance: git # ประวัติแก้ไข ย้อนดูได้
guardrails: # กอง ไม่ใช่ช่องเดียว
input: [redact_pii, reject_out_of_scope]
tool: allowlist[search_ticket, draft_reply] # ไม่มี issue_refund ในมือ
output: policy_compliance_check
human_in_the_loop: [refund, account_change] # งานย้อนไม่ได้ → คนอนุมัติ
stop_when: [resolved, max_turns, budget_exceeded]
sandbox: read_only_replica # tool วิ่งบน replica อ่านอย่างเดียว

สังเกต​ใน​ภาพร่าง ✅ ว่า guardrails เป็น รายการ ไม่ใช่​ค่า​เดียว นี่​ไม่ใช่​ความ​ละเอียด​เกิน​เหตุ แต่​เป็น​หัวใจ GuardrailGuardrailกติกา​ที่​ควบคุม​ไม่​ให้ agent ทำ​เกิน​ขอบเขต​หรือ​ก่อ​ความ​เสียหาย เช่น จำกัด tool ที่​เรียก​ได้ ตรวจ output ก่อน​ส่ง​ออก บังคับ human approval สำหรับ​การกระทำ​ที่​ย้อน​กลับ​ไม่​ได้ — เป็น​สิ่ง​ที่​รักษา​ขอบเขต​ของ Bounded Context ของ agent ให้​ไม่​ล้ำเส้นProcess ที่​ดี​คือ กอง​ของ​ด่าน​ที่​ต่าง​ชนิด​กัน เพราะ​ความ​พัง​ของ agent มี​หลาย class และ​ไม่มี​ด่าน​เดียว​ที่​ดัก​ได้​ทุก class:

  • Input guardrail — กรอง/ตรวจ​สิ่ง​ที่​เข้า​มา​ก่อน​ถึง model: ลบ PII, ปฏิเสธ​คำขอ​ที่​อยู่​นอก​ขอบเขต (คน​ถาม​เรื่อง​ปรับ​ราคา​เมนู แต่​นี่​คือ agent ฝั่ง​ลูกค้า) กัน​ไม่​ให้ prompt injection หรือ​งาน​นอก​ขอบ​ไหล​เข้า loop ตั้งแต่​ต้น
  • Tool guardrail — ด่าน​ที่​แข็งแรง​ที่สุด เพราะ​บังคับ​ที่ ความ​สามารถ ไม่ใช่​ที่​คำ​พูด: allowlist ของ tool ที่ agent นี้​ถือ​ได้ บวก​การ​ตรวจ argument ก่อน​ยิง​จริง Customer-Support ไม่มี issue_refund ใน​มือ​เลย — ต่อ​ให้ model อยาก​คืน​เงิน มัน​ก็​ทำ​ไม่​ได้ นี่​คือ​การ รักษา​ขอบ​ด้วย​การ​ไม่​ให้​เครื่องมือ แทนที่​จะ​หวัง​ให้ model จำ​ว่า​ห้าม​ทำ
  • Output guardrail — ตรวจ​สิ่ง​ที่​จะ​ออก​ก่อน​ส่ง​ถึง​ลูกค้า​จริง: ตรง​ตาม​นโยบาย​ไหม เผลอ​หลุด​ข้อมูล​ภายใน​หรือ​สัญญา​เกิน​อำนาจ​ไหม
  • Human-in-the-loopHuman-in-the-loopการ​ออกแบบ​ให้​มนุษย์​เข้า​มา​ตรวจสอบ​หรือ​อนุมัติ​ใน​จุด​ที่​การกระทำ​ของ agent มี​ความ​เสี่ยง​สูง​หรือ​ย้อน​กลับ​ไม่​ได้ เช่น ก่อน​โอน​เงิน​หรือ​ลบ​ข้อมูล​จริง — เป็น guardrail ชนิด​หนึ่ง​ที่​ยัง​จำเป็น​แม้ agent จะ​ฉลาด​ขึ้น​เรื่อย ๆ เพราะ​บาง​การ​ตัดสิน​ใจ​ไม่​ควร​ปล่อย​ให้ agent ตัดสิน​ใจ​เอง​ทั้งหมดProcess — สำหรับ​การกระทำ​ที่​แพง​หรือ​ย้อน​กลับ​ไม่​ได้ (คืน​เงิน, แก้​บัญชี) ต้อง​มี​คน​อนุมัติ​คั่น​เสมอ ไม่​ปล่อย​ให้ agent กด​เอง
  • เงื่อนไข​หยุด (stopping condition) — agentic loop ที่​ไม่มี​เบรก​จะ​วน​ไม่​จบ​และ​เผา token: หยุด​เมื่อ​แก้​เคส​จบ, เกิน​จำนวน​รอบ​สูงสุด, หรือ​เกิน​งบ นี่​คือ guardrail ต่อ ตัว loop เอง
  • Sandbox — จำกัด blast radius ของ​สิ่ง​ที่ tool ทำได้​จริง: ให้​วิ่ง​บน read-only replica หรือ​ใช้ credential ที่ scope แคบ เพื่อ​ว่า​ถ้า​ด่าน​อื่น​หลุด​หมด ความ​เสียหาย​ก็​ยัง​ถูก​จำกัด​ด้วย​สภาพ​แวดล้อม

Building Effective Agents (Anthropic) พูด​ถึง​เงื่อนไข​หยุด, sandbox และ​การ​ให้​คน​กำกับ​งาน​ที่​แพง/ย้อน​ไม่​ได้ ส่วน OpenAI Agents SDK — Guardrails วาง​กอง​ด่าน input/output/tool ไว้​เป็นชั้นๆ ชัดเจน เหตุผล​ที่​ต้อง​เป็น กอง ไม่ใช่​ช่อง​เดียว​มา​จาก​ธรรมชาติ​ของ​การ​บังคับ​ใช้​ใน​โลก agent — ซึ่ง​พา​เรา​มา​ที่​ประเด็น​ที่​ต้อง​พูดตรงๆ

ตลอด​คอร์ส​เรา​ยืม​คำ​จาก DDD มา​ใช้​กับ agent ได้​ลื่น​ไหล แต่​ตรง​นี้​มี​รอย​ต่อ​ที่​ถ้า​ไม่​พูด​ให้​ชัด​จะ​หลอก​ตัวเอง คน​ที่มา​จาก​สาย DDD จะ​เผลอ​คิด​ว่า bounded context ของ agent บังคับ​ใช้ได้​เหมือน aggregate — และ​มัน​ไม่​จริง

aggregate รักษา invariant แบบ atomic ทุก​การ​เปลี่ยน​สถานะ​ผ่าน root ตัว​เดียว และ​ที่​ทุก transaction commit กฎ​ธุรกิจ (invariant) เป็น​จริง​เสมอ ถ้า​การ​เปลี่ยนแปลง​จะ​ทำให้​กฎ​พัง transaction จะ​ถูก​ปฏิเสธ — throw ออก​มา​เสียง​ดัง ไม่มี​อะไร​ถูก​ตัด​ทิ้ง​เงียบๆ นี่​คือ consistency boundary ที่​บังคับ​ใช้​จริง​โดย​กลไก

context ของ agent หลัง compaction ไม่​รับประกัน​แบบ​นั้น​เลย สิ่ง​ที่​ใกล้​เคียง “commit หน่วย​ความ​จำ” ที่สุด​คือ​การ​สรุป​บีบ​อัด และ​การ​สรุป​นั้น lossy โดย​ธรรมชาติ — ตัว​ที่​ตัดสิน​ว่า​อะไร​เก็บ​อะไร​ทิ้ง​มัก​เป็น model อีก​ที มัน​ตัด​ข้อเท็จจริง​ที่ boundary ควร​รักษา (“ลูกค้า​คน​นี้​เคย​ถูก​ปฏิเสธ​เคลม​มา​แล้ว”, “เพดาน​คืน​เงิน​คือ​ยอด​ที่​จ่าย​จริง”) ทิ้ง​ได้ โดย​ไม่ throw อะไร​ทั้งนั้น ไม่มี transaction ถูก reject มี​แต่ agent ที่​เงียบๆ ไม่รู้​กฎ​นั้น​อีก​ต่อ​ไป การ​บังคับ​ใช้​ขอบเขต​จึง​เป็น best-effort ไม่ใช่ atomic

นี่​คือ​เหตุผลตรงๆ ว่า​ทำไม​ต้อง​มี​ทั้ง​สาม​อย่าง ไม่ใช่​แค่ “เขียน system prompt ให้​ดี”:

  • external memory ปัก​ข้อเท็จจริง​ห้าม​ลืม​ไว้​นอก context เพื่อ​ว่า compaction ตัด​จาก​ชั้น​สั้น​ไป​ก็​ยัง​อ่าน​กลับ​ได้ — ชดเชย​ความ lossy ของ​การ​สรุป
  • guardrails ย้าย​การ​บังคับ​กฎ​แข็งๆ ไป​ไว้​ที่ ขอบ (tool allowlist, human-in-the-loop, output check) แทนที่​จะ​เชื่อ​ว่า model จะ “จำ​ได้” — เพราะ​การ​จำเป็น best-effort แต่​การ​ไม่​ให้​เครื่องมือ​เป็น​ของ​แน่นอน
  • EvalEvalการ​วัดผล​อย่าง​เป็น​ระบบ​ว่า agent ทำงาน​ตรง​ตาม​ที่​ออกแบบ​ไว้​จริง​หรือ​ไม่ ด้วย​ชุด​กรณี​ทดสอบ​และ​เกณฑ์​ที่​ชัดเจน แทน​การ​ดู​จาก​ความ​รู้สึก​ว่า 'ตอบ​ดู​ดี' — จำเป็น​เพราะ agentic loop มี​ความ​ไม่​แน่นอน​สูง​กว่า code ทั่วไป ต้อง​มี eval ก่อน​เชื่อ​ว่า Bounded Context ของ agent ทำงาน​ถูกต้อง​ตาม​สัญญาProcess วัด​ว่า​ขอบ​ยัง​อยู่​จริง​ไหม โดย​ดู ปลายทาง (ผลลัพธ์​ถูกตามนโยบาย​ไหม) ไม่ใช่ เส้นทาง — เพราะ​เมื่อ​ไม่มี compiler คอย​บอกว่า​ขอบ​แตก การ​วัดผล​เชิง​ประจักษ์​คือ​สิ่ง​เดียว​ที่​บอก​เรา​ได้

และ​นี่​คือ​คำ​ตอบ​ว่า​ทำไม guardrail ต้อง​เป็น กอง: เมื่อ​การ​บังคับ​ใช้​เป็น best-effort/ความ​น่า​จะ​เป็น ไม่ใช่ atomic ไม่มี​ด่าน​เดียว​ที่​รับประกัน​ได้​ทั้งหมด แต่ละ​ชั้น​ดัก​ความ​พัง​คนละ class (input ปน​เปื้อน, tool ล้ำเส้น, output หลุด​นโยบาย, งาน​ย้อน​ไม่​ได้, loop วน​ไม่​จบ, blast radius) การ​ซ้อน​หลาย​ชั้น​คือ​การ​ทดแทน​การ​รับประกัน​เชิงกลไก​ที่ agent ไม่มี ด้วย defense in depth — ด่าน​สุดท้าย​ที่​ตรวจ “คำ​ตอบ​สุดท้าย” อย่าง​เดียว มอง​ไม่​เห็น issue_refund ที่​ยิง​ไป​แล้วกลาง​ทาง

DDD ยัง​ให้​คำ​ศัพท์​ของ​การ​ยับยั้ง​ชั่งใจ​ที่​มี​ค่าที่สุด​ใน​การ​ออกแบบ agent — แต่​ให้​ถือ bounded context ไว้​เป็น เจตนา ที่​เรา​ลงแรง​บังคับ ไม่ใช่​กำแพง​ที่ runtime ตั้งให้ฟรีๆ

flowchart TB
  subgraph AGENT["agent เดียว = bounded context (ตั้งใจ, best-effort)"]
    SP["System Prompt<br/>ประกาศขอบเขต + ปฏิเสธงานนอกขอบ"]
    subgraph LOOP["agentic loop — working context (thread-scoped)"]
      CTX["context สั้น<br/>โตทุกรอบ → compaction เมื่อใกล้เต็ม"]
      TOOLS["Tools (allowlist)<br/>search_ticket, draft_reply<br/>ไม่มี issue_refund ในมือ"]
      CTX --> TOOLS --> CTX
    end
    subgraph GUARD["guardrails — กอง ไม่ใช่ช่องเดียว"]
      GIN["input: redact PII, reject นอกขอบ"]
      GTOOL["tool: allowlist + ตรวจ args"]
      GOUT["output: ตรวจนโยบายก่อนส่ง"]
      GHIT["human-in-the-loop: refund/ย้อนไม่ได้"]
      GSTOP["stop: resolved / max turns / งบหมด"]
      GSBX["sandbox: read-only replica"]
    end
  end
  MEM["external agent memory (long-term)<br/>notes + progress file + git<br/>อยู่นอก context window"]
  EVAL["eval<br/>วัดว่าขอบยังอยู่จริง<br/>(ดูปลายทาง ไม่ใช่เส้นทาง)"]

  SP --> LOOP
  LOOP <-->|"เขียนของสำคัญออก / อ่านกลับเมื่อต้องใช้"| MEM
  GUARD -.->|"รักษาขอบไม่ให้ล้ำ"| LOOP
  LOOP -->|"invariant ไม่ atomic: compaction อาจตัดของสำคัญเงียบ ๆ"| EVAL
  classDef agentbox fill:#c7d2fe,stroke:#3730a3,color:#1a1a1f;
  classDef ext fill:#bbf7d0,stroke:#166534,color:#14532d;
  classDef evalc fill:#fde68a,stroke:#92400e,color:#3f2d00;
  class SP,CTX,TOOLS,GIN,GTOOL,GOUT,GHIT,GSTOP,GSBX agentbox;
  class MEM ext;
  class EVAL evalc;

คำ​บรรยาย​ภาพ: ทั้งหมด​นี้​คือ agent ตัว​เดียว (Customer-Support) ไม่ใช่​การ​แตก​หลาย agent — กล่อง​ขอบเขต​ล้อม system prompt, ชุด tool ที่ allowlist, working context และ guardrails ไว้​เป็น consistency boundary แบบ ตั้งใจ คล้าย aggregate ใน domain แต่​ต่าง​กัน​ที่​หัวใจ: aggregate รักษา invariant แบบ atomic ส่วน​ขอบ​ของ agent เป็น best-effort เพราะ working context โต​ทุกรอบ​และ​ถูก compaction บีบ ซึ่ง​อาจ​ตัด​ข้อเท็จจริง​ที่ boundary ควร​รักษา​ทิ้ง​เงียบๆ external memory (เขียว อยู่​นอก context) จึง​กัน​ของ​สำคัญ​ไม่​ให้​หาย​ไป​กับ​การ​สรุป, guardrails หลาย​ชั้น​รักษา​ขอบ​ไม่​ให้​ล้ำ และ eval (เหลือง) วัด​ว่า​ขอบ​ยัง​อยู่​จริง — สาม​อย่าง​นี้​มา​แทน​การ​รับประกัน​เชิงกลไก​ที่ agent ไม่มี ส่วน sub-agent isolation ที่​พูด​ถึง​ใน​เนื้อหา​เป็น​กลวิธี​รักษา context ของ agent หลัก ไม่ใช่​คำ​สั่ง​ให้​แตก agent ตาม subdomain — เส้น​แบ่ง agent ที่แท้​จริง​ลาก​บน​จุด​ที่​ภาษา/ความ​ไว้ใจ​เปลี่ยน (เรื่อง​ของ​บท​ที่ 5) ไม่ใช่​บน​ตำแหน่ง​งาน

บท​นี้​ปิด​เรื่อง agent ตัว​เดียว: เรา​รู้​แล้ว​ว่า​จะ​กัน​มัน​ไม่​ให้​หลุด​ขอบ​ตลอด loop ยาวๆ ได้​อย่างไร — คุม working context ด้วย compaction/external memory/sub-agent isolation, ทำ memory สอง​ชั้น, กอง guardrail หลาย​ด่าน และ​ยอมรับ​ว่า​ทั้งหมด​นี้​บังคับ​ใช้​ขอบเขต​แบบ best-effort ไม่ใช่ atomic จึง​ต้อง​มี eval คอย​วัด

บท​ที่ 5 ถึง​จะ​เปิด​คำถาม​ที่​เรา​เลื่อน​มา​ตลอด: เมื่อไร​ถึง​คุ้ม​ที่​จะ​มี​มากกว่า1 agent — วาด context map ก่อน แล้ว​พิสูจน์​ด้วย​เหตุผล​ที่​มีชื่อ​สาม​ข้อ (context-protection, parallelization, specialization) บวก​ประตู​ต้นทุน ไม่ใช่​แตก​ตาม subdomain แบบ​อัตโนมัติ วินัย​เดิม​ยัง​อยู่: รู้​ว่า​อะไร​ควร​อยู่​ใน agent ที่​มี​ขอบเขต​ดี​ตัว​เดียว​ให้​ชัด​ก่อน แล้ว​ค่อย​แตก​เมื่อ​มี​เหตุผล​จริง


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

เจาะ​ลึก​แนวคิด​ใน​บท​นี้​ต่อ​ได้ที่​คลัง​อ้างอิง DevIQ:

  • Bounded Context — ขอบเขต​ที่ model หนึ่ง​ชุด​และ​ภาษา​หนึ่ง​ชุด​คง​ความหมาย​ไว้ บท​นี้​ยืม​มัน​มา​ใช้​กับ agent ใน​ฐานะ เจตนา ที่​ต้อง​ลงแรง​บังคับ ไม่ใช่​กำแพง​ฟรี
  • Aggregate — consistency boundary ที่​รักษา invariant แบบ atomic คือ​หลัก​ที่​บท​นี้​ใช้​เทียบ​เพื่อ​ชี้ disanalogy: agent context หลัง compaction ไม่ ให้การ​รับประกัน​แบบ​เดียวกัน

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

ข้อ 1 / 3

สามกลไกหลักที่ใช้ควบคุม working context ของ agent ไม่ให้บวมจน context rot คืออะไร?