sabmemory
轻量级Rust MCP内存服务器。接近零的RAM替代了基于嵌入式的存储系统。
~6 MB RAM 在生产中。单个4.1 MB静态二进制文件。没有Python,没有Node.js,没有ML运行时,没有外部依赖。内置网络仪表板,具有知识图可视化功能。
为什么是sabmemory?
每个其他MCP内存服务器都需要大量的运行时(Python/Node.js)、用于嵌入的ML模型或云API调用。sabmemory使用SQLite FTS5全文搜索而不是向量嵌入——以资源成本的一小部分实现快速、相关的搜索。
与其他MCP内存服务器的比较
概述
| 服务器 | 语言 | 星级 | 许可证 | 搜索方法 | RAM使用率 | 安装大小 |
|---|---|---|---|---|---|---|
| sabmemory | 锈 FTS5 + BM25 | ~6 MB | 4.1 MB二进制文件 | |||
| mcp存储器服务 | Python | 1.5k | Apache 2.0 | BM25+ONNX矢量混合 | ~500-850 MB | ~400 MB(型号+部署) |
| 健忘的 | Python | 190 | MIT | FastEmbed+交叉编码器重新排序 | ~300-500 MB | ~200 MB(型号+显示器) |
| mem0 | Python/TS | 49.1k | Apache 2.0 | LLM驱动的提取+向量 | ~ 300-500 MB | pip安装+LLM API |
| 基本内存 | Python | 2.6k | MIT | FastEmbed矢量搜索 | 约200-400 MB | pip安装(约200 MB) |
| @模型上下文协议/服务器内存 | TypeScript | 80.5k\* | MIT | 实体图遍历 | ~50-80 MB | npm安装 |
| 超级存储器 | TypeScript | 16.8k | MIT | 混合RAG(云) | 云托管 | SaaS |
\*星号显示的是modelcontextprotocol/servers monorepo,而不是内存包。
特性
| 功能 | sabmemory | mcp内存服务 | 健忘 | mem0 | 基本内存 | @mcp/memory | 超级内存 | |
|---|---|---|---|---|---|---|---|---|
| MCP工具 | 49 | 15+(REST+MCP) | 42(3元) | ~10 | ~10 | 4 | 云API | |
| 知识图谱 | 是 | 是(键入边) | 是 | 否 | 否 | 是(三元组) | 否 | |
| 实体系统 | 是(键入,AKA) | 否 | 是 | 否 | 否 | 有(简单) | 否 | |
| 内存版本控制 | 是(链) | 否 | 否 | 不 | 否 | 是 | ||
| 自动链接 | 是(FTS5) | 否 | 是(矢量) | 否 | ||||
| 自动忘记/过期 | 是 | 是(衰变) | 否 | 否 | 不 | 是 | ||
| 代币预算 | 是 | 否 | 是 | 不 | 否 | 否 | 不 | 不 |
| 项目 | 是 | 否 | 是 | 不 | 否 | 否 | 不 | 不 |
| 文档 | 是 | 否 | 是 | 不是 | 是(Markdown) | 否 | 否 | |
| 代码伪影 | 是 | 否 | 是 | 不 | 否 | 否 | 不 | 不 |
| 用户配置文件 | 是(自动生成) | 否 | 否 | 是 | 否 | 不 | 否 | |
| Web仪表板 | 是(3D WebGL) | 是 | 否 | 是(OpenMemory) | 否 | 否 | 有(SaaS) | |
| 多用户 | 单用户(本地) | 是(身份验证) | 是的(多租户) | 是 | 单用户 | 单租户 | 是(SaaS) | |
| 集装箱范围界定 | 是 | 否 | 否 | 无 | 无 | 否 | 不 | 否 |
运行时和依赖关系
| 特性 | sabmemory | mcp内存服务 | 健忘 | mem0 | 基本内存 | @mcp/memory | 超级内存 | |
|---|---|---|---|---|---|---|---|---|
| 运行时 | 无(静态二进制) | Python 3.10+ | Python 3.12+ | Python 3.8+ | Python 3.11+ | Node.js 18+ | 云 | |
| 外部服务 | 无 | 无(ONNX本地) | 无(FastEmbed本地) | OpenAI API密钥 | 无 | 没有 | 云API | |
| 需要ML模型 | 不 | 是(MiniLM-L6-v2) | 是(bge-small-en) | 是\[通过LLM API\]\] | 是\[快速嵌入\] | 否 | 是\[云\] | |
| 存储后端 | SQLite(捆绑) | SQLite vec | SQLite或PostgreSQL | Qdrant/ChromaDB/自定义 | SQLite+Markdown | JSONL文件 | 云 | |
| Docker支持 | 不需要 | 是 | 是 | 否 | 否 | 不适用 | ||
| 安装命令 | cargo build | pip install | uvx forgetful-ai | pip install mem0ai | pip install basic-memory | npx | 注册 | |
| 需要配置 | 零配置 | .env 推荐 | Zero-config | 需要LLM API密钥 | Zero-connfig | Zero-cononfig | 需要帐户 | |
| 离线操作 | 是 | 是 | 是 | 不 (需要LLM API) | 是 | 是 | 不 | |
| 自托管 | 是 | 是 | 有 | 是 | 对 | 有 | 有 | 无(SaaS) |
搜索质量权衡
sabmemory以语义相似性换取资源效率。FTS5+BM25执行关键字感知排名搜索,而不是意义感知向量搜索。在实践中,这对于MCP内存用例来说效果很好,因为:
- 记忆是简短的原子笔记,带有明确的关键字和标签
- 编写内存的代理与搜索内存的代理是同一个代理——它使用一致的术语
- 无论词汇匹配如何,重要性得分提升都会显示最相关的结果
- 通过FTS5相似性自动链接在写入时捕获相关概念
对于需要真正语义搜索的用例(在搜索“car”时找到“automotive”),基于嵌入的服务器(如mcp内存服务或Forgetful)更合适。
在2 GB VPS(Ubuntu 24.04)上测量。 sabmemory RSS:6.5 MB Ps正在使用中,包含19个内存、2个实体、2个项目和1个文档。空闲实例降至约2 MB。
特性
- 49个本地MCP工具 --内存、实体、项目、文档、代码工件、关系、配置文件、版本控制
- FTS5全文搜索 BM25排名+重要性得分提升
- 内存版本控制 --具有关系类型(更新/扩展/派生)的版本链,灵感来自 超级存储器
- 自动遗忘 --set
forget_after自动到期日期;软遗忘与过时的区别 - 集装箱范围界定 —
container_tag命名空间隔离字段 - 自动链接 --新存储器通过FTS5自动链接到类似的现有存储器
- 代币预算搜索 --结果受可配置令牌预算的限制(默认8000)
- 知识图谱 --具有类型化关系、双向内存链接的实体
- 文档和代码工件 --存储长格式内容和可重用代码片段
- 用户配置文件 --从高重要性记忆(静态+动态事实)自动生成
- 内置迁移 --从导入数据 健忘 数据库
安装
来源
git clone https://github.com/Sablinova/sabmemory.git
cd sabmemory
cargo build --release
cp target/release/sabmemory ~/.local/bin/需求
- Rust 1.70+(使用2021版)
- 没有其他依赖关系——SQLite是通过rusqlite捆绑的
用法
MCP服务器(stdio)
sabmemory serve
# or just:
sabmemory服务器使用MCP协议通过stdin/stdout进行通信。在MCP客户端中配置它。
OpenCode配置
{
"mcp": {
"sabmemory": {
"type": "local",
"command": ["/path/to/sabmemory", "serve"],
"enabled": true
}
}
}从健忘的ai迁移
sabmemory migrate --from ~/.local/share/forgetful/forgetful.db迁移:项目、实体、内存、文档、代码工件、关系和所有关联。FTS索引在迁移后会自动重建。
数据存储
数据库: ~/.local/share/sabmemory/sabmemory.db
数据库在首次运行时自动创建。所有数据都存储在一个带有FTS5虚拟表的SQLite文件中,用于全文搜索。
建筑
搜索策略
- 自然语言查询被标记为FTS5搜索词
- FTS5 MATCH与BM25排名分数相关性
- 帖子过滤器:过时、遗忘、过期、项目、标签、容器、min_importance
- 重要性得分提升应用于最终排名
- 代币预算执行限制了结果大小
- 链接内存扩展增加了链接知识
内存模型
记忆遵循Zettelkasten(原子音符)原则:
- 标题:简短,可搜索(最多200个字符)
- 内容:单个概念(最多2000个字符)
- 上下文:为什么这很重要(最多500个字符)
- 关键词:用于搜索聚类(最多10个)
- 标签:用于分类(最多10个)
- 重要性:1-10分影响搜索排名和个人资料生成
版本控制(受超级内存启发)
记忆可以通过以下方式形成版本链 parent_memory_id:
- 更新:新版本与父版本相矛盾/替换父版本
- 扩展:新版本丰富了父版本
- 源自:系统推断关系
只有最新版本(is_latest=true)出现在搜索结果中。
自动忘记
集 forget_after (ISO 8601日期)存储在内存中。在每次查询之前,过期的内存会自动标记为遗忘。被遗忘的记忆被排除在搜索之外,但保留以供审计。
工具参考
记忆工具(13)
| 工具 | 说明 |
|---|---|
create_memory | 使用自动链接创建原子内存 |
get_memory | 获取所有关联的内存 |
update_memory | PATCH更新字段 |
delete_memory | 永久删除 |
query_memory | FTS5搜索与BM25+重要性提升 |
get_recent | 最近更新的记忆 |
link_memories | 创建双向链接 |
unlink_memories | 删除链接 |
mark_obsolete | 带有审计跟踪的软删除 |
forget_memory | 软遗忘(不同于过时) |
search_similar | 查找文本相似的记忆 |
create_version | 创建版本更新 |
get_version_chain | 获取完整版本历史记录 |
实体工具(15)
| 工具 | 说明 |
|---|---|
create_entity | 创建实体(人、组织、设备、概念) |
get_entity | 获取实体详细信息 |
update_entity | 补丁更新 |
delete_entity | 删除所有关联 |
list_entities | 列出/筛选实体 |
search_entities | 按姓名/别名搜索FTS |
get_entity_memories | 实体的内存ID |
link_entity_memory | 将实体链接到内存 |
unlink_entity_memory | 删除实体内存链接 |
link_entity_project | 将实体链接到项目 |
unlink_entity_project | 删除实体项目链接 |
create_relationship | 类型化定向关系 |
get_relationships | 获取实体关系 |
update_relationship | 更新关系 |
delete_relationship | 删除关系 |
项目工具(5)
| 工具 | 说明 |
|---|---|
create_project | 创建项目容器 |
get_project | 获取具有内存计数的项目 |
update_project | 补丁更新 |
delete_project | 删除(保留相关记忆) |
list_projects | 列出/筛选项目 |
文档工具(5)
| 工具 | 说明 |
|---|---|
create_document | 存储长表单内容 |
get_document | 获取完整内容 |
update_document | 补丁更新 |
delete_document | 删除 |
list_documents | 列表/筛选器 |
代码工件工具(5)
| 工具 | 说明 |
|---|---|
create_code_artifact | 存储可重用代码 |
get_code_artifact | 获取工件 |
update_code_artifact | 补丁更新 |
delete_code_artifact | 删除 |
list_code_artifacts | 列表/筛选器 |
用户和配置文件工具(4)
| 工具 | 说明 |
|---|---|
get_user | 获取用户信息 |
update_user_notes | 更新用户笔记 |
get_profile | 自动生成的配置文件 |
refresh_profile | 重新生成配置文件 |
元工具(2)
| 工具 | 说明 |
|---|---|
list_tools | 按类别列出所有工具 |
tool_info | 详细的工具信息+模式 |
Web仪表板
sabmemory包括一个内置的web仪表板,用于可视化您的知识图、浏览记忆和探索实体/项目/文档。
运行仪表板
sabmemory dashboard --port 3080仪表板在 http://localhost:3080 并提供:
- 知识图谱 --所有记忆、实体及其连接的交互式Three.js WebGL 3D可视化
- 内存浏览器 --包含重要性、标签和元数据的所有记忆的可搜索列表
- 实体资源管理器 --查看实体、其类型、别名和关系
- 项目视图 --具有相关内存计数的项目
- 文档视图 --存储的长格式文档
- 搜索 --在所有记忆中进行全文搜索
- 细节模态 --单击任何内存以查看完整内容、链接和关联
仪表板API
仪表板在上公开了一个REST API /api/:
| 端点 | 描述 |
|---|---|
GET /api/stats | 内存、实体、项目、文档和链接计数 |
GET /api/memories | 所有带有元数据的内存 |
GET /api/memory/{id} | 具有链接和关联的单个内存 |
GET /api/entities | 所有实体 |
GET /api/relationships | 具有已解析名称的实体关系 |
GET /api/projects | 具有内存计数的项目 |
GET /api/documents | 所有文件 |
GET /api/graph | 用于可视化的完整知识图(节点+边) |
GET /api/search?q=... | FTS5搜索 |
作为systemd服务运行
# Create user service
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/sabmemory-dashboard.service << 'EOF'
[Unit]
Description=sabmemory web dashboard
After=network.target
[Service]
ExecStart=%h/.local/bin/sabmemory dashboard --port 3080
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.target
EOF
# Enable and start
systemctl --user daemon-reload
systemctl --user enable --now sabmemory-dashboard反向代理(nginx)
要使用HTTPS为反向代理后面的仪表板提供服务,请执行以下操作:
server {
listen 443 ssl;
server_name memory.yourdomain.com;
location / {
proxy_pass http://127.0.0.1:3080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}积分
sabmemory的灵感来自并建立在以下想法之上:
- 超级存储器 --内存版本控制链、带过期的自动遗忘、基于容器的作用域、自动生成的用户配置文件、内存类型分类
- 健忘 --知识图架构(实体、关系、内存实体关联)、文档和代码工件存储、基于项目的组织、原子内存原理
许可证
麻省理工学院
