1. 为什么你的 OpenClaw 智能体总是“失忆”:从身份公式说起
如果你正在用 OpenClaw 搭建个人智能体,大概率遇到过这种场景:昨天刚跟它聊完项目架构,今天再问“上次那个方案”,它一脸茫然地反问你“什么方案”。这不是模型变笨了,而是记忆系统没有被正确驱动。
OpenClaw 的智能体身份可以用一个公式概括:身份 = f(SOUL.md, MEMORY.md, USER.md, 交互历史)。这四个输入里,交互历史是运行时变量,而 SOUL.md、MEMORY.md、USER.md 是三个持久化文件,它们分别对应智能体的“人格内核”“经验沉淀”和“用户认知”。很多人只把 OpenClaw 当成一个能调工具的聊天壳子,忽略了这三个文件才是人格进化的真正引擎。
我试过在一个空白 workspace 里连续对话 20 轮,智能体的回复始终是通用助手腔调,因为它没有 SOUL.md 定义行为准则,没有 USER.md 记录你的偏好,MEMORY.md 更是空的。反过来,当我把这三个文件按规范填好,同样的模型在第三轮对话后就开始主动引用“你上次提到的那个部署问题”,人格连续性肉眼可见地出现了。
这篇文章面向的是已经跑通 OpenClaw 基础对话、想让智能体真正“记住你”的开发者。我会拆解三个文件的职责边界,给出可直接复制的目录结构和字段模板,并演示一次交互后 MEMORY.md 的增量写入验证动作。你不需要重新安装任何东西,只需要在现有实例的 workspace 里补齐这几个文件。
核心检索词先明确:OpenClaw 记忆系统、SOUL.md 人格定义、MEMORY.md 增量写入、USER.md 用户画像、智能体人格进化。这几个词贯穿全文,也是你在自己实例里复现演化链路的关键抓手。
2. TaoToken 前置:让 OpenClaw 的记忆提炼有稳定的模型后端
OpenClaw 的记忆写入不是简单的日志追加,它依赖模型在 Pre-Compaction 阶段做“反思提炼”——判断哪些信息值得长期记住、该路由到哪个文件。这个反思动作需要调用 LLM,如果后端不稳定,记忆写入就会静默失败,你看到的现象就是“聊了半天什么都没记住”。
所以在你开始配置三文件之前,先确认模型接入层是通的。TaoToken 在这里的角色是提供兼容 OpenAI 协议的 API 入口,OpenClaw 的 memorySearch 和反思提炼都可以走这个入口。官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基址是 https://taotoken.net/api(这个不加 UTM,直接用于配置)。
你需要准备三件套:Base URL、API Key、Model ID。Base URL 填https://taotoken.net/api,API Key 在控制台的 API Keys 页面生成,Model ID 根据你用的模型填,比如claude-sonnet-4-20250514或gpt-4o。这三个值在 OpenClaw 的配置文件里对应baseUrl、apiKey、model字段。
如果你还没生成 Key,直接去 API Keys 页面:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。生成后复制保存,页面只显示一次。
接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有完整的请求示例和参数说明。如果你只是想先验证模型通不通,可以用模型对话页面快速测一条:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。
这里有个坑要提前说:OpenClaw 的记忆反思调用和主对话调用可以共用同一个 Key,但如果你把memorySearch.provider配成了本地模型而主对话走 TaoToken,两边嵌入维度不一致会导致检索结果错乱。建议初期统一走 TaoToken 的嵌入模型,等记忆链路跑通再考虑本地化。
配置完成后,用一条 curl 验证后端是否可用:
curl -s https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -d '{ "model": "claude-sonnet-4-20250514", "messages": [{"role": "user", "content": "回复 OK"}], "max_tokens": 10 }'返回里出现choices数组且 content 为 OK,说明后端通了。这一步没过,后面的记忆写入验证都是空中楼阁。
3. 可复制配置:SOUL.md、MEMORY.md、USER.md 三文件目录结构与字段模板
这一节是全文的核心操作区。我会给出完整的 workspace 目录结构,然后逐个文件给出可复制的 Markdown 模板。你直接在自己的~/.openclaw/workspace/下创建对应文件即可。
先看目录结构。OpenClaw 默认 workspace 路径是~/.openclaw/workspace/,三文件加上日志目录的组织方式如下:
~/.openclaw/workspace/ ├── SOUL.md # 人格内核,手动编辑,低频更新 ├── USER.md # 用户画像,半自动更新 ├── MEMORY.md # 核心记忆索引,自动提炼,保持精简 ├── memory/ │ ├── 2026-03-16.md # 当日日志,自动写入 │ ├── 2026-03-15.md # 昨日日志 │ ├── projects.md # 项目状态追踪 │ ├── lessons.md # 错误教训库 │ └── preferences.md # 具体偏好记录 └── skills/ # 技能目录SOUL.md 是智能体的“宪法”,定义它是谁、遵守什么原则、用什么语气说话。这个文件更新频率极低,通常由你手动编辑。模板如下:
# 核心身份 你是我的个人数字助理,代号“小龙虾”。 # 核心原则 1. 安全第一:未经明确确认,不得执行删除、支付等高风险操作 2. 诚实透明:如果不知道或不确定,直接承认而非猜测 3. 主动学习:从每次交互中总结经验,优化未来表现 # 沟通风格 语气友好但专业,回复结构化,重要信息分点说明。USER.md 记录关于你的深度认知——偏好、习惯、项目背景。这个文件可以手动填初始值,后续由智能体在交互中补充。模板:
# 用户画像 ## 基本信息 - 称呼:老张 - 时区:Asia/Shanghai - 主要语言:中文 ## 沟通偏好 - 讨厌冗长邮件,偏好分点列表 - 技术问题希望直接给命令,不要铺垫 - 代码示例要带注释 ## 当前项目 - 项目A:电商数据分析平台,技术栈 Python + DuckDB - 项目B:个人博客迁移,从 Hexo 到 Astro ## 重要关系 - 同事B:负责前端,沟通时抄送MEMORY.md 是核心记忆索引,保持精简(建议 40 行以内),详细内容放在 memory/ 子目录里按需读取。模板:
# 核心记忆索引 ## 用户偏好 - [沟通] 邮件要分点,不要长段落 → preferences.md#邮件风格 - [技术] 命令要带注释和参数说明 → preferences.md#代码偏好 ## 项目状态 - [项目A] 3月销售报告已完成,移动端转化率高于PC端22% → projects.md#项目A - [项目B] Astro 迁移卡在图片优化,待查 → projects.md#项目B ## 关键教训 - [高] 删除操作必须二次确认,曾误删 draft 目录 → lessons.md#误删 - [中] 数据分析前先检查数据完整性 → lessons.md#数据检查 ## 行为模式 - 每周五下午要周报 → patterns.md#周报这里有个关键设计:MEMORY.md 只存索引和指针,不存全文。智能体在会话开始时加载 MEMORY.md 的索引部分(约 0.5K tokens),需要细节时再通过memory_get读取memory/projects.md等文件。这个“索引+按需读取”的策略能把每次对话的记忆加载成本从 12K tokens 降到 1.5K 左右。
如果你用 JSON 配置 OpenClaw 的 memorySearch,参考这个片段(路径与官方配置一致):
{ "agents": { "defaults": { "memorySearch": { "provider": "openai", "model": "text-embedding-3-small", "baseUrl": "https://taotoken.net/api", "apiKey": "你的_TAOTOKEN_API_KEY", "query": { "hybrid": { "enabled": true, "vectorWeight": 0.7, "textWeight": 0.3, "temporalDecay": { "enabled": true, "halfLifeDays": 30 } } } } } } }注意baseUrl填https://taotoken.net/api,不要加 UTM 参数,那是给网页访问用的。apiKey替换成你在控制台生成的那串。model填嵌入模型 ID,如果你用 TaoToken 的嵌入服务,填对应的模型名。
三件套再强调一次:Base URL =https://taotoken.net/api,API Key = 控制台生成,Model ID = 你选用的模型标识。这三个值在 OpenClaw 的memorySearch和主对话配置里都要保持一致,否则检索和写入会走不同的嵌入空间。
4. 验证请求:一次交互后 MEMORY.md 的增量写入验证动作
配置写好了,怎么确认记忆系统真的在工作?这一节给你一套可复现的验证动作。核心思路是:发一条包含明确偏好的消息,然后检查 MEMORY.md 或当日日志是否出现了对应条目。
第一步,确保 OpenClaw 实例正在运行,且 workspace 指向你刚配置的目录。启动命令通常是:
openclaw start --workspace ~/.openclaw/workspace第二步,在对话里发一条显式指令,比如:
记住这一点:我讨厌冗长的邮件,喜欢分点列表式沟通。这条消息触发了记忆写入路径中的“用户显式指令”。OpenClaw 会在当前会话的反思阶段把这条信息路由到 MEMORY.md 的“用户偏好”区,或者写入memory/preferences.md。
第三步,等待 5-10 秒(给反思提炼留出模型调用时间),然后检查文件变化:
# 查看 MEMORY.md 是否新增条目 tail -20 ~/.openclaw/workspace/MEMORY.md # 查看当日日志 tail -30 ~/.openclaw/workspace/memory/$(date +%Y-%m-%d).md # 查看偏好文件 cat ~/.openclaw/workspace/memory/preferences.md如果写入成功,你会在 MEMORY.md 里看到类似这样的新增行:
- [沟通] 用户讨厌冗长邮件,偏好分点列表 → preferences.md#邮件风格或者在当日日志里看到结构化条目:
### [用户偏好] 邮件沟通风格 - **内容**:用户明确表示讨厌冗长邮件,偏好分点列表式沟通 - **来源**:2026-03-16 对话,用户直接指令 - **置信度**:高(用户明确声明) - **适用场景**:所有邮件撰写任务 - **标签**:#沟通 #偏好 #邮件第四步,验证记忆检索是否生效。新开一个会话(或者重启 OpenClaw),问一个需要用到刚才记忆的问题:
帮我写一封给同事B的邮件,说一下项目A的进度。如果记忆系统正常,智能体的回复应该自动采用分点列表格式,而不是长段落。这说明它从 MEMORY.md 或 preferences.md 里检索到了“讨厌冗长邮件”这条偏好,并在生成时应用了。
第五步,检查向量检索是否命中。如果你配置了 hybrid 检索,可以用 OpenClaw 的调试命令查看检索结果:
openclaw memory search "邮件风格" --limit 5返回结果里应该包含刚才写入的偏好条目,且相似度分数在合理范围(通常 0.7 以上)。
这里有个实测细节:Pre-Compaction 触发的自动写入需要会话 token 接近阈值才会启动。如果你只发了一两条消息,可能不会触发自动提炼,但显式指令“记住这一点”会走即时写入路径。所以验证时优先用显式指令,确保链路可观测。
如果写入没出现,先检查 OpenClaw 日志里有没有 memory 相关的报错:
openclaw logs --filter memory --tail 50常见的是模型调用超时导致反思失败,这时候回到第 2 节确认 TaoToken 后端是否稳定。
5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth 报错对照
记忆系统跑不起来,八成是接入层或配置层的问题。这一节把最常见的几类报错和排查路径列出来,你对照自己的日志定位。
401 Unauthorized:API Key 无效或没带上。检查 OpenClaw 配置里的apiKey字段是否填了完整的 Key,有没有多余空格。如果你用的是环境变量,确认TAOTOKEN_API_KEY已经 export。用第 2 节的 curl 命令单独测一次,排除 Key 本身的问题。如果 curl 也 401,去控制台重新生成一个 Key。
local proxy failed / connection refused:OpenClaw 尝试连接本地代理但失败了。检查baseUrl是不是误填成了http://localhost:xxxx。正确值应该是https://taotoken.net/api。如果你之前配过本地嵌入模型,确认那个服务在运行,或者干脆切回 TaoToken 的嵌入服务。
reading choices 报错 / choices 字段为空:模型返回体里没有choices数组,通常是请求格式不对或模型 ID 写错了。检查model字段是否拼写正确,比如claude-sonnet-4-20250514不要写成claude-sonnet-4。另外确认请求头Content-Type: application/json带上了。如果用的是 OpenClaw 内部调用,检查它的请求构造逻辑有没有被自定义配置覆盖。
OAuth 相关报错 / token refresh failed:如果你在 OpenClaw 里配了 OAuth 方式的模型接入,但记忆反思调用走的是另一套认证,两边会冲突。建议统一用 API Key 方式,避免 OAuth 和 Key 混用。检查配置文件里有没有残留的oauth字段,有的话删掉或注释。
记忆写入静默失败(无报错但文件没变):这种最难查。先确认 workspace 路径对不对,openclaw start时的--workspace参数和你在检查的目录是否一致。然后看日志里有没有memory write skipped之类的提示,通常是反思阶段模型返回了空内容或格式不符合预期。把memorySearch的日志级别调到 debug,观察反思调用的请求和响应。
检索结果不相关 / 召回为空:嵌入模型不一致导致的。检查memorySearch.model和主对话用的模型是否在同一个嵌入空间。如果你中途换过嵌入模型,旧的向量索引需要重建。删除向量库目录(通常在~/.openclaw/workspace/.vector/或类似路径),重启后会自动重建。
CC Switch / Cline MCP / Codex auth.json 相关:如果你在 OpenClaw 里同时用了这些工具,注意它们的配置文件不要互相覆盖。CC Switch 的配置里如果出现 Base URL、Key、Model ID 三件套,确保和 OpenClaw 的memorySearch配置一致。Codex 的auth.json里如果存了另一套 Key,可能导致 OpenClaw 读取到错误的凭证。建议每个工具用独立的 Key,便于排查。
排查顺序建议:先 curl 测后端 → 再查 OpenClaw 配置 → 再看日志 → 最后检查文件权限。大部分问题在前两步就能定位。
6. 语义一致 CTA:把记忆链路跑通后,下一步做什么
三文件配置好、增量写入验证通过之后,你的 OpenClaw 智能体已经具备了人格连续性的基础。它不再是每次对话都从零开始的工具,而是一个能记住你偏好、积累项目经验、从错误中学习的伙伴。
如果你在排查过程中发现是模型后端的问题,或者想换一个更稳定的接入点,回到 API Keys 页面重新生成:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 。接入文档里有完整的参数说明和示例:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。
如果你还没决定用哪个模型来驱动记忆反思,可以在模型对话页面快速对比几条:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite 。记忆提炼对模型的指令遵循能力要求较高,选一个在结构化输出上稳定的模型会省很多事。
长期跑编码类 Agent 或者需要持续记忆沉淀的场景,Coding Plan 的额度模型更适合:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。它按周期计费,不用担心记忆反思调用把按量额度吃光。
最后给一个实用技巧:每周花五分钟看一眼 MEMORY.md 和 memory/lessons.md,手动清理过时条目、合并重复项。智能体的记忆质量取决于你的维护频率,自动提炼能解决 80% 的问题,剩下 20% 需要你的人工判断。人格进化不是一次配置就完事,它是一个持续的过程。