ฉีด 'สิ่งที่ควรนึกถึงตอนนี้' ให้ AI ทุกเทิร์น — ชั้นกระตุ้นความจำ (Activation Layer) ของ RAG ส่วนตัว
บทนำ
ในการใช้งานผู้ช่วย AI ส่วนตัวของฉัน ฉันเก็บการตัดสินใจในอดีต บทเรียน และข้อมูลเกี่ยวกับตัวฉันเองไว้ในฐานความรู้ (RAG) แต่ แค่เก็บอย่างเดียวไม่พอ ถ้า AI ไม่ยอมไปดึงความทรงจำนั้นออกมาเอง บทเรียนที่เก็บไว้ก็จะไม่เคยถูกใช้เลยสักครั้ง กลายเป็นของตายในคลัง
ฉันจึงสร้างกลไกที่ดักจับข้อความที่ผู้ใช้พิมพ์เข้ามาทุกครั้ง แล้วฉีดความทรงจำที่เกี่ยวข้องกับหัวข้อปัจจุบันเข้าไปให้ AI โดยอัตโนมัติ ฉันเรียกสิ่งนี้ว่า “ชั้นกระตุ้นความจำ (Activation Layer)” เรื่องฝั่ง “เก็บ” ความทรงจำ (การเพิ่มความแม่นยำในการค้นหาด้วยตัวเลข) ฉันเขียนไว้ใน การปรับปรุงความแม่นยำการค้นหา RAG แบบขับเคลื่อนด้วยการวัดผล บทความนี้เป็นอีกด้านหนึ่ง — เรื่องว่าจะทำให้ AI ระลึกถึงความทรงจำที่เก็บไว้ในตอนที่จำเป็นจริงๆ ได้อย่างไร
แค่เก็บไว้ ก็ไม่ได้แปลว่าจะระลึกได้
ต่อให้เก็บความทรงจำไว้มากแค่ไหน ถ้ามันไม่ปรากฏขึ้นมา “ตอนที่จำเป็น” ก็แทบไม่ต่างจากไม่มีมันเลย แม้แต่มนุษย์ ถ้านึกเรื่องที่ควรจะจำได้ไม่ออกในช่วงเวลาสำคัญ ผลลัพธ์ก็เหมือนกับไม่รู้เรื่องนั้นตั้งแต่แรก
ผู้ช่วย AI ก็เช่นกัน ต่อให้เก็บบทเรียนในอดีตไว้ใน RAG ถ้า AI ไม่ยอมค้นหาเองด้วยคำถามว่า “ตอนนี้เรื่องนี้เกี่ยวข้องไหม” บทเรียนนั้นก็จะไม่ทำงาน แต่การขอให้มันทำแบบนั้นทุกครั้งว่า “ค้นหาอดีตก่อนสิ” ก็ทำต่อเนื่องไม่ได้ และถ้าลืมขอเมื่อไหร่ ก็จะทำผิดซ้ำแบบเดิมอีก
สิ่งที่จำเป็นไม่ใช่การค้นหาเอง แต่คือ การระลึก (recall) — สภาวะที่ความทรงจำซึ่งเกี่ยวข้องกับบริบทปัจจุบันถูก AI ดึงเข้ามาเองล่วงหน้า ก่อนที่ใครจะถาม ฉันสร้างมันขึ้นมาเป็นกลไก
【เก็บอย่างเดียว】 สะสมความทรงจำ ─▶ (AI ไม่ยอมดึงออกมาเอง) ─▶ กลายเป็นของตาย ทำผิดซ้ำเดิม
【มีการระลึก】 สะสมความทรงจำ ─▶ ฉีดความทรงจำที่เกี่ยวข้องอัตโนมัติทุกบทสนทนา ─▶ ตอบในสภาวะที่ระลึกได้แล้ว
ดักจับข้อความสนทนาด้วย hook แล้วฉีดความทรงจำ
สิ่งที่ใช้คือ hook ของเครื่องมือ AI (Claude Code) — กลไกที่ให้เราแทรกสคริปต์ของตัวเองเข้าไปในจังหวะเวลาที่กำหนดได้ ในที่นี้ใช้ hook ที่ทำงาน “ในขณะที่ผู้ใช้ส่งข้อความเข้ามา” (UserPromptSubmit)
ขั้นตอนเป็นแบบนี้ เมื่อผู้ใช้พิมพ์อะไรบางอย่างเข้ามา hook จะทำงาน โดยใช้ข้อความนั้นเป็นตัวช่วยรวบรวมความทรงจำที่เกี่ยวข้องจากฐานความรู้ สรุปให้เป็นบทย่อสั้นๆ แล้วฉีดเข้าไปที่ส่วนหัวของ prompt ของ AI AI จะเริ่มตอบในสภาวะที่ “ระลึกถึงความทรงจำที่เกี่ยวข้องแล้ว”
ผู้ใช้พิมพ์ข้อความ
│
▼
hook การส่งข้อความ (UserPromptSubmit) ทำงาน
│
├─ รวบรวม "ความทรงจำที่เกี่ยวข้องกับข้อความนี้" จากฐานความรู้
├─ สรุปให้เป็นบทย่อสั้นๆ
▼
ฉีดเข้าไปที่ส่วนหัวของ prompt ของ AI ─▶ AI ตอบในสภาวะที่ระลึกได้แล้ว
สิ่งสำคัญคือ สิ่งนี้ทำงานอัตโนมัติทุกเทิร์น ทั้งผู้ใช้และ AI ไม่ต้องตั้งใจคิดว่า “ต้องระลึกนะ” การระลึกทำงานเงียบๆ อยู่เป็นพื้นฐานของบทสนทนาตลอดเวลา
แยกวิธีระลึกสองแบบออกจากกัน ไม่ปนกัน
นี่คือแก่นของการออกแบบ “การระลึก” มี สองแบบที่มีธรรมชาติต่างกัน และห้ามเอามารวมกันเป็นก้อนเดียว
แบบแรกคือ การระลึกด้วยเนื้อหา (content recall) แปลงข้อความที่พิมพ์เข้ามาล่าสุดให้เป็นเวกเตอร์เชิงความหมาย แล้วค้นหาเชิงความหมายในฐานความรู้ เพื่อดึงความทรงจำที่ใกล้เคียงกับหัวข้อปัจจุบัน ถ้ามีสิ่งนี้ แม้แต่บทเรียนเก่าที่เก็บไว้นานแล้วก็จะฟื้นคืนมาถ้าหัวข้อตรงกัน ในทางกลับกัน ถ้าไม่มีสิ่งนี้ AI จะ “จำได้แค่เรื่องล่าสุด” — เพื่อนคู่ใจจะมีชีวิตอยู่ด้วยความทรงจำใหม่เท่านั้น กลายเป็นภาวะคล้ายๆ หลงลืม
อีกแบบคือ การระลึกด้วยความใหม่ (recency) — การฉีดบังคับด้วยความใหม่ ไม่ว่าเนื้อหาจะเป็นอะไร ฉีด N รายการล่าสุดเข้าไปแบบไม่มีเงื่อนไข เพราะการตัดสินใจล่าสุดหรืองานที่กำลังดำเนินอยู่ ต่อให้ไม่มีคำซ้ำกับข้อความที่พิมพ์เข้ามาตอนนี้เลย ก็ห้ามตกหล่น
ทั้งสองแบบนี้เป็นระบบที่แยกกันแม้แต่ในความทรงจำของมนุษย์ “การไล่นึกถึงสิ่งที่เกี่ยวข้องกันเป็นทอดๆ” กับ “การจำได้ว่าเพิ่งตัดสินใจอะไรไป” ทำงานต่างกัน ฉะนั้นฉันจึงแยกเป็นคนละส่วน นอกจากนี้ ข้อห้ามเด็ดขาดที่ห้ามละเมิด (บทเรียนที่ priority=high) และข้อมูลพื้นฐานเกี่ยวกับตัวฉันเอง (โปรไฟล์) จะใส่ไว้ในช่องตายตัวทุกครั้ง ไม่ว่าเนื้อหาหรือความใหม่จะเป็นอย่างไร
บทย่อที่ฉีดเข้าไป (ประกอบขึ้นใหม่ทุกเทิร์น)
├─ ① โปรไฟล์ (เกี่ยวกับตัวฉันเอง) … ช่องตายตัว
├─ ② ข้อห้ามเด็ดขาด (บทเรียน priority=high) … ช่องตายตัว
├─ ③ บทเรียน/บทสรุปล่าสุด (บังคับด้วยความใหม่) … ความใหม่
└─ ④ บันทึกที่เกี่ยวข้องกับบริบทปัจจุบัน (ค้นหาเชิงความหมาย) … การระลึกด้วยเนื้อหา
ในโค้ด ③ กับ ④ ถูกดึงแยกกันคนละแบบ ④ ค้นหาเชิงความหมายจากข้อความที่พิมพ์เข้ามา ส่วน ③ เรียงตามวันที่ใหม่สุดก่อน — วิธีดึงเองก็ต่างกัน
# ④ การระลึกด้วยเนื้อหา: ค้นหาเชิงความหมายจากข้อความล่าสุด ดึงความทรงจำที่เกี่ยวข้องกับบริบทปัจจุบัน
res = vault.query(query_texts=[prompt], n_results=TOP_N_QUERY * 2,
where={"source_type": {"$in": ["lesson", "conclusion", "knowledge"]}})
# ③ ความใหม่: ไม่ว่าเนื้อหาจะเป็นอะไร ฉีด N รายการล่าสุดแบบไม่มีเงื่อนไข
items.sort(key=lambda x: x.date, reverse=True) # เรียงตามวันที่ใหม่สุดก่อน
recency = items[:TOP_N_RECENCY]
และเพื่อไม่ให้ความทรงจำเดียวกันปรากฏซ้ำสองครั้งในช่องต่างกัน เนื้อหาที่ถูกเลือกไปแล้วในช่องก่อนหน้าจะถูกตัดออกจากช่องถัดไป เพราะพื้นที่สำหรับการระลึกมีจำกัด จึงไม่ควรเติมด้วยของซ้ำ
การระลึกต้องพับให้พอดีกับ “งบประมาณ” ที่จำกัด
อีกเรื่องหนึ่งที่ดูธรรมดาแต่หลีกเลี่ยงไม่ได้คือ ข้อจำกัดด้านปริมาณ จำนวนตัวอักษรที่ฉีดเข้าไปใน prompt ได้มีเพดานอยู่ (ในระบบนี้ประมาณ 10,000 ตัวอักษร) ความทรงจำเพิ่มขึ้นทุกวัน ใส่ทั้งหมดไม่ได้
ฉะนั้นความทรงจำที่เพิ่มขึ้นเรื่อยๆ ต้องพับให้เหลือปริมาณคงที่ (ประมาณ 6,000 ตัวอักษร) แล้วฉีดเข้าไปทุกครั้ง มีเทคนิคสองอย่างที่ได้ผลตรงนี้
อย่างแรกคือ พยายามรักษาเนื้อหาให้เหมือนเดิมมากที่สุดในทุกเทิร์น ถ้าเนื้อหาที่ฉีดเข้าไปคงที่ แคชฝั่งข้อมูลนำเข้าของ AI (กลไกที่ใช้ผลการคำนวณซ้ำได้เมื่อคำนำหน้าเหมือนเดิม) จะทำงาน ลดความสูญเปล่าลง เราไม่จ่ายต้นทุนแบบไม่จำกัดเพื่อการระลึก
อย่างที่สองคือ กำหนดลำดับการตัดทอนไว้ล่วงหน้า เมื่อพับไม่พอดีและต้องตัดทอน สิ่งแรกที่ถูกตัดคือการระลึกด้วยเนื้อหา (④) ซึ่งมีความสำคัญต่ำกว่า สิ่งที่ปกป้องแบบไม่มีเงื่อนไขคือข้อห้ามเด็ดขาด (②) กับความใหม่ (③) — ตัดจาก “สิ่งที่แม้ไม่มีก็เสียหายน้อย” ก่อน ส่วน “สิ่งที่ถ้าตกหล่นจะเกิดอุบัติเหตุ” ให้เหลือไว้จนถึงที่สุด
สุดท้าย ต่อให้ hook ล้มเหลว บทสนทนาก็ไม่หยุด แม้การดึงความทรงจำจะเกิดข้อผิดพลาด ข้อความที่พิมพ์เข้ามาก็ยังคงถูกส่งต่อไปยัง AI ตามเดิม การระลึกเป็นเพียง “พื้นฐานที่ช่วยได้เมื่อมันมี” และไม่ได้ถูกสร้างมาให้บทสนทนาดำเนินต่อไปไม่ได้หากขาดมันไป กลไกป้องกันต้องไม่จับตัวหลักเป็นตัวประกัน
การระลึกต่างหากที่ทำให้ความทรงจำเป็นความทรงจำ
สิ่งที่เข้าใจถ่องแท้หลังจากสร้างสิ่งนี้ขึ้นมาคือ คุณค่าของความทรงจำไม่ได้ถูกกำหนดด้วย “ปริมาณที่เก็บไว้” แต่ด้วย ว่ามันระลึกได้หรือไม่ ต่อให้เก็บบทเรียนดีแค่ไหน ถ้ามันไม่ปรากฏขึ้นมาในตอนที่จำเป็น มันก็ไม่ได้ทำหน้าที่เป็นความทรงจำ
- ความทรงจำจะทำงานก็ต่อเมื่อถูกยื่นให้ก่อนที่จะถูกถาม อย่าปล่อยให้การค้นหาขึ้นอยู่กับเจตนาของอีกฝ่าย ทำให้มันระลึกอัตโนมัติทุกบทสนทนา
- วิธีระลึกต้องแยกการระลึกด้วยเนื้อหากับความใหม่ออกจากกัน เก็บทั้งบทเรียนเก่าที่เกี่ยวข้องกับหัวข้อปัจจุบัน และบริบทล่าสุดที่ตกหล่นไม่ได้ ไว้เป็นคนละระบบ
- การระลึกต้องพับให้พอดีกับงบประมาณที่จำกัด ทำให้คงที่เพื่อให้แคชทำงาน กำหนดลำดับการตัดทอนไว้ล่วงหน้า และไม่ให้ตัวหลักหยุดทำงานแม้จะล้มเหลว
กลไกการเก็บ (RAG) เป็นเพียงครึ่งหนึ่งของความทรงจำ การดึงสิ่งที่เกี่ยวข้องกับบริบทปัจจุบันเข้ามาก่อนที่จะถูกถาม — ต่อเมื่อมีชั้นการระลึกนี้ ความทรงจำที่เก็บไว้จึงจะกลายเป็น “ความทรงจำที่ใช้งานได้” มนุษย์เรียนรู้จากประสบการณ์ได้ไม่ใช่เพราะจำได้ แต่เพราะระลึกได้ในตอนที่จำเป็น ฉันอยากให้ AI มีการระลึกแบบเดียวกันนี้เช่นกัน
บทความที่เกี่ยวข้อง
- เรื่องฝั่ง “เก็บ” ความทรงจำ — การเพิ่มความแม่นยำในการค้นหาด้วยตัวเลขแทนความรู้สึก อยู่ใน การปรับปรุงความแม่นยำการค้นหา RAG แบบขับเคลื่อนด้วยการวัดผล
- ปรัชญาการออกแบบโดยรวมของ RAG ส่วนตัวนี้สรุปไว้ใน คืนที่ AI แก้ไขฉัน 5 ครั้ง - ปรัชญาการออกแบบเพื่อให้ RAG ส่วนตัวเป็นเพื่อนคุณเป็นเวลา 5 ปี
- การใช้ hook แบบเดียวกัน แต่เพื่อการบังคับแทนการระลึก — กลไกที่หยุดการทำงานอันตรายไม่ให้เกิดขึ้นตั้งแต่แรก อยู่ใน การสร้างกลไก “ไม่ให้ทำ” ในผู้ช่วยเขียนโค้ด AI — จากคำแนะนำสู่การบังคับ และช่องโหว่ที่ประตูเปิดทิ้งไว้