Mnemosyne OS 深度评测:31 星的零依赖 AI 记忆系统,自曝 11 个缺陷,我实测又挖出 7 个

用过 MCP 的人几乎都撞过同一堵墙:会话一长,模型就忘了你三小时前交代过的偏好,你得重新说一遍。市面上叫「AI 记忆」的项目多到能单独开一个分区,绝大多数是往提示词里灌 JSON 的壳。

Mnemosyne OS 不属于这一类。它 31 颗星,却先交出了一份 11 条缺陷的公开台账,每条带实测数据、根因和修法。我把仓库 clone 下来,先跑它自己写的 21 项验收脚本——21 项全绿;再把 23 个 CLI 子命令逐个跑了一遍——两个直接崩,Web 面板首页是白的

零依赖不是口号,是 16,132 行标准库

Mnemosyne 是零依赖、本地优先的 AI 记忆系统(MIT,作者 FrankHu-HK,7.0.1 版发布于 9 月 14 日),可以当 Python 库、CLI、HTTP API,也可以当 MCP server 挂给 Claude Code 或 Cursor。仓库 89 个文件、57 个 Python 文件、16,132 行代码,最大的 brain.py 2,404 行;文档 24,088 行 Markdown,其中一份 818 行的部署指南,逐行标注「这是什么」「为什么」。

零依赖这件事我单独查了:mnemosyne/storage/ 目录下所有 import 只有标准库(sqlite3、hashlib、json、re…),setup.pyinstall_requires 是空列表,PyPI 上的 requires_dist 只有 numpy / transformers / tiktoken 三个可选 extras。表上写着「no numpy, no torch, no vector DB」,这句是真的。

反直觉的地方在于它的设计取向:它把「记忆」当成一个可运营、可审计的对象,而不是一个向量库。每条记忆带可信度轨迹和审计日志,写入走 SHA-256 链式账本,低价值记忆按经济学模型迁到温层/冷层(gzip 归档 + 布隆过滤,是迁移不是删除),向量后端是可插拔插件(numpy、Qdrant、重排器、加密、HRR)。MCP 面 14 个工具,协议 2024-11-05,我实测握手正常、工具数与文档一致。

它自曝的 11 条缺陷里,有几条特别能说明这个项目的气质:

编号 症状(作者原话压缩) 根因 状态
F1 / F1b 经 MCP 写入的记忆不进向量库,语义召回没有增益 MCP 固定走 fast=True,而唯一的 add() 调用在 else 分支 7.0.1 已修
F6 无关查询也返回高分,任何「分数阈值」规则都失效 最终分是加权和,n_time×0.20 + conf×0.10 构成近似恒定的底 行为特性,不修
F7 retain 传了 confidence 不生效,落库恒为 0.7 Notary 评估段无条件覆盖调用方入参 7.0.1 已修
F9 拿到 recall 结果也无法遗忘或更正 返回项里没有 memory_id 7.0.1 已修
F11 forget 之后记录仍可能被召回 缓存失效判据用文件 mtime,而 SQLite 走 WAL 7.0.1 已修

真正狠的是它对 F6 的结论:相关查询首条 0.8332,无关查询首条 0.8232,分差只有 0.0100。作者自己写下一句「排序可用于挑选,分数不可用于过滤」,并把这条定性为「不可修复的行为特性」。一个项目愿意公开承认自己的打分没有绝对标度,这在万星仓库里都少见。

实测:它自曝 11 条,我又挖出 7 条

先说立住了的部分,这些都是我在这台机器上跑出来的:

  • scripts/verify_memory_lifecycle.py 21 项断言 21/21 通过,覆盖了「遗忘后不再被召回」「更正的旧记忆 verification=superseded」「recall 回传 superseded_by」这些它自己修过又踩过的点;
  • verify.py 自检通过,写入 2.50 ms/条、检索 2.39 ms/次;
  • 我通过 MCP 传 confidence=0.95,返回的就是 0.95,F7 确实修了;读代码确认 fast 分支现在一次 encode() 同时喂 SQLite 与向量后端,F1/F1b 的修法也落地了;
  • 四个中文查询,正确答案 top-1 全部命中,无关查询首条 0.415 对相关查询首条 0.442——与它自曝的 F6 完全一致;
  • Web 面板的静态资源里 0 个外部 CDN 引用,断网可用。

然后是它没写进台账的 7 条:

编号 我的实测证据 影响
A git clone 后启动 Web 面板,//login/index.html 三条路由都返回 index.html missing README 表格里的「本地暗色仪表盘」从源码装是白屏
B CLI 写 5 条记忆,Web 面板「记忆总数」显示 1;两边互相搜不到 同一个 --dir、同一个 default 命名空间,两套库
C memory.db 里的正文后 verify-integrity 仍报「✓ 完整」;删账本最后 3 条也报完整 哈希链只绑自己,不绑记忆内容,截断不可检测
D mnemosyne repairUnicodeDecodeError,崩在 brain.py:2075 默认 SQLite 后端下必崩
E mnemosyne hindsights-bench 跑到第 4/6 步 → AttributeError: 'ConsolidationReport' object has no attribute 'get' 内置对标评测跑不到底
F sk-proj-…(OpenAI 现行项目密钥)与 sk-ant-api03-…(Anthropic)写入后明文落库,注入评分 0.0 脱敏只覆盖旧的 sk-+8 位格式
G status 显示「容量:100.0% (limit=8)」,库里只有 8 条 未设上限时 limit=total,容量条恒满

三条最值得展开。

第一,Web 面板是被自己的 .gitignore 吃掉的。 面板读 static/index.html,读不到就返回那句 index.html missing;而仓库的 .gitignore 里赫然写着一行 .html,只放行了 assets/*——前端入口正好在这个通配符下,从来没被提交过。setup.pypackage_data 里倒是老老实实声明了 static/index.htmlstatic/logo.jpg(后者同样缺失)。我下载了 PyPI 上的 wheel 解开看:index.html 26,100 字节、logo.jpg 7,620 字节,都在包里。所以同一份代码,pip install 能看到仪表盘,git clone 看不到。我把 wheel 里的静态文件补回源码树再刷新,登录页立刻出来了。

第二,CLI 和 MCP/Web 写进两个不同的文件。 python mnemosyne.py --dir ./mem retain 落在

/memory.db;MCP server 和 Web 面板落在 /data/namespaces/default/memory.db。根因在 storage/sqlite_backend.py_resolve_paths:namespace 为假值时走「扁平 legacy 布局」,而 CLI 压根没有 --namespace 参数,另两个入口的默认值却是字符串 "default",于是走了命名空间目录。后果很具体:先用 CLI 把偏好灌进去,再挂 MCP 给模型用,模型看到的是一张空表。而 docs/RECALL_STRATEGY.md 的隔离表只写了「命名空间 → 独立 data/namespaces//memory.db」。

第三,那条哈希链只证明账本自己没被动过。 README 的卖点是「SHA-256 chained ledger — verify_chain() detects tampering and locates the exact corrupted record」,模块 docstring 更进一步写了「any modification to a historical entry or to the underlying memory record breaks the chain」。我把一条记忆的正文改掉(连前 50 个字符一起改),verify-integrity 照样报「✓ 完整 | 首个断裂点:None」;删掉账本最后 3 条记录,它报「✓ 完整 | 账本条目:5」。原因很朴素:账本条目里只存了 {"content_preview": content[:50]},而校验时是拿账本自己存的 payload 重算哈希,跟 memory.db 没有任何绑定。作为对照,我改了一下 ledger.db 里的 payload,它立刻报「✗ 损坏 | 首个断裂点:1」。检测有效,但范围是账本文件本身,不是记忆;纯截断因为没有外部锚点,也不可检测。审计留痕够用,当防篡改证据是过度承诺。

另外几条不用展开但值得知道:repair 崩是因为它把 index_path(SQLite 默认后端下就是 memory.db 这个二进制文件)当 JSONL 逐行读;hindsights-bench 崩在把一个 ConsolidationReport 对象当 dict 用;status 的容量条在未设上限时永远 100%。还有一处工程卫生问题:全仓 57 个 Python 文件、16,132 行代码,一个测试文件都没有setup.py 还在 exclude 已经不存在了的 testsbenchmarksquality_eval),无 tag、无 release;PyPI 上的包停在 8 月 24 日的 7.0.0,仓库已经是 9 月 14 日的 7.0.1——pip install 装到的,正好是 11 条缺陷一条没修的那一版。

还有一个不应该漏掉的细节:11 个源文件里有 97 处中英混排的残句,全都落在用户能看到的地方——引擎Version:7.0.1❌ 未finds :Type分布均Value可merges关Key决策Found 冲突 12writes 机制Test。看起来像是某次批量「中译英」留下的半成品,demobenchmark 两个命令里最密集。

它在坐标系里的位置

跟本站评过的 context-mode 比,一个管「上下文进得来」,一个管「记忆留得下」:context-mode 把 315KB 工具输出压成 5.4KB,解决的是爆上下文;Mnemosyne 解决的是跨会话失忆,两者叠起来才是一套。

i-have-adhd 比,两者是同一种气质的极端版——自曝文档的质量远超自测覆盖。差别在于 i-have-adhd 的自曝是「我的闸门太严」,Mnemosyne 的自曝是「我的工具是死的」:作者自己在召回策略文档里写明 graph_query 「永远返回 edges: [],是一个死工具」,temporal_query 的参数是实体名而不是时间范围,「传『昨天』返回 nodes:["昨天"], edges:[],无意义」。在 14 个 MCP 工具里,这两个占了两席,而文档第 4 节直接建议集成方「从强制流程里删掉它们」。

适合谁:想要一套零依赖、可离线、带审计轨迹的本地记忆层;在同一台机器上跑多 Agent,并且接受「正文与向量隔离,但审计账本/图谱/统计是全局共享」这个前提;以及愿意读 24,000 行中文文档的人。

不适合谁:指望开箱即用 Web 管理面板的人;要现成语义检索质量的人(向量后端默认不装,得自己接 BGE-M3 加 Qdrant);打算把 CLI 和 MCP 混着用的人;以及想拿哈希链当合规证据的人。

判断:文档比代码值钱

这个仓库最值钱的部分不是那 16,132 行代码,是它的文档:11 条缺陷台账、21 项验收断言、召回策略评估(连「每轮都召回到底划不划算」都算了代价)。这套东西在万星项目里都少见——大多数项目连自己的缺陷都不敢写在仓库里,更不会写上「分差只有 0.0100,所以阈值规则全部失效」这种自断后路的话。代价同样明显:文档走到了够做验收的深度,代码和测试没跟上,所以 CLI 里还留在会崩的子命令,面板首页还躺在 .gitignore 里,脱敏规则还停在两年前的密钥格式。

真要用,我的建议是三条。第一,别 clone 源码跑 Web 面板——要么 pip install mnemosyne-os 拿前端完整的 7.0.0,要么 clone 7.0.1 之后从 wheel 里把 static/index.html 补回来。第二,先写测试再上生产,它自己一行都没有。第三,如果你只是想学「一个人的 AI 记忆系统该怎么自我验收」,docs/ 下的 KNOWN_DEFECTS.mdACCEPTANCE_GUIDE.mdRECALL_STRATEGY.md 三个文件,比把项目跑起来更值得读。

关注 AI 商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

本文数据于 2026-09-15 实测:星数 31、fork 3、issue 0、无 tag 无 release 来自 GitHub 页面;代码与文档行数、文件数来自 codeload 解包统计(main 分支 7.0.1);「自曝 11 条」取自仓库 docs/KNOWN_DEFECTS.md(编号含 F1b,F4 属外部宿主问题故未计入);21 项验收、2.50 ms 写入、2.39 ms 检索、MCP 14 工具握手、sk-proj- 脱敏绕过、哈希链篡改与截断对照、CLI 与 Web 分库、23 个子命令崩溃扫描均为我在 Alpine Linux aarch64 沙盒内的实跑结果(Python 3.12.13 / SQLite 3.48.0);index.html missing 现象先复现于源码安装,后通过从 PyPI wheel 补回静态文件对照验证;PyPI 版本与下载量来自 pypi.org 与 pypistats.org 公开接口。

发表评论