ระบบหน่วยความจำสามมิติ

ระบบหน่วยความจำสามมิติ

ภาพรวม

ระบบหน่วยความจำของพื้นที่ทำงานใช้สถาปัตยกรรมสามมิติ โดยจัดเก็บและจัดการความรู้ในสามมิติ ได้แก่ บัญชี องค์กร และเซสชัน หน่วยความจำผสานรวมกับบทสนทนาอย่างลึกซึ้ง —— ทุกครั้งที่สนทนาจะมีการค้นหาหน่วยความจำที่เกี่ยวข้องเพื่อฉีดเข้าสู่บริบท และหลังจบการโต้ตอบแต่ละรอบจะดึงหน่วยความจำใหม่ออกมาโดยอัตโนมัติ

ฐานเทคโนโลยี: 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 เอนทิตี)
                      
                      (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
                      
                      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 เสถียร:

  • คำนวณประเภทเอนทิตีด้วย djb2 hash → ดัชนีสี
  • เอนทิตีประเภทเดียวกันจะคงสีเดิมทั้งในมุมมองต่าง ๆ และในเวลาต่าง ๆ
  • ชุดสี 10 สีรองรับการใช้งานแบบวนซ้ำสำหรับประเภทได้ไม่จำกัด

การแก้บั๊ก: เมื่อแมปความสัมพันธ์ของกราฟ ฟิลด์ sourceTypes / targetTypes เคยถูกทิ้งไป ทำให้ทุกโหนดถอยกลับไปใช้ fallback สีเทา บั๊กนี้ได้รับการแก้ไขแล้ว (ดู sidecar/src/mem0Service.ts)

การเจาะลึกหลายระดับ

คลิกที่โหนดเพื่อขยายเอนทิตีที่เกี่ยวข้อง เจาะลึกเข้าสู่เครือข่ายความรู้ทีละชั้น เอนจินกราฟรองรับ:

  • neighborhood() — การค้นหาย่านใกล้เคียงแบบ N-hop
  • shortestPath() — เส้นทางที่สั้นที่สุดระหว่างสองเอนทิตี
  • extractEntitiesFromText() — ดึงชื่อเอนทิตีจากข้อความ

การทำงานร่วมกันของหน่วยความจำกับบทสนทนา

จังหวะการค้นหาหน่วยความจำ

จังหวะ การกระทำ
สร้างบทสนทนาใหม่ ค้นหาหน่วยความจำภาพรวมบัญชี + หน่วยความจำภาพรวมองค์กร แล้วต่อเข้ากับ system prompt
ผู้ใช้ส่งข้อความ เครื่องมือ memory_query ค้นคืนหน่วยความจำที่เกี่ยวข้องเชิงความหมาย
การขยายกราฟ searchWithGraphExpansion — ค้นคืนเชิงความหมาย + ขยายกราฟ 1-hop คืนค่าเอนทิตีและเส้นเชื่อมที่เกี่ยวข้อง

ตำแหน่งการฉีดหน่วยความจำ

ฉีดภาพรวมหน่วยความจำสองส่วนลงใน system prompt:

คุณคือผู้ช่วย AI ของ GPTBots... ## ภาพรวมผู้ใช้ - ผู้ใช้เป็นวิศวกรพัฒนา front-end - ชอบใช้ TypeScript - ... ## ภาพรวมองค์กร - บริษัทใช้เทคสแตก React - โค้ดเนมโครงการ Project Alpha - ...
                      
                      คุณคือผู้ช่วย 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 → หน่วยความจำ สามารถเรียกดูรายการและกราฟได้

เอกสารที่เกี่ยวข้อง