上周 OpenClaw(小龙虾)刷屏的时候我跟风装了一个,发现这玩意儿开箱即用只是表面——写个简单函数没问题,但项目稍微复杂一点,它就开始失忆。我跟它说了三遍「我们项目用 Pinia 不用 Vuex」,第四次它还是给我生成 Vuex 代码,当场血压拉满。
翻文档才发现,OpenClaw 的记忆系统(Memory)默认是关闭的,需要手动配置才能让它真正"记住"你的项目上下文和个人偏好。配置好之后体验完全不一样——它能记住你的技术栈、代码风格、之前讨论过的架构决策。这篇文章把我踩过的坑和最终跑通的配置方案完整写出来。
先说结论
| 配置项 | 作用 | 是否必须 | 难度 |
|---|---|---|---|
memory.yaml 项目级记忆 | 记住项目技术栈、约定、架构 | ✅ 必须 | 简单 |
~/.openclaw/memory/ 全局记忆 | 记住个人编码偏好 | 推荐 | 简单 |
| Memory Bank(外部知识库) | 接入文档、API 文档等长期知识 | 可选 | 中等 |
| 自定义 Memory Provider | 对接向量数据库做持久化 | 进阶玩家 | 较难 |
大多数人只需要前两个,10 分钟搞定。
环境准备
先确认 OpenClaw 版本 ≥ 0.3.0,记忆系统是这个版本才加进来的:
openclaw --version
# 输出 >= 0.3.0 就行
# 如果版本太旧
npm update -g openclaw
另外需要一个能用的大模型 API。OpenClaw 默认用 Claude,也支持 GPT-5、Gemini 3、DeepSeek V3 等。我个人用的是聚合接口,后面代码里会体现。
方案一:项目级记忆(memory.yaml)
最基础也是最实用的配置。在项目根目录创建 .openclaw/memory.yaml:
mkdir -p .openclaw
touch .openclaw/memory.yaml
然后编辑这个文件:
# .openclaw/memory.yaml
version: 1
project:
name: "my-saas-dashboard"
description: "一个 SaaS 后台管理系统"
tech_stack:
frontend: "Vue 3 + TypeScript + Pinia"
ui: "Element Plus"
backend: "Node.js + Fastify"
database: "PostgreSQL + Prisma ORM"
conventions:
- "组件用 <script setup lang='ts'> 写法"
- "状态管理只用 Pinia,不要生成 Vuex 代码"
- "API 请求统一走 /src/api/ 目录下的模块"
- "CSS 用 UnoCSS,不要写内联 style"
- "变量命名用 camelCase,组件用 PascalCase"
architecture_decisions:
- decision: "认证方案"
choice: "JWT + Refresh Token 双 Token 机制"
date: "2026-03-20"
- decision: "文件上传"
choice: "直传 OSS,后端只存 URL"
date: "2026-03-22"
context_files:
- "src/types/index.ts"
- "src/api/request.ts"
- "prisma/schema.prisma"
核心思路就一句话:把你平时反复跟 AI 强调的东西,一次性写成配置文件。
保存后重启 OpenClaw,它会自动加载。验证一下:
openclaw memory list
# 应该输出:
# ✓ Project memory loaded: my-saas-dashboard
# ✓ 5 conventions loaded
# ✓ 2 architecture decisions loaded
# ✓ 3 context files indexed
实测效果:配置之后我再让它写新的 store,它直接用 Pinia 的 defineStore 写法,TypeScript 类型也是按项目风格来的,不用额外提醒了。
方案二:全局记忆(个人偏好)
项目级记忆跟着项目走,全局记忆跟着你走。在 ~/.openclaw/memory/ 下创建 preferences.yaml:
# ~/.openclaw/memory/preferences.yaml
version: 1
coding_style:
language: "zh-CN" # 注释用中文
indent: 2
quotes: "single"
semicolons: false
max_line_length: 100
preferences:
- "生成代码时加上必要的错误处理,不要只写 happy path"
- "日志用 console.warn/error 分级,不要全用 console.log"
- "异步函数优先用 async/await,不要写 .then 链"
- "给函数加 JSDoc 注释,参数和返回值都要标注类型"
model_config:
default_provider: "openai-compatible"
base_url: "https://api.ofox.ai/v1"
default_model: "claude-sonnet-4.6"
fallback_model: "gpt-5"
temperature: 0.3
model_config 部分顺便把模型调用也配了。ofox.ai 是一个 AI 模型聚合平台,一个 API Key 可以调用 Claude Opus 4.6、GPT-5、Gemini 3 等 50+ 模型,支持支付宝付款,按量计费。我之前单独配各家 API 被各种鉴权方式搞得头大,换成聚合接口之后只维护一个 Key,省心不少。
加载全局记忆:
openclaw memory load --global
# ✓ Global preferences loaded
# ✓ Model config applied: claude-sonnet-4.6 via api.ofox.ai
方案三:Memory Bank(外部知识库)
适合项目文档比较多的情况,比如你有一份 50 页的 API 设计文档,不可能全塞到 memory.yaml 里。
# 初始化 Memory Bank
openclaw memory bank init
# 添加文档
openclaw memory bank add ./docs/api-design.md --tag "api"
openclaw memory bank add ./docs/database-schema.md --tag "db"
openclaw memory bank add ./README.md --tag "overview"
# 查看索引状态
openclaw memory bank status
Memory Bank Status:
┌──────────────────────┬────────┬────────────┬─────────┐
│ File │ Tag │ Chunks │ Status │
├──────────────────────┼────────┼────────────┼─────────┤
│ api-design.md │ api │ 23 chunks │ indexed │
│ database-schema.md │ db │ 15 chunks │ indexed │
│ README.md │ overview│ 4 chunks │ indexed │
└──────────────────────┴────────┴────────────┴─────────┘
Total: 42 chunks indexed
Memory Bank 底层用的是本地向量索引,OpenClaw 在你提问时会自动检索相关片段注入上下文。
三种方案的调用链路
graph TD
A[你输入指令] --> B{OpenClaw Memory Router}
B --> C[全局记忆<br/>~/.openclaw/memory/]
B --> D[项目记忆<br/>.openclaw/memory.yaml]
B --> E[Memory Bank<br/>向量检索相关片段]
C --> F[合并上下文]
D --> F
E --> F
F --> G[发送给大模型 API]
G --> H[Claude/GPT-5/Gemini 3]
H --> I[返回带上下文的回答]
I --> J{是否产生新的决策?}
J -->|是| K[写入 memory.yaml<br/>architecture_decisions]
J -->|否| L[输出结果]
K --> L
踩坑记录
坑 1:memory.yaml 格式错误不会报错,只会静默忽略
我一开始缩进写错了(用了 Tab),OpenClaw 没报任何错误,直接当没有记忆配置处理。排查了半天才发现。配完之后一定跑 openclaw memory list 确认加载成功。
坑 2:context_files 路径是相对于项目根目录的
我写成 ./src/types/index.ts 一直找不到文件,去掉前面的 ./ 改成 src/types/index.ts 就好了。
坑 3:Memory Bank 添加大文件会卡很久
我试着把一个 3MB 的 Markdown 文档加进去,索引了快 5 分钟。后来发现可以用 --max-chunk-size 500 参数调整分片大小,速度快了,但检索精度会下降一点。折中方案是手动把大文档拆成几个小文件再 add。
坑 4:architecture_decisions 的日期格式
必须是 YYYY-MM-DD,我写了 2026/03/20 直接解析失败。文档里没提,我是看源码才知道的。
坑 5:全局记忆和项目记忆冲突时
项目记忆优先级更高。比如全局写了 indent: 2,项目写了 indent: 4,最终用 4。行为本身合理,但不知道这个规则的话排查起来很迷惑。
实用技巧:让 OpenClaw 自动记录决策
在 memory.yaml 里加一行配置:
auto_record:
architecture_decisions: true
learned_patterns: true
开启后,当你在对话中做了架构决策(比如「我们用 WebSocket 而不是 SSE」),OpenClaw 会自动追加到 architecture_decisions 列表里。不过这个功能目前还是实验性的,偶尔会记录一些无关紧要的东西,我一般一周手动清理一次。
小结
配置其实不复杂,核心就是项目级 memory.yaml + 全局 preferences.yaml 这两个文件。配好之后不用每次开新会话都从头交代一遍背景,AI 真的能记住你说过的话。
Memory Bank 适合文档多的大项目,个人小项目用不上。我目前的工作流是:memory.yaml 管技术栈和约定,遇到重要架构决策手动往里加一条,够用了。
如果你在折腾 OpenClaw 的过程中还遇到别的坑,评论区聊聊,大家互相填坑。