Tool: remember — 4 โหมดจัดการความจำถาวร พร้อม conflict-scan และ compaction ด้วย LLM

ภาพประกอบ: Tool: remember — 4 โหมดจัดการความจำถาวร พร้อม conflict-scan และ compaction ด้วย LLM

remember บันทึกข้อเท็จจริงหรือข้อตกลงที่ต้องใช้ข้าม session เพื่อให้ agent กลับมาทำงานต่อโดยไม่ต้องสรุปบริบทเดิมใหม่ทุกครั้ง

Tool นี้คืออะไร

บันทึกข้อเท็จจริง (fact) เกี่ยวกับผู้ใช้ลงไฟล์ logs/memory.md แบบถาวร — เขียนลงไฟล์จริงบนดิสก์ ข้อมูลจึงคงอยู่ข้าม session และถูกโหลดกลับเข้า system prompt ในการสนทนาครั้งถัดไป แต่ละบรรทัดมีรูปแบบคงที่ - [YYYY-MM-DD] [category] fact เช่น - [2026-08-14] [ส่วนตัว] ชื่อ ปูม

4 โหมด ไม่ใช่แค่ “เขียนเพิ่ม”

Docstring ล็อกโหมดไว้ชัดเจนตาม parameter ที่ส่งมา — agent ห้ามเดาโหมดเอง:

โหมด Trigger คำพูด ทำอะไร
APPEND (fact อย่างเดียว) “จำไว้ว่า…”, “บันทึกว่า…” เขียนบรรทัดใหม่ — เช็ค conflict กับของเดิมอัตโนมัติ (ดูหัวข้อถัดไป)
REPLACE (fact + replace) “แก้จาก X เป็น Y” หาบรรทัดที่มีข้อความ replace แล้วเขียนทับด้วย fact — ถ้าหาไม่เจอคืน error ไม่ใช่เขียนเพิ่มเงียบๆ
FORGET (forget อย่างเดียว) “ลืม X ไปเลย”, “ไม่ต้องจำ X แล้ว” ลบทุกบรรทัดที่มีข้อความ forget — ถ้าหาไม่เจอคืน error
INSERT (fact + anchor) ขอแทรกความจำที่ตำแหน่งเฉพาะ แทรกบรรทัดใหม่ก่อน/หลังข้อความ anchor หรือที่เลขบรรทัดที่กำหนด — ไม่รัน conflict-scan (เป็นการแก้แบบเจาะจง)

Conflict-scan: ให้ LLM ตัดสินว่าอะไรซ้ำ/ขัดแย้งกัน ก่อนเขียนทุกครั้ง

จุดที่ทำให้ต่างจาก append เข้าไฟล์ดื้อๆ — โหมด APPEND ทุกครั้งจะเรียก LLM ตัวเบา (temperature=0, ปิด thinking) ถามว่า fact ใหม่นี้ ซ้ำหรือขัดแย้งกับบรรทัดไหนในไฟล์เดิมบ้าง (เช่น “ชอบกาแฟดำ” ตามด้วย “ชอบกาแฟนม” ภายหลัง) แล้วลบบรรทัดเก่าที่ขัดแย้งออกอัตโนมัติ — ข้อมูลใหม่ชนะเสมอ

มี guardrail กันความผิดพลาดของ LLM เอง: ถ้า LLM ตอบไม่ใช่ JSON, index ที่ชี้นอกขอบเขต, หรืออยากลบเกิน 3 บรรทัดในครั้งเดียว (_MAX_CONFLICT_REMOVALS) — ระบบตัดสินว่าคำตอบนั้น “garbage” แล้ว fallback ไปเป็น append เฉยๆ โดยไม่ลบอะไรเลย เพื่อไม่ให้ LLM ที่ตอบมั่วมาลบความจำของผู้ใช้ทิ้งโดยไม่ตั้งใจ

เมื่อไฟล์เกินเพดาน: compact ด้วย LLM ก่อน ตัดทิ้งดื้อๆ เป็นแผนสำรอง

ไฟล์มีเพดาน 5,000 ตัวอักษร (_MEMORY_MAX_CHARS) — เกินเมื่อไร ระบบจะให้ LLM เขียนไฟล์ใหม่ให้สั้นลงเหลือ 3,500 ตัวอักษร (_MEMORY_COMPACT_TO, เผื่อ headroom ไม่ให้ compact ซ้ำทุกครั้งที่เขียนเพิ่ม) โดยสั่งให้ รวม entry เรื่องเดียวกันเข้าด้วยกัน และเก็บวันที่ใหม่สุดเมื่อขัดแย้งกัน — ไม่ใช่แค่ตัดบรรทัดเก่าทิ้งทื่อๆ เหมือนเวอร์ชันก่อนหน้า

ถ้า LLM compact ล้มเหลว (timeout, ตอบไม่ครบ, ฯลฯ) มี deterministic fallback: ตัดบรรทัดที่เก่าที่สุดทิ้งทีละบรรทัดจนไฟล์กลับมาอยู่ในขนาดที่กำหนด — รับประกันว่าการเขียนความจำจะไม่มีวันพังเพราะ LLM ตอบช้า/ผิดพลาด และไฟล์ก่อน compact จะถูกสำรองไว้เป็น .bak เสมอ

Agent เรียก tool นี้เมื่อไร

ทำงานตามคำสั่งชัดเจนของผู้ใช้เท่านั้น ไม่ใช่ agent ตัดสินใจเองว่าอะไรควรจำ (ต่างจากระบบ compaction ของ conversation context ที่จัดการอัตโนมัติในเบื้องหลังโดยไม่ต้องสั่ง)

ทำไมเรื่องนี้ถึงสำคัญ

remember เริ่มจากงานง่ายๆ (เขียนบรรทัดเพิ่มลงไฟล์) แต่สะสมการตัดสินใจเชิงสถาปัตยกรรมไว้หลายชั้น: ความจำระยะยาวต้องมีเพดาน ไม่งั้นมันจะกลายเป็นภาระต่อ context แทนที่จะเป็นประโยชน์ — แต่แทนที่จะแก้ด้วยการตัดของเก่าทิ้งดื้อๆ อย่างเดียว ระบบเลือกให้ LLM ช่วยกลั่นกรอง ทั้งตอนเขียนเพิ่ม (conflict-scan กันข้อมูลซ้ำ/ขัดแย้งสะสม) และตอนไฟล์เต็ม (compact แทนตัดทิ้ง) โดยที่ยังมี deterministic fallback รองรับทุกจุดที่ LLM อาจพลาด — หลักการเดียวกับที่เห็นซ้ำทั่วทั้งโปรเจกต์นี้: ให้โมเดลช่วยตัดสินใจเนื้อหา แต่โค้ดยังคุมกรอบความถูกต้องอยู่เสมอ

อ่านเพิ่มเติม

ความคิดเห็น

กำลังโหลดความคิดเห็น...