# เซสชันและหน่วยความจำ ## เซสชัน ### วิธีทำงานของเซสชัน การสนทนาทุกครั้งกับเอเจนต์เกิดขึ้นใน **เซสชัน** เซสชันถูกระบุด้วยคีย์ที่เข้ารหัส context, เอเจนต์ตัวไหน ช่องทางไหน แชทไหน เซสชันรักษา transcript ที่สมบูรณ์ (append-only JSONL) ของข้อความทั้งหมด การเรียกเครื่องมือ และผลลัพธ์ Transcript นี้คือสิ่งที่ให้ context แก่เอเจนต์เกี่ยวกับการสนทนาที่กำลังดำเนินอยู่ ### Session Key เซสชันถูกกำหนดเส้นทางโดยอัตโนมัติตาม context: | รูปแบบ | ความหมาย | |, --, -|, --, -|\ | `agent:main:main` | การสนทนาโดยตรงหลัก | | `agent:::group:` | แชทกลุ่มบนช่องทางเฉพาะ | | `agent:::channel:` | การสนทนาช่องทาง/ห้อง | | `cron:` | การรัน scheduled job | | `hook:` | การรันที่ทริกเกอร์ด้วย Webhook | ### วงจรชีวิตเซสชัน - **การรีเซ็ตรายวัน**, เซสชันรีเซ็ตอัตโนมัติในเวลาที่กำหนดค่าได้ (ค่าเริ่มต้น 4 โมงเช้าตามเวลาท้องถิ่น) ซึ่งสร้าง context การสนทนาใหม่ทุกวันในขณะที่รักษาประวัติ - **การหมดอายุเมื่อไม่ได้ใช้งาน**, เซสชันที่ไม่ได้ใช้งานในช่วงเวลาที่กำหนดค่าได้สามารถรีเซ็ตอัตโนมัติ - **การรีเซ็ตด้วยตนเอง**, เริ่มใหม่ได้ทุกเวลาด้วยคำสั่ง `/new` หรือ `/reset` ### การติดตามโทเค็น เซสชันติดตามการใช้โทเค็นสะสม (อินพุต เอาต์พุต อ่านแคช เขียนแคช) สำหรับการตรวจสอบต้นทุนและการจัดการ context window --- ## Compaction ### Compaction คืออะไร? เมื่อการสนทนาเข้าใกล้ขีดจำกัด context window ของ model Neotask จะ **compact** มัน, สรุปข้อความเก่าเป็นภาพรวมแบบย่อและเริ่มเซสชันใหม่ด้วยสรุปนั้นพร้อมข้อความล่าสุด ### วิธีทำงาน 1. **การตรวจจับ**, ตรวจสอบการใช้งาน context (ค่าเริ่มต้นทริกเกอร์: 80% ของ context window) 2. **การสรุป**, ข้อความเก่าถูกสรุปเป็น compaction entry 3. **เซสชันใหม่**, เซสชันใหม่เริ่มต้นด้วยสรุปที่ฉีดเข้าที่ด้านบน 4. **การรักษา**, Transcript เก่าถูกเก็บสำหรับประวัติแต่ไม่โหลดเข้า context อีกต่อไป ### การกำหนดค่า - **เปิดใช้งาน/ปิดใช้งาน**, สลับการ compaction อัตโนมัติ - **เกณฑ์**, เปอร์เซ็นต์ของ context window ที่ทริกเกอร์ compaction (ค่าเริ่มต้น 80%) - **จำนวนข้อความขั้นต่ำ**, ไม่ compact หากมีข้อความน้อยกว่า N รายการ ### การ Compact ด้วยตนเอง คุณสามารถทริกเกอร์ compaction ด้วยตนเองได้ทุกเวลาด้วยคำสั่ง `/compact` ซึ่งมีประโยชน์เมื่อคุณต้องการรีเซ็ต context โดยไม่สูญเสียข้อมูลสำคัญ --- ## หน่วยความจำ ### หน่วยความจำเอเจนต์ เอเจนต์แต่ละตัวมีระบบหน่วยความจำสำหรับการคงข้อมูลสำคัญข้ามเซสชัน: - **MEMORY.md**, ไฟล์ markdown ใน workspace ของเอเจนต์ที่จัดเก็บข้อเท็จจริงสำคัญ ค่ากำหนด และ context - **Memory directory**, ไฟล์เพิ่มเติมใน `memory/` สำหรับความรู้ที่มีโครงสร้าง ### Vector Search Neotask รองรับการค้นหาความคล้ายคลึง vector ข้ามหน่วยความจำเอเจนต์: 1. **การ Index**, ไฟล์หน่วยความจำถูก index โดยใช้ embedding 2. **การค้นหา**, เอเจนต์ค้นหาหน่วยความจำด้วยภาษาธรรมชาติ ("ผู้ใช้พูดอะไรเกี่ยวกับค่ากำหนด API ของพวกเขา?") 3. **การเรียกคืน**, หน่วยความจำที่เกี่ยวข้องถูกส่งคืนตามลำดับความคล้ายคลึง ### Memory Plugin (LanceDB) Memory plugin ของ LanceDB ให้การจัดเก็บ vector ขั้นสูง: - ฐานข้อมูล vector ถาวร - ขนาด chunk และ overlap ที่กำหนดค่าได้ - การค้นหาความคล้ายคลึงที่มีประสิทธิภาพ - การ re-index อัตโนมัติเมื่อไฟล์หน่วยความจำเปลี่ยนแปลง ### การเรียกคืนอัตโนมัติ เมื่อเริ่มต้นเซสชัน หน่วยความจำที่เกี่ยวข้องสามารถถูกเรียกคืนและฉีดเข้าใน context ของเอเจนต์โดยอัตโนมัติ ซึ่งให้ความต่อเนื่องแก่เอเจนต์ข้ามเซสชันโดยไม่ต้องโหลดประวัติการสนทนาทั้งหมด --- ## การคงเซสชัน ข้อมูลเซสชันทั้งหมดถูกจัดเก็บในเครื่อง: - **Session metadata**, `sessions.json` ติดตามเซสชันที่ใช้งานอยู่ กิจกรรมล่าสุด จำนวนโทเค็น และ config - **Transcript**, Transcript เซสชันแต่ละรายการจัดเก็บเป็นไฟล์ `.jsonl` - **การกู้คืน**, เซสชันรอดพ้นการรีสตาร์ท Gateway โดยไม่สูญเสียข้อมูล ### การทำความสะอาด - เซสชันที่ไม่ได้เข้าถึงในช่วงเวลาที่กำหนดค่าได้ (ค่าเริ่มต้น 30 วัน) มีสิทธิ์สำหรับการทำความสะอาด - การจัดการเซสชันด้วยตนเองมีผ่าน UI หรือ API - Transcript ที่ compact แล้วถูก archive แต่สามารถตรวจสอบได้