OpenClaw 记忆机制:从入门到精通

1. 智能体记忆:人生还是别只如初见

记忆机制是Agent中的重要课题,如何让你的Agent不要每次和你聊天都像第一天认识?之前聊过的话它还能回忆起来?

OpenClaw 的解法也很直接:本地 RAG。把知识库索引好,用时按需检索,只把相关内容塞进有限的上下文窗口。而且设计上是渐进式的——没配 API 也能用,配了就能更强。


2. 默认配置:自适应策略

OpenClaw 的记忆默认是开箱即用的,核心就这几行:

{
  "enabled": true,        // 功能开启
  "provider": "auto",     // 自动检测 Embedding 服务
  "vector.enabled": true, // 优先尝试向量搜索
  "hybrid.enabled": true, // 混合搜索备用
  "fallback": "none"      // 失败不回退,直接降级
}

关键在 "auto" 这个设计。OpenClaw 会按顺序检测:OpenAI → Gemini → Voyage → Ollama → 本地模型,全都没有就自动降级。你不用操心配错,它自己找活路。


3. 零配置:FTS-Only 模式

如果你什么 API key 都没填,Ollama 也没装,OpenClaw 会默默进入 FTS-Only 模式。

实际生效的配置

{
  "model": "fts-only",
  "provider": "none"
}

工作机制

流程其实挺直观:用户问题进来,先拆成关键词,然后去 SQLite 的 FTS5 索引里搜,BM25 算个分,返回最相关的文本块。

"怎么部署到服务器?"
    ↓
分词 → ["怎么", "部署", "服务器"]
    ↓
FTS5 索引检索 + BM25 评分
    ↓
返回 6 个相关段落(每段约 400 tokens,重叠 80 tokens)
    ↓
塞进 prompt,LLM 作答

BM25 是什么?

简单说就是个带智商的关键词匹配。它不仅数词频,还会:

局限

场景 结果
搜"苹果” 找不到"iPhone"
搜"怎么上线" 找不到"如何部署"
中文问题搜英文文档 完全不行

纯关键词的硬伤:认字不认意


4. 进阶:向量搜索

想要语义理解,得有个能把文字变成"意思"的东西——这就是 Embedding 模型。

配置方式

{
  "memorySearch": {
    "provider": "openai",              // 或 gemini、voyage、ollama
    "model": "text-embedding-3-small"  // 默认小模型,够用
  }
}

工作机制

Embedding 模型会把任意文本转成固定维度的向量,比如 1536 个数字。语义相近的文本,向量空间里的距离也近。

文档:"如何在 AWS 上部署 OpenClaw"
    ↓
text-embedding-3-small
    ↓
[0.023, -0.045, 0.891, ...]  ← 1536 维向量
    ↓
存入 sqlite-vec(SQLite 的向量扩展)

查询时也一样:

问题:"怎么在云服务器上跑这个?"
    ↓
Embedding 模型
    ↓
[0.019, -0.038, 0.854, ...]
    ↓
余弦相似度检索 → 找到最接近的文档向量
    ↓
返回语义相关的结果

带来的能力


5. 更强:混合搜索

纯向量也有坑——遇到专有名词、版本号、精确术语时,它可能"想太多"。这时候 BM25 的字面匹配反而更准。

OpenClaw 的解法是双路召回,加权融合

配置

{
  "query": {
    "hybrid": {
      "enabled": true,
      "vectorWeight": 0.7,   // 语义占大头
      "textWeight": 0.3,     // 关键词兜底
      "candidateMultiplier": 4
    }
  }
}

工作机制

问题:"OpenClaw 配置"
        ↓
    ┌───┴───┐
    ↓       ↓
 向量搜索   BM25 搜索
 (语义)    (关键词)
    ↓       ↓
[A:0.92]  [B:0.95]
[B:0.88]  [C:0.90]
    └────┬────┘
         ↓
    加权融合:0.7×向量分 + 0.3×BM25分
         ↓
    重新排序,取 Top 6

为什么混合更好?

场景 纯向量 纯 BM25 混合
语义相关但关键词不同
专有名词精确匹配
版本号、文件名 可能错

向量负责"懂意思",BM25 负责"别漏词",两者互补。


6. 高阶玩法

6.1 MMR 重排序:结果多样性

默认的 Top-K 有个问题——可能 6 条结果全在讲同一件事。MMR(Maximal Marginal Relevance)会让结果又相关又多样

{
  "mmr": {
    "enabled": true,
    "lambda": 0.7   // 0 最多样,1 最相关
  }
}

工作机制:每选一条结果,就降低与其相似的候选分数。确保覆盖不同角度。

问题:"OpenClaw 记忆机制"

普通排序 → [向量搜索×3, 向量搜索×2, 向量搜索×1]
MMR 排序 → [向量搜索, BM25原理, 混合搜索, 配置方法, 会话记忆, 多模态]

6.2 时间衰减:新记忆优先

老记忆可能过时,新记忆更相关。

{
  "temporalDecay": {
    "enabled": true,
    "halfLifeDays": 30   // 30 天分数减半
  }
}

分数会乘以一个衰减因子:2^(-天数/30)。今天创建的记 1.0,一个月前 0.5,两个月前 0.25。

6.3 查询扩展:提高召回

用户的问题可能太简短,LLM 帮忙扩展几个同义表述,分别搜索后合并结果。

{
  "expansion": {
    "enabled": true,
    "model": "gpt-4o-mini",
    "maxPhrases": 3
  }
}
原问题:"怎么部署"
    ↓
LLM 扩展:
- 如何上线 OpenClaw
- 服务器安装配置
- 生产环境部署指南
    ↓
4 个查询分别检索,结果去重融合

6.4 会话记忆:跨轮次上下文

默认只索引 memory/ 目录的静态文件。开启会话记忆后,当前对话本身也会被索引

{
  "experimental": {
    "sessionMemory": true
  },
  "sync": {
    "sessions": {
      "deltaBytes": 1000,      // 会话新增 1000 字节触发索引
      "deltaMessages": 5       // 或 5 条新消息
    }
  }
}

效果:第 1 轮你说"我在做支付系统",第 5 轮问"怎么设计"时,系统还记得上下文。甚至下次开新会话,之前的对话也能被检索到。

6.5 多模态:图片、音频也能搜

{
  "multimodal": {
    "enabled": true,
    "image": { "enabled": true },
    "audio": { "enabled": true }
  }
}

之后搜"架构图"就能找到那张 PNG,搜"会议录音"能找到对应的 MP3。


7. 层级对照与选型建议

层级 配置成本 核心能力 适用场景
FTS-Only 关键词匹配 快速体验、完全离线、文档少
Vector 低(一个 API key) 语义理解 需要同义词、跨语言匹配
Hybrid 语义+关键词 生产环境,兼顾准确与召回
+MMR/时间/扩展 中高 结果优化 知识库大、结果需要多样、时效性强
+会话/多模态 全功能 复杂项目、长周期、多媒体

快速上手建议

想立刻升级? 最省事的方案:

// Gemini,免费额度够用
{
  "memorySearch": {
    "provider": "gemini",
    "model": "gemini-embedding-exp-03-07"
  }
}

完全离线?

ollama pull nomic-embed-text
{
  "memorySearch": {
    "provider": "ollama",
    "model": "nomic-embed-text"
  }
}