全部文章
博客版本发布扩展工程

智能体的记忆,以及值得信赖的状态

会话一结束,智能体就忘掉一切。NeuroSquad 0.1.222 新增“记忆”:画一条箭头,智能体就能保存学到的东西,下周还能找回来——保存在你的电脑上,可按含义搜索。同时,Claude Code 卡片不再卡在“工作中”。

阅读约 6 分钟0.1.222 带来了什么

智能体的每次会话都从零开始。你解释过这个仓库用 pnpm、迁移文件放在 db/migrations、没人手动推送 staging 分支——到了下一次会话,或者画布上的下一个智能体,又得从头讲一遍。指令文件适合一次写好的规则,却管不了智能体在工作中学到的东西。

NeuroSquad 0.1.222 新增 “记忆”,一个基于开源记忆引擎 mem0(Apache-2.0)的插件卡片。连接到它的智能体会保存值得记住的内容,之后再找回来——在另一次会话、另一个智能体里,或者重启之后。记忆保存在你的电脑上,位于应用的数据文件夹中。无需注册账号,也无需运行服务器。

Claude Code 卡片用箭头连接“团队记忆”卡片。终端里智能体先保存一条关于预发部署的记忆,随后根据自动回忆的记忆回答关于迁移的问题
第一轮:智能体用 memory_add 保存一条团队规则,卡片显示它和智能体的名字。第二轮:自动回忆把关于迁移的记忆加到提示中。截图中的智能体连接的是按脚本应答的本地模型;记忆、搜索和回忆都是真实的应用。

箭头就是权限

和所有插件一样,“记忆”是一张卡片。从智能体向它画一条箭头,智能体就获得六个工具:memory_search、memory_add、memory_list、memory_get、memory_update 和 memory_delete。移除箭头,工具随之消失,记忆仍留在卡片上。大多数命令行工具在下一次读取工具列表时就能看到变化,无需重启。Codex、Kimi Code、Cursor 和 Crush 只在启动时读取一次工具列表,因此它们一开始就有这些工具,由箭头决定调用能否通过。

记忆属于范围,而不属于某张卡片:此工作区(默认——这里所有连接的智能体共享)、所有工作区(适合处处适用的内容,比如你的约定),或 每个智能体独立(每个连接的智能体有自己的私有记忆,卡片显示全部)。除非你打开“智能体可以修改任何记忆”,智能体只能修改或删除自己保存的记忆。工具说明会告诉智能体:记忆是笔记而不是指令,密钥绝不能存入记忆。

mem0 需要嵌入模型才能搜索。我们不希望卡片在开始工作前还要先准备什么,所以默认使用内置的关键词索引:添加卡片后立即离线可用,能找到与问题有相同词或词片段的记忆——“postgres”能找到“PostgreSQL”。它不认识同义词,卡片也会如实说明。

升级选项是 智能搜索:一个在你电脑上运行的多语言句子模型 paraphrase-multilingual-MiniLM-L12-v2。在卡片上按一下,就会一次性下载约 150 MB——模型、分词器和 WebAssembly 运行时——逐个文件校验 SHA-256,并为已有记忆重建索引。选择 WebAssembly 是有意为之:没有原生代码,同一套文件就能在 Windows 和两种 Mac 上运行,无需重新编译或签名。你也可以改用 OpenRouter 或你自己服务器(Ollama、LM Studio、llama.cpp、vLLM)上的嵌入模型。

“团队记忆”卡片用英文问题搜索;唯一的匹配是关于 PostgreSQL 16 和 db/migrations 的中文记忆,匹配度 27%
用英文提问(“迁移文件放在哪里?”)也能找到用中文写的记忆。百分比是卡片在每个结果旁显示的匹配分数。

为什么选这个模型

我们用英文、俄文和中文的文本对比较了两个同样大小的模型。multilingual-e5-small 给相关和不相关文本对的分数几乎一样——都在 0.75 到 0.81 之间——还把“用哪个包管理器?”排得离数据库那条记忆比离 pnpm 那条更近。MiniLM 能把它们分开:相关文本对约 0.53–0.58,不相关的低于 0.25。正是这个差距让卡片能把不相关的记忆排除在外。不过分数整体不高,所以自动回忆的阈值比搜索框更严格。

智能搜索没有设为默认,因为首次使用时下载 150 MB 会让智能体的第一次 memory_add 一直等着,还会消耗没人要求的流量。卡片会在合适的位置——记忆数量下方——提供这个选项。

不用开口的回忆与保存

我们告诉智能体,在可能依赖先前决定的工作之前先搜索记忆,但它们并不总是照做。卡片上的两个开关(默认都关闭)让这件事不再依赖它们。

  • 自动回忆。 在连接的智能体每次提示之前,用提示在卡片的范围内搜索,最多五条相关记忆会以笔记的形式加入这一轮。如果搜索超过三秒,这一轮就不带回忆直接进行。Claude Code、Codex 和 Qwen Code 通过各自的提示钩子实现,OpenCode 和 Kilo Code 通过 NeuroSquad 插件,pi 和 omp 通过它们的扩展,Gemini CLI 通过一个专门的钩子。
  • 自动保存。 连接的智能体结束一轮后,你的提示和它的最终回答会发给你在卡片上选择的事实提取模型——OpenRouter 上的或你自己服务器上的。模型只保留长期有效的事实,常常一条也没有。没有模型时这个开关不可用:否则每个提示都会被原样保存。
卡片上一条记忆的历史:先以 PostgreSQL 15 添加,随后被修改——旧文本被划掉,新文本为 PostgreSQL 16
每条记忆都保留历史。这一条最初写的是 PostgreSQL 15,后来在卡片上做了修改。

保留什么由你决定。卡片列出每条记忆及其作者——你、某个智能体或“自动”——可以就地修改或删除,并显示历史。导出会把一个范围写入 JSON 文件;导入时先显示预览再写入:多少条是新的,多少条已存在并将跳过。“撤销”只删除上一次导入添加的内容。删除工作区会删除它的记忆,删除智能体会删除它的私有记忆,删除对话框会事先说明数量。

记忆卡片的设置:自动回忆已开启,自动保存因需要事实提取模型而关闭,还有三条记忆的导入预览:两条新增,一条已存在
卡片设置:两个自动开关,以及来自另一个工作区导出文件的导入预览。

依据会话记录判断 Claude Code 的状态

卡片的状态——工作中、需要你的回答、已完成、空闲——来自命令行工具的钩子。对 Claude Code 来说这还不够。我们检查了自己的 14 份 NeuroSquad Claude Code 会话记录,只看事件类型:166 轮中有 14 次中断,3 轮因速率限制结束,还有 38 个提示是在 Claude 仍在工作时输入的。最近有七轮结束时根本没有 Stop 钩子——发生在按下 Escape 或 API 出错之后——每一次都让卡片停在“工作中”。另一个问题是 Notification 钩子:除了真正的权限请求,它还会报告子智能体完成、对话框结果等事件,卡片会在一轮正常结束后把其中一些当成“需要你的回答”。

Claude Code 会把每一轮写入会话记录文件,钩子会告诉我们文件位置。现在每张 Claude 卡片在智能体工作时读取记录中新增的行,并据此核对状态:比当前状态更新的一轮结束、中断标记或 API 错误会结束这一轮;在完成之后开始的新一轮会让卡片重新变为工作中。在我们的测试中,回答中途按 Escape,卡片约 0.3 秒变为空闲。API 错误会以“Claude stopped: API error”结束这一轮并照常提醒,但提示队列不会发进失败的一轮。“需要你的回答”现在只来自权限请求或提问;后面排着提示的 Stop 也不再在两轮之间提醒“已完成”。

如果卡片看起来仍然不对,它的菜单里有 “复制状态追踪”:卡片最近的状态事件和状态转换,只有事件类型——不含提示、回答、命令或文件名。把它粘贴到问题报告里,我们就能看到卡片看到的情况。

插件有自己的页面 记忆(mem0),文档 里有使用指南;状态和通知见 通知。完整的更改列表见 0.1.222 更新日志。