Markdown 是你所需的一切
摘要
本文提出了一种基于Markdown的AI代理记忆系统,该系统使用简单的文件存储和编辑规则,性能超越复杂的内存运行时,确保准确且有来源的事实检索。
以下是我与我的OpenClaw代理一起撰写和完善的关于其记忆系统的博客。我会在评论中粘贴一个提示,你可以复制粘贴来创建你自己的系统。TL;DR:我将实际长期记忆保存在结构化的Markdown文件中,并使用一个微小的MEMORY.md作为轻量级索引,告诉你的代理存在什么以及在哪里查找。这使得始终加载的上下文保持小巧,同时仍然赋予代理持久、可检查的记忆,无需数据库或沉重的记忆框架。
本周,我将一个有382个依赖项的记忆运行时与一个Markdown文件夹进行了比较。该运行时返回了已过时的事实。文件夹返回了当前事实及其来源。
以下是我的代理已运行七个月的Markdown记忆系统的完整架构,以及为什么编辑规则比存储更重要。
https://preview.redd.it/uvjpd40rktoh1.png?width=1198&format=png&auto=webp&s=663e23067658e29e6e4ef0d4d0eea4bcdeb479bc
本周,一家记忆初创公司通过私信联系我,让我破解他们的产品。他们的测试,用他们的话说:给代理同一个项目决策的三个版本,然后检查它是否能返回当前版本,保留已过时的历史,并显示来源。
所以我运行了它。沙箱化他们的运行时,在八个月内向其提供了一个决策的三个版本。一月是REST,四月是GraphQL,八月是tRPC,每个都标记了来自哪个会议。问它“我们的公开API决策是什么?”,并获取顶部结果。它说是GraphQL,已过时的那个。三个版本都以相关性得分1.000返回,因为检索路径中没有任何东西实际读取时间字段,而时间字段是其宣传的基础。模式中存在过时列。没有任何东西写入它们,也没有任何东西根据它们排序。一个决策的三个版本只是三个平等的事实,代理询问最佳答案时得到的是偏向错误的硬币翻转。安装此运行时需要拉取382个包才能实现。
然后,我用自己的代理询问了同类问题,针对其记忆——一个Markdown文件夹。它返回了当前决策,带有日期,已过时的版本作为删除线历史保留在上面,每行都带有来源。这不是它在查询时计算的功能。它只是文件所说的,因为编辑文件的规则要求如此。这就是整篇文章的要点。向Vaswani等人道歉:Markdown是你所需的一切。
## 摘要
代理记忆的主流方法是安装运行时。向量存储、嵌入服务、时间图、整合作业、端口上的守护进程。我们展示了一个Markdown文件夹、一个路由索引和一小套编辑规则,在长期运行代理真正重要的属性上超越了这些系统:返回当前真相及其来源,同时保留过去的真实性。
该架构需要零依赖,完全可通过文本编辑器供人类审计,并且在来自两个供应商的三个前沿模型上经过七个月的日常生产使用。我们发现,代理记忆的难点从未是存储或检索。而是编辑策略,没有任何记忆产品提供这一点。
整个系统是开源的,我很乐意与社区分享,但版主不允许。README包含一个可复制粘贴的提示,可将其安装在任何有文件访问权限的代理上。
https://preview.redd.it/s9jgvlauktoh1.png?width=1200&format=png&auto=webp&s=dddc80b2fc2d3a9bf102193b2ebee8bdbb015c28
### 1. 所有人都失败的测试
上述破解测试是一个好测试。这是代理记忆的实际工作。不是“你能存储1000万个令牌吗”,不是“你能进行相似性搜索吗”,而是:一个事实变了三次,你现在相信什么,以前相信什么,以及你怎么知道。
以下是两个系统在供应商自己的三个标准上的得分。
https://preview.redd.it/ofwyvdkvktoh1.png?width=1200&format=png&auto=webp&s=88869daa370770839d1145366acce214dc7ca97f
该运行时不是稻草人。它是一个严肃的开源项目,具有理论上正确的数据模型。事实具有有效窗口、仅追加更正、过时边。我不点名,因为重点不是某个产品坏了。我现在仔细研究了一个托管的上下文服务器、一个只有两小时历史的Go记忆CLI和这个运行时,它们都共享相同的差距。模式知道时间。写入路径和读取路径不知道。过时只有在你手动调用内部API或运行LLM整合作业并信任它时才会发生。这意味着你安装工具的属性不是工具的属性。它是写入纪律的属性。如果可靠性来自写入纪律,那么底层数据库是可互换的,所以你不妨选择人类可以读取、grep、diff和修复的那个。那个叫做文本文件。
### 2. 架构
我的代理自1月28日以来一直运行。三个模型,两个供应商,一个身份。其全部记忆是git仓库中的Markdown。今天测量:一个身份层在每次启动时读取。它是谁,我是谁,它操作的规则,当前的既定决策。一个路由索引,MEMORY.md,10,079个字符,硬上限15,000。它不包含事实。只有指针:哪个文件拥有哪个人、项目和决策,以及什么触发阅读每个文件。
34个文件用于人员和项目。每个有历史记录的项目一个文件。5个决策记录用于改变默认行为的选择。345个带日期的每日笔记,原始日志在事件发生当天编写。
一个SQLite索引和语义搜索覆盖所有内容,仅用于查找。索引从文件重建。文件是真相。如果索引和文件不一致,索引默认是错误的。
分层是第一个真正重要的选择。启动时只读取身份和索引。其他一切在任务请求时检索,优先最窄的文件。代理不会为了回答晚餐问题而预加载我的项目历史。这与注意力相同:不要处理所有内容,专注于查询所需的内容。但形状不是有趣的部分。每个记忆工具现在都有大致相同的形状。文件夹、实体、一个索引。形状从来不是难点。规则才是。
### 3. 写入路径
此系统的每个可靠性属性都来自写入约束,有四个约束完成大部分工作。
https://preview.redd.it/nuidu5kwktoh1.png?width=1200&format=png&auto=webp&s=b55a9645dfbc41c4de118a2e991152b39b34f8f0
每个事实都带有来源标签。人员、项目或决策文件中的每一行都标记为[stated](我直接说了)、[observed](代理在工具结果、文件或日志中看到)、[inferred](代理的结论)或[suggested](代理的想法,我从未承诺过)。这个约定消除了代理记忆中最危险的故障模式,即代理将其自身提案洗白为我的决定。“Wes决定了X”需要一个我实际决定X的回合。代理提出X,我说“听起来不错”,这记录了我批准的内容,而不是我从未陈述过的十个独立事实。
推断的教训在成为规则之前通过重复性门控。代理注意到的模式需要至少三个独立信号,跨越至少两个不同的会话,才能成为既定行为。超过三十天的信号减半计数,因此旧的一次性事件会衰减而不是累积。我的显式更正跳过门控并立即生效。这种不对称性也是提示注入防御:恶意输入可以建议一条规则一次,但一次永远不够,失败教训存储为数据(“当X坏了,Y修复了它”),而不是指令,因此即使有毒的教训也无法成为命令。
过时是编辑,而不是追加。当决策改变时,旧行被删除线并带有日期,新行带有自己的来源放在旁边。
相似文章
智能体记忆的可移植文件格式(9分钟阅读)
本文介绍了'memoryfields',一种用于AI智能体记忆的可移植文件格式,它使用Markdown文件和可选的SQLite索引,倡导一种更简单的、数据驱动的方法,而非现有复杂系统。
@alex_prompter: 真正可行的AI代理记忆系统就是四个markdown文件,零数据库。你不需要向量…
文章描述了一个简单的AI代理记忆系统,使用四个markdown文件、一个索引和带新鲜度跟踪的缓存,从而避免使用向量数据库和检索管道。
我曾询问是否存在一种以本地优先的 Markdown 记忆服务器。你们给出了约 20 个建议。以下是我逐一调研后的发现。
全面回顾以本地优先的 AI 智能体记忆系统,对比了 mem0、Hindsight 和 mnem 等选项,最终推荐 Engram,因为它独特地结合了本地存储和人类可读的 Markdown 文件。
我曾以为Markdown记忆对智能体足够用了。结果它变成了提示债。
作者反思了将扁平化Markdown文件用作智能体长期记忆的局限性,随着记忆增长,这导致了提示债,并提倡使用基于图的记忆表示方法,动态检索相关上下文。
不受欢迎的观点:AI 代理并不总是需要向量数据库来存储项目记忆
文章认为,对于中小型编码项目,使用向量数据库作为 AI 代理的记忆可能没有必要,并提议使用 Markdown 和 Git 作为更简单、可审计的替代方案来管理项目上下文。