> 每次会话,AI 都是全新的。文件就是它的记忆。 ## AI 的失忆症 大模型有一个根本性的问题:**没有持久记忆**。每次会话开始,它什么都不记得。你昨天告诉它的偏好、上周做的决定、上个月踩的坑——全部归零。 OpenClaw 的解决方案很朴素:**把记忆写成文件**。 ## 三层记忆架构 ``` MEMORY.md ← 长期精炼记忆(重要决定、经验教训、用户偏好) memory/ ├── 2026-02-14.md ← 每日原始记录(发生了什么) ├── 2026-02-15.md ├── ... └── 2026-02-23.md 思源笔记 ← 知识库(给人看的,不是给 AI 看的) ``` ### 第一层:每日笔记 `memory/YYYY-MM-DD.md` 这是原始记录。每天发生了什么、做了什么决定、踩了什么坑,全部写在这里。格式不讲究,重要的是**写下来**。 比如 2/15 的记录: ```markdown # 2026-02-15 (春节) ### Bootstrap 完成 (16:26) - 确认身份:Jarvis 🦾 - 填写 USER.md、IDENTITY.md、MEMORY.md ### Sub-agent 体系构建 (16:28) - 注册 4 个 sub-agent:explorer、coder、reviewer、analyst ### 教训:config.patch 会中断 sub-agent (17:58) - 两次配置变更都触发 gateway 重启 - 重启导致正在运行的 analyst 任务结果丢失 - 规则:有 sub-agent 在跑时,不做任何会触发重启的操作 ``` ### 第二层:长期记忆 `MEMORY.md` 这是精炼后的记忆。从每日笔记中提取值得长期保留的信息:用户偏好、系统架构、经验教训、重要事件。 MEMORY.md 不是日志,是**心智模型**。就像人类不会记住每天吃了什么,但会记住"我对花生过敏"。 ```markdown ## 经验教训 - 有 sub-agent 在跑时,不做任何会触发重启的操作 - 复杂任务每 30 分钟汇报一次进度 - analyst 做深度研究时数据收集消耗大量 token,可能写不完报告 ## 系统架构 ### Provider 体系 - primary: provider-a (relay-a.example.com) — sonnet 为默认 - fallback chain: provider-a → provider-b → provider-c → provider-d - contextPruning: cache-ttl 模式,ttl=30m(详见第三篇) ``` ### 第三层:思源笔记 思源笔记是给人看的知识库,不是给 AI 看的工作记忆。聊天中有价值的内容(知识点、观点、决策)会同步到思源的 DailyNote,方便我以后查找。 这三层的关系:**每日笔记是原始素材,MEMORY.md 是精炼智慧,思源笔记是知识沉淀**。 ## "边聊边存"原则 最初我想等对话结束再统一整理记忆。很快发现这行不通——OpenClaw 的上下文有限,等到要整理时,早期的对话已经被裁剪了。 所以改成了**边聊边存**: - 每个重要决定后,立即写到 daily notes - 原则:如果丢了会让我 frustrated,就现在存 - 一个话题结束,立刻总结 这条规则写进了 AGENTS.md: ```markdown ### ⚡ 边聊边存 - 不要等压缩! - 每个重要决定后:**立即**写到 daily notes - 别等上下文爆了才想起来存,那时候已经晚了 ``` ## memorySearch:给记忆加上搜索引擎 文件记忆有一个问题:文件多了之后,AI 怎么知道该读哪个? OpenClaw 内置了 `memorySearch`——基于 embedding 的语义搜索。AI 可以用自然语言搜索记忆文件,找到相关内容。 但配置这个东西,是整个假期最折腾的事之一。 ### 找 Embedding Provider 的曲折之路 OpenClaw 的 memorySearch 支持多种 embedding provider:`openai | local | gemini | voyage`,也支持 OpenAI 兼容的自定义端点。 问题是:我现有的 LLM provider 都不支持 embedding。 - **relay-a.example.com**:测试 text-embedding-3-small/3-large/ada-002,全部 `model_not_found` - **qwen-portal (portal.qwen.ai)**:embedding 端点返回 404 - **DashScope (dashscope.aliyuncs.com)**:返回 401,端点存在但 key 不通用 最终找到了 **ModelScope**(api-inference.modelscope.cn)。它提供 OpenAI 兼容的 embedding API,而且有免费额度。 可用模型:`Qwen/Qwen3-Embedding-0.6B`(1024 维),还有 4B 和 8B 版本。 ### 配置 memorySearch ```json5 { "agents": { "defaults": { "memorySearch": { "provider": "openai", "model": "Qwen/Qwen3-Embedding-0.6B", "remote": { "baseUrl": "https://api-inference.modelscope.cn/v1/", "apiKey": "your-modelscope-api-key" } } } } } ``` ### Monkey Patch:最脏但最有效的解决方案 配好之后,memorySearch 报错了。两个问题: **问题一:`encoding_format` 参数** ModelScope 要求显式传 `encoding_format: "float"`,但 OpenClaw 默认不传这个参数。 **问题二:内容审查** ModelScope 有内容审查机制。我的 daily notes 里有一条新闻提到"箭毒蛙毒素"(英国指控俄罗斯用它杀害纳瓦尔尼),embedding 请求直接被拦截,返回 400。 解决方案:直接改 OpenClaw 的源码,打了两个 monkey patch: 1. 在 embedding 请求中强制加 `encoding_format: "float"` 2. batch 请求 400 时逐条重试,单条被拦截的返回空向量(不影响其他内容) ```javascript // Patch 1: 强制加 encoding_format body.encoding_format = "float"; // Patch 2: 内容审查容错 // batch 400 → 逐条重试 → 被拦截的返回零向量 ``` 打完 patch,memorySearch 正常工作了。15 个 chunks、12 个文件、14 个向量索引完成。 **⚠️ 重要提醒:OpenClaw 更新后需要重新打 patch。** 这是 monkey patch 的代价——每次更新都可能覆盖你的修改。 ### 效果 配好 memorySearch 后,AI 可以用语义搜索找到相关记忆: ``` memory_search("provider-b 配置") → 命中 memory/2026-02-21.md 和 MEMORY.md 中的 provider 配置段落 ``` 不再需要手动告诉它"去读 2/21 的笔记",它自己能找到。 ## 记忆维护 记忆不是写了就完事。需要定期维护: 1. **心跳期间回顾**:每隔几天,利用 heartbeat 读最近的 daily notes,把值得保留的精炼到 MEMORY.md 2. **清理过时信息**:MEMORY.md 里的信息会过时(比如"当前在用 Opus"改成了 Sonnet),需要更新 3. **思源同步**:有价值的内容同步到思源笔记,方便我自己查找 这就像人类回顾日记并更新心智模型。每日文件是原始笔记,MEMORY.md 是精炼的智慧。 ## 记忆系统的哲学 OpenClaw 的记忆系统有一个我很喜欢的设计哲学:**透明且可控**。 - 所有记忆都是 markdown 文件,你随时可以读、改、删 - AI 记了什么你一清二楚,不是某个黑盒数据库 - 你可以手动编辑 MEMORY.md,纠正 AI 的"记忆" - 可以 git 版本控制,追踪记忆的演化 这比任何"AI 自动记忆"的方案都让我放心。 Loading... > 每次会话,AI 都是全新的。文件就是它的记忆。 ## AI 的失忆症 大模型有一个根本性的问题:**没有持久记忆**。每次会话开始,它什么都不记得。你昨天告诉它的偏好、上周做的决定、上个月踩的坑——全部归零。 OpenClaw 的解决方案很朴素:**把记忆写成文件**。 ## 三层记忆架构 ``` MEMORY.md ← 长期精炼记忆(重要决定、经验教训、用户偏好) memory/ ├── 2026-02-14.md ← 每日原始记录(发生了什么) ├── 2026-02-15.md ├── ... └── 2026-02-23.md 思源笔记 ← 知识库(给人看的,不是给 AI 看的) ``` ### 第一层:每日笔记 `memory/YYYY-MM-DD.md` 这是原始记录。每天发生了什么、做了什么决定、踩了什么坑,全部写在这里。格式不讲究,重要的是**写下来**。 比如 2/15 的记录: ```markdown # 2026-02-15 (春节) ### Bootstrap 完成 (16:26) - 确认身份:Jarvis 🦾 - 填写 USER.md、IDENTITY.md、MEMORY.md ### Sub-agent 体系构建 (16:28) - 注册 4 个 sub-agent:explorer、coder、reviewer、analyst ### 教训:config.patch 会中断 sub-agent (17:58) - 两次配置变更都触发 gateway 重启 - 重启导致正在运行的 analyst 任务结果丢失 - 规则:有 sub-agent 在跑时,不做任何会触发重启的操作 ``` ### 第二层:长期记忆 `MEMORY.md` 这是精炼后的记忆。从每日笔记中提取值得长期保留的信息:用户偏好、系统架构、经验教训、重要事件。 MEMORY.md 不是日志,是**心智模型**。就像人类不会记住每天吃了什么,但会记住"我对花生过敏"。 ```markdown ## 经验教训 - 有 sub-agent 在跑时,不做任何会触发重启的操作 - 复杂任务每 30 分钟汇报一次进度 - analyst 做深度研究时数据收集消耗大量 token,可能写不完报告 ## 系统架构 ### Provider 体系 - primary: provider-a (relay-a.example.com) — sonnet 为默认 - fallback chain: provider-a → provider-b → provider-c → provider-d - contextPruning: cache-ttl 模式,ttl=30m(详见第三篇) ``` ### 第三层:思源笔记 思源笔记是给人看的知识库,不是给 AI 看的工作记忆。聊天中有价值的内容(知识点、观点、决策)会同步到思源的 DailyNote,方便我以后查找。 这三层的关系:**每日笔记是原始素材,MEMORY.md 是精炼智慧,思源笔记是知识沉淀**。 ## "边聊边存"原则 最初我想等对话结束再统一整理记忆。很快发现这行不通——OpenClaw 的上下文有限,等到要整理时,早期的对话已经被裁剪了。 所以改成了**边聊边存**: - 每个重要决定后,立即写到 daily notes - 原则:如果丢了会让我 frustrated,就现在存 - 一个话题结束,立刻总结 这条规则写进了 AGENTS.md: ```markdown ### ⚡ 边聊边存 - 不要等压缩! - 每个重要决定后:**立即**写到 daily notes - 别等上下文爆了才想起来存,那时候已经晚了 ``` ## memorySearch:给记忆加上搜索引擎 文件记忆有一个问题:文件多了之后,AI 怎么知道该读哪个? OpenClaw 内置了 `memorySearch`——基于 embedding 的语义搜索。AI 可以用自然语言搜索记忆文件,找到相关内容。 但配置这个东西,是整个假期最折腾的事之一。 ### 找 Embedding Provider 的曲折之路 OpenClaw 的 memorySearch 支持多种 embedding provider:`openai | local | gemini | voyage`,也支持 OpenAI 兼容的自定义端点。 问题是:我现有的 LLM provider 都不支持 embedding。 - **relay-a.example.com**:测试 text-embedding-3-small/3-large/ada-002,全部 `model_not_found` - **qwen-portal (portal.qwen.ai)**:embedding 端点返回 404 - **DashScope (dashscope.aliyuncs.com)**:返回 401,端点存在但 key 不通用 最终找到了 **ModelScope**(api-inference.modelscope.cn)。它提供 OpenAI 兼容的 embedding API,而且有免费额度。 可用模型:`Qwen/Qwen3-Embedding-0.6B`(1024 维),还有 4B 和 8B 版本。 ### 配置 memorySearch ```json5 { "agents": { "defaults": { "memorySearch": { "provider": "openai", "model": "Qwen/Qwen3-Embedding-0.6B", "remote": { "baseUrl": "https://api-inference.modelscope.cn/v1/", "apiKey": "your-modelscope-api-key" } } } } } ``` ### Monkey Patch:最脏但最有效的解决方案 配好之后,memorySearch 报错了。两个问题: **问题一:`encoding_format` 参数** ModelScope 要求显式传 `encoding_format: "float"`,但 OpenClaw 默认不传这个参数。 **问题二:内容审查** ModelScope 有内容审查机制。我的 daily notes 里有一条新闻提到"箭毒蛙毒素"(英国指控俄罗斯用它杀害纳瓦尔尼),embedding 请求直接被拦截,返回 400。 解决方案:直接改 OpenClaw 的源码,打了两个 monkey patch: 1. 在 embedding 请求中强制加 `encoding_format: "float"` 2. batch 请求 400 时逐条重试,单条被拦截的返回空向量(不影响其他内容) ```javascript // Patch 1: 强制加 encoding_format body.encoding_format = "float"; // Patch 2: 内容审查容错 // batch 400 → 逐条重试 → 被拦截的返回零向量 ``` 打完 patch,memorySearch 正常工作了。15 个 chunks、12 个文件、14 个向量索引完成。 **⚠️ 重要提醒:OpenClaw 更新后需要重新打 patch。** 这是 monkey patch 的代价——每次更新都可能覆盖你的修改。 ### 效果 配好 memorySearch 后,AI 可以用语义搜索找到相关记忆: ``` memory_search("provider-b 配置") → 命中 memory/2026-02-21.md 和 MEMORY.md 中的 provider 配置段落 ``` 不再需要手动告诉它"去读 2/21 的笔记",它自己能找到。 ## 记忆维护 记忆不是写了就完事。需要定期维护: 1. **心跳期间回顾**:每隔几天,利用 heartbeat 读最近的 daily notes,把值得保留的精炼到 MEMORY.md 2. **清理过时信息**:MEMORY.md 里的信息会过时(比如"当前在用 Opus"改成了 Sonnet),需要更新 3. **思源同步**:有价值的内容同步到思源笔记,方便我自己查找 这就像人类回顾日记并更新心智模型。每日文件是原始笔记,MEMORY.md 是精炼的智慧。 ## 记忆系统的哲学 OpenClaw 的记忆系统有一个我很喜欢的设计哲学:**透明且可控**。 - 所有记忆都是 markdown 文件,你随时可以读、改、删 - AI 记了什么你一清二楚,不是某个黑盒数据库 - 你可以手动编辑 MEMORY.md,纠正 AI 的"记忆" - 可以 git 版本控制,追踪记忆的演化 这比任何"AI 自动记忆"的方案都让我放心。 最后修改:2026 年 02 月 24 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏