用过 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.py 的 install_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.py21 项断言 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 repair → UnicodeDecodeError,崩在 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.py 的 package_data 里倒是老老实实声明了 static/index.html 和 static/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 落在 ;MCP server 和 Web 面板落在 。根因在 storage/sqlite_backend.py 的 _resolve_paths:namespace 为假值时走「扁平 legacy 布局」,而 CLI 压根没有 --namespace 参数,另两个入口的默认值却是字符串 "default",于是走了命名空间目录。后果很具体:先用 CLI 把偏好灌进去,再挂 MCP 给模型用,模型看到的是一张空表。而 docs/RECALL_STRATEGY.md 的隔离表只写了「命名空间 → 独立 data/namespaces/」。
第三,那条哈希链只证明账本自己没被动过。 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 已经不存在了的 tests、benchmarks、quality_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 冲突 12、writes 机制Test。看起来像是某次批量「中译英」留下的半成品,demo 和 benchmark 两个命令里最密集。
它在坐标系里的位置
跟本站评过的 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.md、ACCEPTANCE_GUIDE.md、RECALL_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 公开接口。