Workspace Memory v2 (ออฟไลน์): บันทึกการวิจัย¶
เป้าหมาย: เวิร์กสเปซสไตล์Clawd (agents.defaults.workspace, ค่าเริ่มต้น ~/.openclaw/workspace) ซึ่ง “หน่วยความจำ” ถูกจัดเก็บเป็นไฟล์Markdownหนึ่งไฟล์ต่อวัน (memory/YYYY-MM-DD.md) พร้อมไฟล์ที่คงที่จำนวนเล็กน้อย (เช่น memory.md, SOUL.md)
เอกสารนี้เสนอสถาปัตยกรรมหน่วยความจำแบบ offline-first ที่คงMarkdownเป็นแหล่งข้อมูลหลักที่ตรวจทานได้โดยมนุษย์ แต่เพิ่ม การเรียกคืนเชิงโครงสร้าง (การค้นหา สรุปเอนทิตี การอัปเดตความเชื่อมั่น) ผ่านดัชนีที่สร้างจากอนุพันธ์
ทำไมต้องเปลี่ยน?¶
การตั้งค่าปัจจุบัน (หนึ่งไฟล์ต่อวัน) ดีเยี่ยมสำหรับ:
- การบันทึกแบบ “append-only”
- การแก้ไขโดยมนุษย์
- ความทนทานและการตรวจสอบย้อนหลังด้วยgit
- การบันทึกที่แรงเสียดทานต่ำ (“แค่เขียนลงไป”)
มันไม่เหมาะกับ:
- การดึงข้อมูลที่ต้องการการเรียกคืนสูง (“เราตัดสินใจเรื่องXว่าอย่างไร?”, “ครั้งล่าสุดที่ลองYคือเมื่อไหร่?”)
- คำตอบแบบยึดเอนทิตีเป็นศูนย์กลาง (“เล่าให้ฟังเกี่ยวกับAlice / The Castle / warelay”) โดยไม่ต้องอ่านหลายไฟล์
- ความเสถียรของความคิดเห็น/ความชอบ (และหลักฐานเมื่อมีการเปลี่ยน)
- ข้อจำกัดด้านเวลา (“อะไรเป็นความจริงในช่วงพ.ย.2025?”) และการแก้ไขความขัดแย้ง
เป้าหมายการออกแบบ¶
- ออฟไลน์: ทำงานได้โดยไม่ต้องใช้เครือข่าย; รันบนแล็ปท็อป/ปราสาท; ไม่พึ่งพาคลาวด์
- อธิบายได้: รายการที่ดึงมาควรระบุแหล่งที่มาได้ (ไฟล์ + ตำแหน่ง) และแยกจากการอนุมาน
- พิธีการต่ำ: การบันทึกรายวันยังคงเป็นMarkdown ไม่ต้องมีสคีมาหนัก
- เพิ่มทีละขั้น: v1 ใช้ได้ด้วยFTSอย่างเดียว; semantic/vectorและกราฟเป็นอัปเกรดเสริม
- เป็นมิตรกับเอเจนต์: ทำให้ “การเรียกคืนภายใต้งบโทเคน” ง่าย (ส่งคืนชุดข้อเท็จจริงขนาดเล็ก)
โมเดลเป้าหมาย (Hindsight × Letta)¶
สองส่วนที่ต้องผสาน:
- ลูปควบคุมสไตล์Letta/MemGPT
- เก็บ “แกนหลัก” ขนาดเล็กไว้ในบริบทเสมอ (persona + ข้อเท็จจริงผู้ใช้ที่สำคัญ)
- ทุกอย่างอื่นอยู่นอกบริบทและเรียกคืนผ่านเครื่องมือ
- การเขียนหน่วยความจำเป็นการเรียกเครื่องมือแบบชัดเจน (append/replace/insert) ถูกบันทึก แล้วฉีดกลับเข้ามาในเทิร์นถัดไป
- ซับสเตรตหน่วยความจำสไตล์Hindsight
- แยกสิ่งที่สังเกต vs สิ่งที่เชื่อ vs สิ่งที่สรุป
- รองรับ retain/recall/reflect
- ความคิดเห็นที่มีระดับความเชื่อมั่นและพัฒนาได้ด้วยหลักฐาน
- การเรียกคืนที่ตระหนักถึงเอนทิตี + คำถามเชิงเวลา (แม้ไม่มีกราฟความรู้เต็มรูปแบบ)
สถาปัตยกรรมที่เสนอ (Markdownเป็นแหล่งข้อมูลหลัก + ดัชนีที่สร้างจากอนุพันธ์)¶
คลังข้อมูลหลัก (เป็นมิตรกับgit)¶
เก็บ ~/.openclaw/workspace เป็นหน่วยความจำหลักที่มนุษย์อ่านได้
เลย์เอาต์เวิร์กสเปซที่แนะนำ:
~/.openclaw/workspace/
memory.md # small: durable facts + preferences (core-ish)
memory/
YYYY-MM-DD.md # daily log (append; narrative)
bank/ # “typed” memory pages (stable, reviewable)
world.md # objective facts about the world
experience.md # what the agent did (first-person)
opinions.md # subjective prefs/judgments + confidence + evidence pointers
entities/
Peter.md
The-Castle.md
warelay.md
...
หมายเหตุ:
- บันทึกรายวันก็ยังคงเป็นบันทึกรายวัน ไม่จำเป็นต้องแปลงเป็น JSON
- ไฟล์
bank/เป็นไฟล์ คัดสรร ผลิตโดยงานสะท้อน และยังแก้ไขด้วยมือได้ memory.mdยังคง “เล็ก + ใกล้แกน”: สิ่งที่คุณต้องการให้Clawdเห็นทุกเซสชัน
คลังข้อมูลอนุพันธ์ (การเรียกคืนของเครื่อง)¶
เพิ่มดัชนีอนุพันธ์ภายใต้เวิร์กสเปซ (ไม่จำเป็นต้องติดตามด้วยgit):
~/.openclaw/workspace/.memory/index.sqlite
รองรับด้วย:
- สคีมาSQLiteสำหรับข้อเท็จจริง + ลิงก์เอนทิตี + เมตาดาต้าความคิดเห็น
- SQLite FTS5 สำหรับการเรียกคืนเชิงคำศัพท์ (เร็ว เล็ก ออฟไลน์)
- ตารางembeddingsเสริมสำหรับการเรียกคืนเชิงความหมาย (ยังคงออฟไลน์)
ดัชนีสามารถ สร้างใหม่จากMarkdownได้เสมอ
Retain / Recall / Reflect (ลูปการปฏิบัติการ)¶
Retain: ทำให้บันทึกรายวันเป็น “ข้อเท็จจริง”¶
อินไซต์สำคัญของHindsightที่ใช้ได้ที่นี่: เก็บ ข้อเท็จจริงเชิงบรรยายที่สมบูรณ์ในตัวเอง ไม่ใช่ชิ้นส่วนเล็กๆ
กฎเชิงปฏิบัติสำหรับ memory/YYYY-MM-DD.md:
- ตอนสิ้นวัน (หรือระหว่างวัน) เพิ่มส่วน
## Retainพร้อมบูลเล็ต 2–5 ข้อ ที่: - เป็นเชิงบรรยาย (รักษาบริบทข้ามเทิร์น)
- สมบูรณ์ในตัวเอง (อ่านเดี่ยวๆแล้วเข้าใจ)
- ติดแท็กด้วยชนิด + การกล่าวถึงเอนทิตี
ตัวอย่าง:
## Retain
- W @Peter: Currently in Marrakech (Nov 27–Dec 1, 2025) for Andy’s birthday.
- B @warelay: I fixed the Baileys WS crash by wrapping connection.update handlers in try/catch (see memory/2025-11-27.md).
- O(c=0.95) @Peter: Prefers concise replies (<1500 chars) on WhatsApp; long content goes into files.
การพาร์สขั้นต่ำ:
- คำนำหน้าชนิด:
W(โลก),B(ประสบการณ์/ชีวประวัติ),O(ความคิดเห็น),S(การสังเกต/สรุป; มักถูกสร้าง) - เอนทิตี:
@Peter,@warelayฯลฯ (slugแมปไปที่bank/entities/*.md) - ความเชื่อมั่นของความคิดเห็น:
O(c=0.0..1.0)ไม่บังคับ
หากไม่ต้องการให้ผู้เขียนต้องคิดมาก งานสะท้อนสามารถอนุมานบูลเล็ตเหล่านี้จากบันทึกที่เหลือได้ แต่การมีส่วน ## Retain แบบชัดเจนคือ “คันโยกคุณภาพ” ที่ง่ายที่สุด
Recall: การสืบค้นผ่านดัชนีอนุพันธ์¶
การเรียกคืนควรรองรับ:
- เชิงคำศัพท์: “ค้นหาคำ/ชื่อ/คำสั่งแบบตรงตัว” (FTS5)
- เชิงเอนทิตี: “เล่าให้ฟังเกี่ยวกับX” (หน้าเอนทิตี + ข้อเท็จจริงที่เชื่อมกับเอนทิตี)
- เชิงเวลา: “เกิดอะไรขึ้นแถวๆ27พ.ย.” / “ตั้งแต่สัปดาห์ที่แล้ว”
- เชิงความคิดเห็น: “Peterชอบอะไร?” (พร้อมความเชื่อมั่น + หลักฐาน)
รูปแบบการส่งคืนควรเป็นมิตรกับเอเจนต์และอ้างอิงแหล่งที่มา:
kind(world|experience|opinion|observation)timestamp(วันต้นทาง หรือช่วงเวลาที่สกัดได้ถ้ามี)entities(["Peter","warelay"])content(ข้อเท็จจริงเชิงบรรยาย)source(memory/2025-11-27.md#L12ฯลฯ)
Reflect: สร้างหน้าที่เสถียร + อัปเดตความเชื่อ¶
การสะท้อนเป็นงานตามตาราง (รายวันหรือฮาร์ตบีต ultrathink) ที่:
- อัปเดต
bank/entities/*.mdจากข้อเท็จจริงล่าสุด (สรุปเอนทิตี) - อัปเดตความเชื่อมั่นของ
bank/opinions.mdตามการเสริมหรือขัดแย้ง - เสนอการแก้ไข
memory.mdแบบเลือกได้ (“ใกล้แกน” และคงทน)
วิวัฒนาการของความคิดเห็น (เรียบง่าย อธิบายได้):
- แต่ละความคิดเห็นมี:
- ข้อความ
- ความเชื่อมั่น
c ∈ [0,1] - last_updated
- ลิงก์หลักฐาน (สนับสนุน + ขัดแย้ง IDข้อเท็จจริง)
- เมื่อมีข้อเท็จจริงใหม่:
- หา候选ความคิดเห็นด้วยการทับซ้อนเอนทิตี + ความคล้าย (เริ่มด้วยFTS แล้วค่อย embeddings)
- ปรับความเชื่อมั่นทีละน้อย; การเปลี่ยนแปลงมากต้องมีการขัดแย้งที่แรง + หลักฐานซ้ำ
การผสานรวมCLI: สแตนด์อโลน vs ผสานลึก¶
ข้อแนะนำ: ผสานรวมลึกในOpenClaw แต่แยกไลบรารีแกนหลักได้
ทำไมต้องผสานในOpenClaw?¶
- OpenClawรู้อยู่แล้ว:
- พาธเวิร์กสเปซ (
agents.defaults.workspace) - โมเดลเซสชัน + ฮาร์ตบีต
- รูปแบบการบันทึก + การแก้ไขปัญหา
- คุณต้องการให้เอเจนต์เรียกเครื่องมือเอง:
openclaw memory recall "…" --k 25 --since 30dopenclaw memory reflect --since 7d
ทำไมยังต้องแยกเป็นไลบรารี?¶
- ทำให้ตรรกะหน่วยความจำทดสอบได้โดยไม่ต้องพึ่งGateway/รันไทม์
- นำกลับไปใช้ในบริบทอื่น (สคริปต์โลคัล แอปเดสก์ท็อปในอนาคต ฯลฯ)
รูปแบบ: เครื่องมือหน่วยความจำตั้งใจให้เป็นCLIขนาดเล็ก + ชั้นไลบรารี แต่ทั้งหมดนี้เป็นเชิงสำรวจเท่านั้น
“S-Collide” / SuCo: ควรใช้เมื่อใด (การวิจัย)¶
หาก “S-Collide” หมายถึง SuCo (Subspace Collision): เป็นแนวทางการดึงANNที่มุ่งเน้นสมดุลระหว่างการเรียกคืน/เวลาแฝงโดยใช้การชนกันที่เรียนรู้/มีโครงสร้างในซับสเปซ (บทความ: arXiv 2411.14754, 2024)
มุมมองเชิงปฏิบัติสำหรับ ~/.openclaw/workspace:
- อย่าเริ่ม ด้วยSuCo
- เริ่มด้วยSQLite FTS + (เสริม) embeddingsแบบง่าย; จะได้ประสบการณ์ผู้ใช้ส่วนใหญ่ทันที
- พิจารณาโซลูชันระดับSuCo/HNSW/ScaNNก็ต่อเมื่อ:
- คอร์ปัสมีขนาดใหญ่ (หลายหมื่น/แสนชิ้น)
- การค้นหาembeddingsแบบ brute-force ช้าเกินไป
- คุณภาพของการเรียกคืนข้อมูลถูกจำกัดอย่างมีนัยสำคัญโดยการค้นหาเชิงคำศัพท์
ทางเลือกที่เป็นมิตรกับออฟไลน์ (ซับซ้อนเพิ่มขึ้นตามลำดับ):
- SQLite FTS5 + ตัวกรองเมตาดาต้า (ไม่มีML)
- Embeddings + brute force (ไปได้ไกลกว่าที่คิดเมื่อจำนวนชิ้นไม่มาก)
- ดัชนีHNSW (แพร่หลาย แข็งแรง; ต้องมีไลบรารี)
- SuCo (ระดับวิจัย; น่าสนใจหากมีอิมพลีเมนต์ที่ฝังได้)
คำถามเปิด:
- โมเดลembeddingออฟไลน์ที่ ดีที่สุด สำหรับ “หน่วยความจำผู้ช่วยส่วนตัว” บนเครื่องของคุณ (แล็ปท็อป + เดสก์ท็อป) คืออะไร?
- หากคุณมีOllamaอยู่แล้ว: ฝังด้วยโมเดลโลคัล; มิฉะนั้นจัดส่งโมเดลembeddingขนาดเล็กไปกับทูลเชน
โครงการนำร่องที่เล็กที่สุดแต่ใช้งานได้¶
หากต้องการเวอร์ชันขั้นต่ำที่ยังใช้ได้:
- เพิ่มหน้าเอนทิตี
bank/และส่วน## Retainในบันทึกรายวัน - ใช้SQLite FTSสำหรับการเรียกคืนพร้อมการอ้างอิง (พาธ + หมายเลขบรรทัด)
- เพิ่มembeddingsเฉพาะเมื่อคุณภาพการเรียกคืนหรือสเกลต้องการ
อ้างอิง¶
- แนวคิดLetta / MemGPT: “core memory blocks” + “archival memory” + หน่วยความจำที่แก้ไขตนเองด้วยเครื่องมือ
- รายงานเทคนิคHindsight: “retain / recall / reflect”, หน่วยความจำสี่เครือข่าย, การสกัดข้อเท็จจริงเชิงบรรยาย, วิวัฒนาการความเชื่อมั่นของความคิดเห็น
- SuCo: arXiv 2411.14754 (2024): “Subspace Collision” การดึงเพื่อนบ้านใกล้เคียงโดยประมาณ