阐释 AI Agent 中工作记忆文件与可检索知识库这两个不同的记忆层,以及各自的正确用法。
AI translation, not an official translation. Refer to the original for technical details.
Adapted from @MichaelGannotti# 你的 Agent 有两个大脑,请停止把它们当成一个 MEMORY.md 不是第二大脑。 Hermes 和 OpenClaw 都能"记忆"。这个词背后藏着两套截然不同的系统。 其一是 Agent 的工作记忆:像 MEMORY.md 和 USER.md 这样经过精心整理的小文件,随每次对话载入提示词。 其二是记忆库或第二大脑:Obsidian 知识库、LLM wiki,或者 Agent 可以检索和维护的 Markdown 知识库。它不应该在每轮对话中都被全量导入。 如果你把这两层合并处理,Agent 要么忘记你是谁,要么把一部小说拖进每条回复,把重要内容压缩得无影无踪。 两个层次 把它想成一个人,而不是一个聊天机器人。 Agent 记忆是始终在线的工作记忆。好的例子:MEMORY.md、USER.md 以及技能文件。错误用法:把整个 wiki 塞进系统提示词。 记忆库是按需调用的知识。好的例子:Obsidian 知识库、LLM wiki,或按日期命名的日记。错误用法:期望整个知识库在每次回复时都被加载。 它们解决的是不同的问题。 1. Agent 记忆(MEMORY.md) 这是贴在显示器上的便利贴。 在 Hermes 中,通常由两个小文件构成: • MEMORY.md:用于持久性事实、既定决策和项目指针 • USER.md:记录关于你的信息:偏好、沟通风格和约束条件 这些文件被刻意保持精简。社区文档显示,Hermes 中 MEMORY.md 约为 2,200 字符,USER.md 约为 1,375 字符。它们在会话开始时加载。在 Hermes 中,为了保持提示词缓存的稳定性,这些文件在会话剩余时间内往往被冻结。写入操作会立即落盘。它们并不总是出现在当前会话的系统提示词中。 OpenClaw 则更侧重文件与检索的结合: • MEMORY.md:用于私有主会话中经过整理的长期事实 • memory/YYYY-MM-DD.md:日常工作笔记 • 今天和昨天的笔记通常自动加载,更早的日期保持可检索状态 • memory_search 和 memory_get 以块为单位检索内容,而非将整个存档注入提示词 OpenClaw 还附带一个内置的 memory-wiki 插件,可将持久性知识编译成结构化的 wiki,与活跃的记忆插件并存。它不替代 MEMORY.md。 适合放入 Agent 记忆的内容: • 你是谁,以及 Agent 应该如何与你沟通 • 固定规则 • 活跃项目名称及指向知识库页面的指针 • 硬性约束、记录工具、当前优先级 • Agent 反复犯错的纠正项 不适合放在这里的内容: • 研究资料转储 • 会议记录 • 你曾提及的每一个人 • 完整的架构说明 • 不断增长的"今天我们还……"日记 MEMORY.md 是索引,也是章程。它不是图书馆。 技能文件紧随其后,作为程序性记忆存在:记录如何再次完成某项工作,而非上次完成它的故事。 会话数据库是情节性记忆。Agent 可以检索"我们去年八月有没有调试过这个问题?",而无需把那段故事保留在提示词中。 2. 记忆库 / 第二大脑 这是图书馆、wiki,也是档案柜。 你可能见到的名称: • Obsidian 知识库 • LLM wiki:不可变的来源、LLM 拥有的 wiki 页面,以及一个 schema 文件 • OpenClaw memory-wiki • 以 Agent 为范围的 Markdown 树,用于知识、实体和决策的管理 重点不在于"更多文件",而在于经过编译、可供检视的知识。 • 人类可读的 Markdown • 稳定的页面名称 • 反向链接,而非神秘的向量数据团 • 支持 Git diff • 在切换 Hermes、OpenClaw、Claude Code、Cursor 或本地模型后依然有效 • 你可以打开它,亲眼看到 Agent 相信什么 金库是温热记忆与冷存储的结合。当指针或搜索表明某个页面有价值时,智能体才会打开它。它不会在启动时将整个金库一口吞下。 Karpathy 的 LLM-wiki 构想是正确的心智模型。不要每次会话都从原始笔记中重新推导相同的答案。要维护页面、查询索引、检查矛盾。保持源数据不可变,让模型负责管理 wiki 层。 Hermes 官方指导说得很直接:Obsidian 是一个可供审阅的 Markdown 层,而非 MEMORY.md 和 USER.md 的替代品。持久性事实留在智能体记忆中。金库存放研究资料、摘要、项目背景和待审队列。 **为何会产生混淆** 两者看起来都是 Markdown。两者都被称为"记忆"。两者都可以由智能体写入。 于是人们会这样做: 1. 智能体学到了有用的东西 2. 他们将其粘贴进 MEMORY.md 3. 文件越来越大 4. 整合或截断机制启动 5. 早期上下文被压缩成一个失真的摘要 6. 智能体此后对一个压缩过的半真相深信不疑 或者反过来: 1. 他们把所有东西都放进 Obsidian 2. 热层中什么都没有 3. 压缩之后,常驻指令消失了 4. 智能体在会话中途忘记了使用规则 两个层都没有问题。问题出在路由上。 热层回答:我在和谁交谈,规则是什么,当前有什么任务正在进行? 金库回答:关于这个人、这个仓库、这个决策或这个领域,我们已经知道些什么? **为何你需要金库** MEMORY.md 永远不会成为你的第二大脑,也不可能成为。上下文窗口、缓存和整合机制不会允许这一点。 你需要金库,是因为知识应当不断积累,而不是不断蒸发。会话日志可以搜索,但它们并不是对你的世界的一个持续维护的模型。一个 wiki 页面可以吸收十次会话的内容,而无需将这十次会话都强行塞进下一个提示词。 你需要能看到智能体相信什么。如果智能体要基于某个事实采取行动,你应当能够打开那个页面、编辑它,并留下注释。 智能体可以替换,金库不应该替换。今天是 Hermes,明天是 OpenClaw,某个仓库上是 Claude Code,另一台机器上是本地模型。磁盘上的金库是可移植的基底。隐藏在主目录下的记忆文件则做不到这一点。 检索优于填塞。把一个 200 页的金库塞进提示词,并不是拥有了更多记忆,而是注意力更差了。指针加上文件读取或 wiki 搜索,每次都胜过塞满的系统提示词。 你成为主编。智能体起草,你决定接受、修改还是删除某个页面。这个审阅循环正是你阻止静默偏移的方式。 日常笔记与持久知识是两件不同的事。OpenClaw 已经对此做了拆分:日常文件用于运行上下文,MEMORY.md 用于提炼后的事实。金库是第三跳:提炼后的知识页面,比两者的生命周期都更长。 **有效的集成模式** 不要用金库替代智能体记忆。 不要用智能体记忆替代金库。 让 MEMORY.md 充当路由器。 热层:MEMORY.md、USER.md、SOUL.md。包含常驻规则、身份信息、当前工作以及指向金库的指针。 温热层:智能体按需打开的金库页面。涵盖项目、人物、决策、操作指南和研究资料。 情节层:会话数据库与日常笔记。记录周二发生了什么。 程序层:技能。记录我们如何完成这项工作。 一份好的 MEMORY.md 看起来像这样: 常驻规则 • 在任何不可逆操作前先询问。 • 永远不要将密钥放入金库。 • 优先编辑现有 wiki 页面,而非新建重复页面。 当前工作 • 项目 A 的详情存放在 wiki/projects/project-a.md • 项目 B 的详情存放在 wiki/projects/project-b.md 如何检索 • 人物与机构:wiki/entities/ • 决策记录:wiki/decisions/ • 回答前先检索知识库,不要依赖记忆作答。 • 若某条事实在未来30天以上仍有参考价值,则写入知识库页面,再在此处添加一行指针。 最后这句话,就是整个系统的核心。 **如何搭建** **第零步:划定范围。** 第一天不要把 Hermes 或 OpenClaw 对准你整个私人知识库。 先创建一个专用知识库或文件夹: AgentVault • index.md • wiki/concepts • wiki/entities • wiki/projects • wiki/decisions • wiki/how-tos • daily • inbox • raw(可选,存放不可变的原始资料) • log.md 除非有充分理由并配置独立的权限隔离方案,否则请将日记、密码、家庭笔记和客户机密排除在外。先从一个"Agent Memory"文件夹起步,通过冒烟测试后再逐步扩展。 **第一步:明确所有权。** 若采用"LLM写wiki"模式,原始资料由你掌管,保持不可变。 Wiki 由 Agent 负责,它负责撰写和更新页面,你来审核。 index.md 和 MEMORY.md 由你和 Agent 共同维护,保持简短。 如果你已经在用 Obsidian,请使用独立知识库或顶层文件夹。对于频繁写入的 Agent,独立知识库更为整洁。 **第二步:接入 Hermes。** Hermes v0.14 附带的社区接入路径: ``` hermes memory setup –provider obsidian –path ~/AgentVault hermes memory status ``` 可选但实用的配置: • 在本地启动 Obsidian Local REST API,供运行期间实时读写 • 配置 Obsidian MCP server,使任意 MCP 客户端共享同一个"大脑" 然后在 MEMORY.md 或某个技能文件中告知 Hermes 文件夹约定:写入位置、页面命名规则,以及何时将某条事实提升为"热记忆"。 **冒烟测试**:让它把本次会话的单页摘要写入日记笔记,并在 index.md 中添加一条指针。打开 Obsidian,如果找不到那条笔记,或者无法编辑它,说明这套集成只是表面文章,没有真正跑通。 **第三步:接入 OpenClaw。** 保留原生文件。 持久事实写入 MEMORY.md。 运行上下文写入 memory/YYYY-MM-DD.md。 然后将知识库添加为额外检索路径,如需编译页面和 Wiki 工具,启用 memory-wiki。 让会话记忆插件负责捕获和召回,让知识库负责编译页面。两者可以叠加使用,但不应抢占同一项工作。 **第四步:给 Agent 配备归档技能。** 这一步是大多数人会跳过的,但没有规则,知识库只会变成一堆垃圾。 1. 在回答重复性问题之前,先检索知识库。 2. 做出决策后,撰写或更新决策页面,包含日期、背景、决策内容、备选方案和相关链接。 3. 接触新的人员或供应商后,更新对应的实体页面。 4. 不要重复创建,合并到已有页面中。 5. 只有某条信息需要影响未来每一次会话时,才将其提升至 MEMORY.md,格式为一行摘要加路径。 6. 日记笔记是时间线,Wiki 页面是知识库,两者不可互换。 7. 若两个页面存在冲突,在 log 中标记,而不是静默覆盖。 这就是摄取、查询、检查的完整闭环,应用于 Agent 工作空间。 **第五步:完成人工闭环。** 每周一次: • 浏览日记笔记 • 确认或改写新增的 Wiki 页面 • 删除重复内容 • 从中提炼3到10条真正持久的事实,写入 MEMORY.md • 将过时的热记忆条目降级,归还至知识库 如果你从不打开知识库,你拥有的不是第二大脑,而是一个 Agent 在某个文件夹里替你写同人小说。 用 Git 管理知识库,把 Agent 的写入当作 Pull Request 对待。Diff 是这套系统里成本最低的安全机制。 **集成到位后的真实体验** 接入完善的会话是这样运转的: 1. Agent 启动,热记忆告知它你是谁、运行规则,以及三条当前活跃的指针。 2. 你询问某个项目。代理读取项目页面,而非从聊天记录中重建它。 3. 它完成工作。 4. 它追加每日笔记。 5. 如果某项决策发生变化,它会更新决策页面。 6. 如果该变化已成为长期政策,它会在 MEMORY.md 中添加一行。 7. 你稍后浏览页面,修正它夸大的那一句话。 代理获得了连续性。 你保持了所有权。 提示词保持精简。 知识库变得更加丰富。 这就是全部收益所在。 **需要避免的失败模式** 整个生活库的访问权限。家庭日记和 API 密钥不应存在于同一个代理可以改写的知识图谱中。 将知识库当作提示词。如果你发现自己在把整个知识库拼接进系统提示词,说明你的 MEMORY.md 构建得有问题。 两个事实来源。不要把同一个偏好设置分别保存在 USER.md、知识库和某个记忆插件里,还各自标着不同的日期。选定一个归宿,让其他地方指向它。 没有晋升规则。如果所有内容都停留在每日笔记里,你拥有的是一本日记,而不是一个大脑。 没有降级规则。如果所有内容都停留在 MEMORY.md 里,整合过程将会吞噬你的历史记录。 未经审阅的代理写入。Markdown 之所以安全,正是因为你能读懂它。请务必阅读它。 **简短版本** MEMORY.md 是代理的工作记忆。 知识库是代理的图书馆。 你需要前者,这样代理在压缩后不会忘记规则。 你需要后者,这样代理可以积累一个世界模型,而不必在每次会话时将其付之一炬。 搭建一个有范围限制的 Markdown 知识库。将热记忆设计为一份规章加一份索引。教代理去搜索、撰写页面,并且只晋升那些必须保持热状态的内容。自己审阅这些页面。 这就是让 Hermes、OpenClaw 以及其余自主化技术栈,从令人印象深刻的聊天记录,真正蜕变为一个能够切实记忆的系统的方法。