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

Context Engineering ที่​ได้​ผล​สำหรับ AI Agents

เกี่ยว​กับ​บท​แปล​นี้

บทความ​นี้​เป็น บท​แปล​ภาษา​ไทย​อย่าง​ไม่​เป็น​ทางการ ของ “Effective context engineering for AI agents” เขียน​โดย​ทีม Applied AI ของ Anthropic — Prithvi Rajasekaran, Ethan Dixon, Carly Ryan และ Jeremy Hadfield โดย​มี Rafi Ayub, Hannah Moran, Cal Rueb และ Connor Jennings ร่วม​สมทบ

เผยแพร่​บน Anthropic Engineering เมื่อ 29 กันยายน 2025

แปล​และ​เรียบเรียง​เพื่อ​การ​ศึกษา — ไดอะแกรม​เชิง​แนวคิด​วาด​ใหม่​เป็น​ภาษา​ไทย (label ของ node คง​เป็น​ภาษา​อังกฤษ) และ​ศัพท์​เทคนิค​คง​ไว้​เป็น​ภาษา​อังกฤษ​พร้อม​คำ​อธิบาย​ไทย​เมื่อ​พบ​ครั้ง​แรก ลิขสิทธิ์​ของ​เนื้อหา​ต้นฉบับ​เป็น​ของ Anthropic

Context (บริบท — ชุด​ข้อมูล​ทั้งหมด​ที่ model เห็น​ใน​หนึ่ง​ครั้ง​ของ​การ​อนุมาน) เป็น​ทรัพยากร​ที่​สำคัญ​ยิ่ง​แต่​ก็ มี​จำกัด สำหรับ AI agent บทความ​นี้​รวบรวม​กลยุทธ์​ใน​การ ดูแล (curate) และ​จัดการ context ที่​ขับ​เคลื่อน agent ซึ่ง​สร้าง​ขึ้น​บน LLM ให้​เกิด​ประสิทธิภาพ​สูงสุด

Context engineering คือ​วิวัฒนาการ​ตาม​ธรรมชาติ​ที่​ต่อยอด​มา​จาก prompt engineering เมื่อ​เรา​ขยับ​จาก​การ​เขียน prompt แบบ​ครั้ง​เดียว​จบ ไป​สู่​การ​สร้าง agent ที่​ทำงาน​เป็น​วง​รอบ​ยาว ๆ โจทย์​ก็​เปลี่ยน​จาก “เขียน​คำ​สั่ง​ให้​ดี” ไป​เป็น “จะ​จัดสรร​พื้นที่​ใน context window อัน​จำกัด​อย่างไร​ให้​คุ้ม​ที่สุด​ใน​ทุก ๆ ก้าว”

ใน​ยุค​แรก​ของ LLM งาน​ส่วน​ใหญ่​ของ​วิศวกร AI คือ prompt engineering เพราะ use case ส่วน​ใหญ่​ที่​ไม่ใช่​การ​แชต​ใน​ชีวิต​ประจำ​วัน มัก​เป็น​งาน​แบบ single-shot (ทำ​ครั้ง​เดียว​จบ) เช่น การ​จัด​หมวด​หมู่ (classification) หรือ​การ​สร้าง​ข้อความ (text generation)

หัวใจ​จึง​อยู่​ที่​การ​เลือก​ถ้อยคำ​และ​วิธี​เรียบเรียง​คำ​สั่ง​ให้​ได้​ผลลัพธ์​ที่​ต้องการ

แต่​เมื่อ​เรา​สร้าง agent ที่​ทำงาน​ต่อ​เนื่อง​เป็น​วง​รอบ โจทย์​ก็​ใหญ่​กว่า​ตัว prompt มาก agent ทำงาน​เป็น​วง​รอบ และ​ใน​แต่ละ​รอบ​มัน​สร้าง​ข้อมูล​ใหม่ ๆ ที่ อาจ​จะ มี​ความ​เกี่ยวข้อง​ขึ้น​มา​เรื่อย ๆ ข้อมูล​เหล่า​นี้​ต้อง​ถูก​กลั่นกรอง​ซ้ำ​เป็น​วงจร

คำถาม​หลัก​จึง​ไม่ใช่​แค่ “prompt ควร​เขียน​ว่า​อะไร” แต่​เป็น “อะไร​บ้าง​ที่​ควร​อยู่​ใน context ของ model ณ จุด​นี้”

นิยาม​ที่​ใช้​ใน​บทความ​นี้
  • Prompt engineering หมาย​ถึง​วิธีการ​เขียน​และ​จัด​ระเบียบ​คำ​สั่ง​ของ LLM เพื่อ​ให้​ได้​ผลลัพธ์​ที่​ดี​ที่สุด
  • Context engineering หมาย​ถึง ชุด​ของ​กลยุทธ์​ใน​การ​ดูแล​และ​รักษา​ชุด token (ข้อมูล) ที่​เหมาะสม​ที่สุด​ตลอด​การ​อนุมาน​ของ LLM ซึ่ง​ครอบคลุม​ข้อมูล ทุก​อย่าง ที่​อาจ​ไหล​เข้า​มา​ใน context นอกเหนือ​จาก​ตัว prompt ด้วย
  • Agent ใน​บทความ​นี้​หมาย​ถึง LLM ที่​ใช้ tool อย่าง​อิสระ​แบบวน​เป็น​วง​รอบ (LLMs autonomously using tools in a loop)

พูด​อีก​อย่าง prompt engineering เป็น​เพียง ส่วน​ย่อย​หนึ่ง ของ context engineering เพราะ​การ​เขียน system prompt ก็​คือ​ส่วน​หนึ่ง​ของ​งาน​ดูแล context ส่วน context engineering เอง​เป็น​ภาพ​ที่​กว้าง​กว่า — มัน​คือ​การกลั่นกรอง​อย่าง​ซ้ำ ๆ (iterative refinement) ว่า​จะ​ให้​อะไร​อยู่​ใน context ใน​แต่ละ​ก้าว​ของ​การ​ทำงาน

context ที่ agent ต้อง​บริหาร​ประกอบ​ด้วย​หลาย​ส่วน

  • system prompt
  • tools
  • Model Context Protocol (MCP — โพรโทคอลมาตรฐาน​สำหรับ​เชื่อม agent เข้า​กับ​ข้อมูล/เครื่องมือ​ภายนอก)
  • ตัวอย่าง (examples)
  • ประวัติ​ข้อความ (message history)
  • file ความ​จำ (memory files)
  • ข้อมูล​ที่​ดึง​มา (retrieved data)
  • state ระหว่าง​รัน

ทั้งหมด​นี้​ต้อง​หลอม​รวม​กัน​ภายใน context window ที่​มี​ขนาด​จำกัด

flowchart LR
  SP[System Prompt]
  TL[Tools]
  MCP[Model Context Protocol]
  EX[Examples]
  MH[Message History]
  MEM[Memory Files]
  RD[Retrieved Data]
  RS[Runtime State]
  CW[Context Window]
  SP --> CW
  TL --> CW
  MCP --> CW
  EX --> CW
  MH --> CW
  MEM --> CW
  RD --> CW
  RS --> CW
  CW --> LLM[LLM Inference]

ภาพ 1 — context ไม่​ได้​มี​แค่ prompt แต่​เป็น​ทุก​แหล่ง​ข้อมูล​ที่​ไหล​มา​รวม​กัน​ใน context window เดียวกัน​ก่อน​ถึง​การ​อนุมาน​ของ model งาน​ของ context engineering คือ​การ​เลือก​ว่า​จะ​ให้​อะไร​เข้า​มา​บ้าง

เพราะ agent สร้าง​ข้อมูล​เพิ่ม​ขึ้น​เรื่อย ๆ ใน​ทุกรอบ งาน​จึง​กลาย​เป็น​วงจร​ของ​การกลั่นกรอง: ดูแล​ชุด token ที่​มี​สัญญาณ​สูงสุด → ให้ model อนุมาน → agent เรียก​ใช้ tool → มี​ข้อมูล​ใหม่​ไหล​เข้า context → ตัด​แต่ง/กลั่นกรอง context ใหม่ แล้ว​วน​กลับ​ไป​เริ่ม​รอบ​ถัด​ไป

flowchart LR
  Curate[Curate high signal tokens] --> Infer[LLM generates response]
  Infer --> Act[Agent calls tools]
  Act --> Grow[New data enters context]
  Grow --> Refine[Refine and prune context]
  Refine --> Curate

ภาพ 2 — วงจร​ของ context engineering: ใน​ทุก​ก้าว​เรา​ต้อง​กลั่นกรอง​ว่า​จะ​เก็บ​อะไร​และ​ตัด​อะไร​ทิ้ง context จึง​ไม่ใช่​สิ่ง​ที่​ตั้ง​ไว้​ครั้ง​เดียว​จบ แต่​ต้อง​ดูแล​อย่าง​ต่อ​เนื่อง

แม้ context window จะ​ใหญ่​ขึ้น​เรื่อย ๆ แต่ LLM ก็​ยัง​มี “งบ​ความ​สนใจ” (attention budget) ที่​จำกัด และ​จะ​ร่อยหรอ​ลง​เมื่อ​ประมวล​ผล token มาก​ขึ้น​เรื่อย ๆ

ปรากฏการณ์​นี้​มัก​ถูก​เรียก​ว่า context rot (ภาวะ​ที่​คุณภาพ​การ​เรียกคืน​ข้อมูล​ของ model เสื่อม​ลง​เมื่อ context ยาว​ขึ้น) คือ​ยิ่ง​จำนวน token ใน context เพิ่ม​ขึ้น ความ​สามารถ​ของ model ใน​การ​เรียกคืน​ข้อมูล​ได้​อย่าง​แม่นยำ​ก็​ยิ่ง​ลด​ลง

ราก​ของ​ปัญหา​นี้​อยู่​ที่​สถาปัตยกรรม​ของ transformer เอง ใน​กลไก attention ทุก token จะ​ต้อง​พิจารณา​ความ​สัมพันธ์​กับ​ทุก ๆ token อื่น หมายความ​ว่า​สำหรับ n token เรา​จะ​มี​คู่​ความ​สัมพันธ์​ราว n² คู่ เมื่อ context ยาว​ขึ้น ความ​สามารถ​ของ model ใน​การ​เก็บ​ความ​สัมพันธ์​เหล่า​นี้​ก็​ถูก​ยืด​จน​บาง​ลง

ยิ่ง​ไป​กว่า​นั้น model ถูก​ฝึก​จาก​ข้อมูล​ที่​เป็น​ลำดับ​สั้น ๆ เสีย​เป็น​ส่วน​ใหญ่ มัน​จึง​มี​ประสบการณ์​กับ long-range dependency (ความ​สัมพันธ์​ระหว่าง token ที่​อยู่​ห่าง​กัน​มาก) น้อย​กว่า

และ​เทคนิค​อย่าง​การ interpolate ตำแหน่ง (positional encoding) เพื่อ​ยืด​หน้าต่าง​ให้​ยาว​ขึ้น​ก็​แลก​มา​ด้วย​ความ​แม่นยำ​ที่​ลด​ลง​บ้าง

บทเรียน​สำคัญ​คือ ควร​มอง context เป็น ทรัพยากร​ที่​มี​จำกัด​และ​มี​ผล​ตอบแทน​ส่วน​เพิ่ม​ที่​ลด​ลง (diminishing marginal returns) เปรียบ​ได้​กับ working memory ที่​จำกัด​ของ​มนุษย์ ทุก ๆ token ที่​ใส่​เข้าไป​ล้วน​ดึง​งบ​ความ​สนใจ​ของ model ออก​ไป​บาง​ส่วน ดังนั้น​เรา​จึง​ต้อง​ประหยัด

เป้าหมาย​ของ context engineering

ค้นหา ชุด token ที่​มี​สัญญาณ​สูงสุด (high-signal) ที่​เล็ก​ที่สุด​เท่า​ที่​จะ​เป็น​ไป​ได้ ซึ่ง​เพิ่ม​โอกาส​ให้​เกิด​ผลลัพธ์​ที่​ต้องการ​มาก​ที่สุด — ไม่ใช่​การ​ยัด​ทุก​อย่าง​ที่​อาจ​เกี่ยวข้อง​เข้าไป​ให้​มาก​ที่สุด

เมื่อ​ยึด​หลัก “น้อย​แต่​มี​สัญญาณ​สูง” แล้ว มา​ดู​ว่า​องค์​ประกอบ​แต่ละ​ส่วน​ของ context ควร​ออกแบบ​อย่างไร

System prompt ควร​ชัดเจน​อย่าง​ที่สุด ใช้​ภาษา​ที่​เรียบ​ง่าย​และ​ตรง​ไป​ตรง​มา และ​อยู่​ที่ “ระดับ​ความ​สูง​ที่​พอเหมาะ” (the right altitude) ซึ่ง​เป็น​จุด​สมดุล​ระหว่าง​สอง​ความ​ล้มเหลว​ที่​พบ​บ่อย:

  • สูง​เกิน​ไป (vague): ให้​คำ​แนะนำ​กว้าง ๆ ระดับ​นามธรรม​จน​ไม่มี​สัญญาณ​ที่​จับ​ต้อง​ได้ สมมติ​เอา​ว่า model “เข้าใจ​กัน​อยู่​แล้ว” ทั้ง​ที่​จริง​มัน​ไม่มี context ร่วม​นั้น
  • ต่ำ​เกิน​ไป (brittle): ฮาร์ด code ตรรกะ if-else ที่​ซับซ้อน​และ​เปราะ พยายาม​ระบุ​พฤติกรรม​ที่​ต้องการ​แบบ​เป๊ะ ๆ สำหรับ​ทุก​สถานการณ์ ผล​คือ​ดูแล​ยาก​ขึ้น​เรื่อย ๆ และ​แตกหัก​ง่าย​เมื่อ​เจอ​กรณี​ที่​ไม่​ได้​เตรียม​ไว้

จุด​ที่​เหมาะสมอยู่​ตรง​กลาง คือ เจาะจง​พอที่​จะ​ชี้นำ​พฤติกรรม​ได้ แต่​ยืดหยุ่น​พอที่​จะ​ให้ heuristic (แนวทาง​ตัดสิน​ใจ) ที่​แข็งแรง​แก่ model แทนที่​จะ​สั่ง​ทุก​ฝี​ก้าว

flowchart LR
  Vague["Too high - vague, overly general"] --- Right["Right altitude - Goldilocks zone"] --- Brittle["Too low - brittle if-else"]

ภาพ 3 — spec ต​รัม​ของ system prompt: ปลาย​ด้าน​หนึ่ง​คือ prompt ที่ ต่ำ​เกิน​ไป (brittle) ฮาร์ด code if-else จน​เปราะ อีก​ด้าน​คือ prompt ที่ สูง​เกิน​ไป (vague) กว้าง​และ​นามธรรม​จน​ถือ​เอา​ว่า model มี context ร่วม​กัน​อยู่​แล้ว ทั้ง​ที่​ไม่มี ระดับ​ที่​พอเหมาะ (Goldilocks / the right altitude) อยู่​ตรง​กลาง

เชิง​โครงสร้าง แนะนำ​ให้​แบ่ง system prompt ออก​เป็น​ส่วน ๆ อย่าง​ชัดเจน เช่น ข้อมูล​พื้น​หลัง (background), คำ​สั่ง (instructions), แนวทางการ​ใช้ tool และ​รูปแบบ​ผลลัพธ์ (output description) โดย​ใช้ XML tag หรือ​หัวข้อ Markdown ช่วย​จัด​ระเบียบ

อย่างไร​ก็ตาม เมื่อ model เก่ง​ขึ้น รูปแบบ​การ​จัด​วาง​ที่​เป๊ะ ๆ ก็​สำคัญ​น้อย​ลง หัวใจ​ที่แท้​จริง​คือ ความ​ชัดเจน

หลักการ​คือ​มุ่ง​หา ชุด​ข้อมูล​ที่​น้อย​ที่สุด​ที่​ยัง​อธิบาย​พฤติกรรม​ที่​คาด​หวัง​ได้​ครบถ้วน (“น้อย​ที่สุด” ไม่​ได้​แปล​ว่า “สั้น” — เรา​ยัง​ต้อง​ให้​ข้อมูล​เบื้องต้น​ที่​จำเป็น​ครบ) วิธี​ที่​ดี​คือ​เริ่ม​จาก​ขั้น​ต่ำ​สุด แล้ว​ค่อย ๆ เติม​คำ​สั่ง​หรือ​ตัวอย่าง​เข้าไป​ตาม​รูปแบบ​ความ​ล้มเหลว (failure modes) ที่​เจอ​จริง

Tools คือ​ช่อง​ทาง​ที่ agent ใช้​ปฏิสัมพันธ์​กับ​สภาพ​แวดล้อม​และ ดึง context ใหม่ เข้า​มา tool ที่​ดี​จึง​ควร:

  • Self-contained — ทำงาน​ได้​ครบ​ใน​ตัวเอง
  • ทน​ต่อ​ข้อ​ผิดพลาด (robust to error) — จัดการ​กรณี​ผิดพลาด​ได้​อย่าง​มี​เหตุผล
  • ชัดเจน​ที่สุด​ว่า​ใช้​ทำ​อะไร — มีชื่อ​และ parameter ที่​สื่อ​ความหมาย

ปัญหา​ที่​พบ​บ่อย​คือ​ชุด tool ที่ บวม (bloated) และ​มีหน้าที่​ทับซ้อน​กัน จน​แม้แต่​มนุษย์​ก็​ตอบ​ไม่​ได้​ว่า​ควร​ใช้​ตัว​ไหน​ใน​สถานการณ์​หนึ่ง ๆ ถ้า​วิศวกร​ที่​เป็น​คน​ยัง​เลือก​ไม่​ถูก ก็​อย่า​หวัง​ว่า AI agent จะ​เลือก​ถูก

กฎ​ง่าย ๆ เรื่อง tools

ถ้า​วิศวกร​ที่​เป็น​มนุษย์​ยัง​บอก​ไม่​ได้​อย่าง​ชัดเจน​ว่า​ควร​ใช้ tool ไหน​ใน​กรณี​หนึ่ง ๆ AI agent ก็​จะ​บอก​ไม่​ได้​เช่น​กัน จง​คง​ไว้​เพียง ชุด tool ขั้น​ต่ำ​ที่​ใช้งาน​ได้​จริง (minimal viable set) ที่​หน้าที่​ไม่​ทับซ้อน​กัน​และ​กำกวม​น้อย​ที่สุด ซึ่ง​จะ​ช่วย​ให้​ทั้ง​ดูแล​รักษา​ง่าย​และ agent ตัดสิน​ใจ​ถูก​ขึ้น​ด้วย

การ​ให้​ตัวอย่าง (examples) หรือ few-shot prompting ยัง​เป็น​แนว​ปฏิบัติ​ที่​ดี​เสมอ แต่​ข้อ​ควร​ระวัง​คือ อย่า​ยัด​รายการ edge case ยาวเหยียด​ลง​ไป​ใน prompt เพราะ​จะ​กลาย​เป็น​สัญญาณ​รบกวน​เสีย​เอง

แทนที่​จะ​ทำ​อย่าง​นั้น ให้ คัดเลือก​ตัวอย่าง​ที่​หลากหลาย​และ​เป็น​แบบฉบับ (canonical) จำนวน​หนึ่ง​ที่​สื่อ​พฤติกรรม​ที่​คาด​หวัง​ได้​อย่าง​มี​ประสิทธิภาพ สำหรับ LLM แล้ว ตัวอย่าง​ที่​ดี​หนึ่ง​ตัวอย่าง​มี​ค่า​เท่ากับ​คำ​อธิบาย​นับ​พัน​คำ

โดย​รวม ทั้ง system prompt, tools และ examples ล้วน​ยึด​หลัก​เดียวกัน คือ​มุ่ง​ไป​ที่ ชุด​ที่​น้อย​ที่สุด​แต่​มี​สัญญาณ​สูงสุด

แนวทาง​ดั้งเดิม​ใน​การเตรียม context คือ​การ ดึง​ข้อมูล​ที่​เกี่ยวข้อง​ล่วงหน้า (pre-retrieval) ก่อน​การ​อนุมาน โดย​มาก​ใช้​การ​ค้น​ด้วย embedding แบบ RAG (Retrieval-Augmented Generation — ดึง​เอกสาร​ที่​ใกล้​เคียง​มา​เสริม prompt) แล้ว​ยัด​ข้อมูล​เหล่า​นั้น​เข้า context ตั้งแต่​ต้น

แต่​กำลัง​มี​การ​ขยับ​ไป​สู่​กลยุทธ์​แบบ “just in time” (ดึง​เมื่อ​ถึง​เวลา​ต้อง​ใช้) แทนที่​จะ​ประมวล​ผล​ข้อมูล​ที่​เกี่ยวข้อง​ทั้งหมด​ไว้​ล่วงหน้า

agent จะ​เก็บ​เพียง ข้อมูล​อ้างอิง​แบบ​เบา (lightweight identifiers) เช่น path ของ file คิว​รี​ที่​บันทึก​ไว้ หรือ link แล้ว​ค่อย ๆ โหลด​ข้อมูล​เข้า context ตอน runtime ด้วย tool เมื่อ​จำเป็น​จริง ๆ

นอกจาก​นี้ agent ยัง​เขียน​คิว​รี​แบบ​เจาะจง เก็บ​ผลลัพธ์​ไว้ และ​ใช้​คำ​สั่ง Bash อย่าง head และ tail เพื่อ​ตรวจ​ดู​ข้อมูล​ปริมาณ​มาก​เป็น​บาง​ส่วน โดย​ไม่​ต้อง​โหลด​ข้อมูล​ทั้ง​ก้อน​เข้า context ได้​ด้วย

แนวคิด​นี้​เลียน​แบบ​การ​รับรู้​ของ​มนุษย์ เรา​ไม่​ได้​ท่องจำ​ทุก​อย่าง แต่​พึ่งพา​ระบบ​จัด​ระเบียบ​ภายนอก เช่น ระบบ file บุ๊กมาร์ก หรือ​ดัชนี แล้ว​ค่อย​ไป​เปิด​หา​เมื่อ​ต้อง​ใช้

ที่​สำคัญ​คือ metadata (ข้อมูล​กำกับ file) ก็​เป็น​สัญญาณ: file ชื่อ test_utils ใน folder tests ให้​ความหมาย​ต่าง​จาก file ชื่อ​เดียวกัน​ใน folder src/core_logic โครงสร้าง folder ธรรมเนียม​การ​ตั้ง​ชื่อ และ timestamp ล้วน​บอกใบ้​ถึง​ความ​เกี่ยวข้อง​และ​วิธี​ใช้งาน

จุด​แข็ง​ของ​แนวทาง​นี้​คือ progressive disclosure (การ​เปิดเผย​ที​ละ​ขั้น) — agent ค่อย ๆ ค้น​พบ context ที่​เกี่ยวข้อง​ผ่าน​การ​สำรวจ แต่ละ​ปฏิสัมพันธ์​ให้​ข้อมูล​ที่​ช่วย​ชี้​ก้าว​ถัด​ไป และ​เก็บ​ไว้​ใน working memory เพียง​เท่า​ที่​จำเป็น​ใน​ขณะ​นั้น

flowchart TB
  Choice{How to prepare context}
  subgraph Pre[Pre Retrieval RAG]
    P1[Index all data ahead of time]
    P2[Embed and retrieve relevant chunks]
    P3[Load everything into context before inference]
    P1 --> P2 --> P3
  end
  subgraph JIT[Just in Time]
    J1[Keep lightweight identifiers]
    J2[Agent explores at runtime]
    J3[Load only what is needed now]
    J1 --> J2 --> J3
  end
  Choice --> P1
  Choice --> J1

ภาพ 4 — สอง​แนวทาง​เตรียม context: pre-retrieval ดึง​และ​ยัด​ทุก​อย่าง​ไว้​ก่อน​อนุมาน ส่วน just-in-time เก็บ​แค่​ตัว​ชี้​แล้ว​ให้ agent สำรวจ​และ​โหลด​เฉพาะ​สิ่ง​ที่​ต้อง​ใช้​ใน​ขณะ​นั้น

แน่นอน​ว่า​แนวทาง just-in-time มี ข้อ​แลกเปลี่ยน: การ​สำรวจ​ตอน runtime ช้า​กว่า​การ​ดึง​ข้อมูล​ที่​คำนวณ​ไว้​ล่วงหน้า และ​ต้อง​ออกแบบ tool อย่าง​พิถีพิถัน หาก​ไม่มี​แนวทาง​กำกับ​ที่​ดี agent อาจ​ใช้ tool ผิด หลง​ทาง หรือ​ถูก​ดึง​ความ​สนใจ​ออก​นอก​เรื่อง​ได้

ใน​ทาง​ปฏิบัติ ทางออก​ที่​ดี​มัก​เป็น hybrid — ดึง​ข้อมูล​บาง​ส่วน​ไว้​ล่วงหน้า​เพื่อ​ความเร็ว ผสม​กับ​การ​สำรวจ​แบบ just-in-time

ตัวอย่าง​เช่น Claude Code จะ​ดึง file อย่าง CLAUDE.md ขึ้น​มา​ไว้​ล่วงหน้า ขณะ​เดียวกัน​ก็​ใช้ primitive (คำ​สั่ง​พื้นฐาน) อย่าง glob และ grep เพื่อ​ค้นหา​และ​ดึง​ข้อมูล​แบบ just-in-time ได้​ตลอด ทำให้​ไม่​ต้อง​พึ่ง​ดัชนี​หรือ syntax tree ที่​อาจ​เก่า​เก็บ​และ​ตก​ยุค

การ​ออกแบบ​ที่​เหมาะสม​ขึ้น​อยู่​กับ​งาน — งาน​สาย​กฎหมาย​หรือ​การเงิน​ที่​ต้องการ​ความ​ครบถ้วน​และ​เร็ว อาจ​ได้​ประโยชน์​จาก​การ​ดึง​ข้อมูล​ไว้​ล่วงหน้า​มากกว่า

งาน​ระยะ​ยาว​ที่​กิน​เวลา​นาน​หลาย​นาที​จนถึง​หลาย​ชั่วโมง — เช่น การ migrate codebase ขนาด​ใหญ่ หรือ project วิจัย​ที่​ครอบคลุม​กว้าง — ต้องการ​เทคนิค​พิเศษ เพราะ​เมื่อ​เวลา​ผ่าน​ไป ปริมาณ​ข้อมูล​จะ ล้น​เกิน context window ที่​มี​อยู่ ต่อ​ไป​นี้​คือ​สาม​เทคนิค​หลัก​ใน​การ​รักษา​ความ​ต่อ​เนื่อง​ข้าม​ขอบเขต​ของ context window

Compaction คือ​การ​สรุป​เนื้อหา​ของ context window ที่​กำลัง​จะ​เต็ม แล้ว เริ่ม context window ใหม่​ด้วย​บท​สรุป​นั้น เป็น​กลไก​หลัก​ที่​ช่วย​ให้​บทสนทนา​ดำเนิน​ต่อ​ได้​ยาว​โดย​ไม่​ชน​เพดาน

ยก​ตัวอย่าง​ใน Claude Code เรา​จะ​ส่ง​ประวัติ​ข้อความ​ให้ model สรุป​และ​บีบ​อัด​รายละเอียด​ที่​สำคัญ​ที่สุด​เอา​ไว้ เช่น การ​ตัดสิน​ใจ​เชิง​สถาปัตยกรรม (architectural decisions) bug ที่​ยัง​แก้​ไม่​เสร็จ และ​รายละเอียด​การ implement จาก​นั้น​จึง​เริ่ม​ต่อ​ด้วย context ใหม่​พร้อม file ที่​เพิ่ง​เข้าถึง​ล่าสุด

ศิลปะ​ของ compaction อยู่​ที่ การ​เลือก​ว่า​จะ​เก็บ​อะไร​และ​ทิ้ง​อะไร เพราะ​การ​บีบ​อัด​ที่​ก้าวร้าว​เกิน​ไป​อาจ​ทำให้​สูญเสีย context ที่​ดู​เล็กน้อย​แต่​วิกฤต ซึ่ง​ความ​สำคัญ​ของ​มัน​จะ​เพิ่ง​มา​ชัด​ใน​ภายหลัง

คำ​แนะนำ​ใน​การ​ปรับ​จูน prompt ของ compaction คือ เพิ่ม recall ก่อน (ให้​จับ​ทุก​ชิ้น​ส่วน​ที่​เกี่ยวข้อง​ไว้​ให้​ครบ) แล้ว​จึง​ค่อย ปรับ precision (ตัด​เนื้อหา​ที่​ซ้ำซ้อน​หรือ​เกิน​จำเป็น​ออก)

รูปแบบ​ที่​ปลอดภัย​ที่สุด​ของ compaction คือ​การ ล้าง​ผลลัพธ์​ของ tool (tool result) และ​การ​เรียก tool เก่า ๆ ที่​ไม่​จำเป็น​แล้ว​ออก เพราะ​เนื้อหา​เหล่า​นั้น​มัก​ไม่​ได้​ให้​สัญญาณ​อะไร​อีก​ต่อ​ไป เทคนิค​นี้​เพิ่ง​เปิด​ตัว​เป็น feature บน Claude Developer Platform

flowchart LR
  A[Context window near limit]
  B[Summarize critical details]
  C[Discard stale tool results]
  D[Reinitiate fresh context window]
  E[Continue the task]
  A --> B --> C --> D --> E

ภาพ 5 — compaction: เมื่อ context ใกล้​เต็ม ให้​สรุป​รายละเอียด​สำคัญ ทิ้ง​ผลลัพธ์ tool ที่​ตก​ยุค แล้ว​เปิด context window ใหม่​เพื่อ​ทำงาน​ต่อ​โดย​ไม่​ขาด​ช่วง

Structured note-taking หรือ agentic memory คือ​การ​ให้ agent เขียน​บันทึก​อย่าง​สม่ำเสมอ​ลง​ใน​หน่วย​ความ​จำ​ที่​คง​อยู่ นอก context window แล้ว​ดึง​กลับ​เข้า​มา​ใช้​ใน​ภายหลัง เทคนิค​นี้​ให้ ความ​จำ​ที่​คงทน (persistent memory) โดย​มี overhead ต่ำ

ด้วย​โครงสร้าง​เรียบ​ง่าย​อย่าง to-do list หรือ file NOTES.md เพียง file เดียว agent ก็​สามารถ​ติดตาม​ความ​คืบ​หน้า​และ​รักษา context ข้าม​หลาย​สิบ​ก้าว​ได้

ตัวอย่าง​ที่​เห็น​ภาพ​ชัด​คือ Claude เล่น​เกม Pokémon ที่​ต้อง​เก็บ​ตัว​นับ​สะสม (tally) ต่าง ๆ และ​แผนที่​ความ​คืบ​หน้า​เอา​ไว้ เช่น ใน​ช่วง 1,234 ก้าว​ที่​ผ่าน​มา Claude ฝึก Pikachu อยู่​ที่ Route 1 จน​ได้​เลเวล​เพิ่ม​ขึ้น 8 เลเวล​จาก​เป้าหมาย 10 เลเวล และ​ยัง​ติดตาม​สถานะ​เหล่า​นี้​ได้​แม้ context จะ​ถูกรีเซ็ต​ไป​แล้ว

บน Claude Developer Platform ความ​สามารถ​นี้​เปิด​ตัว​เป็น public beta พร้อม​กับ​การ​เปิด​ตัว Sonnet 4.5 ผ่าน memory tool ที่​ใช้​วิธี​จัด​เก็บ​แบบ​อิง file (file-based) เพื่อ​ให้​บันทึก​เหล่า​นี้​อยู่คงทน​และ​เรียก​กลับ​มา​ได้

แทนที่​จะ​ให้ agent ตัว​เดียว​พยายาม​แบก state ของ​ทั้ง project ไว้​ทั้งหมด เรา​สามารถ​ให้ specialized sub-agents รับผิดชอบ​งาน​เฉพาะ​จุด โดย​แต่ละ​ตัว​มี context window ที่​สะอาด เป็น​ของ​ตัวเอง

กลไก​คือ agent หลัก (lead / orchestrator) ถือ​แผน​ระดับ​สูง​และ​คอย​ประสาน​งาน ส่วน sub-agent แต่ละ​ตัว​ลง​ลึก​ทำงาน​เชิง​เทคนิค​หรือ​ใช้ tool ค้นหา​ข้อมูล​อย่าง​เข้มข้น

แต่ละ sub-agent อาจ​ใช้ token นับ​หมื่น​ใน​การ​สำรวจ ทว่า คืน​กลับ​มา​ให้ agent หลัก​เพียง​บท​สรุป​ที่​กลั่น​แล้ว​อย่าง​กระชับ (ราว 1,000 ถึง 2,000 token) ของ​งาน​ที่​ทำ

ผล​คือ การ​แยก​ความ​รับผิดชอบ (separation of concerns) อย่าง​ชัดเจน — รายละเอียด​ของ​การ​ค้นหา​ถูก​กัก​ไว้​ภายใน sub-agent ส่วน agent หลัก​โฟกัส​ที่​การ​สังเคราะห์​และ​วิเคราะห์​ภาพ​รวม

งาน​วิจัย​เรื่อง “How we built our multi-agent research system” ของ Anthropic แสดง​ให้​เห็น​ว่า​สถาปัตยกรรม​แบบ​นี้​ให้​ผล​ดี​ขึ้น​อย่าง​มี​นัย​สำคัญ​เมื่อ​เทียบ​กับ agent เดี่ยว​ใน​งาน​วิจัย​ที่​ซับซ้อน

flowchart TB
  Lead[Lead Agent keeps high level plan]
  S1[Subagent A focused work]
  S2[Subagent B focused work]
  S3[Subagent C focused work]
  R1[Condensed summary]
  R2[Condensed summary]
  R3[Condensed summary]
  Synth[Lead synthesizes results]
  Lead --> S1
  Lead --> S2
  Lead --> S3
  S1 --> R1
  S2 --> R2
  S3 --> R3
  R1 --> Synth
  R2 --> Synth
  R3 --> Synth

ภาพ 6 — สถาปัตยกรรม sub-agent: agent หลัก​ถือ​แผน​ระดับ​สูง กระจาย​งาน​ให้ sub-agent ที่​มี context สะอาด​ของ​ตัวเอง​ไป​สำรวจ​เชิง​ลึก แล้ว​รับ​กลับ​มา​เพียง​บท​สรุป​ที่​กลั่น​แล้ว​เพื่อ​นำ​มา​สังเคราะห์

การ​เลือก​ขึ้น​อยู่​กับ​ลักษณะ​ของ​งาน:

  • Compaction เหมาะ​กับ​งาน​ที่​ต้องการ​ความ​ต่อ​เนื่อง​ของ​บทสนทนา​แบบ​ไป​กลับ (back-and-forth)
  • Structured note-taking เหมาะ​กับ​งาน​พัฒนา​แบบวน​ซ้ำ​ที่​มี​หมุด​หมาย (milestones) ชัดเจน
  • Sub-agent architectures เหมาะ​กับ​งาน​ที่​ต้อง​สำรวจ​หลาย​ทิศทาง​แบบ​ขนาน (parallel exploration)

Context engineering คือ การ​เปลี่ยนแปลง​เชิง​หลักการ ใน​วิธี​ที่​เรา​สร้าง​ระบบ​ด้วย LLM เมื่อ model เก่ง​ขึ้น ความ​ท้าทาย​ก็​ไม่​ได้​อยู่​ที่​การ​เค้น​เขียน prompt ที่​สมบูรณ์​แบบ​เพียง​อย่าง​เดียว​อีก​ต่อ​ไป แต่​อยู่​ที่ การ​ดูแล​อย่าง​พิถีพิถัน​ว่า​จะ​ให้​ข้อมูล​ใด​เข้า​สู่​งบ​ความ​สนใจ​อัน​จำกัด​ของ model ใน​แต่ละ​ก้าว

ไม่​ว่า​จะ​ผ่าน compaction, structured note-taking, sub-agent หรือ​การ​ดึง​ข้อมูล​แบบ just-in-time หลักการ​เบื้องหลัง​ล้วน​เป็น​หนึ่ง​เดียวกัน นั่น​คือ ค้นหา​ชุด token ที่​มี​สัญญาณ​สูงสุด​ที่​เล็ก​ที่สุด​เท่า​ที่​จะ​เป็น​ไป​ได้

เทคนิค​เฉพาะ​จะ​เปลี่ยน​ไป​ตาม​ความ​ก้าวหน้า​ของ model แต่​แม้ model จะ​ฉลาด​ขึ้น​และ​ทำงาน​ได้​อิสระ​มาก​ขึ้น​เพียง​ใด การ​มอง context เป็น​ทรัพยากร​ที่​มี​จำกัด จะ​ยัง​คง​เป็น​แก่น​กลาง​ของ​การ​สร้าง agent ที่​เก่ง​และ​เชื่อถือ​ได้​เสมอ

อ่าน​ต่อ​ใน​ไซต์​นี้

หัวข้อ​นี้​เชื่อม​โยง​กับ​บทความ​อื่น​ใน​หมวด​บทความ เช่น ทำความ​เข้าใจ Spec-Driven Development และ Structured-Prompt-Driven Development (SPDD) ที่​ว่าด้วย​การ​จัดการ context และ prompt ให้​เป็น​ชิ้น​งาน​ชั้น​หนึ่ง​ของ​กระบวนการ​พัฒนา

และ​เชื่อม​โยง​กับ​หลักการ​ออกแบบอย่าง KISS, YAGNI และ Separation of Concerns ที่​สะท้อน​แนวคิด “น้อย​แต่​มี​สัญญาณ​สูง” ใน​บริบท​ของ code


📄 อ่าน​ต้นฉบับ​ภาษา​อังกฤษ: Effective context engineering for AI agents — ทีม Applied AI ของ Anthropic, Anthropic Engineering (29 กันยายน 2025)