深入 · 最近在做 · 2026.10

长期记忆数据库让 AI 换会话、换工具之后,还记得我认定过什么是对的

这不是聊天记录备份。它是一套有写入闸门、有检索评测、有拒答线的个人记忆系统: 485 条记忆里 42 条是撤回后留下的墓碑,检索要说出依据落在哪个文件、哪一段, 答不上来时必须说「库里没有」。下面所有数字都能用一条 SQL 或一次评测复跑。

为什么要做这件事

四个具体问题,不是「AI 应该更懂我」这种愿望

怎么设计的

先把「什么算记住、什么算答对、什么算该拒答」定成规则,再写代码

四层,按「谁来确认」分,不按内容主题分

L0 画像与规则:只有需要我本人拍板的才进这层,改动必须人工确认。
L1 项目事实:自动写入 + 强制来源,写不进来源的直接拒写。
L2 日志与证据:只追加、不进检索——过程记录不该污染「事实」。
L3 经验与 SOP:稳定到可以复用的做法,升级成 skill。

写入闸门规则(违反就写不进去)
必须先有来源无 source 拒写;每条都记来源类型、路径、观察时间
三路判定同主题同说法 → 去重;说法相反 → 双方标 disputed 等人工裁决;说法一致但更晚 → 旧条转 stale 并记 supersedes
主题键复用只允许 57 个主题键,禁止每条新造标题——否则冲突检测永远空转(这条是踩坑后补的)
数字必须带条件claim 含数字时必须写 conditions / exceptions,否则一条断言不算数
低置信强制未验证推断类置信度 ≤0.6 时必须 verified=false,并在正文里明说「推断」

检索、拒答与图谱

记忆层的三个动作:找得到、说得清、答不上时闭嘴

双索引 FTS5
443 条条目 + 165 份原文镜像
→ 每轮自动检索
三档:强命中 / 低置信 / 不注入
→ 拒答双信号
top<9.0 或 前 5 条覆盖<0.10
→ 原文线索
判「无」时给可能的位置,不装懂

真实数据(2026-10-25 22:35 只读直查)

下面这些不是估算,是 select count(*) 和遥测表

485条记忆(443 生效 / 42 撤回墓碑)
57个主题键(历史 99 个标题归并)
6个项目层(5 个项目 + 全局)
165份原文镜像(88 个来源文件)
750个图谱节点(0 悬空链接)
72个归档会话(9,990 条消息)
720次检索遥测(自动/调试/评测)
146次引用记账(102 采纳 / 44 判无关)
17条检索缺口(确认 1 / 否决 4 / 排除 12)

生效条目的类型分布:事实 204 · 决策 117 · 偏好 63 · 经验 56 · 项目卡 3。撤回不删档——42 条留墓碑,可追溯为什么被撤回。

评测:四组证据,逐组说清口径

每组都标了样本量与日期;样本小的地方我直接说小

① 检索评测:40 条题,取前 5 条 (2026-10-25 21:02 复跑)

指标结果说明
路径召回 path_recall@50.857(24/28)该找到的文件,前 5 条里找回来的比例
条目召回 entry_recall@51.000该命中的记忆条目,前 5 条里全在
MRR(路径 / 条目)0.81 / 0.92第一条正确结果排多靠前
项目内纯度 · 跨项目泄漏1.0 · 0.0按项目过滤后不串项目;全局检索不命中禁区

② 拒答线:拿真实问句重放,不只看自己出的题 (2026-10-23,102 条重放)

可答的 27 条里误拒 1 条(3.7%,95% 置信区间 0.7%–18.3%);不可答只有 3 条:拦住 1 条、漏 2 条。 不可答样本只有 3 条,catch 只当「参考」,不作为调线依据——这是当时定下的结论:暂不调线,继续攒自然样本。 同一套三档口径下,我自己的固定评测题集是 catch 0.947(18/19)、误拒 0.000。

③ 人工可用性:四轮,第一轮是被自己推翻的 (2026-10-20,n=6)

轮次均分(5 分制)会用率可用率(≥4 分)发生了什么
v1 盲评2.1716.7%16.7%模型给 8.58 分,我盲评 2.17,与模型一致率 0%——第一个被证伪的判断
v23.8383.3%66.7%修交付契约后大幅回升,但可用率差 2 个任务过 85% 线,仍 FAIL
v34.2100%60%换全新任务集(5/5 已评);会用率满分,可用率差在形态
v3.15.0100%100%定向修订 3 条后重评 6/6 全 5 分、0 事实问题;不是盲测泛化

④ 模型 A/B:同一模型同一任务,只差记忆 (2026-10-19,6 类真实任务)

无记忆 2.92 → 有记忆 8.58(+5.67 / 10 分制),6/6 全胜;编造从 16 处降到 0 处; 有记忆组共引用 39 条记忆,39/39 全部能在库中找到且状态为 active。含一道诱饵题(库里确实没有的主题),有记忆组明确回答「记忆库无记录」。

但这组是模型生成 + 模型评审的结论,不能当可用性证据——第 ③ 组的人工盲评恰好证明了相反的事。

我推翻自己的四个判断

这部分比数字更值钱:判断错在哪、靠什么证据改

① 「模型说好」不等于「我能用」

模型 A/B 给出 8.58 分、6/6 全胜,我盲评只有 2.17、一致率 0%。由此定下规矩:模型评审只作参照,验收必须人评。修的不是分数,是交付形态(开场点题、模板给全文)——v3.1 才到 6/6。

② 「主题键唯一」让冲突检测三道闸全部空转

一开始每条记忆一个新标题,看起来整齐;结果是「同主题、说法相反」根本不会触发。把 99 个历史标题归并到 57 个主题键后,去重、冲突、演进三道闸才真正跑起来——这不是重构代码,是修判定口径。

③ 全量可检索 > 策略性隐藏

试过把过程文档标成「只索引、不进检索」,等于让检索看不见它们,违背「宁可全量检索」的口径,撤回:过程文档一律保持可检索、不蒸馏,策略覆盖率按 1.0 守。

④ 省 token ≠ 省钱

把常驻核心做「单版本化」以为能省一半:全量口径只降 5.7%(未过协议 ≥8% 线),按步归一化反而 +3.6%,因此回退。成本大头是会话历史 × 步数 × 每步重发,常驻核心只占约 0.8%——省错地方了。

工程实现

自己写,不依赖第三方服务;换机只搬一个文件夹

Python 标准库 + SQLite FTS5 零第三方依赖 93 个模块 · 约 1.4 万行 7 天 · 143 次提交(+ 代码仓 38 次) 单文件夹可整体迁移

已知边界

不用追问,我先说

这些结论不能外推

这个库现在每天在真实工作里跑:写记忆、检索、引用记账、拒答、会话归档。 想看它怎么定义「内容合格」,可回到评测集那份:

看评测集与判分器 → | ← 返回首页