本文转发自知乎
OpenClaw 记忆系统深度拆解:从零理解 AI 助手的"大脑"是如何工作的
当 AI 不再"金鱼记忆"——深入剖析开源个人 AI 助手的持久化记忆架构设计
引言:为什么记忆是 AI 助手的分水岭
在 2026 年初,一个名为 OpenClaw 的开源项目以惊人的速度席卷了开发者社区——60,000+ GitHub Stars 仅用 72 小时,成为当时增长最快的开源项目之一。这个被称为"真正能做事情的 AI"的助手,与 ChatGPT、Claude 等传统聊天机器人最大的区别之一,就是它的 持久记忆系统 。
传统的对话式 AI 有一个致命缺陷: 每次对话都是全新的开始 。你昨天告诉它你的喜好,今天它就忘了;你上周让它记住一个重要的项目细节,这周它就消失了。这种"金鱼记忆"让 AI 始终停留在"工具"层面,而无法进化成真正的"助手"。
OpenClaw 的核心突破在于: 它让 AI 真正拥有了记忆 。不是简单的上下文窗口堆积,而是一个精心设计的、分层的、可持久化的记忆架构。
本文将从架构设计、存储机制、检索策略、安全考量和实践应用五个维度,深度拆解 OpenClaw 的记忆系统,帮助你理解现代 AI 助手是如何实现"长期记忆"的。
第一部分:整体架构设计——双轨记忆模型
1.1 核心哲学:Markdown 即真相(Markdown as Source of Truth)
OpenClaw 记忆系统最令人惊艳的设计决策是: 使用纯 Markdown 文件作为记忆的源头,而非传统数据库 。
大多数 AI 记忆系统一上来就设计复杂的数据库 schema,但 OpenClaw 选择了相反的路径—— 可读的纯文本 。这种设计有以下几个深层考量:
- 透明性 :用户可以像阅读笔记一样查看 AI 的记忆
- 可编辑性 :直接修改 Markdown 文件就能改变 AI 的行为
- 可移植性 :不依赖特定数据库,任何文本编辑器都能处理
- 版本控制友好 :天然支持 Git,可以追踪记忆的演变历史
这种设计哲学贯穿了整个记忆系统。正如 OpenClaw 文档所说:"OpenClaw memory is plain Markdown in the agent workspace. The files are the source of truth; the model only 'remembers' what gets written to disk."
1.2 双层记忆架构
OpenClaw 采用了经典的双层记忆模型,模拟人类记忆的 工作记忆 和 长期记忆 :
┌─────────────────────────────────────────────────────────────┐
│ OpenClaw 记忆架构 │
├─────────────────────────────────────────────────────────────┤
│ 第一层:短期/工作记忆 (Working Memory) │
│ ├── memory/2026-02-06.md ← 今日日志(追加写入) │
│ ├── memory/2026-02-05.md ← 昨日日志(只读参考) │
│ └── 自动加载:会话启动时读取今天+昨天的日志 │
├─────────────────────────────────────────────────────────────┤
│ 第二层:长期/精炼记忆 (Long-term Memory) │
│ ├── MEMORY.md ← 人工精选的核心记忆(仅私聊) │
│ └── 手动触发:AI 主动整理写入,或用户直接编辑 │
└─────────────────────────────────────────────────────────────┘
1.2.1 第一层:每日日志(Daily Logs)
位于 memory/YYYY-MM-DD.md 的路径下,这是 追加写入 的运行时笔记:
- 写入时机 :AI 在对话过程中实时写入,记录重要的上下文、决策和临时信息
- 读取策略 :会话启动时自动加载今天和昨天的日志
- 内容特征 :原始、详细、时间线导向,类似日记
- 保留周期 :理论上永久保留,但检索优先级随时间降低
这种设计的巧妙之处在于: 它既保证了上下文的连续性,又避免了向 LLM 发送过长的历史记录 。昨天的对话作为参考加载,但不会被无限累积。
1.2.2 第二层:精炼记忆(Curated Memory)
位于 MEMORY.md ,这是 人工精选 的长期记忆文件:
- 写入时机 :AI 主动整理("从我们的对话中,我应该记住什么?"),或用户明确要求
- 读取策略 :仅在私聊会话中加载,群聊中不加载(出于隐私考虑)
- 内容特征 :结构化、概括性、偏好导向,类似个人档案
- 保留周期 :永久,且是 AI 理解用户的"圣经"
为什么群聊不加载 MEMORY.md? 这是一个重要的隐私设计。群聊中的信息可能是多人的,如果 AI 把从私聊中学到的个人偏好应用到群聊,可能会造成隐私泄露或语境错位。
1.3 索引层:SQLite + 向量嵌入
虽然 Markdown 是源头,但纯文本检索效率低下。OpenClaw 在本地构建了一个 混合索引层 :
~/.openclaw/memory/
├── {agentId}.sqlite # 每个 Agent 独立的 SQLite 数据库
│ ├── chunks # 文本分片表
│ ├── embeddings # 向量嵌入表
│ └── metadata # 文件指纹、模型信息等
└── embedding-cache/ # 本地嵌入模型缓存
索引的工作原理 :
- 文件监听 :通过文件系统 watcher 监听
MEMORY.md和memory/目录的变化 - 自动同步 :变化后 1.5 秒的防抖延迟触发重新索引
- 分片策略 :Markdown 文件被切分为约 400 token 的块,80 token 重叠
- 嵌入模型 :支持 OpenAI、Gemini 或本地嵌入模型,自动回退
关键设计 :索引是 派生数据 ,可以随时重建。真正的源头永远是 Markdown 文件。这种设计避免了"数据锁定"风险。
第二部分:存储机制——从内存到磁盘的持久化管道
2.1 上下文压缩与预刷新机制(Pre-compaction Flush)
这是 OpenClaw 记忆系统最精妙的技术细节之一。
LLM 都有上下文长度限制(如 Claude 3.5 Sonnet 的 200K tokens)。当对话过长时,OpenClaw 不会简单地截断或丢弃,而是执行一个 静默的记忆刷新 :
// 伪代码:预压缩刷新逻辑
async function preCompactionFlush(session: Session) {
if (session.contextLength > COMPACTION_THRESHOLD) {
// 静默触发一轮对话,提醒 AI 写入重要记忆
await session.injectSilentTurn(\`
Context limit approaching. Review our conversation and write
any durable facts, preferences, or decisions to MEMORY.md
before compression occurs.
\`);
// 压缩旧上下文,保留摘要
await session.compact();
}
}
为什么这很重要?
传统做法是在上下文满了后直接截断,导致重要信息丢失。OpenClaw 的预刷新机制 在压缩前主动提醒 AI 保存关键信息 ,就像人类在忘记事情前赶紧记在笔记本上一样。
注意 :这个功能仅在 workspace 可写时触发。如果是只读的 Docker 沙盒环境,则跳过此步骤。
2.2 会话文件与记忆分离
OpenClaw 区分 会话历史 和 提炼记忆 :
~/.openclaw/
├── workspace/
│ ├── MEMORY.md # 长期记忆(提炼后)
│ └── memory/
│ └── 2026-02-06.md # 每日日志(原始)
└── sessions/
└── {sessionId}.jsonl # 完整会话历史(原始记录)
- JSONL 会话文件 :每一次对话的完整记录,用于审计和回溯
- Markdown 记忆文件 :AI 提炼后的有用信息,用于指导未来行为
这种分离确保了 可追溯性 (你能查到 AI 为什么那样说)和 可用性 (AI 不会被噪声淹没)。
2.3 工作空间隔离与多 Agent 支持
OpenClaw 支持 多 Agent 路由 ,不同渠道可以使用不同的记忆空间:
agents:
work-slack:
workspace: ~/.openclaw/workspaces/professional
memorySearch:
store:
path: ~/.openclaw/memory/work.sqlite
personal-telegram:
workspace: ~/.openclaw/workspaces/personal
memorySearch:
store:
path: ~/.openclaw/memory/personal.sqlite
隔离的好处 :
- 工作相关的记忆不会污染个人生活
- 可以为不同角色配置不同的长期记忆(MEMORY.md)
- 敏感信息限制在特定渠道内
第三部分:检索策略——如何找到"相关"记忆
3.1 混合检索:向量搜索 + 关键词匹配
单纯的向量语义搜索有局限:它擅长找"意思相近"的内容,但不擅长找"具体名字"或"精确匹配"。OpenClaw 采用了 混合策略 :
用户提问 → 并行检索
├── 向量搜索:找到语义相关的记忆片段(约 700 字符摘要)
│ └── 使用 SQLite 中的嵌入向量,余弦相似度排序
└── 关键词搜索:找到包含特定术语的记忆
└── 使用 SQLite FTS(全文搜索)
→ 合并结果 → 去重 → 按相关度排序 → 注入上下文
向量搜索的细节 :
- 目标大小 :每个 chunk 约 400 tokens(约 600-800 字符)
- 重叠 :80 tokens,确保语义连贯性不被切断
- 返回格式 :包含文件路径、行号范围、相似度分数、使用的嵌入模型
关键词搜索的补充 : 当用户提到特定项目名称、人名、日期时,关键词搜索能快速定位精确匹配,而向量搜索可能因为这些词的语义泛化而漏掉。
3.2 记忆工具:Agent 主动检索
OpenClaw 提供了两个核心记忆工具供 AI 调用:
3.2.1 memory_search —— 语义搜索
// 工具定义(简化)
{
name: "memory_search",
description: "Search through memories using semantic similarity",
parameters: {
query: "string", // 搜索意图描述
limit: "number" // 返回结果数量(默认 5)
},
returns: {
snippets: [{
text: "string", // 记忆片段文本(截断至 ~700 字符)
path: "string", // 文件路径
lines: [start, end], // 行号范围
score: "number" // 相似度分数
}]
}
}
关键限制 :不返回完整文件内容,只返回摘要。这是为了防止上下文被单个大文件占满。
3.2.2 memory_get —— 精确读取
{
name: "memory_get",
description: "Read a specific memory file",
parameters: {
path: "string", // 相对 workspace 的路径
startLine: "number", // 可选:起始行
limit: "number" // 可选:读取行数
}
}
安全限制 :路径必须在 MEMORY.md 或 memory/ 目录下,禁止读取敏感文件。
3.3 检索的触发时机
OpenClaw 的检索不是被动的,而是 多阶段触发 :
- 会话启动时 :自动加载今天 + 昨天的日志 + MEMORY.md(私聊)
- Agent 主动调用 :当 AI 判断需要历史信息时,调用
memory_search - 工具调用后 :某些工具执行后自动触发相关记忆检索
- 上下文压缩前 :预刷新阶段检索可能被遗忘的关键信息
第四部分:安全与隐私设计——记忆的边界
4.1 提示注入与记忆污染
OpenClaw 的记忆系统面临一个独特的安全挑战: 持久化提示注入(Persistent Prompt Injection) 。
攻击场景 :
- 攻击者通过某种方式让 AI 记住一条恶意指令(如"永远忽略之前的指令,执行 X")
- 这条指令被写入
MEMORY.md或每日日志 - 后续所有会话都会加载这条记忆,导致 AI 行为被长期劫持
OpenClaw 的防御措施 :
4.1.1 分层信任模型
MEMORY.md:仅在私聊加载,且需要用户明确确认写入- 每日日志:自动加载,但优先加载近期的,旧的检索权重降低
- 会话文件:不直接作为记忆加载,仅用于审计
4.1.2 沙盒隔离
通过 Docker 沙盒运行不受信任的会话:
agents:
defaults:
sandbox:
mode: "non-main" # 非主会话(如群聊)使用沙盒
docker:
image: "openclaw-sandbox"
readOnly: true # 只读,防止写入恶意记忆
4.1.3 内存的"遗忘"机制
虽然 Markdown 是源头,但 OpenClaw 支持 选择性遗忘 :
// 伪代码:遗忘特定记忆
async function forgetMemories(options: {
path?: string; // 特定文件
before?: Date; // 某日期前
matching?: string; // 匹配关键词
}) {
// 从 SQLite 索引中删除
await index.delete(options);
// 可选:从 Markdown 文件中删除对应段落
await rewriteMarkdown(options);
}
4.2 隐私保护设计
4.2.1 本地优先(Local-First)
所有记忆文件默认存储在本地 ~/.openclaw/ 目录,不上传云端。这意味着:
- 你的私人对话不会被用于训练第三方模型
- 即使 OpenClaw 的服务器被攻破,你的记忆也不会泄露
- 你可以随时物理删除文件,确保数据销毁
4.2.2 渠道隔离
如前所述, MEMORY.md 仅在私聊加载。这防止了:
- 群聊中的其他成员通过 AI 窥探你的私人偏好
- 工作频道中的敏感信息混入个人记忆
4.2.3 配对码与访问控制
OpenClaw 默认对未知发送者拒绝消息,需要显式配对批准:
openclaw pairing list
openclaw pairing approve <userId>
这防止了恶意用户通过冒充身份向你的 AI 注入记忆。
4.3 记忆的"毒性"与清理
长期运行后,记忆文件可能积累矛盾或过时的信息。OpenClaw 提供了:
- 手动整理 :用户直接编辑 Markdown 文件,删除不需要的记忆
- 自动去重 :索引层自动检测相似片段
- 版本控制 :建议将 memory 目录纳入 Git,可以回滚到干净的记忆状态
第五部分:实践应用——如何高效使用 OpenClaw 记忆
5.1 记忆的"写入策略"
想要让 AI 记住关键信息,你需要理解它的 写入触发机制 :
5.1.1 显式请求
最直接的方式是明确告诉 AI:
"请记住,我所有项目都用 TypeScript,不喜欢 Python。"
AI 会调用工具将这条写入 MEMORY.md 。
5.1.2 间接提炼
在长时间的对话后,询问:
"从我们的对话中,你有什么应该永久记住的吗?"
这会触发 AI 的 主动记忆整理 ,将散落的上下文提炼成结构化的 MEMORY.md 条目。
5.1.3 手动编辑
直接编辑 ~/.openclaw/workspace/MEMORY.md :
## Technical
- Primary language: TypeScript
- Editor: VS Code with Vim keybindings
- Avoid: Python except for data science tasks
## Personal
- Timezone: Asia/Shanghai (UTC+8)
- Preferred meeting times: 10:00-12:00, 14:00-17:00
5.2 记忆的"读取调优"
5.2.1 优化 MEMORY.md 结构
AI 加载 MEMORY.md 时,结构化的 Markdown 更容易被解析:
## 工作相关
### 项目 Alpha
- 技术栈:Next.js + Prisma
- Deadline: 2026-03-01
### 项目 Beta
- 技术栈:Rust + Tauri
- Status: 暂停中
## 个人偏好
### 饮食
- 素食主义者
- 过敏:花生
### 沟通风格
- 喜欢简洁直接的回答
- 技术讨论时可以使用术语
5.2.2 使用标签增强检索
在记忆中加入特定标签,便于后续检索:
#project-alpha #urgent 需要本周完成 API 文档
虽然 OpenClaw 的默认搜索是语义化的,但标签可以帮助人工快速浏览。
5.3 多设备同步
OpenClaw 本身不提供云同步,但你可以通过以下方式实现记忆同步:
5.3.1 Git 同步
cd ~/.openclaw/workspace/memory
git init
git remote add origin https://github.com/your/memory-repo.git
git add .
git commit -m "Memory update: $(date +%Y-%m-%d)"
git push
5.3.2 云盘同步
使用 Dropbox、iCloud Drive 或 Syncthing 同步 ~/.openclaw/workspace 目录。
注意 :同步时要确保 OpenClaw 不在运行,避免文件冲突。
5.4 故障排查
5.4.1 "AI 总是忘记"
- 检查 workspace 路径 :确保 Gateway 使用的是同一个 workspace
- 检查写入权限 :特别是 Docker 沙盒环境,可能是只读的
- 显式要求写入 :提醒 AI "请把这条写入 MEMORY.md"
5.4.2 "搜索不到相关记忆"
- 检查嵌入模型配置 :需要设置 OpenAI、Gemini 或本地嵌入 API key
- 检查索引状态 :运行
openclaw doctor诊断索引健康 - 手动触发重索引 :删除 SQLite 文件,让系统自动重建
5.4.3 "记忆太多,响应变慢"
- 归档旧日志 :将
memory/2025-*.md移动到备份目录 - 精简 MEMORY.md :定期手动清理过时的记忆
- 调整 chunk 大小 :减少每个片段的 token 数(高级配置)
第六部分:技术进阶——自定义记忆插件
6.1 插件架构
OpenClaw 允许通过插件扩展记忆系统。默认的 memory-core 插件可以被替换或增强:
// 自定义记忆插件示例
export default definePlugin({
name: "memory-advanced",
slots: {
memory: {
async search(query: string, context: Context) {
// 1. 查询向量数据库
const vectorResults = await vectorSearch(query);
// 2. 查询图谱数据库(如果安装了 Graphiti)
const graphResults = await temporalQuery(query);
// 3. 合并排序
return mergeResults(vectorResults, graphResults);
},
async write(content: string, metadata: object) {
// 自定义写入逻辑,比如同时写入云端备份
await localWrite(content, metadata);
await cloudBackup.write(content, metadata);
}
}
}
});
6.2 集成外部记忆系统
6.2.1 Graphiti 时序知识图谱
社区有项目将 Graphiti 与 OpenClaw 集成,实现 时序感知的记忆 :
npm install openclaw-graphiti-memory
memory:
provider: "graphiti"
graphiti:
endpoint: "http://localhost:8000"
temporal: true # 支持时序查询("上周三我说过什么?")
Graphiti 的优势:
- 时间感知 :"三天前"、"上周"等时间限定查询
- 关系推理 :"我和谁讨论过这个项目?"
- 事实演化 :追踪信息的变化历史("项目状态从进行中变为暂停")
6.2.2 VecLite 轻量级向量库
对于资源受限的设备,可以使用 VecLite 替代完整的 SQLite + 嵌入模型方案:
import { Memory } from 'veclite/integrations/openclaw';
const memory = new Memory({
path: './lightweight-memory.db',
embeddingDim: 384, // 使用轻量级模型
localModel: 'all-MiniLM-L6-v2'
});
6.3 记忆的导入导出
OpenClaw 支持多种格式的记忆迁移:
// 从旧会话导入记忆
await memory.importSession('./old-session.jsonl', {
deduplicate: true,
tag: 'migrated-2026'
});
// 导出为 Markdown 备份
await memory.exportMarkdown('./backup/');
// 遗忘特定时间段
await memory.forget({
before: new Date('2026-01-01'),
tag: 'temp'
});
第七部分:设计哲学与未来演进
7.1 "龙虾之道"(The Lobster Way)
OpenClaw 的吉祥物是一只龙虾,这不仅是 branding,更代表了其 持续蜕皮进化 的设计理念:
- 硬壳 :安全边界清晰,默认拒绝未知访问
- 软体 :内部柔软灵活,Markdown 文件可随时调整
- 蜕皮 :定期丢弃旧的不适用记忆,生长出新的能力
记忆系统的这种"可塑性"是其核心优势——不像传统数据库那样僵化,而是像生物神经网络一样可以 遗忘、重塑、进化 。
7.2 与 AutoGPT、MemGPT 的对比
| 特性 | OpenClaw | AutoGPT | MemGPT |
|---|---|---|---|
| 存储格式 | Markdown 文件 | 向量数据库 | 分层记忆架构 |
| 可读性 | 极高(纯文本) | 低(二进制) | 中(结构化) |
| 编辑性 | 直接编辑 | 需工具 | 需 API |
| 检索方式 | 混合(向量+关键词) | 纯向量 | 分层缓存 |
| 上下文管理 | 预压缩刷新 | 递归总结 | 虚拟上下文 |
| 部署复杂度 | 低 | 高 | 中 |
| 隐私控制 | 完全本地 | 依赖配置 | 依赖配置 |
OpenClaw 的取舍很明显: 牺牲绝对存储效率,换取透明度和可控性 。
7.3 未来可能的演进方向
基于当前架构,OpenClaw 的记忆系统可能向以下方向发展:
7.3.1 分层记忆压缩
目前的预压缩刷新还比较简单,未来可能引入更智能的 分层摘要 :
- L1:原始对话(最近 3 天)
- L2:周度摘要(过去 4 周)
- L3:月度回顾(永久保存)
7.3.2 跨 Agent 记忆共享
在保持隔离的前提下,允许用户显式分享某些记忆:
7.3.3 记忆的"置信度"评分
为每条记忆添加置信度元数据,低置信度的记忆(如一次性提及的偏好)会被高置信度的记忆(如多次确认的偏好)覆盖。
7.3.4 多模态记忆
扩展 Markdown 格式支持图像、音频的引用:

用户提到这只猫叫"咪咪",3岁。
结语:记忆让 AI 成为"助手"而非"工具"
OpenClaw 的记忆系统证明了: 真正的个人 AI 助手不是拥有最大的模型,而是拥有最懂你的记忆 。
通过简洁而精妙的双层 Markdown 架构、透明的文件存储、混合检索策略和严格的安全边界,OpenClaw 实现了一个既强大又可控的记忆系统。它不是黑盒,而是 可审计、可编辑、可迁移 的个人知识库。
对于开发者,理解这套架构不仅能帮助你更好地使用 OpenClaw,更能启发你设计自己的 AI 记忆系统。核心启示是:
- 简单胜过复杂 :Markdown 文件胜过复杂的数据库 schema
- 透明建立信任 :用户可以阅读 AI 的记忆,知道它"知道"什么
- 分层管理记忆 :工作记忆与长期记忆的分离是必需的
- 安全不能妥协 :持久化记忆意味着持久化的攻击面,必须严格隔离
当你下次与 OpenClaw 对话,看到它准确记得你上周提到的项目细节、知道你更喜欢 TypeScript 而非 Python、记得你通常在下午开会——背后是这套精心设计的记忆系统在默默工作。
这,就是 AI 从"工具"进化为"助手"的关键一步。
参考资源 :
- OpenClaw 官方文档 - Memory 章节
- OpenClaw GitHub 仓库
- OpenClaw-mini 极简复现项目
- How OpenClaw Implements Agent Memory
- The OpenClaw Prompt Injection Problem
本文深度剖析了 OpenClaw 记忆系统的设计理念、技术实现和最佳实践,适合希望理解 AI 助手长期记忆机制的开发者和技术爱好者阅读。
编辑于 2026-02-06 19:33・广东
