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 是什么?
简单说就是个带智商的关键词匹配。它不仅数词频,还会:
- 降低常见词的权重(“的”、“是"不值钱)
- 偏爱短文档里的命中(100 字文档出现 1 次,比 10000 字文档出现 10 次更相关)
- 词频饱和(出现 10 次和 100 次,差别没那么大)
局限
| 场景 | 结果 |
|---|---|
| 搜"苹果” | 找不到"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 }
}
}
- 图片 → Gemini 视觉模型生成描述 → Embedding → 向量
- 音频 → Whisper 转录 → 文本 → Embedding → 向量
之后搜"架构图"就能找到那张 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"
}
}