Bộ nhớ Workspace v2 (offline): ghi chú nghiên cứu

Mục tiêu: Workspace Mayros (agents.defaults.workspace, mặc định ~/.mayros/workspace) nơi "bộ nhớ" được lưu trữ như một file Markdown mỗi ngày (memory/YYYY-MM-DD.md) cộng một tập hợp nhỏ file ổn định (ví dụ: memory.md, MAYROS.md).

Tài liệu này đề xuất một kiến trúc bộ nhớ offline-first giữ Markdown làm nguồn chân lý chuẩn, có thể xem xét, nhưng thêm recall có cấu trúc (tìm kiếm, tóm tắt entity, cập nhật độ tin cậy) qua chỉ mục dẫn xuất.

Tại sao thay đổi?

Thiết lập hiện tại (một file mỗi ngày) tuyệt vời cho:

  • ghi nhật ký "chỉ thêm"
  • chỉnh sửa con người
  • độ bền + khả năng kiểm toán được hỗ trợ git
  • capture ma sát thấp ("chỉ viết nó ra")

Nó yếu cho:

  • truy xuất recall cao ("chúng ta quyết định gì về X?", "lần cuối chúng ta thử Y?")
  • câu trả lời trung tâm entity ("nói cho tôi về Alice / The Castle / warelay") mà không cần đọc lại nhiều file
  • ổn định opinion/preference (và bằng chứng khi nó thay đổi)
  • ràng buộc thời gian ("điều gì đúng trong Nov 2025?") và giải quyết xung đột

Mục tiêu thiết kế

  • Offline: hoạt động không có mạng; có thể chạy trên laptop/Castle; không phụ thuộc cloud.
  • Có thể giải thích: item được truy xuất nên có thể quy cho (file + vị trí) và tách biệt khỏi suy luận.
  • Nghi lễ thấp: ghi nhật ký hàng ngày vẫn là Markdown, không có công việc schema nặng.
  • Tăng dần: v1 hữu ích chỉ với FTS; ngữ nghĩa/vector và đồ thị là nâng cấp tùy chọn.
  • Thân thiện với Agent: làm cho "recall trong ngân sách token" dễ dàng (trả về gói nhỏ sự kiện).

Mô hình ngôi sao Bắc đẩu (Hindsight × Letta)

Hai phần để pha trộn:

  1. Vòng lặp điều khiển kiểu Letta/MemGPT
  • giữ một "core" nhỏ luôn trong ngữ cảnh (persona + sự kiện người dùng chính)
  • mọi thứ khác là ngoài ngữ cảnh và được truy xuất qua công cụ
  • ghi bộ nhớ là lệnh gọi công cụ rõ ràng (append/replace/insert), được lưu trữ, sau đó được tiêm lại turn tiếp theo
  1. Substrate bộ nhớ kiểu Hindsight
  • tách rời những gì được quan sát vs những gì được tin vs những gì được tóm tắt
  • hỗ trợ retain/recall/reflect
  • opinion mang độ tin cậy có thể phát triển với bằng chứng
  • truy xuất nhận biết entity + truy vấn thời gian (ngay cả không có đồ thị kiến thức đầy đủ)

Kiến trúc đề xuất (Markdown nguồn chân lý + chỉ mục dẫn xuất)

Kho lưu trữ chuẩn (thân thiện git)

Giữ ~/.mayros/workspace làm bộ nhớ con người có thể đọc chuẩn.

Bố cục workspace được đề xuất:

~/.mayros/workspace/
  memory.md                    # nhỏ: sự kiện + preference bền (core-ish)
  memory/
    YYYY-MM-DD.md              # log hàng ngày (thêm; tự sự)
  bank/                        # trang bộ nhớ "được gõ" (ổn định, có thể xem xét)
    world.md                   # sự kiện khách quan về thế giới
    experience.md              # agent đã làm gì (ngôi thứ nhất)
    opinions.md                # prefs/judgments chủ quan + độ tin cậy + con trỏ bằng chứng
    entities/
      Peter.md
      The-Castle.md
      warelay.md
      ...

Lưu ý:

  • Log hàng ngày vẫn là log hàng ngày. Không cần biến nó thành JSON.
  • File bank/ được curate, được tạo bởi công việc reflection và vẫn có thể được chỉnh sửa bằng tay.
  • memory.md vẫn "nhỏ + core-ish": những thứ bạn muốn agent thấy mọi phiên.

Kho lưu trữ dẫn xuất (recall máy)

Thêm chỉ mục dẫn xuất dưới workspace (không nhất thiết được theo dõi git):

~/.mayros/workspace/.memory/index.sqlite

Hỗ trợ nó với:

  • Schema SQLite cho sự kiện + liên kết entity + metadata opinion
  • SQLite FTS5 cho recall từ vựng (nhanh, nhỏ, offline)
  • bảng embedding tùy chọn cho recall ngữ nghĩa (vẫn offline)

Chỉ mục luôn có thể xây dựng lại từ Markdown.

Retain / Recall / Reflect (vòng lặp hoạt động)

Retain: chuẩn hóa log hàng ngày thành "sự kiện"

Insight chính của Hindsight quan trọng ở đây: lưu trữ sự kiện tự sự, tự chứa, không phải snippet nhỏ.

Quy tắc thực tế cho memory/YYYY-MM-DD.md:

  • vào cuối ngày (hoặc trong), thêm phần ## Retain với 2–5 bullet là:
    • tự sự (ngữ cảnh cross-turn được bảo toàn)
    • tự chứa (standalone có ý nghĩa sau)
    • được gắn thẻ với loại + mention entity

Ví dụ:

## Retain
- W @Peter: Hiện ở Marrakech (Nov 27–Dec 1, 2025) cho sinh nhật Andy.
- B @warelay: Tôi sửa crash Baileys WS bằng cách bao bọc handler connection.update trong try/catch (xem memory/2025-11-27.md).
- O(c=0.95) @Peter: Thích phản hồi ngắn gọn (<1500 ký tự) trên WhatsApp; nội dung dài đi vào file.

Phân tích tối thiểu:

  • Tiền tố kiểu: W (world), B (experience/biographical), O (opinion), S (observation/summary; thường được tạo)
  • Entity: @Peter, @warelay, v.v. (slug ánh xạ đến bank/entities/*.md)
  • Độ tin cậy opinion: O(c=0.0..1.0) tùy chọn

Nếu bạn không muốn tác giả nghĩ về nó: công việc reflect có thể suy ra các bullet này từ phần còn lại của log, nhưng có phần ## Retain rõ ràng là "đòn bẩy chất lượng" dễ nhất.

Recall: truy vấn qua chỉ mục dẫn xuất

Recall nên hỗ trợ:

  • từ vựng: "tìm thuật ngữ / tên / lệnh chính xác" (FTS5)
  • entity: "nói cho tôi về X" (trang entity + sự kiện liên kết entity)
  • thời gian: "điều gì xảy ra khoảng Nov 27" / "từ tuần trước"
  • opinion: "Peter thích gì?" (với độ tin cậy + bằng chứng)

Định dạng trả về nên thân thiện với agent và trích dẫn nguồn:

  • kind (world|experience|opinion|observation)
  • timestamp (ngày nguồn, hoặc phạm vi thời gian được trích xuất nếu có)
  • entities (["Peter","warelay"])
  • content (sự kiện tự sự)
  • source (memory/2025-11-27.md#L12 v.v.)

Reflect: tạo trang ổn định + cập nhật niềm tin

Reflection là công việc được lên lịch (hàng ngày hoặc heartbeat ultrathink) mà:

  • cập nhật bank/entities/*.md từ sự kiện gần đây (tóm tắt entity)
  • cập nhật độ tin cậy bank/opinions.md dựa trên củng cố/mâu thuẫn
  • tùy chọn đề xuất chỉnh sửa cho memory.md (sự kiện bền "core-ish")

Phát triển opinion (đơn giản, có thể giải thích):

  • mỗi opinion có:
    • phát biểu
    • độ tin cậy c ∈ [0,1]
    • last_updated
    • liên kết bằng chứng (hỗ trợ + mâu thuẫn id sự kiện)
  • khi sự kiện mới đến:
    • tìm opinion ứng viên bằng sự chồng chéo entity + similarity (FTS đầu tiên, embedding sau)
    • cập nhật độ tin cậy bằng delta nhỏ; nhảy lớn yêu cầu mâu thuẫn mạnh + bằng chứng lặp lại

Tích hợp CLI: độc lập vs tích hợp sâu

Khuyến nghị: tích hợp sâu trong Mayros, nhưng giữ thư viện cốt lõi có thể tách rời.

Tại sao tích hợp vào Mayros?

  • Mayros đã biết:
    • đường dẫn workspace (agents.defaults.workspace)
    • mô hình phiên + heartbeat
    • mẫu logging + khắc phục sự cố
  • Bạn muốn agent tự gọi công cụ:
    • mayros memory recall "…" --k 25 --since 30d
    • mayros memory reflect --since 7d

Tại sao vẫn chia thư viện?

  • giữ logic bộ nhớ có thể test không có gateway/runtime
  • tái sử dụng từ ngữ cảnh khác (script local, ứng dụng desktop tương lai, v.v.)

Shape: Công cụ bộ nhớ được dự định là lớp CLI + thư viện nhỏ, nhưng điều này chỉ là khám phá.

"S-Collide" / SuCo: khi nào sử dụng nó (nghiên cứu)

Nếu "S-Collide" đề cập đến SuCo (Subspace Collision): đó là cách tiếp cận truy xuất ANN nhắm mục tiêu sự đánh đổi recall/latency mạnh bằng cách sử dụng va chạm đã học/có cấu trúc trong không gian con (paper: arXiv 2411.14754, 2024).

Quan điểm thực tế cho ~/.mayros/workspace:

  • đừng bắt đầu với SuCo.
  • bắt đầu với SQLite FTS + embedding đơn giản (tùy chọn); bạn sẽ nhận được hầu hết thắng UX ngay lập tức.
  • chỉ cân nhắc giải pháp lớp SuCo/HNSW/ScaNN khi:
    • corpus lớn (hàng chục/hàng trăm nghìn chunk)
    • tìm kiếm embedding brute force trở nên quá chậm
    • chất lượng recall bị nút cổ chai có nghĩa bởi tìm kiếm từ vựng

Lựa chọn thay thế thân thiện offline (trong độ phức tạp tăng dần):

  • SQLite FTS5 + bộ lọc metadata (zero ML)
  • Embedding + brute force (hoạt động ngạc nhiên xa nếu số lượng chunk thấp)
  • Chỉ mục HNSW (phổ biến, mạnh mẽ; cần binding thư viện)
  • SuCo (cấp nghiên cứu; hấp dẫn nếu có triển khai vững bạn có thể nhúng)

Câu hỏi mở:

  • model embedding offline tốt nhất cho "bộ nhớ trợ lý cá nhân" trên máy của bạn (laptop + desktop) là gì?
    • nếu bạn đã có Ollama: nhúng với model local; nếu không cung cấp model embedding nhỏ trong toolchain.

Pilot hữu ích nhỏ nhất

Nếu bạn muốn phiên bản tối thiểu, vẫn hữu ích:

  • Thêm trang entity bank/ và phần ## Retain trong log hàng ngày.
  • Sử dụng SQLite FTS cho recall với trích dẫn (đường dẫn + số dòng).
  • Chỉ thêm embedding nếu chất lượng recall hoặc quy mô yêu cầu nó.

Tham khảo

  • Khái niệm Letta / MemGPT: "block bộ nhớ core" + "bộ nhớ archival" + tự chỉnh sửa bộ nhớ điều khiển công cụ.
  • Báo cáo kỹ thuật Hindsight: "retain / recall / reflect", bộ nhớ bốn mạng, trích xuất sự kiện tự sự, phát triển độ tin cậy opinion.
  • SuCo: arXiv 2411.14754 (2024): "Subspace Collision" truy xuất nearest neighbor gần đúng.