1574 字
约 5 分钟
15
OpenClaw 的 Memory 到底是怎么工作的?

OpenClaw 的 Memory 到底是怎么工作的?

很多人第一次接触 OpenClaw Memory,会把它理解成:

Memory 不就是一个本地 RAG 吗?

确实很像。

它同样涉及 Chunk、Embedding、向量检索、全文检索和混合召回

但要真正理解 Memory,得先搞清楚它到底“记”了什么。

一、Session 和 Memory 有什么区别?

OpenClaw 的记忆可以简单理解成两层:

Session
   ↓
原始对话记录
   ↓
提炼重要信息
   ↓
Memory

Session:短期记忆

Session 保存当前会话中的原始对话。

例如:

用户:我是 Java 后端开发。
用户:以后回答技术问题尽量使用 Java 技术栈。
用户:文章不要写得太像营销号。

这些首先属于会话记录

Memory:长期记忆

真正值得长期保留的信息,可以进一步沉淀到 Memory,例如:

用户偏好:
- Java 后端开发
- 技术问题优先使用 Java 技术栈
- 写作避免营销号、爆款腔

所以两者最大的区别是:

Session 记录“聊过什么”,Memory 保存“以后还值得记住什么”。


二、Memory 本质上存在哪里?

OpenClaw 的长期记忆本体主要是 Markdown 文件。

例如:

MEMORY.md
memory/
├── 2026-03-18.md
├── 2026-03-19.md
└── ...

可以简单理解为:

MEMORY.md
→ 更长期、更稳定的结论和偏好

memory/*.md
→ 日记式记忆,记录阶段性的重要信息

这里有一个非常重要的概念:

Markdown 才是 Memory 的内容本体,SQLite 更像它的检索加速层。

否则 Memory 文件越来越多,总不能每问一个问题,就把几百个 Markdown 全部读一遍。

所以 OpenClaw 会给 Memory 建索引。


三、Memory 怎么建立索引?

整个过程可以压缩成四步:

Markdown
   ↓
发现文件变化
   ↓
切成 Chunk
   ↓
建立全文 + 向量索引
   ↓
SQLite

比如一篇很长的 Memory,会先被拆成多个 Chunk。

每个 Chunk 再走两条路:

              Chunk
             ↙     ↘
          FTS      Vector
           ↓          ↓
       关键词检索    语义检索

这样以后查记忆,就不用扫描全部 Markdown。

可以通过:

openclaw memory status

查看 Memory 当前的索引状态。


四、为什么要做混合检索?

这是 OpenClaw Memory 很关键的一点。

它不是只做向量检索,而是把关键词检索和语义检索结合起来

比如搜索:

openclaw memory search "nomic-embed-text"

这种查询最重要的是:

字符串要准确命中。

这时候全文检索更有优势。

而如果搜索:

上次说过不要那种爆款腔的写法是什么?

用户可能根本没有说出 Memory 原文中的关键词。

但:

爆款腔
营销号
写作风格
表达偏好

语义上又非常接近。

这时候向量检索就更有价值。

所以可以简单理解成:

FTS5 + BM25
负责“字面上像不像”

Vector / Embedding
负责“意思上像不像”

        ↓

     混合召回

这其实已经非常接近一个轻量级 RAG 系统了。


五、Memory 和 RAG 到底有什么区别?

两者底层思想确实非常像:

        Memory / RAG
             │
             ↓
           Chunk
             ↓
         Embedding
             ↓
      Keyword + Vector
             ↓
          Retrieval
             ↓
            LLM

真正的区别更多在使用场景

RAG 通常解决:

“从外部知识库里找到答案。”

比如公司文档、产品手册、技术资料、客服知识库。

Memory 更偏向解决:

“从 Agent 自己过去的经历里找到答案。”

比如:

  • 用户是谁
  • 用户有什么偏好
  • 之前做过什么决定
  • 上次任务执行到了哪里
  • 哪些信息以后还需要继续使用

所以可以记一句:

RAG 检索的是知识,Memory 检索的是过去。


六、Agent 怎么使用 Memory?

Memory 并不是每次对话都把所有文件塞进上下文。

更合理的方式是:

用户提问
   ↓
Agent 判断需要历史信息
   ↓
memory_search
   ↓
找到相关片段
   ↓
memory_get
   ↓
读取具体内容
   ↓
生成答案

例如 Agent 想知道:

用户以前喜欢什么文章风格?

先搜索相关 Memory。

找到对应文件和片段后,再读取具体内容。

这样最大的好处就是:

Memory 可以越来越多,但不需要每次全部塞进 Context。

既保留了长期记忆,又控制了 Token 消耗。


七、Memory 最适合记什么?

比如我有一个 Agent 专门处理账号审核。

每次都重复告诉它:

审核完成发到哪个群
加入哪个项目组
回复采用什么格式

非常麻烦。

这些稳定规则就很适合沉淀成 Memory:

# 审核偏好

- 审核完成后通知运营群
- 通过后加入指定项目组
- 回复采用固定审核格式

以后 Agent 再执行类似任务,就可以从 Memory 中找回这些规则。

这才是长期记忆真正有价值的地方。


最后总结

OpenClaw Memory 的整个工作流程,其实可以浓缩成一张图:

Session 原始对话
       ↓
   提炼重要信息
       ↓
Markdown Memory
       ↓
     Chunk
       ↓
┌──────┴──────┐
↓             ↓
FTS/BM25    Embedding
关键词检索    向量检索
└──────┬──────┘
       ↓
    混合召回
       ↓
memory_search
       ↓
 memory_get
       ↓
     Agent

所以面试官再问:

“OpenClaw Memory 和 RAG 有什么区别?”

千万别只回答:

一个 SQLite,一个 Elasticsearch。

更准确的理解是:

两者底层都可以使用 Chunk、Embedding 和混合检索,但解决的问题不同。RAG 主要让 Agent 检索外部知识,Memory 主要让 Agent 找回自己的历史、上下文和用户偏好。

RAG 让 AI 有知识,Memory 让 AI 有过去。

而一个真正长期陪伴用户工作的 Agent,不能只有知识,还得记得我们曾经一起做过什么。

OpenClaw 的 Memory 到底是怎么工作的?
http://www.clxhxhhr.top/posts/425/
作者
clxstart
发布于
2026-09-02
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。