作者将事实、任务和技术决策存入 Postgres,以 pgvector 做语义检索,并通过 MCP 按需提供给 Claude Code。相比每次全量读取 Markdown,这套关系化记忆层能减少无关上下文并保留跨会话工程知识。
每次 AI 编程会话都以同样的方式开始:对昨天发生的事毫无记忆。
我受够了 Claude Code 在每次会话中都要重新摸索我的架构、尚未解决的 bug,以及那些“等等,我们当初为什么要这么决定”的问题——于是,我为它构建了一个记忆层。这篇文章将介绍它的工作原理,以及我为什么最终放弃了那个显而易见的初始方案。
大多数面向 AI 编程 Agent 的“记忆库”方案,都是由少量 markdown 文件组成——比如 architecture.md、progress.md、decisions.md——Agent 会在每次会话开始时重新读取它们。这个思路很合理,也确实有效,直到这些文件变得足够大,以至于还没开始真正的工作,加载它们就已经耗尽了全部 context 预算。为了让内容保持在可管理的范围内,你最终只能把部分内容精简到“归档”文件中,而精简恰恰会让你丢掉六周后才发现需要的信息。
这种失败模式其实并不在于 markdown 本身,而在于扁平文件迫使你进行全有或全无的读取:你无法只查询与当前正在修复的 bug 相关的三个事实。
所以,我没有使用文件,而是采用带有 pgvector 的 Postgres 数据库作为后端,并通过 MCP server 将其暴露给 Claude Code:
节点,而不是文件章节。每一条事实、任务、决策和进度说明都是一行数据,包含一种类型(brief、product、pattern、tech、active、progress、devenv、task、plan、decision)、正文、主题标签和 embedding。
边,而不是标题。节点通过带类型的关系连接起来——depends_on、blocks、relates_to、supersedes、part_of、refines、cross_ref——因此,“这个 bug 被那个决策阻塞”是一条图谱事实,而不是埋在大段文字中的一句话。
检索采用向量搜索与图遍历,并限定在当前任务的范围内,而不是“把整个文件全部丢进去,让模型自己整理”。
重点并不在于图比文件更高级,而在于检索从一次读取变成了一次查询。
下面这个约束塑造了整个设计:被搜索出来、但最终证明无关的材料,绝不能占据工作会话的 context。否则,你只是绕了更多步骤,重新制造了 markdown 的问题——现在消耗 token 的方式,从滚动浏览文件变成了滚动浏览向量搜索结果。
有两种机制共同确保这一点:
服务端过滤。搜索会应用相似度阈值,并在返回结果之前剔除所有此前已被标记为无关的内容。它永远不会返回一份未经处理的候选列表,让调用方自行筛选。
Subagent 隔离。在任务调查过程中,只有一个用完即弃的 Subagent 会真正调用搜索。它会在自己的一次性 context 中审查结果,标记被拒绝的内容(这样同样的噪声下次就不会再次出现),然后只向主会话返回一份经过综合整理的简报。它筛掉的垃圾信息永远不会接触到真正执行工作的 context。
仅靠过滤,仍然可能让一个话多的调用方重新读取所有内容。仅靠 Subagent,仍然会把未经筛选的噪声摆到主会话面前。两者缺一不可。
一个共享知识库可以服务于我参与的所有项目——这并非偶然,而是因为数据库后端让这件事几乎不需要额外成本。更有意思的结果是:不同项目中的会话可以相互交流。
Project A 中的会话可以直接把一项任务提交到 Project B 的 backlog——它会以 status: inbox 的状态出现在那里,而不会被悄悄合并进 backlog,因此它会被清楚地标记为“由其他人提交”。它也可以发送消息,并通过 Postgres LISTEN/NOTIFY 实时收到回复,无需轮询——一个轻量级的监听进程会把新增的数据行转换成实时聊天通知。
这套机制被刻意设计为与任务/记忆图谱相互独立:消息不会生成 embedding,不会建立图谱边,也不依赖 embedding provider 正常运行。因此,即使 embedding API 发生故障、导致记忆写入完全中断,Agent 之间的聊天仍然可以继续工作。
这是我在其他“赋予 Agent 记忆”方案中没有见过的部分:它不只是“记住我的项目”,而是让 Agent 真正能够跨越项目边界,把工作交接给彼此。
它目前仍然是一款非常个人化的工具,并且一直在自己身上进行 dogfooding——在构建它的过程中,我一直使用它来管理这个记忆库项目自身的任务和决策。如果其他正在构建类似方案的人觉得有帮助,我很乐意进一步深入介绍它的 schema、检索评分机制或消息协议。
🔗 https://github.com/ineron/MemoryBankMCP
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。