我给腾讯 27k star 的记忆系统提了个 PR,教它「越用越准」
故事是这样的。
前两天我在自己电脑上把 Claude Code 的 API 地址,指向了本地跑着的一个代理服务。然后新开了个会话,随口喂给它几条事实,我是厦大 CS 的本科生,主攻 Java 后端和 AI,最近在给腾讯的一个开源项目提 PR。为了做对照,我还瞎编了第三条,说我特别爱喝手冲咖啡,每天下午三点准时下楼买一杯。
今天我另起了一个全新的会话,上下文干干净净,问它,我下午三点一般干嘛。
它答,下午三点你一般会去楼下买一杯手冲咖啡。
那一瞬间的感觉很难形容,就是,它记得我。。。你明知道这背后是检索、注入、重排一堆冷冰冰的管线,可看到它说出这句话的时候,还是会起一层鸡皮疙瘩。
新会话,零上下文,它凭什么记得?
先看我到底跑了什么。就三行。
1
2
3
export ANTHROPIC_BASE_URL=http://127.0.0.1:8096/claude-code/default
export ANTHROPIC_AUTH_TOKEN=sk-mem-某某某
claude -p "我下午三点一般喜欢干什么?"
claude 那边什么都没配,地址指向本地、token 是记忆系统发的。剩下的活全在代理里。我扒了 Proxy 的日志,一轮对话下来是这样走的。
1
2
3
4
5
[session-init:cc] session=claude-code:0bf118dc… preset hit team=team-p08aprntxh agent=agt-p08asohyml task=- → register directly
[session-init:cc] session=claude-code:0bf118dc… → initialized agent=agt-p08asohyml task=- team=team-p08aprntxh user=usr-p08aedhpbt
[session-init:cc] session=claude-code:0bf118dc… processed: 2 msgs, ctx=Y/N protocol=anthropic systemAppend=Y final=[user,system]
[injection-debug] injectors=["skill","knowledge","tdai-memory"] injectedSkipped=false
[cache] session=claude-code:0bf118dc… L2a hit → promote L1
它先认出我绑定的是哪个团队哪个 agent,然后决定这一轮要注入哪些东西,最后从 L2 的缓存里命中,把相关的 L1 记忆提升进上下文。这一套不跟你打招呼,发生在你看不见的几百毫秒里。
那我的事实到底被存成了什么样?我直接去数据库里把 L1 记录捞了出来。
1
2
3
4
内容:该成员在项目开发中的工作习惯为,1) 动手修改代码前,必须先在 Markdown 文档中写清楚方案与验收标准,方案未理清前不动键盘;2) 向上游提交 PR 前,必须在本地 worktree 运行完整测试…
类型:work_method
优先级:priority 85
场景:团队在整理该成员的工作方法与贡献档案
我对着存储结构看了半天,最有意思的是它提取时那条铁规矩,宁缺毋滥。我第一轮实测的时候顺手编了两条生活事实,想问它记不记得,结果这两条直接没抽出来。翻到提取 prompt 我才知道,工作模式底下明明白白写着,不提取与工作无关的个人偏好。系统不是什么都记,它有取舍,记错了比记不住更可怕。
还有个特别符合直觉的细节。我一次喂了两条习惯,它合并成了一条记忆,独立完整,跳出对话也看得懂。prompt 里管这个叫归纳合并,强关联的消息不许碎片化。我有时候觉得,做这个系统的人,自己一定很讨厌那种记了一堆碎片还觉得自己很努力的笔记本。
凭的是屏幕上这个东西。这是 Memory Hub 的面板,也是我今天实测完顺手截的图。L0 对话原文一百一十三条,L1 原子记忆八条,L2 场景记忆三条,L3 核心记忆一条。我的那几句话,已经在这套系统里走完了一整条流水线,变成了分好类的记忆资产。
这个系统叫 TencentDB-Agent-Memory,腾讯云今年开源的,GitHub 上 27.7k star,2.7k fork。slogan 特别直白,让 Agent 沉淀经验,让人专注创造。
今天这篇文章,我想把它拆开给你看。它怎么给 AI 造记忆,跟心理学有多像,以及我给它提的那个 PR,一个可能让整个记忆系统「越用越准」的改进方向。
先说大家都有体感的一个问题。
你天天用 Claude Code 也好,Codex 也好,有没有发现它们都金鱼记忆。今天的对话一关,明天全忘。上下文窗口倒是越做越大,但窗口是个旅游团大巴,下车就散。你上周跟它斗智斗勇踩出来的结论,这周它一脸无辜地再踩一遍。
TencentDB-Agent-Memory 的思路是,不跟你争上下文窗口的事,它在 Agent 和大模型之间插了一层代理,你的对话流过它的时候,顺手就沉淀成记忆。Agent 那边零代码接入,base URL 指过去就行。
有意思的在后头。它沉淀记忆的方式分了四层,跟人脑的机制对得整整齐齐。我头一回翻文档的时候,差点以为作者是拿脑科学课本抄的。
L0,对话原文,原样落盘,每天一个文件,不做压缩。这就是刚发生的事,还带着体温的原始记录,相当于工作记忆。你刚说完的话,字字都在。
L1,原子记忆。一个大模型在一次调用里同时干两件事,先切情境,再从对话里把事实、偏好、约束一个个拆出来,拆成独立的小卡片。每条卡片都有规矩,要独立完整,跳出对话还得成立,要带溯源 ID,能一路追回原文哪几句话。而且宁缺毋滥。这是我把这套系统的文档翻烂之后最喜欢的细节,记忆系统最怕的不是记不住,是记一堆垃圾还特自信。
L2,场景记忆。把散落的 L1 卡片围绕项目整合成一个个场景文件,每个场景带热度值,被翻牌越多火苗越多。系统里跑这个活儿的 prompt 开头自称,记忆整合架构师,你不仅仅是记录数据,你更像一位人类学家和心理学家。
L3,核心记忆。两千年字符的硬上限,装的是这个用户最稳定的画像,认知内核。
四层分好之后怎么用,也有讲究,而且是那种一眼能看出老手才想得出来的讲究。
L2 和 L3 直接拼进 system prompt,模型一睁眼就知道自己面对一个什么人、什么场景。但 L1 不塞进去,它被包装成一组只读工具挂在旁边,模型判断需要的时候自己去查。
为啥不一起塞?因为 system prompt 一动,大模型那边的 KV cache 就全废了,每一次对话的输入成本直接翻几倍。稳定的东西钉死,易变的东西按需取,这行里踩过坑的人才会把边界画在这个位置。
写到这,突然想起以前上课摸鱼看的一本脑科学书。人的睡眠里有个过程叫记忆巩固,白天海马体匆匆记下的 episodic 短暂痕迹,会在夜里被大脑离线重放,一遍遍重组,最后沉淀成皮层里的语义知识。梦里跑的不是幻觉,是白天的回放。
L0 到 L3 的这条管线,几乎就是给 AI 造了一个睡眠。对话发生时只管快速记录,之后异步地、一批一批地提取整合沉淀,整个链路带任务队列、分布式锁、失败重试、级联调度,L1 抽完推 L2,L2 收尾进 L3。工程上,队列、分布式锁、失败重试、级联调度,一样不缺。认知科学里管这个过程叫 consolidation,它管这个叫记忆。名字起得挺唬人,但活儿是这么个活儿。
我实测那天,全程盯着日志看它跑完这条流水线,感受还挺神奇的。我那段随口说的三句话,先是被 L0 原样落盘,几分钟后 L1 抽取任务自动入队,大模型把对话切成情境,情境名起的是,团队成员在介绍 TencentDB-Agent-Memory 项目工作背景。然后抽取、去重、冲突检测,一路自动跑进 L2 的场景块。整个过程没有任何人操作,它自己在那睡觉,自己把白天的东西消化了。
对了,这套东西不是玩具,项目自己的 benchmark 里挂着 PersonaMem,一个专门测 Agent 能不能在长期交互后正确理解和使用用户信息的评测,不带记忆 48%,挂上这套系统 76%。
不过这套系统有个地方一直空着,它只管记,不管忘,也不会越用越准。
人脑不是这样的。心理学里有个效应叫提取练习,记忆每被成功提取一次,下次就更容易被想起来,越用越牢。还有艾宾浩斯那个老掉牙的遗忘曲线,不用的记忆会自然衰减。这两个机制拧在一起,人脑才能把有限的容量留给真正重要的东西。
而这套系统呢,检索只按相似度排序。一条记忆哪怕上周刚救过 Agent 一命,今天检索的时候,它跟一条三个月没人碰过的记忆,权重一模一样。
这就是我那个 PR 要干的事,编号 #1376,让 Agent 选中过的 L1 记忆被强化。
机制说穿了不复杂,分三步。
第一步,搜索结果带上记忆 ID,Agent 判断某条记忆真的支撑了这次回答,就回写一次使用记录。注意,是 Agent 主动确认,不是搜索 Top-K 全部记为已使用。后者我也评估过,会把仅供参考的候选一起强化,几次搜索之后大家都顶着时间戳,信号就稀释没了。
第二步,重排打分。在这条记忆的原始相似度上叠两个很轻的因子,一个是近因,十四天半衰期的指数衰减,一个是频次,一个饱和函数,用得越多加分越多,但有上限。注释里我写了四个字,use it or lose it。
第三步是后来补的,也是这个故事里我最想讲的部分。
我把带强化的版本跑了真实模型的三组对照实验,一百个多会话的 episode,同一个模型配对测。结果出来一半在预期内,正确反馈的场景,命中率涨了 8.3 个百分点。另一半把我干沉默了,在学过旧方案的场景里,反向暴跌 18.1 个点。
排查下来发现一个特别心理学的现象。那条记忆的内容写着「以前是这么做的」,查询问的是「现在该怎么做」。一个过时的历史方案,因为被翻牌得多,反而压过了现行约定,冲到了最前面。
强化放大了一切,包括过时。
这个坑心理学里其实早有名字,一个叫编码特异性,强化应该附着在使用的情境上,一个叫干扰更新,新旧内容冲突时要分得出谁先谁后。我最初只抄了提取练习和遗忘曲线,漏了这两条。
所以我加了第二版,给它起了个土名字叫 frame gate。一条记忆如果自我描述成历史,「以前」「曾经」「已废弃」「后来改了」,这类标记一出现,在现在式的查询里就撤回它的强化,只撤奖,不惩罚,原始排序兜底。
改完再跑一遍那组实验。不带强化的基线 72.4%,只带强化的版本 76.3%,加上 frame gate 之后,84.2%。退化场景全部转正,两个不同的模型上方向一致。
这个 PR 现在刚提上去,还在等维护者安排 review。我在等它被合进去的那天。
当然要诚实说一句,这套基准是我自己造的合成评测,不是线上真实收益,PR 里我也是这么标注的。数字看看方向就好。
写到这,回头看会觉得有点奇妙。
1885 年,艾宾浩斯拿自己做实验,用一堆无意义音节,量出了人类第一条遗忘曲线。一百四十年后,一个本科生在宿舍里,给一个 AI 记忆系统写衰减函数,在评论区跟人讨论编码特异性。
你在给 AI 造记忆的时候,几乎是沿着认知科学一百年走过的路又走了一遍。工作记忆、情景记忆、巩固、遗忘、再巩固,这些词一个个从教科书里跳出来,变成代码里的模块和函数。说不上是谁参考谁,反正最后用的是同一套词。
也不知道最后是谁塑造谁。
项目的 slogan 那句话,我是真喜欢。让 Agent 沉淀经验,让人专注创造。记忆这东西,说到底是一个身份问题,你记得什么,你就是谁。人如此,Agent 大概也会如此。
以上,既然看到这里了,如果觉得写得还行,随手点个赞、留个言吧,想第一时间看到后续也可以订阅我的 RSS~
谢谢你看我的文章,我们,下次再见。

