让智能体的记忆会遗忘:6 个月自用账本,12 条没佐证的猜测至今仍被关在门外
速览卡
- 分类:编程搭建
- 结果:自 2026-03 下旬用到 10 月中旬,记忆目录 73 个文件、18 个项目/全局目录;12 条推断记忆仍为暂存(未被第二会话佐证)、8 条至少被强化 1 次、10 条情景摘要、3 条归档、1 条被修正取代、2 条偏好升级为技能
- 状态:已实现(作者自用账本;示例为合成,数字来自作者本人记忆库)
- 成本:本地存储免费;蒸馏调用为 Haiku 级小额调用 + Claude Code 订阅
- 耗时:最小版一天内
一句话
别把智能体的记忆做成无限增长的聊天存档:作者给 Claude Code 做了一套“会遗忘”的记忆系统——推断出来的记忆先关在暂存区,只有被第二个会话佐证才转正;用不上的按种类指数衰减;改错了不覆盖旧条,而是归档旧条留作审计——6 个月下来,12 条没佐证的猜测至今仍没混进正式记忆。
原作者怎么做的
- 分五种记忆(不同种类不同保留策略):偏好(怎么做事,长期)、程序(跑通过的工作流,很长期)、事实(代码和文档里没有的 durable 知识,长期)、情景(某次任务的过程,短期)、痕迹(提示词与工具活动的紧凑时间线,很短期);另有两类特殊处理:想法永不随年龄衰减,规则到期不悄悄消失、而是标记出来对照最新文档复核。
- 定真源:Markdown 文件是真源,SQLite + 本地向量 + 小知识图谱只是派生索引——数据库丢了,记忆还在;文件可读、可改、可备份,智能体藏不进不透明的状态里。
- 接钩子(无常驻服务):会话开始做维护与简报(8 条预算跨各区)、每条提示词做记录与召回(至多 3 条短指针,同会话内不重复注入)、工具结果记录 outcome、会话结束启动 detached 蒸馏(Haiku 调用,输入修剪后的 transcript + 痕迹摘要 + 已有记忆名与描述,输出情景摘要 + 至多 3 条候选记忆);钩子 fail-open,记忆维护失败不阻塞写代码,错误只进本地日志。
- 立晋升门:用户直接说的偏好可立即生效;蒸馏推断的候选先以低置信度暂存,对正常简报与召回隐藏;只有后续会话出现匹配观察才强化并转正;召回本身不算证据(否则越被召回的记忆越永久,富者愈富);修正用“新条指向旧条 contradicts”并归档旧条,不覆盖、不删除——正常召回只见当前主张,旧主张留作审计。
- 设衰减:每条活跃记忆有置信度与衰减锚,分数 = 置信度 × 年龄衰减(按种类指数衰减,e-folding 时间常数而非半衰期);低分进归档而非删除;被钉住的可豁免;只有“真帮上忙、被用户确认、被独立再次观察到”才算强化。
- 召回三路融合:关键词(文件名、命令、工单号、错误码)+ 语义向量(同义不同词)+ 图关系(提示词点名的实体连带的相关实体),按衰减后分数加权,每提示词至多 3 条短指针;向量不可用时退关键词与图,索引坏了退关键词匹配。
- 技能毕业线:会话开始时脚本比对“够置信或至少强化过 1 次”的程序/偏好记忆与已装技能,提议更新旧技能或新建技能——只提议、不自动改写,作者批准后才落地并标记停止打扰;作者自己的两条偏好(脚本必须限时、复杂计划写成同卡片节点图)就是这么变成
script-timeouts与plan-graph技能的。
结果
- 6 个月账本(2026-03 下旬至 10 月中旬):73 个文件、18 个项目/全局目录(已实现,作者自用账本)
- 暂存 12 条:蒸馏提出、至今未被第二会话佐证的推断记忆,仍被挡在正式记忆之外(已实现,作者自述;作者自认“门是否太严,6 个月还答不上来”)
- 强化 8 条、情景摘要 10 条、归档 3 条、被修正取代 1 条、偏好升级为技能 2 条(已实现,作者自用账本)
- 作者自承的短板:半衰期公式数学上不正确(用的是 e-folding 而非真半衰期)、图遍历的项目隔离需加固、作用域标识有碰撞风险、秘密过滤未覆盖全部留存路径、POSIX 假设(fork/setsid)不适用 Windows 原生安装
提示词结构
(按原文做法还原的记忆治理骨架,非原文逐字提示词)
```
真源:[Markdown 文件] 是权威;[SQLite + 向量 + 知识图谱] 只是派生索引,丢了可重建。
分种类定保留策略:[偏好长期] / [程序很长期] / [事实长期] / [情景短期] / [痕迹很短期];[想法不衰减] / [规则到期标记复核不悄悄消失]。
晋升门:[用户直说] → 立即生效;[蒸馏推断] → 先暂存、低置信度、对简报与召回隐藏;[后续会话匹配观察] → 强化转正;[召回本身] ≠ 证据。
修正:新条 [contradicts: 旧文件] 并归档旧条,不覆盖、不删除;正常召回只见当前主张。
衰减:分数 = [置信度] × [按种类指数衰减];低分进归档;[钉住] 可豁免。
召回:[关键词] + [语义向量] + [图关系] 三路融合、按衰减后分数加权,每提示词至多 [3 条短指针];失败时逐级降级,不阻塞写代码。
技能毕业:[够置信或强化过 1 次] 的程序/偏好 → 只提议、不自动改写 → [作者批准] 后落地并标记停止打扰。
```
中国读者怎么迁移
国内用 Claude Code / Cursor / Codex 的读者能先搭最小版:一个记忆文件夹 + 会话结束蒸馏(用便宜模型跑,输出情景摘要 + 至多 3 条候选)+ 一条铁律——候选先暂存、被第二个会话佐证才转正。别一上来就做向量与知识图谱:作者 6 个月的教训是,存储是已解决的部分,真正值钱的是“信任规则”(暂存、佐证、衰减、归档旧条)。国内替代:Haiku 蒸馏换成手头便宜模型,SQLite 与向量换成本地文件 + 简单关键词检索,先把“暂存—佐证—转正”跑起来。
风险与限制
- 示例为合成:作者文末声明“示例为合成”,6 个月数字来自他本人记忆库、未经外部验证;引用 73/18/12/8 这些数时必须带“作者自用账本”限定。
- 没有省时省钱数:这篇的“结果”是记忆系统的存活状态账本,不是省了多少小时或多少钱;别把它包装成效率提升案例。
- 隐私边界要讲清:文件、索引、向量都在本机,但注入请求的记忆会随请求发给模型厂商,蒸馏默认走 Claude CLI 调 Haiku;作者自承启发式脱敏可能漏掉非常规秘密、修剪后的 transcript 未过脱敏器、本地文件未加密——“本地存储”不等于“离线推理”。
- 门是否太严未知:12 条暂存里可能有本该转正的好记忆,作者自认 6 个月答不上来;照搬时暂存区要定期人工翻一次,别让门变成垃圾场。
- 平台耦合:钩子版紧绑 Claude Code(POSIX 的 fork/setsid),作者自己也说这是短板、已抽成 MCP 版(Part 2);非 Claude Code 用户建议等 MCP 版或只抄规则层。
- 与已发布案例的边界:本站已发布常驻智能体失败账本、晨报书签防漏、行为锁等都是“智能体干活”的案例;本篇是“智能体记忆的治理规则”,主题不同。
原文链接
https://medium.com/@avis2329/i-built-a-memory-system-for-claude-code-that-knows-how-to-forget-b411807ba138