ระบบหน่วยความจำสามมิติ
ภาพรวม
ระบบหน่วยความจำของพื้นที่ทำงานใช้สถาปัตยกรรมสามมิติ โดยจัดเก็บและจัดการความรู้ในสามมิติ ได้แก่ บัญชี องค์กร และเซสชัน หน่วยความจำผสานรวมกับบทสนทนาอย่างลึกซึ้ง —— ทุกครั้งที่สนทนาจะมีการค้นหาหน่วยความจำที่เกี่ยวข้องเพื่อฉีดเข้าสู่บริบท และหลังจบการโต้ตอบแต่ละรอบจะดึงหน่วยความจำใหม่ออกมาโดยอัตโนมัติ
ฐานเทคโนโลยี: mem0 REST API + กราฟความรู้ Neo4j
สถาปัตยกรรมสามมิติ
| มิติ | ขอบเขต | วิธีการเขียน | สิทธิ์การจัดการ | การฉีดเข้าบทสนทนา |
|---|---|---|---|---|
| ระดับบัญชี | userId (ข้ามองค์กร) | เพิ่มด้วยตนเอง + ดึงอัตโนมัติจากบทสนทนา | ผู้ใช้จัดการเอง | ฉีด "ภาพรวมผู้ใช้" เข้า system prompt |
| ระดับองค์กร | orgId (แยกตามองค์กร) | ผู้ดูแลระบบดูแลด้วยตนเอง | เฉพาะผู้ดูแลพื้นที่ทำงาน | ฉีด "ภาพรวมองค์กร" เข้า system prompt |
| ระดับเซสชัน | runId (เซสชันเดียว) | ดึงอัตโนมัติทุกรอบ | จัดการอัตโนมัติ | ค้นหาเชิงความหมายภายในเซสชัน |
หน่วยความจำระดับบัญชี
- แชร์ข้ามองค์กร: ผูกกับ userId ใช้งานได้ในทุกองค์กรของผู้ใช้
- วิธีการเขียน:
- ด้วยตนเอง: เพิ่มผ่านคำสั่งในหน้าจัดการหน่วยความจำหรือในบทสนทนา
- อัตโนมัติ: ตรวจจับข้อมูลที่ควรจดจำโดยอัตโนมัติในระหว่างบทสนทนา
- หน้าจัดการ: การตั้งค่า APP → หน่วยความจำ
- เอกสารรายละเอียด: การจัดการหน่วยความจำ
หน่วยความจำระดับองค์กร
- แยกตามองค์กร: ผูกกับ orgId มองเห็นได้เฉพาะสมาชิกในองค์กรปัจจุบัน
- สิทธิ์การจัดการ: มีเพียงผู้ดูแลพื้นที่ทำงานเท่านั้นที่ดูแลได้
- หน้าจัดการ: การจัดการพื้นที่ → การตั้งค่าขั้นสูง → หน่วยความจำองค์กร
- เอกสารรายละเอียด: การตั้งค่าขั้นสูง — หน่วยความจำองค์กร
หน่วยความจำระดับเซสชัน
- เซสชันเดียว: ผูกกับ runId มีผลเฉพาะภายในเซสชันปัจจุบันเท่านั้น
- ดึงทุกรอบ: วิเคราะห์และดึงหน่วยความจำโดยอัตโนมัติหลังจบบทสนทนาแต่ละรอบ
- ไม่ต้องจัดการ: ระบบจัดการให้โดยอัตโนมัติ
กลไกการดึงหน่วยความจำ
คำสั่งชัดแจ้ง (ความเชื่อมั่น 0.99)
ผู้ใช้ขอให้ Agent จดจำหรือลืมข้อมูลโดยตรง:
| การดำเนินการ | คำสำคัญที่กระตุ้น |
|---|---|
| เพิ่มหน่วยความจำ | "จดจำ", "จดไว้", "บันทึกหน่วยความจำ", "บันทึกลงหน่วยความจำ", "remember", "store in memory" |
| ลบหน่วยความจำ | "ลบหน่วยความจำ", "ลืมไป", "ลืม", "forget this", "remove from memory" |
การตรวจจับโดยนัย (ความเชื่อมั่น 0.5-0.93)
ระบบตรวจจับข้อเท็จจริงที่คงอยู่ในบทสนทนาโดยอัตโนมัติผ่านรูปแบบ regex:
| ประเภทสัญญาณ | ตัวอย่าง | ความเชื่อมั่น |
|---|---|---|
| โปรไฟล์ส่วนตัว | "ฉันชื่อจางซาน", "ฉันเป็นนักพัฒนา front-end", "my name is" | 0.93 |
| สิ่งที่เป็นเจ้าของ | "ฉันมีแมวหนึ่งตัว", "ฉันเลี้ยง", "I own" | 0.90 |
| ความชอบส่วนตัว | "ฉันชอบใช้ TypeScript", "I prefer" | 0.88 |
| สไตล์ผู้ช่วย | "ต่อไปนี้กรุณาตอบเป็นภาษาจีน", "always use", "ความชอบรูปแบบการตอบสนอง" | 0.86 |
เกณฑ์ความเชื่อมั่น
| โหมด | เกณฑ์ | คำอธิบาย |
|---|---|---|
| strict | 0.85 | โหมดอนุรักษ์นิยม ดึงเฉพาะหน่วยความจำที่มีความเชื่อมั่นสูง |
| standard (ค่าเริ่มต้น) | 0.65 | โหมดสมดุล |
| relaxed | 0.50 | โหมดเชิงรุก จดจำเนื้อหาได้มากขึ้น |
กฎการยกเว้นอัตโนมัติ
เนื้อหาต่อไปนี้จะไม่ถูกดึงเป็นหน่วยความจำ:
- คำถามล้วน ๆ (ลงท้ายด้วยเครื่องหมายคำถาม ขึ้นต้นด้วยคำถาม)
- การพูดคุยเล่น/ทักทาย
- เนื้อหาในบล็อกโค้ด
- ข้อมูลที่มีระยะเวลา/ผูกกับเวลา (วันที่ ข่าว สถานะชั่วคราว)
- หัวข้อที่ไม่คงอยู่ (รายงานบั๊ก ข้อความข้อผิดพลาด)
กราฟความรู้
การจัดเก็บฝั่งแบ็กเอนด์ (Neo4j)
ความสัมพันธ์ของหน่วยความจำจัดเก็บในฐานข้อมูลกราฟ Neo4j ในรูปแบบสามส่วน (triple):
(source เอนทิตี) --[relationship]--> (target เอนทิตี)
การค้นหาย่านใกล้เคียงแบบ N-hop (1-4 ฮอป):
MATCH path = (n {name: $entity})-[*1..depth]-(m)
WHERE ALL(node IN nodes(path) WHERE node.user_id = $user_id)
UNWIND relationships(path) AS rel
RETURN source, relationship, target
การค้นหา Cypher รับประกันว่าจะไม่ข้ามขอบเขตของผู้ใช้เด็ดขาด
การแสดงภาพฝั่งฟรอนต์เอนด์
ใช้ react-force-graph-2d ในการเรนเดอร์กราฟแบบ force-directed:
| ประเภทโหนด | สี | คำอธิบาย |
|---|---|---|
| Hub | สีม่วง #6d28d9 |
โหนดศูนย์กลางของผู้ใช้/องค์กร |
| Fact | สีน้ำเงิน #2563eb |
รายการหน่วยความจำ |
| Entity | สีอำพัน #f59e0b (ค่าเริ่มต้น) |
เอนทิตีที่ดึงออกมา; สีเฉพาะกำหนดโดย djb2 hash แมปไปยังชุดสี 10 สี |
การปรับแต่งการเรนเดอร์กราฟ (อัปเดต 2026-04) NEW
กราฟเวอร์ชันใหม่นำเกณฑ์ความหนาแน่นสองตัวเข้ามา เพื่อหลีกเลี่ยงการที่โหนดมากเกินไปจนทำให้ป้ายกำกับซ้อนทับกัน:
| ค่าคงที่เกณฑ์ | ค่า | ความหมาย |
|---|---|---|
PILL_READABILITY_MIN_SCALE |
1.5 | เมื่อการซูมน้อยกว่า 1.5x จะไม่เรนเดอร์ป้ายข้อความ |
PILL_MIN_SCREEN_AREA_PER_NODE |
3000 | เมื่อพื้นที่หน้าจอต่อโหนดน้อยกว่า 3000 พิกเซล จะไม่เรนเดอร์ป้าย |
ต้องเป็นไปตามเงื่อนไขทั้งสองพร้อมกันจึงจะแสดงป้ายกำกับ หากไม่เป็นไปตามนั้นจะเรนเดอร์เพียงจุดวงกลม
การทำให้สีของ Entity Type เสถียร:
- คำนวณประเภทเอนทิตีด้วย
djb2hash → ดัชนีสี - เอนทิตีประเภทเดียวกันจะคงสีเดิมทั้งในมุมมองต่าง ๆ และในเวลาต่าง ๆ
- ชุดสี 10 สีรองรับการใช้งานแบบวนซ้ำสำหรับประเภทได้ไม่จำกัด
การแก้บั๊ก: เมื่อแมปความสัมพันธ์ของกราฟ ฟิลด์ sourceTypes / targetTypes เคยถูกทิ้งไป ทำให้ทุกโหนดถอยกลับไปใช้ fallback สีเทา บั๊กนี้ได้รับการแก้ไขแล้ว (ดู sidecar/src/mem0Service.ts)
การเจาะลึกหลายระดับ
คลิกที่โหนดเพื่อขยายเอนทิตีที่เกี่ยวข้อง เจาะลึกเข้าสู่เครือข่ายความรู้ทีละชั้น เอนจินกราฟรองรับ:
neighborhood()— การค้นหาย่านใกล้เคียงแบบ N-hopshortestPath()— เส้นทางที่สั้นที่สุดระหว่างสองเอนทิตีextractEntitiesFromText()— ดึงชื่อเอนทิตีจากข้อความ
การทำงานร่วมกันของหน่วยความจำกับบทสนทนา
จังหวะการค้นหาหน่วยความจำ
| จังหวะ | การกระทำ |
|---|---|
| สร้างบทสนทนาใหม่ | ค้นหาหน่วยความจำภาพรวมบัญชี + หน่วยความจำภาพรวมองค์กร แล้วต่อเข้ากับ system prompt |
| ผู้ใช้ส่งข้อความ | เครื่องมือ memory_query ค้นคืนหน่วยความจำที่เกี่ยวข้องเชิงความหมาย |
| การขยายกราฟ | searchWithGraphExpansion — ค้นคืนเชิงความหมาย + ขยายกราฟ 1-hop คืนค่าเอนทิตีและเส้นเชื่อมที่เกี่ยวข้อง |
ตำแหน่งการฉีดหน่วยความจำ
ฉีดภาพรวมหน่วยความจำสองส่วนลงใน system prompt:
คุณคือผู้ช่วย AI ของ GPTBots...
## ภาพรวมผู้ใช้
- ผู้ใช้เป็นวิศวกรพัฒนา front-end
- ชอบใช้ TypeScript
- ...
## ภาพรวมองค์กร
- บริษัทใช้เทคสแตก React
- โค้ดเนมโครงการ Project Alpha
- ...
เครื่องมือหน่วยความจำ
Agent สามารถค้นหาและจัดการหน่วยความจำเชิงรุกได้ผ่านเครื่องมือต่อไปนี้:
| เครื่องมือ | การดำเนินการ | คำอธิบาย |
|---|---|---|
| memory_query | list / search / graph_traverse | รายการ, ค้นหาเชิงความหมาย, ท่องกราฟ |
| memory_manage | add / update / delete | เพิ่ม, แก้ไข, ลบหน่วยความจำ |
| conversation_search | search | ค้นหาบทสนทนาที่ผ่านมา |
| recent_chats | list | แสดงรายการบทสนทนาล่าสุด |
การแยก Gateway ข้ามบัญชี NEW
เมื่อโหนดถูกเรียกใช้แบบข้ามบัญชีในขอบเขต enterprise:
- หน่วยความจำระดับบัญชี (ผูกกับ userId): ❌ ไม่สามารถเข้าถึงได้
- หน่วยความจำระดับองค์กร (ผูกกับ orgId): ✅ เข้าถึงได้
- หน่วยความจำระดับเซสชัน (ภายในเซสชันนี้): ✅ เข้าถึงได้
บังคับกรองด้วยแฟล็ก isRemoteSession ในขั้นตอนการค้นหาของ mem0Service —— การเรียกข้ามบัญชีไม่สามารถอ่านหน่วยความจำส่วนตัวของเจ้าของโหนดปลายทางได้
วัตถุประสงค์ของการออกแบบ: ปกป้องความเป็นส่วนตัวของบุคคล ในขณะที่ไม่กระทบต่อการแชร์ความรู้ระดับองค์กรร่วมกัน ดูรายละเอียดที่ สถาปัตยกรรมหลายโหนด
ความสามารถของ mem0
แบ็กเอนด์หน่วยความจำอิงจาก mem0 ให้ความสามารถอัตโนมัติต่อไปนี้:
| ความสามารถ | คำอธิบาย |
|---|---|
| อัปเดตอัตโนมัติ | ข้อมูลใหม่ทับข้อมูลเก่า (เช่น "ฉันชอบ Python" → "ฉันชอบ TypeScript") |
| รวมอัตโนมัติ | หน่วยความจำที่คล้ายกันถูกรวมเป็นรายการที่สมบูรณ์ยิ่งขึ้น |
| ลืมอัตโนมัติ | ข้อมูลที่ขัดแย้งกันจะล้างเวอร์ชันเก่าโดยอัตโนมัติ |
การป้องกันการหมดเวลา
| การดำเนินการ | หมดเวลา |
|---|---|
| ค้นหา/จัดการหน่วยความจำ | 25 วินาที |
| การดำเนินการหน่วยความจำระดับเซสชัน | 5 วินาที (หมดเวลาเร็ว ไม่บล็อกบทสนทนา) |
| การดึงความสัมพันธ์ของกราฟ | 3 วินาที (ลดระดับอย่างนุ่มนวลหลังหมดเวลา) |
สิ่งนี้หมายความว่าอย่างไรต่อผู้ใช้
ระบบหน่วยความจำทำให้ Agent สามารถ "รู้จักคุณ" ได้ หากไม่มีหน่วยความจำ ทุกครั้งที่สนทนา Agent ก็เหมือนคนแปลกหน้าที่พบกันครั้งแรก แต่เมื่อมีหน่วยความจำ Agent จะรู้ถึงความชอบ ภูมิหลังของโครงการ และนิสัยการทำงานของคุณ
การแสดงออกของสามมิติในทางปฏิบัติ:
- หน่วยความจำบัญชี: "คุณเคยบอกว่าชอบ TypeScript" → Agent จะให้ความสำคัญกับการใช้ TypeScript ในบทสนทนาของทุกองค์กร
- หน่วยความจำองค์กร: ผู้ดูแลระบบเพิ่ม "บริษัทใช้ฐานข้อมูล PostgreSQL" → เมื่อสมาชิกทุกคนในองค์กรพูดคุยเรื่องฐานข้อมูลกับ Agent, Agent จะแนะนำโซลูชัน PostgreSQL เป็นค่าเริ่มต้น
- หน่วยความจำเซสชัน: คุณพูดในบทสนทนานี้ว่า "โครงการปัจจุบันชื่อ Project Alpha" → Agent จะจำได้ในบทสนทนานี้ แต่ในบทสนทนาใหม่อาจจะไม่
คุณสามารถจัดการหน่วยความจำได้ดังนี้:
- สำหรับความชอบส่วนตัว: พูดในบทสนทนาว่า "จดจำไว้ว่าฉันชอบใช้ธีม dark" หรือเพิ่มด้วยตนเองที่ การตั้งค่า APP → หน่วยความจำ
- สำหรับความรู้ขององค์กร: ติดต่อผู้ดูแลระบบเพื่อเพิ่มที่ การจัดการพื้นที่ → การตั้งค่าขั้นสูง → หน่วยความจำองค์กร
- พบว่าหน่วยความจำผิดพลาด: พูดในบทสนทนาว่า "ลืมความชอบเกี่ยวกับ Python ก่อนหน้านี้" หรือลบโดยตรงในการจัดการหน่วยความจำ
- ดูหน่วยความจำที่มีอยู่: การตั้งค่า APP → หน่วยความจำ สามารถเรียกดูรายการและกราฟได้
เอกสารที่เกี่ยวข้อง
- การจัดการหน่วยความจำ — หน้าจัดการหน่วยความจำฝั่ง APP
- การตั้งค่าขั้นสูง — หน่วยความจำองค์กร — การจัดการหน่วยความจำระดับองค์กร
- การจัดการเครื่องมือ — เครื่องมือที่เกี่ยวข้องกับหน่วยความจำ (memory_query, memory_manage)
- สถาปัตยกรรมหลายโหนด — กลไกการแยก Gateway ข้ามบัญชี
