
给 AI 编程助手一个真正的记忆:PMB 是怎么做到的
用过 Claude Code、Cursor 这些 AI 编程工具的人,大概都经历过这种事:上个 session 教了它一堆项目规则、踩坑经验、架构决策,新开一个对话,它全忘了。你说"修复上周那个 LoadGuard 定价 bug",它一脸无辜地回"什么 bug?"
LLM 只有上下文窗口,没有持久记忆。每次对话都是从零开始,这是模型架构决定的,跟模型聪不聪明没关系。
昨天 HN 上有个项目叫 PMB(Project Memory Bank),专门解决这个问题。它的思路很有意思——不用任何云服务,不用 API key,一个 SQLite 文件搞定一切。我去翻了源码,发现它在几个关键设计上的选择值得聊一聊。
它是怎么工作的
PMB 通过 MCP(Model Context Protocol)协议接入 AI 编程助手。MCP 是 Anthropic 提出来的开放协议,目标是让 AI Agent 通过标准化接口调用外部工具和记忆系统。Claude Code、Cursor、Codex、Windsurf、Zed 都支持。
架构并不复杂:
存储层:一个 SQLite 数据库文件,加一个本地的 LanceDB 向量索引。没有服务器,没有云依赖,数据就在你磁盘上。
检索层:BM25 关键词搜索 + 向量语义搜索,再用 Reciprocal Rank Fusion(RRF)把两种结果融合。作者说目标是"找到对的记忆,而不是最近的记忆"。这跟很多 RAG 系统只拼向量相似度不一样——纯向量搜索容易漏掉精确关键词匹配,纯 BM25 又抓不到语义关联,混合起来效果才靠谱。
接入层:MCP 协议提供 29 个工具。recall、record_lesson、record_decision 是最常用的。
光看架构你可能会想"这不就是一个本地 RAG 吗"。但 PMB 值得说的地方不在架构,在自动化程度上。
关键设计:不靠 Agent "记得"去调工具
Agent 记忆系统最大的坑不是存不好,是用不好。你给 Agent 一堆 recall/record 工具,它很多时候就是不调。LLM 优先处理当前上下文里的内容,历史记忆?它不一定看得到。
PMB 的解法是绕过 Agent 的主动性,在协议层强制注入记忆。它装了四个 hook:
UserPromptSubmit → 自动召回。每条用户消息进来,先走一个分类器(regex + 多语言支持,亚毫秒级),如果匹配到相关记忆,在 Agent 思考之前就注入上下文。Agent 不需要自己决定要不要调 recall,记忆自己就送上门了。
PostToolUse → 被动观察。Agent 每次用完工具,PMB 在后台记录一次。读操作和 ls 之类的噪音会被过滤掉,只保留编辑、测试、commit 这些有意义的行为。这为后续的自动记忆合成提供了素材。
SessionStart → 会话恢复。上下文窗口压缩时,Agent 通常会忘记刚才做了什么。这个 hook 从记录中重建"上次做到哪了"——哪些决策做了、哪些任务完成了、哪些经验学到了、还有哪些目标没完成。新 session 不再是白纸一张。
Stop → 自动写入 + 遵循检查。每轮结束时做两件事:一是检查这次浮现的教训(lesson)有没有被 Agent 真正采纳(通过 token 重叠度检测,不是靠模型自报),二是如果 Agent 这一轮没有主动调用任何 record_* 工具,就从观察到的行为中合成一条记忆写进去。
最后这个设计很实用。Agent 忙起来就是会忘记记录经验,你不能指望它每次都主动调工具。PMB 直接在后台补上,而且去重——Agent 自己记了就不重复写。
性能数据
PMB 公布了一组基准数据:
| 指标 | 数值 |
|---|---|
| recall p50/p95 (热启动) | 35 ms / 110 ms |
prepare(message) 热启动 |
4-16 ms |
record_batch_async |
< 1 ms |
| MCP 冷启动 | 3.7 s |
| LoCoMo recall@10 (n=10) | 94.5% |
35 毫秒的召回延迟基本等于无感——比发一条网络请求还快。写入更是亚毫秒级,完全不阻塞工作流。3.7 秒的冷启动是因为第一次要加载嵌入模型,启动后热缓存就快了。
LoCoMo 94.5% 的 recall@10 数据是他们自己的 benchmark,效果不错但最好保留一点怀疑态度——自测 benchmark 总是会比第三方测试好看。不过思路是对的。
和"让 Agent 自己记"的区别
现在很多方案走的是"教 Agent 用记忆工具"的路线——在 CLAUDE.md 或 system prompt 里写"请记住重要决策",给 Agent 提供 recall/record 工具,希望它能自觉使用。
这条路有个根本问题:LLM 的注意力机制决定了它优先处理当前用户消息里的内容,而不是历史记忆里的内容。除非记忆被显式注入到上下文里,否则 Agent 大概率当它不存在。
PMB 换了个思路:不改变 Agent 的行为,改变记忆注入的方式。记忆在 Agent 看到用户消息之前就已经在上下文里了,Agent 自然会参考它。就像给人戴个耳机播放背景信息——你不需要主动去查资料,信息自己流进耳朵。
代价是记忆注入的粒度依赖分类器质量。分类器判断不准,该注入的没注入,或者注入了噪音,反而干扰 Agent。PMB 用 regex + 多语言支持来降低误判,但复杂场景下够不够用,还得看实际项目验证。
本地优先 vs 云端记忆
PMB 坚持本地优先——数据就在你磁盘上,不经过任何第三方服务器。这对开发者来说是安全感:代码仓库的决策记录、踩坑经验、个人偏好,不需要上传到某个公司的服务器。
也有取舍。本地意味着不跨设备、不做团队共享。PMB 的回答是"你自己决定要不要同步"——SQLite 文件可以拷到 Dropbox、推到 git、放 U 盘里,随你。
在 AI Agent 记忆方案里,本地优先和云端是两条不同的路。我自己用的 Hermes Agent 走的是共享记忆路线——四个 Agent 连同一个 TencentDB 记忆后端,跨 profile 读写,适合多 Agent 协作。但代价是记忆系统本身成了一个需要运维的服务。PMB 的路线更简单:不依赖任何基础设施,pip install 就能用,适合个人开发者。
教训自检机制
PMB 还有一个"教训自检"的设计:每条教训都有一个 surface_id,记录被展示给 Agent 的次数和被实际采纳的次数。如果一条教训反复被展示但 Agent 从不采纳,它会被标记为"💀 DEAD"(已失效);如果被采纳了两次以上,标记为"★ USEFUL"。你可以看到哪些规则真的在起作用,哪些只是噪音。
技术含量不高,但解决了一个实际问题:规则文件越写越多,大部分早不管用了但没人清理。PMB 用数据告诉你哪些该留、哪些该删。
我的看法
PMB 的算法没什么新鲜的——BM25 + 向量 + RRF 是标准 RAG 配方,SQLite + LanceDB 是常见组合。它的价值在于工程细节做得到位:四个 hook 让记忆真正被用起来、亚毫秒写入不阻塞工作流、自动去重避免记忆膨胀、教训自检帮你清理噪音。
对于个人开发者来说,"AI 编程助手记不住东西"这个痛点真实且频繁。如果你经常用 Claude Code 或 Cursor,厌倦了每个新 session 都重新解释项目背景,PMB 值得一试。
pip install pmb-ai
pmb setup
pmb warmup
三行命令,你的 AI 编程助手就有了真正的记忆。不用注册账号,不用配 API key,不用启动服务。
项目地址:github.com/oleksiijko/pmb[1]
引用链接
[1]github.com/oleksiijko/pmb: https://github.com/oleksiijko/pmb
夜雨聆风