A tangle of colorful wires

一个记忆插件会分析你的对话。它生成 1,000 个孤立的片段,并将它们插入向量数据库。你每次发出提示词时,它都会附上最相似的五个片段;如果智能体感到困惑(它确实会),它就会手动搜索更多片段。这就是他们称之为“记忆”的产品。

当你思考自己究竟想解决什么问题时,用起来会觉得这很奇怪。你希望你的智能体理解你的项目。知道某个功能在哪里、为什么构建它、你们达成了什么共识、你在意什么。结果你得到的却是在 RAG 片段上碰运气,每次提示词都注入,指望正确的那些能浮上来。

即使它真的起作用,智能体仍然不理解你的项目。整个记忆插件生态系统都在解决错误的问题。

因为智能体不需要记忆。它们需要文档。

一切都只是 RAG

市面上每一个记忆插件都以相同的方式运作:

  1. 遍历会话记录
  2. 生成“记忆”片段
  3. 插入 RAG 数据库
  4. 每次提示词都检索前 5 条并注入
  5. 还需要更多?给智能体一个工具,让它在 RAG 数据库中搜索

这就是整个架构。有些工具格外花哨;它们让智能体逐字搜索过去的记录。或者它们实现某种多层记忆系统,对短期或长期记忆进行分类。又或者它们添加一堆后台守护进程来审查、合并或去重记忆。一夜之间重写记忆的“做梦者”。持续上下文压缩。重排序器。等等。

每个插件都试图添加新的烧 token 的“功能”,来修补底层同样有缺陷的架构。这就是为什么它们没有一个能可靠地工作。

召回的问题

所有这些记忆插件都遭受同一大类问题的困扰。

  • 记忆是按相似度浮现的。相似度搜索排序的是两个片段在嵌入空间中的接近程度。仅此而已。你并不知道哪个是正确的、最新的,或者缺了什么。
  • 记忆的存储没有上下文。一个 RAG 片段只能包含这么多内容。你丢失了其他一切:上下文、动机、教训、环境等等。
  • 过去被当作真相。所有这些插件都依赖召回;无论是通过转录文本搜索,还是通过向量数据库。但代码库每天都在变化;那么关于身份验证的 500 个片段各自到底有多准确?
  • 智能体无法搜索它不知道的东西。即使你确实向智能体暴露了一个搜索工具,智能体又怎么知道何时使用它?智能体不知道自己不知道什么。
  • 这个存储是不可审计的。SQLite 里有 10,000 个嵌入。哪些记忆存在?哪些已经过时?哪些从未被检索过?哪些是错误的,并在暗中影响你的智能体工作方式?

这些只是记忆插件所面临、尝试解决却未能解决的众多问题中的五个,因为它们都做出了同一个假设:

智能体会遗忘:这就是问题所在。所以解决办法就是记住。为了更好地记住,我们应该捕获更多、更好地索引、更智能地检索。

它们的整个论点都围绕着捕获和召回过去。但其他任何人处理知识都不是这么做的。没有人会重看 3 年前的团队会议,来记住某个功能的约束条件。人们会把事情写下来,并使用那些记录。

同样地,解决方案是不是给智能体一个搜索工具,让它用来搜索过去价值 1,000 万 token 的对话,重建所发生事情的碎片。

解决方案,是基于文档的记忆。

如今,人们用 AI 以光速产出产品、功能和垃圾内容,却完全不阅读或理解哪怕一行代码。在这种情况下,很容易看出文档为何最终沦为事后才考虑的东西,而它本应比以往任何时候都更重要。

文档胜过召回

人们早就知道智能体需要上下文。这就是为什么他们发明了AGENTS.md文件:这样智能体就不会盲目地闯入代码库。这很有效。但很多时候,那个单一文件是该项目的唯一文档。

一个单一文件是不够的。智能体需要一整个大脑,一个结构化的工作空间,在那里它可以无需被要求就记录指令、规格、决策、研究、索引,任何东西。关于代码审查流程如何运作的指令,详述与用户讨论了什么的规格,对某个陌生库或 API 的可复用研究。

当智能体工作时,它可以从大脑中读取文件,以获得相关且完整的上下文。智能体工作完成后,它会更新过时的内容,在必要时添加新文档,而此时完整图景仍在上下文中。通过这种方式,智能体循环从提示 → 构建 → 遗忘转变为提示 → 查阅 → 构建 → 更新。记忆从一个你硬接到智能体上的 RAG 数据库,变成了一个你可以读取、更新,甚至共享的工作区。

付诸测试

一年多前,当我刚开始用 AI 编程时,我就意识到了这个问题。我想要一种让智能体跨会话记住工作的方式,于是我先创建了一个internal/文件夹,让智能体把所有内容都写下来:规格、计划、索引。我要求智能体在开始工作前始终阅读相应的文档和索引,并在工作完成后进行更新。

这套简陋的指令慢慢演变成了一个正式系统,然后又变成了一个名为Operator Memory的插件,我一直在自己的所有项目中定期使用它。

Diagram comparing the prompt, build, forget loop with Operator Memory's prompt, consult, build, update loop

Operator Memory 使用上述模型提供基于文档的记忆。Operator 为你的智能体提供一个 Markdown 大脑,它可以在其中持久保存重要知识:指令、规格、研究、索引。工作前,智能体始终查阅大脑中的相关文档。工作后,智能体更新大脑;重新审视过时的文档,在缺失处添加文档。

没有向量数据库。没有嵌入。没有摘要器、策展器、更新器、梦想器,或任何其他烧 token 的后台守护进程。没有黑盒检索。

使用 Operator,一切都是纯 Markdown 文档,你可以阅读、更新、提交,并与团队共享。我已经使用这个系统一年多了。如果你想试试,它是免费且开源的:https://github.com/aerovato/operator-memory