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

Ubiquitous Language → system prompt + tools

บท​ที่ 2 ใช้ SubdomainSubdomainส่วน​ย่อย​ของ​ปัญหา​ทาง​ธุรกิจ (problem space) แบ่ง​เป็น core, supporting, generic — ก่อน​จะ​ออกแบบ​ว่า​จะ​มี agent กี่​ตัว​และ​แต่ละ​ตัว​ทำ​อะไร ต้อง​วิเคราะห์ subdomain ของ​ธุรกิจ​ก่อน​เสมอ ไม่ใช่​เริ่ม​จาก​อยาก 'มี agent' แล้ว​ค่อย​หา​เรื่อง​ให้​มัน​ทำStrategic Design จำแนก​ว่า​กล่อง​ไหน​ใน​ธุรกิจ​คู่ควร​เป็น AgentAgentระบบ​ซอฟต์แวร์​ที่​รับ​เป้าหมาย​แล้ว​วางแผน-ตัดสิน​ใจ-เรียก​ใช้ tool ได้​เอง​หลาย​รอบ (agentic loop) โดย​ไม่​ต้อง​มี​มนุษย์​กำกับ​ทุก​ก้าว ต่าง​จาก​โปรแกรม​ทั่วไป​ที่​รัน​ตาม​ลำดับ​คำ​สั่ง​ตายตัว — ใน​คอร์ส​นี้​มอง​แต่ละ agent เหมือน1 Bounded Context ที่​ต้อง​มี​ขอบเขต ภาษา และ​หน้าที่​ของ​ตัวเอง​ชัดเจนArchitecture จริงๆ (core ที่​ปลาย​เปิด) กล่อง​ไหน​ควร​เป็น workflow หรือ​แค่ tool ตอน​นี้​สมมติ​ว่า​เรา​ได้ context หนึ่ง​ที่​ตัดสิน​แล้ว​ว่า​จะ​เป็น agent — เช่น “ดูแล​ลูกค้า” ของ ops-copilot คำถาม​ของ​บท​นี้​คือ แล้ว​อะไร​ไป​อยู่​ข้าง​ใน​มัน​บ้าง คำ​ตอบสั้นๆ คือ Ubiquitous LanguageUbiquitous Languageภาษา​กลาง​ที่​ทีม​และ​ผู้เชี่ยวชาญ​ธุรกิจ​ใช้​ร่วม​กัน อิง​กับ model โดยตรง — สำหรับ agent แล้ว ภาษา​นี้​คือ​คำ​ศัพท์​ที่​ปรากฏ​ใน system prompt ชื่อ tool และ schema ของ​มัน​ด้วย ถ้า​คำ​ใน code agent ไม่​ตรง​กับ​คำ​ที่​ผู้เชี่ยวชาญ​ธุรกิจ​ใช้ แปล​ว่า​กำลัง​หลง​ทางStrategic Design ของ context นั้น​แปลง​ร่าง​เป็น​สอง​สิ่ง​ที่​จับ​ต้อง​ได้: System PromptSystem Promptชุด​คำ​สั่ง​ที่​ฝัง​ไว้​ล่วงหน้า​เพื่อ​กำหนด​บทบาท ขอบเขต​หน้าที่ ภาษา และ​กติกา​ของ agent ก่อน​เริ่ม​สนทนา​จริง เทียบ​ได้​กับ​สัญญา (contract) ที่​ประกาศ​ว่า Bounded Context นี้​รับผิดชอบ​อะไร และ​ปฏิเสธ​คำขอ​ที่​อยู่​นอก​ขอบเขตArchitecture ที่​ระดับ​ความ​สูง​พอดี กับ​ชุด ToolToolfunction หรือ API ภายนอก​ที่ agent เรียก​ใช้ได้​เพื่อ​กระทำ​สิ่ง​ที่ model ภาษา​เอง​ทำ​ไม่​ได้ เช่น ค้น​เว็บ อ่าน file เรียก​ฐาน​ข้อมูล — ขอบเขต​ของ​ชุด tool ที่ agent หนึ่ง​ถือ​อยู่​ก็​คือ​ส่วน​หนึ่ง​ที่​นิยาม Bounded Context ของ agent นั้น ยิ่ง tool set กว้าง​เกิน​หน้าที่ ยิ่ง​เสี่ยง​ให้ agent ล้ำ​ขอบเขตArchitecture ที่​น้อย คม และ​ตั้ง namespace ชัด นี่​คือ​การ​แม็ป​ที่​แข็งแรง​ที่สุด​เส้น​หนึ่ง​ใน​คอร์ส — แข็งแรง​พอที่​จะ​สอน​ได้​อย่าง​มั่นใจ เพราะ​คำ​ศัพท์​ที่​ผู้เชี่ยวชาญ​ธุรกิจ​พูด​ใน​ห้อง Event Storming คือ​คำ​เดียว​กับ​ที่​ควร​โผล่​ใน prompt และ​ชื่อ tool ของ agent ตัว​นั้น​เป๊ะๆ

📦 code ตัวอย่าง

คอร์ส​นี้​เป็น คอร์ส​ออกแบบ ไม่ใช่​ทัวร์ SDK — code ใน​บท​คือ ภาพร่าง ของ system prompt, ชุด tool และโทโพโล​ยี (Thai Mermaid + pseudo-config สั้นๆ) ไม่ใช่ app ที่​รัน​ได้​จริง ตัวอย่าง​ต่อยอด​จาก domain เดิม​ที่ repo kaen-food-ordering (กำลัง​จัด​ทำ) โดย​มอง​มัน​ผ่าน​เลนส์​ใหม่: ระบบ ops-copilot ที่​ช่วย​ทีม​ปฏิบัติการ​ของ platform

ใน DDD ubiquitous language ไม่ใช่ “อภิธาน​ศัพท์” ที่​แขวน​ไว้​เฉยๆ มัน​คือ​ภาษา​เดียว​ที่​ทีม​พูด model ใช้ และ code สะกด​ตาม ภายใน Bounded ContextBounded Contextขอบเขต​ที่ ubiquitous language และ model หนึ่ง​ชุด​มี​ความหมาย​คง​เส้น​คง​วา นอก​ขอบเขต​นี้​คำ​เดียวกัน​อาจ​หมาย​ถึง​คนละ​อย่าง — เมื่อ​ออกแบบ​ระบบ agent ให้​คิด​ว่า​แต่ละ agent (หรือ​กลุ่ม agent ที่​ทำงาน​ร่วม​กัน) ควร​รับผิดชอบ Bounded Context เดียว ไม่ใช่​ยัด​ทุก​หน้าที่​ไว้​ใน agent เดียว หรือ​กระจาย agent ตาม​อำเภอ​ใจStrategic Design หนึ่ง​อัน คำ​ว่า “เคส” “การ​ชดเชย” “SLA” มี​ความหมาย​คง​เส้น​คง​วา พอ​เปลี่ยน​สนาม​มา​เป็น agent ภาษา​นี้​ยัง​ทำ​หน้าที่​เดิม แต่​ตกผลึก​ลง​ใน​ที่​ที่​ต่าง​ออก​ไป​สอง​แห่ง:

  • ลงใน system prompt — เป็น​คำ​ที่ agent ใช้​บรรยาย​บทบาท ขอบเขต และ​หลัก​ตัดสิน​ใจ​ของ​ตัวเอง ถ้า prompt เรียก​สิ่ง​ที่​ทีม CX เรียก​ว่า “เคส” ว่า “ticket bug report” ขึ้น​มา แปล​ว่า​ภาษา​เริ่ม​เพี้ยน​ตั้งแต่​ต้นน้ำ
  • ลง​ใน​ชื่อ tool และ schema ของ​มัน — ชื่อ tool, ชื่อ parameter และ​รูป​ผลลัพธ์ ล้วน​เป็น​คำ​ศัพท์​ของ context นั้น agent อ่าน​ชื่อ tool เพื่อ​เดา​ว่า​มัน​ทำ​อะไร เหมือน​ที่​คน​อ่าน​ชื่อ function ชื่อ​ที่​ตรง​ภาษา​คือ​ครึ่ง​หนึ่ง​ของ​เอกสาร

กล่าว​อีก​แบบ: prompt กับ tool คือ พื้น​ผิว ที่ ubiquitous language ของ context โผล่​ออก​มา​ให้ model เห็น ถ้า​สอง​พื้น​ผิว​นี้​พูด​คนละ​ภาษา​กับ​ที่​ทีม​พูด agent จะ​สับสน​แบบ​เดียว​กับ​โปรแกรมเมอร์​ที่​อ่าน code ซึ่ง​ตั้ง​ชื่อ​มั่ว

คำถาม​แรก​ไม่ใช่ “เขียน prompt ยังไง​ให้​เก่ง” แต่​คือ “เขียน​ที่ ระดับ ไหน” ทีม Applied AI ของ Anthropic เรียก​จุด​ที่​ถูกต้อง​ว่า right altitude ใน Effective context engineering for AI agents (Anthropic, Sep 2025) — prompt ควร​มี เฉพาะ​ส่วน​ที่​จำเป็น​เพื่อ​กำหนด​พฤติกรรม​ให้​ครบ ไม่​มาก​ไป​ไม่​น้อย​ไป มัน​คือ​โซน​พอดี​ระหว่าง​สอง​ความ​ผิดพลาด:

  • ต่ำ​เกิน​ไป — ยัด​กฎ if/else ราย-คำ​เข้าไป​เป็น​ร้อย​ข้อ (“ถ้า​ลูกค้า​พิมพ์​คำ​ว่า X ให้​ตอบ Y”) เปราะ​มาก เคส​ที่​ไม่​ตรง​คำ​เป๊ะๆ ร่วง​หมด และ​ไม่มี​ใคร​ไล่​แก้​ทัน
  • สูง​เกิน​ไป — เขียน​กว้าง​ลอย (“ช่วย​ลูกค้า​ให้​ดี​ที่สุด”) จน agent ต้อง​เดา​เอา​เอง​ว่า​ขอบเขต​อยู่​ตรง​ไหน อะไร​ทำได้ อะไร​ห้าม​แตะ
❌ version ดิบ: prompt ที่​ระดับ​ต่ำ​เกิน​ไป — เปราะ​เพราะ​ผูก​กับ​คำ​เป๊ะ ๆ
agent: customer-support
system_prompt: |
ถ้าลูกค้าพิมพ์ "เงิน" หรือ "คืน" ให้เรียก issue_refund ทันที
ถ้าพิมพ์ "ช้า" ให้ตอบ "ขออภัยในความล่าช้า"
ถ้าพิมพ์ "อาหารผิด" ให้... (ตามด้วยกฎ if/else อีกห้าสิบข้อ)
# เปราะ: เคสที่พูดคนละคำแต่ความหมายเดียวกันร่วงหมด
# อันตราย: ผูก issue_refund ที่ย้อนกลับไม่ได้กับแค่ keyword
✅ prompt ระดับ​พอดี: บทบาท + ขอบเขต + ภาษา + หลัก​ตัดสิน​ใจ
agent: customer-support
system_prompt: |
บทบาท: คุณคือผู้ช่วยฝ่ายดูแลลูกค้าของ platform ฟู้ดเดลิเวอรี
ขอบเขต: ตอบเรื่องสถานะเคส นโยบายคืนเงิน และช่วยร่างคำตอบ
เรื่องครัว ราคาเมนู หรือการจัดคิวไรเดอร์ ไม่ใช่งานของคุณ — ส่งต่อ
ภาษา: ใช้คำว่า "เคส" "นโยบาย" "การชดเชย" ตามที่ทีม CX ใช้จริง
หลักตัดสินใจ: การกระทำที่มีเงินเกี่ยวข้องต้องให้คนอนุมัติก่อนเสมอ
# พอดี: กำหนดพฤติกรรมครบโดยไม่ผูกติด if/else ราย-คำ

สังเกต​ว่า version พอดี​ไม่​ได้​สั้น​ที่สุด แต่​มัน ครบ พอที่​จะ​กำหนด​พฤติกรรม — บอกว่า​เป็น​ใคร รับผิดชอบ​แค่​ไหน ปฏิเสธ​อะไร ใช้​คำ​อะไร และ​เส้น​ความ​เสี่ยง​อยู่​ตรง​ไหน สิ่ง​ที่​มัน​จงใจ ไม่ ทำ​คือ​แจกแจง​ทุก​สถานการณ์​ล่วงหน้า เพราะ​นั่น​คือ​งาน​ของ model ไม่ใช่​ของ prompt right altitude จึง​เป็น​เรื่อง​ของ “ให้ heuristic ที่​แข็งแรง แล้ว​ไว้ใจ​ให้ model ปรับ​ใช้​เอง” ไม่ใช่ “เขียน script ให้​มัน​เดิน​ตาม​ทุก​ก้าว”

พื้น​ผิว​ที่​สอง​คือ​ชุด tool และ​หลัก​ก็​เหมือน​กับ prompt: น้อย​แต่​คม ชนะ​เยอะ​แต่​กำกวม สัญชาตญาณ​ที่​ผิด​คือ “backend เรา​มี endpoint อะไร ก็​ยก​มา​เป็น tool ให้​ครบ​ทุก​อัน” — ได้ tool ที่​เกือบ​ซ้ำ​กัน​มากอง จนถึง​จุด​ตัดสิน​ใจ agent ต้อง​เลือก​ระหว่าง get_ticket_by_id, get_ticket_by_email, search_tickets_open ที่​ทับซ้อน​กัน Writing effective tools for AI agents (Anthropic) วาง​กฎ​ไว้​ที่​นี่: ถ้า​คน​ยัง​บอก​ไม่​ได้​ว่า​ควร​ใช้ tool ไหน agent ก็​บอก​ไม่​ได้​เหมือน​กัน tool ที่​มาก​เกิน​ไป​ไม่​ได้​เพิ่ม​ความ​สามารถ มัน​เพิ่ม​จุด​ตัดสิน​ใจ​กำกวม แล้ว​จุด​กำกวม​ทุก​จุด​คือ​ที่​ที่ agent พลาด​ได้

บทความ​เดียวกัน​ให้​ทาง​แก้​สอง​ข้อ​ที่​ใช้ได้​ทันที:

  • รวม operation ที่​เกี่ยวข้อง​ไว้​ใต้ parameter action — แทนที่​จะ​มี6 tool สำหรับ “หา​เคส” ให้​มี tool เดียว​ที่​รับ action: get | search จำนวน tool ลด จุด​ตัดสิน​ใจ​ก็​ลด​ตาม
  • ตั้ง​ชื่อ​ตาม service/resource — ใช้ namespace อย่าง support.ticket, support.reply แทนชื่อลอยๆ อย่าง getTicket namespace บอก​ทั้ง​ว่า tool นี้​อยู่ context ไหน และ​ช่วย​ไม่​ให้​ชื่อ​ชน​กัน​เมื่อ​ระบบ​โต
❌ version ดิบ: ยก endpoint ของ backend มา​เป็น tool ที​ละ​อัน
tools:
- get_ticket_by_id
- get_ticket_by_email
- get_ticket_by_order
- search_tickets_open
- search_tickets_closed
- list_recent_tickets
# หกวิธี "หาเคส" ที่เกือบซ้ำกัน — คนยังงงว่าจะใช้ตัวไหน agent ยิ่งงง
✅ tool น้อย คม ตั้ง​ชื่อ​ตาม resource รวม operation ไว้​ใต้ action
tools:
- name: support.ticket
description: อ่านและค้นเคสของฝ่ายดูแลลูกค้า
params:
action: [get, search] # รวมหลาย operation ไว้ที่เดียว
query: "เลขเคส อีเมล หรือเลขออเดอร์"
- name: support.reply
description: ร่างคำตอบถึงลูกค้า (ยังไม่ส่งจนกว่าคนจะอนุมัติ)

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

เพราะ ubiquitous language นิยาม​อยู่ ภายใน bounded context หนึ่งๆ พื้น​ผิว​ทั้ง​สอง​จึง​ต้อง​เป็น​ราย-context ด้วย: agent “ดูแล​ลูกค้า” พูด​ภาษา​เคส/นโยบาย และ​ถือ namespace support.* เท่านั้น มัน​ไม่​ควร​ถือ kitchen.mark_ready หรือ rider.reassign เลย — ไม่ใช่​เพราะ​กลัว​มัน​ทำ​พัง แต่​เพราะ tool ของ​ครัว​มา​พร้อม ภาษา​ของ​ครัว และ​ภาษา​นั้น​จะ​รก​อยู่​ใน prompt ของ context ที่​ไม่​ได้​พูด​ภาษา​ครัว การ​กัน​ไม่​ให้ support agent ถือ tool ครัว​จึง​เป็นการ รักษา ให้​ภาษา​ของ​แต่ละ context คม​และ​ไม่​ปน​กัน — หลัก​เดียว​กับ​ที่​ห้าม model Order ใน​ครัว​รู้เรื่อง​บิล​ลิ่ง

แต่​ตรง​นี้​ต้อง​ระวัง​ไม่​ให้​เลยเถิด “ราย-context” ไม่​ได้ แปล​ว่า “ต้อง​มี agent process แยก​กัน​หนึ่ง​ตัว​ต่อ1 context เสมอ” — บาง context เริ่ม​เป็น workflow ก่อน บาง​คู่​ที่​ภาษา​ใกล้​กัน​พอ​อาจ​อยู่​ใน agent เดียวกัน​ด้วย​ซ้ำ เส้น​ที่​เรา​ลาก​ใน​บท​นี้​คือ เส้น​ภาษา ว่า prompt กับ tool namespace ชุด​ไหน​ควร​อยู่​ด้วย​กัน ส่วน​คำถาม​ว่า​จะ​แตก​เป็น​กี่ agent จริง​คือ​เรื่อง​ของ Multi-agentMulti-agentระบบ​ที่​มี agent มากกว่า​หนึ่ง​ตัว​ทำงาน​ร่วม​กัน แต่ละ​ตัว​ควร​มี Bounded Context ของ​ตัวเอง​ชัดเจน​และ​เชื่อม​กัน​ผ่าน context map/handoff ที่​ออกแบบ​ไว้ — ไม่ใช่​คำ​ตอบ​สำเร็จรูป​สำหรับ​ทุก​ปัญหา หลาย​งาน​ทำ​ด้วย agent เดียว​หรือ workflow ธรรมดา​ก็​เพียงพอ​และ​เชื่อถือ​ได้​กว่าArchitecture ใน​บท​ที่ 5 ซึ่ง​ต้อง​มี​เหตุผล​รองรับ ไม่ใช่​แตก​อัตโนมัติ​ตาม subdomain — วินัย​ของ​ทั้ง​คอร์ส​ยัง​เหมือน​เดิม: รู้​ว่า​อะไร​ควร​อยู่​ใน agent ที่​มี​ขอบเขต​ดี ตัว​เดียว ก่อน

flowchart TB
  subgraph UL["Ubiquitous Language ของ context ดูแลลูกค้า"]
    W["คำศัพท์ร่วมของทีม CX<br/>เคส · นโยบายคืนเงิน · การชดเชย · SLA"]
    R["กฎที่ทีมพูดออกมา<br/>เงินเกี่ยวข้อง = ต้องมีคนอนุมัติ"]
  end
  subgraph AG["agent Customer-Support หนึ่งตัว = bounded context หนึ่งอัน"]
    SP["System Prompt (ระดับความสูงพอดี)<br/>บทบาท + ขอบเขต + ภาษา CX + หลักตัดสินใจ<br/>เรื่องครัว/ไรเดอร์ = ส่งต่อ ไม่ใช่งานเรา"]
    TS["Tool surface (ตั้ง namespace)<br/>support.ticket · action = get / search<br/>support.reply — ไม่มี kitchen.* / rider.* ปน"]
  end
  W ==>|"ภาษาเดียวกันไหลเข้า prompt"| SP
  W ==>|"คำศัพท์กลายเป็นชื่อ tool/param"| TS
  R ==>|"กฎกลายเป็นหลักตัดสินใจ + guardrail"| SP
  classDef ul fill:#fef3c7,stroke:#b45309,color:#1a1a1f;
  classDef ag fill:#c7d2fe,stroke:#3730a3,color:#1a1a1f;
  class W,R ul;
  class SP,TS ag;

คำ​บรรยาย​ภาพ: ภาษา​ของ context “ดูแล​ลูกค้า” หนึ่ง​อัน (เหลือง) แตก​เป็น​สอง​พื้น​ผิว​ของ agent ตัว​เดียว (น้ำเงิน) — คำ​ศัพท์​ร่วม​ไหล​เข้า​ทั้ง system prompt และ​ชื่อ tool/param ส่วน​กฎ​ที่​ทีม​พูด​กลาย​เป็น​หลัก​ตัดสิน​ใจ​ใน prompt และ GuardrailGuardrailกติกา​ที่​ควบคุม​ไม่​ให้ agent ทำ​เกิน​ขอบเขต​หรือ​ก่อ​ความ​เสียหาย เช่น จำกัด tool ที่​เรียก​ได้ ตรวจ output ก่อน​ส่ง​ออก บังคับ human approval สำหรับ​การกระทำ​ที่​ย้อน​กลับ​ไม่​ได้ — เป็น​สิ่ง​ที่​รักษา​ขอบเขต​ของ Bounded Context ของ agent ให้​ไม่​ล้ำเส้นProcess สังเกต​ว่า tool surface สะอาด ไม่มี kitchen.* หรือ rider.* ปน — นั่น​คือ​เส้น​ภาษา​ของ context นี้ ไม่ใช่​คำ​สั่ง​ว่า​ต้อง​แยก agent process ออก​จาก​ตัว​อื่น​เสมอ (บาง context เริ่ม​เป็น workflow หรือ​รวม​กับ​ตัว​ข้างๆ ได้ ถ้า​ภาษา​ใกล้​กัน​พอ) และ​ย้ำ​อีก​ชั้น: ลูกศร​ทั้ง​สาม​เป็น ความ​ตั้งใจ ที่​เขียน​ลง prompt ไม่ใช่ invariant ที่​บังคับ​ใช้​แบบ atomic เหมือน aggregate — prompt สัญญา​ไม่​ได้​ว่า agent จะ​ทำ​ตาม​ทุก​ครั้ง

จบ​บท​ด้วย​คำ​เตือน​ที่​ต้อง​พูดตรงๆ เพราะ​การ​แม็ป​ข้าง​บน​แข็งแรง​จน​น่า​หลง​เชื่อ​เกิน: prompt กับ​ชื่อ tool ที่​เขียน​ดีแล้ว ก็​ยัง​เป็น​แค่ heuristic ไม่ใช่ schema เวลา​เรา​เขียน​ใน prompt ว่า “เรื่อง​ครัว​ไม่ใช่​งาน​ของ​คุณ” นั่น​เป็น ความ​ตั้งใจ ที่​เรา​ส่ง​ให้ model ไม่ใช่​กฎ​ที่​ระบบ​บังคับ​ใช้ได้​เอง มัน​ต่าง​จาก aggregate ใน DDD ตรง​นี้​ชัด​มาก: aggregate รักษา invariant แบบ atomic — code ปฏิเสธ transaction ที่​ทำให้​ยอด​ติดลบตรงๆ ไม่มี​ทาง​หลุด แต่​ขอบเขต​ที่​เขียน​ไว้​ใน prompt เป็น best-effort ยิ่ง​พอ context ถูก​บีบ​อัด (compaction) หรือ​สรุป​ย่อ​ระหว่าง Agentic LoopAgentic Loopวงจร​ที่ agent ทำซ้ำ​จนกว่า​จะ​บรรลุ​เป้าหมาย: รับ input → วางแผน/ตัดสิน​ใจ → เรียก tool → สังเกต​ผลลัพธ์ → วน​กลับ​ไป​ตัดสิน​ใจ​ใหม่ — ต่าง​จาก​โปรแกรม​ทั่วไป​ที่​รัน​เส้นทาง​เดียว​จบ วงจร​นี้​เอง​ที่​ทำให้ agent ยืดหยุ่น แต่​ก็​เสี่ยง context rot ถ้า​วน​นาน​เกิน​ไป​โดย​ไม่มี​ขอบเขตProcess ยาวๆ คำ​สั่ง​เดิม​อาจ​จาง​ลง​หรือ​ถูก​ตีความ​ใหม่​ได้

นี่​ไม่ใช่​เหตุผล​ให้​เลิก​เขียน prompt ดีๆ — แต่​เป็น​เหตุผล​ว่า​ทำไม prompt เพียง​อย่าง​เดียว​ไม่​พอ และ​ทำไม​สาม​อย่าง​ต่อ​ไป​นี้​ถึง​ต้อง​มา​เสริม: Agent MemoryAgent Memoryกลไก​ที่ agent เก็บ​ข้อมูล​ข้าม​รอบ​ของ agentic loop หรือ​ข้าม session เช่น สรุป​บทสนทนา​เก่า บันทึก​ข้อเท็จจริง​ระยะ​ยาว หรือ​ผลลัพธ์​ก่อน​หน้าที่​ต้อง​อ้างอิง​ต่อ — ออกแบบ​ให้​ดี​ต้อง​เลือก​ว่า​อะไร​ควร​เก็บ อะไร​ควร​ทิ้ง ไม่ใช่​ยัด​ประวัติ​ทั้งหมด​กลับ​เข้า context ทุก​ครั้ง​จน​เกิด context rotArchitecture ที่​เลือก​เก็บ​สิ่ง​สำคัญ​ไว้​ไม่​ให้​หาย​ตอน​บีบ​อัด context, guardrail ที่​บังคับ​กฎ​แข็งๆ นอก prompt (เช่น “ห้าม​ยิง tool คืน​เงิน​ถ้า​ไม่มี human approval” เป็น code จริง ไม่ใช่​ประโยค​ใน prompt), และ EvalEvalการ​วัดผล​อย่าง​เป็น​ระบบ​ว่า agent ทำงาน​ตรง​ตาม​ที่​ออกแบบ​ไว้​จริง​หรือ​ไม่ ด้วย​ชุด​กรณี​ทดสอบ​และ​เกณฑ์​ที่​ชัดเจน แทน​การ​ดู​จาก​ความ​รู้สึก​ว่า 'ตอบ​ดู​ดี' — จำเป็น​เพราะ agentic loop มี​ความ​ไม่​แน่นอน​สูง​กว่า code ทั่วไป ต้อง​มี eval ก่อน​เชื่อ​ว่า Bounded Context ของ agent ทำงาน​ถูกต้อง​ตาม​สัญญาProcess ที่​วัด​ว่า agent ทำ​ตาม​ขอบเขต​จริง​หรือ​ไม่ พูด​ให้​คม: ขอบเขต​ที่​เขียน​ใน prompt ยัง​เป็น​แค่​สมมติฐาน​จนกว่า eval จะ​ยืนยัน บท​ที่ 4 จะ​ลง​ลึก​เรื่อง​การ​รักษา​บริบท1 agent ด้วย​เครื่องมือ​สาม​อย่าง​นี้ พร้อม​ยอมรับ​จุด​ที่ agent ไม่ เหมือน aggregate อย่าง​ตรง​ไป​ตรง​มา


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

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

  • Ubiquitous Language — ภาษา​กลาง​ที่​ทีม​และ​ผู้เชี่ยวชาญ​ธุรกิจ​ใช้​ร่วม​กัน หัวใจ​ที่​บท​นี้​ยืม​มา​เป็น​วัตถุดิบ​ของ system prompt และ​ชื่อ tool
  • Bounded Context — ขอบเขต​ที่ model และ​ภาษา​หนึ่ง​ชุด​คง​ความหมาย​ไว้ เหตุผล​ว่า​ทำไม prompt กับ tool namespace ถึง​ต้อง​เป็น​ราย-context

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

ข้อ 1 / 3

ทำไม tool ที่ "น้อยแต่คม" ถึงดีกว่าการยกทุก endpoint ของ backend มาเป็น tool ให้ครบ?