文章将Agent记忆视为会连接、衰减和修剪的网络,重点讨论记忆筛选、检索及淘汰三类工程问题。相关实践来自开源项目ResceneAgent,并延伸到四种记忆引擎的设计思路。
「构建你自己的 AI 智能体」系列特别篇 · 所有工程实践均来自开源项目 ResceneAgent

让我先用一句话告诉你答案:
AI 智能体的记忆并不是一个不断堆积东西的仓库,而是一张会生长、遗忘和修剪的网。
每当你告诉它一件事,它就会在线上打一个结。当两件事存在关联时,又会有一根线将这两个结连接起来。随着时间推移,这张网会变得越来越密——它会更懂你,但也可能变得更慢。
因为真正困难的从来都不是“把东西存进去”,而是以下三件事:
什么应该被记住?
需要时,如何找到它?
当它过时时,如何将它放下?
博尔赫斯笔下的富内斯记得一切,而这反而让他更难思考。当每一片叶子、每一种云朵的形状都同样清晰时,你就无法从细节中提取模式。AI 智能体也是如此——永不遗忘的记忆并不等于智慧,它更像是一次硬盘故障。
图灵在 1950 年的论文《计算机器与智能》中提出了“儿童机器”的设想:与其从零开始构建一个完全成熟的成人大脑,不如从一个更简单的基础出发,让它通过教育不断成长。今天,当我们为 AI 智能体构建记忆系统时,从某种意义上说,我们正在回答这个七十多年前提出的问题:机器经历过的事情,如何转化为它在下一次行动中所携带的经验?
为了把这个故事讲清楚,我们需要稍微绕一点路——从 HTML 开始。然后,我们会看看一种非常特别的电子元件——忆阻器。
而且,这并不只是一篇方案综述。稍后,我会详细讲述一个真实的两个月实验:我构建了一个功能完备的“数字海马体”,它能够传播激活、随时间衰减,甚至能让你逐跳观察记忆被召回的过程。之后,我又进行了一次对照实验,并亲手证明了它不值得继续保留在主线上。
构建一个系统是一种能力。亲手终结自己引以为傲的作品——那才是工程判断力。
1991 年夏天,Tim Berners-Lee 向更广泛的社区开放了早期的 Web 系统。HTML 最神奇的地方并不是标题、段落或表格,而是链接:
<a href="another-page.html">Go to another page</a>
在纸质世界里,一页内容写完,它也就结束了。而在 Web 上,一份文档可以伸出手,与另一份文档牵在一起。
Berners-Lee 后来回忆说,他对 Web 的梦想是建立一个共享的信息空间:链接可以指向任何事物,无论它属于个人还是公众,也无论它是一份草稿还是已经完成的作品。
这个变化看起来似乎只是多了一个标签,但实际上,它相当于为知识修建了道路。过去,文档是一座座彼此隔绝的孤岛。有了超链接,它们之间第一次架起了桥梁。
但 HTML 是为网页结构和浏览器渲染设计的。如果你只是想记录一句“用户喜欢简短回复”,却不得不写成:
<html>
<body>
<p>用户喜欢简短回复</p>
</body>
</html>
这就像只是想随手写一张购物清单,却先建了一座档案馆。
2004 年,John Gruber 发布了 Markdown。它的核心理念不是“提供更多功能”,而是“使用更少的符号”:即使未经渲染,原始文本也应该自然、清晰且易于阅读。
# Title
- One record
- Another record
[Link to another document](another.md)
一个 # 表示标题,一个 - 表示列表项,一对方括号则可以创建链接。至于知识库软件中常见的 [[wikilinks]]——严格来说,它并不属于最初的 Markdown 规范,而是后来由 Wiki 和笔记工具添加的扩展。不过,它们体现了同样的精神:让知识之间的连接足够轻量,使人类可以不假思索地写下它们,机器也能毫不费力地读取。
这正是 Markdown 适合作为 AI 智能体记忆载体的原因:透明、可编辑、易于进行版本控制,而且人类与模型看到的是同一份内容。
但文件格式只解决了“存在哪里”的问题。更困难的问题是:记忆存进去以后,如何把它找出来?
普通电阻就像一扇没有记忆的门:你推过它一百次,下一次它依然和以前一样。
忆阻器则不同。它的名称来自 memory resistor,即“记忆电阻”。流经它的电荷会改变它的内部状态,因此下一次电流通过时,它的电导会受到过去经历的影响。
可以把它想象成一条泥土小路:
没有人行走时,草会慢慢重新长出来,这条路也会越来越难以辨认。
走的人越多,土地就会被踩得越结实,道路也会变得越清晰。
下次来到岔路口时,你自然会选择那条被反复走过的路。

这不正是记忆的运作方式吗?反复被召回的连接会变得更强,长期不用的连接则会逐渐减弱。
1971 年,Leon Chua 根据电路变量之间的对称关系,推导出了忆阻器这一“缺失的电路元件”。2008 年,Strukov 等人发表了《The Missing Memristor Found in Nature》,提出了后来广为人知的物理模型。忆阻器之所以吸引神经形态计算研究人员,恰恰是因为它的电导能够保留历史:单个器件既可以“存储”,又能表现出类似突触权重变化的效果。
Prism 的早期版本拥有一个使用 C++17 编写的向量存储原型:
Vector Storage
+ HNSW Nearest Neighbor Search
+ Memristor State
+ Chaotic Evolution
这个想法很吸引人:不要让向量存储成为一排永不变化的抽屉,而是让每条记忆都像一个电子突触一样运作——拥有电导、磁通和不断演化的状态。一次访问并不只是“找到它”,还会改变它。时间流逝也不只是增加一个时间戳,还会让记忆缓慢漂移。
换句话说,普通的向量存储就像一张地图:道路一旦画好,就会一直留在那里。忆阻器模型则更像一座真实的城市:人流会把小路踩成主干道,而废弃的道路则会被杂草吞没。
最终,我砍掉了这个想法。不是因为它不够酷,也不是因为它无法工作,而是因为它把系统推向了另一种复杂性:C++ 向量层、C API、Go 服务、混沌状态、索引结构以及上层记忆图,都必须协同演化。在试图模拟“像大脑一样运作”的过程中,整个工程本身反而长成了一个难以维护的大脑。
但忆阻器留下了它最重要的遗产:
记忆不应该只是被存储。每一次使用,都应该改变它在下一次被召回的概率。
后来,当我使用 Go 重建 PrismD 时,我放弃了 C++ 原型,但保留了这个思想:节点能量会随时间衰减,而访问会强化它。甚至连接两条记忆的突触,也拥有自己的衰减率。硬件隐喻被移除了,但真正有用的动态机制得以保留。
这也是我第一次真正理解:做减法并不意味着删除一切,而是移除昂贵的形式,保留有效的原则。
市面上充斥着各种 AI 智能体记忆方案的名称:向量存储、RAG、知识图谱、语义网络、长期记忆、情景记忆……这些术语就像一层烟幕。
剥去这些标签,常见的实现方式大致可以归为四类。
RAG 是 Retrieval-Augmented Generation,即检索增强生成。
它不会把整座图书馆都塞进模型的大脑,而是派一个检索器去书架上找出最相关的几页,然后把这些页面交给模型,让它回答问题。
User asks: "How did we fix that login function last time?"
↓
Retriever searches the document store for relevant fragments
↓
The matched fragments are handed to the LLM
↓
LLM generates the answer combining the question and retrieved material
2020 年,Lewis 等人将 RAG 描述为参数化记忆与非参数化记忆的结合:模型的参数就像“它已经记住的知识”,而外部索引则像一座可供它随时查阅的参考图书馆。
因此,把 RAG 描述成“每次都从头重读你的整本日记”并不完全准确。更合适的比喻是:在开口回答之前,你先让图书管理员根据关键词、语义或元数据,从档案中取来几页相关内容。
它的优势很明显:资料可以随时更新,知识库也可以很庞大。缺点同样明显:如果检索时找错了书架,那么回答再巧妙也于事无补。与其说 RAG 是对用户的持续理解,不如说它更像是“按需查询”。
第二种方法将记忆建模为图:每条记忆都是一个节点,节点之间通过关系相连。
[Transformer]
/ \
/ \
[Attention] —— [GPT]
\ /
\ /
[Scaled Dot-Product]
当“Attention”节点被激活时,能量会沿着边扩散,唤醒 Transformer、GPT 和 Scaled Dot-Product 等相关概念。这类似于 Collins 和 Loftus 在 1975 年提出的语义记忆“扩散激活”理论:一个概念一旦被触发,激活就会沿着联想网络传播。
这就像夜晚的城市。你点亮一盏路灯,电流便沿着道路传递,逐渐照亮周围的街道。
它的好处是能够发现间接关系:A 与 C 没有直接连接,但 A 连接 B,B 又连接 C,因此系统依然能够找到通路。
代价则来自网络本身:如何对节点去重、如何设置边的权重、激活应该传播多少跳、如何衰减旧关系、如何修复损坏的图……规模一旦扩大,你维护的就不再是一本笔记,而是一座城市的交通系统。
第三种方法最简单:记忆就是 Markdown 文件。需要时加载,不需要时跳过。
memory/
├── index.md ← Lightweight directory: links + one-line summaries
├── preferences.md ← User preferences
└── project-rescene.md← Project knowledge
Task: "Change the login page"
↓
Read index.md, hit [[project-rescene]]
↓
Read the relevant memories in project-rescene.md
↓
Inject into context, agent starts working
如果说 RAG 是图书管理员,那么纯 Markdown 就是一盒索引卡片。你不需要数据库控制台,也不必猜测黑箱里装着什么。打开文件,AI 智能体记住的一切都一目了然。错误可以修正,过期内容可以删除,版本变化也可以通过 Git 跟踪。
它的弱点同样直观:链接通常只能把你带到下一张卡片,并不会自动进行复杂的多跳推理。卡片数量较少时,它轻巧得令人愉悦;当卡片堆满整个房间时,如何找到正确的那一张便成了新的问题。
结构化 MD 并没有抛弃 Markdown,而是为每张卡片增加了几个字段:来源、类型、置信度、最后更新时间和适用范围。
- Content: User prefers short replies
Confidence: High
Source: Confirmed over multiple conversations
Last updated: 2026-08-02
- Content: Project may use Vue 3
Confidence: Pending verification
Source: Single mention by user
纯 Markdown 就像便利贴。结构化 Markdown 则像是把这些便利贴贴到白板上,再用不同颜色标记:“已确认”“待验证”“可能已过期”。
这一点很重要,因为记忆不仅会丢失,也可能会撒谎。并非出于恶意,而是因为它可能把一次性事件误认为某种规律,把昨天的事实当成今天的真相,或者将模型自己的猜测与用户真正说过的话混为一谈。
元数据就是记忆的“营养成分标签”:它会告诉 AI 智能体,这条信息来自哪里、有效期有多长,以及使用它是否安全。
当然,标签划分得越细,维护成本就越高。如果你还要求 LLM 定期合并、去重、降级和淘汰记忆,那就相当于雇了一名档案管理员:房间确实会更整洁,但档案管理员需要领工资,而且也可能把东西归错档。

这里并不存在“技术越复杂就越好”。
为了十条偏好构建知识图谱,就像为了跨过一条小溪而修建一座跨海大桥。把数百万份文档塞进 Markdown,则像是用便利贴管理一座国家图书馆。
记忆引擎没有唯一答案,只有与你的规模、任务和维护能力相匹配的答案。

如果只看到最终方案,你可能会以为我选择 Markdown,是因为图引擎太难,或者 PrismD 从未真正运行起来。
事实恰恰相反:PrismD 是在完全投入运行后才被判处死刑的。
PrismD 将记忆建模为加权有向图:
节点:一条记忆,包含文本、情绪、重要性和能量;
突触:记忆之间的关联,分为联想、时间、语义和情节四类;
集群:逻辑区域,包括用户画像、代码工作、工具日志和会话;
域:为不同用户或角色设置的物理隔离空间。
它的记忆生命周期并不是简单的 CRUD,而更像生物的新陈代谢:
ENGRAM write
↓
DRIFT decay
↓
LOOM recall and strengthen
↓
COMPILE compress
↓
CONSOLIDATE merge / discard
↓
PRUNE active forgetting
甚至连突触也会遗忘:
Effective Weight = Initial Weight × exp(-decay_rate × time_since_last_use)
一条长期未使用的连接,会像废弃的铁路线一样逐渐锈蚀。它每被使用一次,就证明自己依然有价值。
图扩散很容易做出惊艳的演示:点亮“初恋”,它便会唤醒“雨天”“火车站”和“那首歌”。但在生产环境中,更危险的问题是:那些本不该产生关联的事物,也会沿着边蔓延。
例如,工具错误不应该污染用户画像,临时会话也不应该污染长期项目知识。
因此,我构建了一个显式的集群间传播矩阵:
ToolLog → UserBase = 0.05
CodeWork → UserBase = 0.8
UserBase → Session = 1.0
当工具日志向用户画像传播时,其能量会被压缩至原来的 5%。这不是检索后的补丁式过滤器,而是将“记忆边界”直接写入传播动力学。
这个教训至关重要:记忆系统不仅需要召回率,还需要防止污染。记错一件事,往往比彻底忘记它更加危险。
PrismD 的可视化并不只是一份节点列表。你可以右键单击一条记忆,选择“追踪扩散激活”,然后看着源节点亮起,接着是第一跳,再到第二跳——就像电流在黑暗的神经网络中传递。
节点还会实时变暗。前端复现了后端的指数衰减公式,首次让“遗忘”变得肉眼可见。
这让我确认算法并非黑箱:为什么某条记忆会被召回、能量来自哪里、在哪一跳发生了衰减——这一切都可以观察。
但“可解释”并不等于“值得使用”。再漂亮的仪表盘,也无法回答这套架构的投入产出比问题。
我并不是仅凭感觉就说“图太重了”。我先用零依赖的 Python 对 SpreadActivation 进行了一比一复现,并逐项验证:
能量是否严格按照 0.9 × 0.85^hop 衰减?
ToolLog → UserBase = 0.05 是否真的能够阻止污染?
图扩散是否能够使用更少的 token 覆盖真实基准答案?
经过 DRIFT 后,低能量节点是否能按照阈值被正确剪枝?
四项检查全部通过。换句话说,图扩散是正确的。
随后,我使用同一份真实语料和同一套真实基准答案,让三种方法正面较量:
获胜的并不是最像大脑的 LOOM,而是最简单的 STRUCT_MD。
与全量注入相比,图扩散确实能够唤醒间接关联,也确实节省了 token。但放在完整的工程环境中,它在召回率上的边际优势,不足以抵消图结构、边权重、集群间矩阵、衰减状态、持久化、LLM 驱动的组织整理以及多语言运行时所带来的维护成本。
结构化 MD 足够快、足够透明,易于复现,也易于测试;出现问题时,只需要打开文件检查即可。
因此,投入两个月开发的 PrismD 最终被归档。记忆系统的主线收敛到了一个更简单的方案。
这并不是“项目失败”,而是一次完整的架构实验:
首先证明复杂方案确实有效。然后再证明,即便如此,它依然不值得采用。
许多项目只做了前半部分——让演示跑起来,然后宣布胜利。真正的工程判断力体现在后半部分:它带来的收益,是否大到足以让整个团队永远为其支付维护成本?
这次实验后,我保留下来的演进路径是:
纯 MD
↓ 首先:“可见且可编辑”
轻量级索引与反向链接
↓ 接下来:“可查找”
来源 / 置信度 / 时间——最小化元数据
↓ 最后:“可信且可过期”
只有当真实数据证明有必要时,才引入向量搜索或图关系
这就像种树:先让它活下来,再修剪;先让树干长起来,再决定在哪里嫁接。不要在种下一株幼苗的第一天,就给它装上卫星监控和城市级排水系统。
JSON 非常适合交换结构化数据。但当记忆需要长期阅读、手动编辑和版本对比时,Markdown 往往更加友好。格式应当服务于场景——不要把任何一种文件类型奉为圭臬。
每次工作流运行时都自动写入,很快就会让记忆存储变成阁楼:旧快递箱、报纸,还有一台舍不得扔掉的坏风扇。真正需要的东西反而再也找不到了。
自动记忆至少需要设置一道门槛:它是否重复?是否稳定?是否经过用户确认?对未来的任务是否有用?否则,所谓“增长”不过是垃圾堆得更高而已。
图很漂亮,多跳推理也很诱人。但每增加一种关系类型,就会增加一种需要解释、更新和测试的新状态。先用最简单的方法运行起来,让真实需求浮出水面,再决定复杂性应该放在哪里。
index.md 看起来只是一份目录,实际上却是记忆系统的门厅。如果门厅清晰,AI 智能体就知道该推开哪扇门。如果门厅堆满杂物,那么再豪华的房间也无法抵达。
“用户喜欢蓝色”和“用户在三个不同项目中都主动选择了蓝色”不是同一种记忆。来源决定可信度,时间决定它是否已经过期,作用域决定它能否迁移到下一个项目。
PrismD 的扩散、衰减和集群隔离都通过了单元测试。但完整系统最终仍然输给了结构化 MD。一个齿轮运转得再漂亮,也不代表整台机器值得建造。
最危险的想法是:“我们已经做了两个月,再坚持一下吧。”仅仅因为作者舍不得放手,代码并不会自动变得值得维护。当实验已经回答了问题时,归档比固执更专业。
回到开头:AI 智能体的记忆是一张不断被修剪的网。
RAG 解决的是“去哪里寻找材料”。图扩散解决的是“相关概念如何相互唤醒”。纯 Markdown 解决的是“如何保持记忆透明”。结构化 Markdown 解决的是“这段记忆是否可信”。
它们不是四支相互交战的军队,而更像四种不同的工具:书架太大时,请来图书管理员;关系太深时,铺开一张地图;需要透明性时,使用索引卡;需要可靠性时,加上标签。
PrismD 最终留给我的答案,不是“图扩散毫无用处”,也不是“Markdown 永远最好”。它留给我的是一个更简单的原则:复杂性必须用真实回报换取自己的生存空间。
真正成熟的记忆系统,或许不是记得最多的系统,也不是看起来最像大脑的系统,而是知道自身边界的系统:
重要时写入。需要时命中。该放手时放手。
如果你更想看看这种记忆理念如何落地到一个真实的 AI 智能体中——索引如何解析、上下文如何注入、记忆如何参与下一项任务——欢迎在 GitHub 上查看 ResceneAgent 的完整源代码:
🐙 GitHub:Rescenix/ResceneAgent 如果这个方向引起了你的共鸣,欢迎点个 Star、提交 Issue,或直接浏览代码。你的反馈将成为这个 AI 智能体下一段“记忆”的起点。
Alan M. Turing,《Computing Machinery and Intelligence》,Mind,1950。来源存档:剑桥大学国王学院 The Turing Digital Archive
Tim Berners-Lee,《The World Wide Web: A very short personal history》:W3C
John Gruber,《Markdown: Syntax》:Daring Fireball
Patrick Lewis 等,《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》,NeurIPS 2020:论文页面
Allan M. Collins 与 Elizabeth F. Loftus,《A Spreading-Activation Theory of Semantic Processing》,Psychological Review,1975:DOI: 10.1037/0033-295X.82.6.407
Jorge Luis Borges,《Funes the Memorious》,1942。引用该作品,是因为它从文学角度洞察了“无法遗忘”如何阻碍抽象。
ResceneAgent 项目源代码与文档:GitHub 仓库
Leon O. Chua,《Memristor—The Missing Circuit Element》,IEEE Transactions on Circuit Theory,1971:DOI: 10.1109/TCT.1971.1083337
Dmi