บทที่ 06 · ประกอบ Harness · Memory & State

Memory & State

ถามต่อว่า “…แล้วพรุ่งนี้ล่ะ?” แล้วผู้ช่วยทำหน้างง — เพราะ LLM ไม่มีความจำ มันอ่าน context window ก้อนเดียวต่อหนึ่งครั้ง จบแล้วลืม บทนี้แยกให้ชัดระหว่างสามสิ่งที่คนมักรวมเป็น “สมองที่จำได้”: context window (เห็นรอบนี้), compaction (ย่อแล้วล้างเมื่อเต็ม), และ external memory (จดไว้นอก window ให้อยู่ข้ามเซสชัน)

พูดแบบเข้าใจง่าย

LLM ไม่มี state ข้ามการเรียก — “ความจำ” เดียวของมันคือข้อความที่อัดอยู่ใน context window ของ รอบนั้น window มีขนาดจำกัด พอ agent ทำงานยาว ๆ มันก็เต็ม

ทักษะของวิศวกรคือ ตัดสินทีละข้อว่าอันไหน “ชั่วคราว” (ปล่อยให้หายได้) อันไหน “ต้องคงอยู่” (จดลง external memory) กับดักคลาสสิก: เก็บแค่ ตัวชี้ (pointer) ของเซสชันไว้ ไม่ใช่ เนื้อหา ของบทสนทนา

เปรียบเทียบ: ไวต์บอร์ดในที่ประชุม + Google Doc ของเลขาฯ ไวต์บอร์ดใหญ่แต่มีขอบเขต พอเต็มก็ลบแล้วเขียนสรุป 5 บรรทัดไว้บนหัว — อะไรที่ไม่อยู่ใน 5 บรรทัดนั้น หายเกลี้ยง (compaction) ส่วน Doc ที่เลขาฯ พิมพ์เก็บไว้ อยู่รอดทุกการลบ เพราะมันอยู่นอกบอร์ด (external memory) และการลบเอกสารแจกที่จดเลขสำคัญไปแล้วออกจากบอร์ด = context editing ระวัง: จดแค่ “เลขห้องประชุม” (pointer) ไม่เท่ากับก๊อปเนื้อหาการประชุมลง Doc

ในระบบของเรา — แหล่งความจริงอยู่นอก context

ระบบของเราออกแบบให้ ฐานข้อมูล (Postgres) เป็นแหล่งความจริง ผู้ช่วยจึงไม่ต้อง “จำ” ค่าการจองหรือข้อมูลนักศึกษาไว้ในบทสนทนา — มัน ดึงใหม่จากระบบทุกครั้งที่ต้องใช้ ดังนั้น compaction จะดุแค่ไหนก็ได้ ความจริงไม่หาย เพราะความจริงไม่เคยถูกเก็บไว้ในบทสนทนาตั้งแต่แรก

รอบยาว ๆwindow เริ่มเต็ม
Compactionย่อบทสนทนาเก่า ทิ้งรายละเอียดดิบ
ดึงใหม่ค่าการจอง/ข้อมูลจริง ดึงสด ๆ จากฐานข้อมูล
ตอบถูกไม่ต้องพึ่งความจำในแชต

อีกตัวอย่างที่จับต้องได้: ผู้ช่วยตัวที่ช่วยร่างคู่มือนี้ มี ความจำแบบไฟล์ของตัวเอง — มันรู้บริบทของโปรเจกต์นี้ตั้งแต่ข้อความแรกของเซสชันใหม่ ทั้งที่ window ว่างเปล่า เพราะข้อเท็จจริงสำคัญถูก เขียนลงไฟล์ในเซสชันก่อน ๆ จึงรอดข้ามขอบเขตเซสชันมาได้ — นี่คือ external memory ที่ทำถูก

ทำพลาด vs ทำถูก

⚠️ แย่ · คิดว่า “มันจำบทสนทนาได้”
เก็บแค่ pointer ไม่ใช่เนื้อหา
อาจารย์บอกเกณฑ์ให้คะแนน แล้วเงียบไป 2 นาที พอกลับมาบอก “เอาเลย” — ระบบกลับเปิดเซสชันใหม่ เพราะมันเก็บไว้แค่ ตัวชี้เซสชัน ไม่ใช่เนื้อหา เกณฑ์นั้นหายเกลี้ยง → ผู้ช่วยถามใหม่หรือเดา
⚠️ แย่ · พึ่งความจำในแชตกับค่าที่สำคัญ
หวังให้ค่ารอด compaction
เก็บ “ห้องที่ว่าง/เกรด/ตัวเลขสำคัญ” ไว้กลางบทสนทนาแล้วหวังว่ามันจะอยู่ — พอ compaction มาถึง ค่าที่สรุปไม่ติดก็หาย และไม่มีใครรู้ว่าหายไปตอนไหน
✅ ดี · external memory + แหล่งความจริงนอก window
จดของที่ต้องคงอยู่ · ดึงของจริงใหม่
ข้อเท็จจริงที่ต้องคงอยู่ → เขียนลงไฟล์/ฐานข้อมูล; ค่าที่เป็นความจริง → ดึงสดจากแหล่งความจริงทุกครั้ง เหตุผลชั่วคราวปล่อยให้ compaction ลบได้ ไม่มีความจริงไหนถูกฝากไว้ในบทสนทนา

ลองเอง — เอาตัวรอดจาก compaction

กิจกรรม · จำลองแล้วทำนาย
Survive the Compaction
context window มีความจุ 100 หน่วย ใส่ข้อมูลเข้าไปจนเต็ม เลือก 📌 pin (จดลง external memory) หรือ 🧹 clear (ลบของก้อนใหญ่) ตามใจ พอ window ล้น กด COMPACT — แล้วดูว่าอะไรรอด อะไรหาย และตอบคำถามทดสอบได้ไหม
pin/clear แล้วกด COMPACT
มองไปข้างหน้า — จำได้ ยังไม่พอ ต้อง “จริง” ด้วย external memory ทำให้ข้อเท็จจริงอยู่รอด แต่ใครรับประกันว่ามัน ถูกต้องตรงกับโลกจริง? บทที่ 07 ว่าด้วย grounding & verification — ตอบจากข้อมูลจริง และตรวจจากสภาพแวดล้อมก่อนลงมือ

สรุปบทที่ 06

Harness Scorecard · มิติ: “ของที่ต้องคงอยู่ ถูกจดไว้นอก window ไหม?” ผู้ช่วยจัดการแล็บ ✅ บางส่วน — แหล่งความจริงอยู่ในฐานข้อมูล (ดึงใหม่ได้) แต่ state ของบทสนทนาเองไม่มีบ้านถาวร (ออกแบบไว้แบบนั้น) อะไรที่ต้องอยู่ข้ามการหยุดยาวต้องเขียนลงที่ถาวร

📋 build-your-harness checklist · บรรทัดที่ 6 “ตัดสินทีละข้อ: ชั่วคราว (ปล่อยหายได้) vs ต้องคงอยู่ (เขียนลง external memory / แหล่งความจริง)”