AVM:重新思考 AI 智能体的记忆
AI 智能体会遗忘一切。每次会话都从零开始。唯一的连续性来自于你在开始时显式传入的内容——而最朴素的方案,是把所有东西堆进一堆 Markdown 文件,然后统统加载进来。
这在一定程度上是有效的,直到它不再有效为止。
真正的问题不是存储
遇到记忆限制时,直觉反应是考虑存储:我该把数据放在哪里?但这是个错误的问题。真正的约束是上下文窗口——智能体不是从磁盘读取,而是从 token 中读取。所有进入记忆的内容都必须塞进一个有限且昂贵的预算里。
所以真正的问题不是「我在哪里存储记忆?」而是「哪些记忆值得现在加载?」
这一重新定框改变了一切。你不需要一块更大的磁盘,你需要一个对 token 代价有感知的检索系统——它能看着一个查询,在不超出预算的情况下返回最相关的上下文。
为什么是文件系统?
AVM 将智能体的记忆组织成一个虚拟文件系统。这个选择看起来有些奇怪——为什么不是数据库?不是向量存储?不是图数据库?
因为文件系统是我们所拥有的最通用的结构化信息心智模型。每个开发者都理解路径、目录、权限和文件操作。更重要的是:智能体也理解它。智能体已经在使用的工具——读、写、列目录、搜索——直接映射到文件系统操作上。
还有一个更深层的原因。记忆不是一个单一的东西。智能体有不应共享的私有笔记、应在智能体之间流通的共享知识,以及用于紧急信号的广播频道。文件系统让这些区别可见且可导航。扁平的数据库做不到。
/memory/private/{agent}/ ← 仅属于你
/memory/shared/market/ ← 所有人可读,专家可写
/memory/shared/events/ ← 广播,任何人都可写命名空间即策略。
记忆不应被覆盖
当你更新对某件事的看法时,你不会抹掉之前的想法。你会在旧的观察旁边添加新的。历史很重要——它是你思维演化的证据。
AVM 默认将写操作视为追加操作。每次新的观察都会创建一个新节点,旧版本持续存在。当你回忆某事时,系统会从所有版本中找到最相关的节点,在 token 预算内进行综合。
这是记忆正确的语义。覆盖写适用于配置,对于知识则是错误的。如果两个智能体独立观察到同一市场信号并各自写下分析,你希望两份分析都保留——而不是保留最后写的那个。
/proc 的洞见
Linux 有一个精妙的设计:/proc 看起来像文件系统,但它不是。当你 cat /proc/cpuinfo 时,你并不是在读一个文件——你是在触发一个内核函数,将实时系统状态格式化为文本。文件系统接口只是一个通用的 API。
AVM 对记忆元数据做了同样的事。每个节点都有虚拟子文件:
note.md:meta— 节点的重要性得分、时间戳、来源note.md:links— 该节点关联的其他节点note.md:history— 内容如何随时间变化:search?q=RSI— 目录级别的搜索,渲染为文件读取
核心洞见:文件系统接口足够完备,可以表达任意操作。你不需要特殊的客户端库,不需要学习新的 API。Shell 命令、脚本、智能体——任何能读取文件的东西都能立即使用。
多智能体是第一等公民
大多数记忆系统是为单个智能体设计的,事后才加入多智能体支持——通常是通过给数据加前缀来区分归属。
AVM 将多智能体视为第一等设计约束。权限模型是声明式的:每个智能体对特定命名空间有明确的读写权限。一个智能体不会意外地将其私有上下文泄露给另一个智能体。共享知识必须显式放置在共享命名空间中。
这很重要,因为智能体会犯错误。一个将敏感推理写入共享命名空间的智能体会将其暴露给所有人。一个读取另一个智能体私有笔记的智能体可能被它本不应看到的上下文所污染。权限系统不是官僚主义——它是让每个智能体信任自己上下文的边界。
「Token 预算」真正意味着什么
Token 感知检索听起来像一种优化,实际上是一种设计哲学。
目标从来不是删除旧记忆——删除会破坏信息。目标是控制什么会被加载到特定会话中。recall() 不返回文件,它返回一个综合摘要,按相关性、时效性和重要性打分,修剪到指定的 token 预算内。
这比数据库查询更接近人类记忆的工作方式。你不会检索你对某个主题的全部记忆——你会检索最突出的部分,经过上下文过滤。系统做了那个过滤,这样智能体就不必自己做了。
文件系统隐喻、追加写、虚拟节点、声明式权限——这些不是实现选择,它们是对同一个基本问题的回答:对智能体来说,「记住」意味着什么?
不是存储。不是检索。而是真正延续重要的事情,以现在有用的形式。
