数据截至 (上游 commit 85532420387c)
MOSCore:记忆操作系统的内核
30 秒导读: MemOS 把"记忆"当成一种操作系统资源来管。
MOSCore就是这个 OS 的内核——它自己不实现记忆算法,而是像内核调度进程一样,编排多个用户、多个 MemCube(记忆容器)上的记忆操作与对话。你调用add/search/chat,内核负责鉴权、路由到对的 Cube、把检索到的记忆拼进 prompt、再把结果回写。真正"记忆怎么抽取、怎么组织、怎么检索"由后续各章的组件完成。
本章讲内核如何编排,不深入记忆内部算法(那委托给 MemReader、图谱组织、检索管线、调度器)。想先建立"三类记忆 + MemCube 容器"的心智模型,请先读 第 1 章。
1. 这是什么(零基础也能懂)
一句话定义: MOSCore(Memory Operating System Core)是一个记忆的操作系统内核——统一入口,管理若干 MemCube(记忆立方,装记忆的容器),并在多用户场景下提供增删查改与"带记忆的对话"。
它解决什么问题? 假设你在做一个能"记住用户"的 AI 助手。你会立刻遇到一堆脏活:
- 记忆存在哪个容器里?一个用户可能有多个 Cube,一个 Cube 可能被多个用户共享。
- 谁能读谁的记忆?多租户下必须鉴权,不能让 A 搜到 B 的私人记忆。
- 对话时怎么把"相关记忆"喂给大模型?检索、拼 prompt、回写历史,每次都要做。
MOSCore 把这些编排逻辑收拢到一处。你的应用只跟内核打交道,不用自己拼装记忆管线。
它对外能做什么(公共 API): 记忆的 CRUD + 对话 + 用户/Cube 治理。核心就这几组动词:
| 动词 | 方法 | 干什么 |
|---|---|---|
| 记 | add | 把消息/文档/纯文本变成记忆,存进某个 Cube |
| 查 | search / get / get_all | 按 query 检索、按 id 取、取全部 |
| 改删 | update / delete / delete_all | 改一条 、删一条、清空一个 Cube |
| 聊 | chat | 带着检索到的记忆跟 LLM 对话 |
| 治理 | create_user / register_mem_cube / share_cube_with_user | 建用户、挂载 Cube、共享 Cube |
用起来什么样: 一个最小真实用法(来自 src/memos/mem_os/main.py:79 的 MOS.simple() docstring 示例):
# 示意,非源码(改写自 main.py:94-104 的 docstring)
memory = MOS.simple() # 读环境变量自动配置,并自动挂载一个默认 Cube
memory.add("Hello world!") # 记一句话
response = memory.chat("What did I just say?") # 带着记忆回答
一句话直觉: 把 MOSCore 当操作系统内核,MemCube 当进程/文件,UserManager 当权限系统。内核自己不干活,它调度资源、做鉴权、串流程。
2. 顶层全景(内核大概怎么转)
内核由三块协作:公共 API 面(对外动词)、治理层(用户与 Cube 的鉴权、路由)、执行层(把请求落到具体 MemCube 的记忆组件上)。
怎么读下面这张图: 从上到下是一次调用的穿透顺序——先过 API,再过治理鉴权,最后落到某个 Cube 的记忆组件。
┌─────────────────────────────────────────┐
你的应用 ──▶ │ MOSCore 公共 API 面 │
│ add / search / get / update / delete │
│ / chat / register_mem_cube ... │
└───────────────────┬─────────────────────┘
│ ① 鉴权 + 路由
▼
┌─────────────────────────────────────────┐
│ 治理层 UserManager (SQLite) │
│ 校验 user 存在? 有权访问这个 cube? │
│ 一个 user ⇄ 多个 cube(多对多) │
└───────────────────┬─────────────────────┘
│ ② 拿到可访问的 cube_id
▼
┌─────────────────────────────────────────┐
│ 执行层 self.mem_cubes[cube_id] │
│ .text_mem / .act_mem / .pref_mem │
│ (真正的记忆抽取/组织/检索在这些组件) │
└─────────────────────────────────────────┘
▲
③ 可选:把请求异步抛给 MemScheduler(见第 6 章)
部件一句话职责:
| 部件 | 干什么 | 在哪 |
|---|---|---|
MOSCore | 内核本体,编排一切 | src/memos/mem_os/core.py:38 |
self.mem_cubes | cube_id → GeneralMemCube 的字典(多用户时用线程安全字典) | core.py:53 |
UserManager | 用户/Cube 的持久化与鉴权(SQLAlchemy + SQLite) | src/memos/mem_user/user_manager.py:97 |
self.chat_history_manager | user_id → ChatHistory,逐用户维护对话历史 | core.py:51 |
MOS(子类) | 面向易用性的增强:自动配置 + CoT 分解式检索 | src/memos/mem_os/main.py:24 |
mem_scheduler | 可选的异步调度器,接线开关 | core.py:82(@property) |
主线走一遍(高层): 应用调 chat("...") → 内核查该用户可访问的 Cube → 在每个 Cube 的 text_mem 上检索记忆 → 把记忆拼进 system prompt → 连同对话历史喂给 LLM → 回写这轮问答到历史。下一节展开这条链。