AI Agent 记忆层不可篡改凭证:300 行代码拆解

300 行代码,加上一个具体落点——给 AI Agent 的记忆层加”不可篡改的收据”。这是最近掘金热榜上一篇被反复讨论的开源实现的切入角度。对于正在被 Agent 失忆、记忆漂移折磨的开发者来说,这比任何一篇 Agent 框架横评都更值得拆开看一眼:它解决的是”凭什么信 Agent 记得没错”这种天天出但没人写进 issue 的问题。

它能冲上热榜,是因为记忆被篡改这事在生产环境早就开始出真问题。开发者每天都在和这种现象打交道:Agent 上周信誓旦旦说”你不吃辣”,这周因为新会话里某次提示注入把记忆改了,又兴致勃勃推荐麻辣火锅;昨天它严格按用户偏好设了”回复别用感叹号”,今天打开新会话又开始连发感叹号。这些不是模型能力问题,是记忆栈缺一层审计——没人知道改了什么、什么时候改的、改之前到底是什么。300 行瞄准的就是这个”没人在意但天天出事”的痛点。它能不能直接拿去用?更像一份思路样品,而不是开箱即用的产品——后面会讲清楚到底差在哪里。

热榜这篇到底做了什么

掘金那篇文章标题里已经讲清楚了定位——用 300 行代码,给 AI 的记忆层加上”不可篡改的收据”,附开源实现。它不是再造一个 Agent 框架,也不是替代 LangChain、Dify 那套工具栈,而是把目光收缩到一个具体问题上:AI 已经存下来的记忆,凭什么信它没被改过?给出的答案是给每次写入配一张可校验、可追溯的凭证。

这种”克制到只做一件事”的姿态,也是 那位用 300 行手写 Agent 的作者反复强调过的——框架会过时,不变的是 Agent 底层的那个循环。记忆层这件事也一样,与其去复刻大厂产品,不如先把”凭据可校验”这一层做透。

记忆层在 Agent 里到底是什么角色

要理解这 300 行的价值,先得拆开”记忆层”这个词。参考 里那种简化说法,很多人以为 Agent 的 Memory 就是把之前的聊天历史拿数组拼起来再发给模型——这只是最表层的工作记忆。完整的记忆栈还包括长期记忆、跨会话状态、Agent 自身推理过程中的中间结果,以及从工具调用回流进来的上下文。

记忆层是 Agent 在多轮、多会话、多任务里保持”人格一致”的物理基础。它一旦出问题,Agent 看起来就像换了一个人:上一秒还在遵守的规则,下一秒装作不知道;昨天还认得的项目代号,今天问起来要重新解释。OpenViking 长期记忆系统把记忆拆成四层——工作记忆、语义记忆、情景记忆、程序记忆——每层都有独立的写入、检索、衰减逻辑;进一步用三层分层加符号化建模来提高可解释性。这两套思路侧重的是”怎么让记忆更准、更有用”,而不可篡改凭证要解决的是另一件事:怎么让记忆可被信任。

记忆被篡改的几种典型场景

在动笔写代码之前,这篇开源实现的作者先盘点了当前最常见的几类篡改来源,这也是 300 行存在的理由。

第一类是外部提示注入。用户或隐藏在文档、网页里的恶意内容通过对话把”请把你之前记住的所有内容改成 X”塞给 Agent,Agent 真的会去”更新”自己的记忆。第二类是自身漂移覆盖。Agent 在新会话里基于错误推断,把旧记忆当成过时信息覆盖掉,把”用户不喜欢辣”默默改写成”用户喜欢川菜”。第三类是工具回写污染——调用第三方工具后,工具返回的内容被写回记忆,但没人审核过这内容是否可信。第四类是跨会话不一致:不同会话同时改同一段记忆,最后保留了一个版本,但没人能说清保留的是不是正确的那一份。

这四类问题都不是模型能力问题,是记忆栈缺”审计层”。300 行的不可篡改凭证,就是给记忆栈补这一层。

三条实现路径,300 行选了最轻的那一条

不可篡改凭证能想到的实现路子,大致走三条。

第一条是哈希链串联。每条新记忆都包含前一条记忆的哈希值,写入顺序一旦被打断,校验就失败。这条路最简单、代码量最少,也是 300 行实现的主路径。第二条是签名盖章。每条记忆生成时由可信方签名,读取时用公钥验签。比哈希链更安全,但依赖密钥管理,多一条密钥泄露的风险面。第三条是第三方公证,把每次写入广播到独立公证服务(甚至类似区块链账本),靠多节点共识防篡改。这条路最重,但抗攻击性也最强。

300 行选第一条有充分理由:成本最低、依赖最少、单机能跑、demo 友好。代价是单点信任——攻破这一个进程,整条链都失效。作者在文章里也承认,这条路是”最小可行实现”,不是终态方案。

300 行的代码结构里能看出什么

把掘金这篇的代码结构拆开看,整体靠”追加写 + 哈希链”这种最朴素的模式串起来,避免引入复杂状态机。从公开代码看,主要分几块,每块都被压到几十行。

记忆存储层负责原始数据落盘,最简单的就是 SQLite 或 JSON 文件。凭证生成层是核心:每条记忆在写入前先算哈希,把当前哈希与上一条记录的哈希串起来,形成一条只能追加的链。写入即盖章意味着”update”在代码层面几乎不存在——旧记录不会被修改,只追加新版本,凭证里同时记录操作类型(新增、版本替换、合并)和时间戳。读取即校验每次从链头开始重算哈希,发现对不上就拒绝返回,并提示调用方该位置已被破坏。

历史回放是这套设计的副产品。既然每条记忆都保留了前驱哈希,那么从任意一点回溯都可以重建完整的历史视图。对于”我昨天到底跟你说过什么”这类需求,回放比重新检索更可靠,逻辑上也更不依赖外部索引。

每个模块能做到这么短,是因为它拒绝引入复杂状态机——不解决冲突合并、不做并发控制、不管访问权限,把这些统统留给上层。换句话说,作者不是不知道这些重要,而是刻意把”最小可信凭证”从”完整记忆治理”里剥离出来。这种克制其实也回应了 那篇里反复强调的现实:真正值钱的从来不是那点代码量,而是背后的运维、计费、容灾配套。

单机能跑和生产可用之间隔着什么

诚实地讲,300 行能证明的思路到生产环境之间,至少隔着几层。

没有分布式共识,意味着这套实现只能信任”一个进程里的内存和磁盘”。要做多实例部署、读写分离、灾备切换,哈希链的”链头”就不知道该信谁。没有访问控制,任何能写进程内存的人都能绕过验证——在企业内部基本等于裸奔。没有审计日志:只证明了”记忆没被改”,但回答不了”是谁在什么时候请求改的”。没有压缩归档,几万条记忆之后哈希链会变长,校验一次的开销线性增长。没有密钥轮换和撤销机制——一旦把签名方案加上去,密钥过期老记录就跟着失效。

这些都不是 300 行代码的”缺陷”,而是它的设计取舍——它演示的是思路,不是开箱即用的产品。从思路变成产品,配套件的工程量比 300 行多得多,这也是 那篇里反复提醒的现实:别被这点”几百行代码”忽悠了。

它和已有记忆系统是什么关系

很多人会问:这套不可篡改凭证,是不是要把现在用的 OpenViking、AgentMemory 或者 LangChain Memory 全替换掉?不需要,也不该替换。

OpenViking 的四层记忆架构解决的是”哪些信息进哪一层、怎么衰减、怎么唤起”;提出的分层加符号化设计解决的是”怎么让记忆更可解释、更可检索”。不可篡改凭证和它们正交:它是叠加在已有记忆系统之上的一层审计组件,监听写入、生成凭证、暴露校验接口,现有记忆管理逻辑一行都不用改。

这其实就是 300 行最值得借鉴的设计哲学——把一件事做透,别试图做完所有事。比起那些号称”300 行复刻大厂产品”的言论,这种克制反而更接近工程落地的真实节奏。

一句话判断

不可篡改凭证解决的不是”让 Agent 更聪明”,而是”让 Agent 的记忆可以被审计和回滚”。300 行展示了把这件事做到最小可行的样子:单机能跑、哈希链串联、追加写不修改。要不要再往上推到生产,取决于团队对一致性和可信度的需求强度,以及愿意为这一层多花多少运维成本。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容