
把记忆存进Git:一个AI记忆系统的数据模型
字数:约2800字 | 阅读时间:8分钟 “索引烧了可以重建,正本烧了就什么都没了。” 「记忆工程」系列第二篇。上一篇讲了为什么要给 AI 造一个"第二大脑",这一篇往下挖一层:记忆到底长什么样,为什么必须能 diff,以及四条底线是怎么一条条落进代码里的。 一、先说清楚"正本"是什么 上一篇发出去之后,被问得最多的问题是:向量库、嵌入式数据库、各种记忆框架都有,为什么偏要从"一堆文件加一个 Git 仓库"开始? 先给结论:我们要的不只是“存得下”,更要"毁不掉"。 所谓正本,就是把所有派生物全删掉之后还剩下的那份东西。embedding 索引删了,可以从 Markdown 重建;缓存删了,可以重新生成。这些都可以坏,坏了重跑就行。但 Markdown 和 Git 历史要是没了,整个系统就只剩一个空壳。反过来,只要这两样在,索引层随便推倒重来,十分钟满血复活。 这个设计被真实场景检验过。项目进行中,本机的记忆仓库被一次强制重置打翻,AI 在巡检报告里提示了异常。最后我们是靠 Git 的操作日志(reflog)把现场完整恢复的——那些记忆要是存在某个私有数据库里,那次大概率就是永久丢失,连"去哪找"都不知道。 记忆系统天然处在各种自动化程序的写风险之下:AI 会写错,脚本会写崩,重置会误伤。把正本放在最笨、最老实、二十年不会过时的格式上,就是给整个系统设了一个止损下限。 二、骨架:三种记录 结论先行:整个记忆库只有三种记录——Topic、Fact、Relation。 **Topic 是实体节点。**一个项目、一个工具、一次会话、一个设计决策,都是 Topic。它是记忆图里"名词"的部分。 Fact 是关于某个 Topic 的一条离散陈述。“切片查询默认走三级降级"是一条 Fact,“查询接口只监听本机"也是。每条 Fact 独立存在,独立带状态,独立过期。 **Relation 是带类型的边。**MVP 只留了七种:depends-on、part-of、belongs-to、authored-by、references、conflicts-with、supersedes。 为什么只留七种?因为实际运行里我们观察到一个现象:关系类型一旦放开,AI 就开始发明关系——“somewhat-related-to"这种模糊边一多,图就废了,查询时全是噪音。宁可类型少,也要收敛。 三、一条事实的解剖 空谈模型容易飘,看一条真实的记忆。这是演示库里的一条 Fact(commit 哈希做了截断): --- type: fact id: fact-alpha-getuser-main topics: [project-alpha] status: active confidence: high provenance: demo-seed repo: …/project-alpha version: main commit: 1a2b3c4 axis: subject --- Alpha 在 main 分支只提供 getUser(id) 单点查询,无限流。 前面这几行 frontmatter 是机器读的索引:id 是唯一编号,topics 声明这条事实挂在哪些实体上,status 是生命周期状态(active / expired / superseded / contested / pending-review),confidence 是置信度,provenance 记来源。 ...
