记忆
Memory(记忆)是 Agent 跨会话持久化信息的能力。OpenClaw 采用双层记忆架构,结合语义搜索(Semantic Search)实现高效的信息存储与检索。
记忆架构
┌─────────────────────────────────────────┐
│ 记忆系统 Memory │
├──────────────────┬──────────────────────┤
│ 每日日志 │ 长期记忆 │
│ Daily Logs │ Long-term Memory │
│ │ │
│ memory/ │ MEMORY.md │
│ 2025-01-14.md │ (精选事实) │
│ 2025-01-15.md │ │
│ (追加写入) │ (仅私聊更新) │
└──────────────────┴──────────────────────┘
│ │
▼ ▼
┌─────────────────────────┐
│ 向量索引 + BM25 │
│ Vector Index │
│ 混合搜索 │
└─────────────────────────┘每日日志(Daily Logs)
每日日志是 Agent 的"日记本",按日期自动归档:
~/.openclaw/workspace/memory/
├── 2025-01-13.md
├── 2025-01-14.md
└── 2025-01-15.md ← 今天特征:
- 追加写入(Append-only)— 仅向当前日期文件末尾添加内容
- 自动读取 — 会话启动时加载今天 + 昨天的日志
- 格式 — 纯 Markdown,每条记录带时间戳
markdown
# 2025-01-15 Daily Log
## 10:30
- User prefers dark mode in all UIs
- Working on the authentication module
## 14:15
- Deployed v2.3.1 to staging
- Bug found in session reset logic — needs fix长期记忆(Long-term Memory)
MEMORY.md 存储经过整理的关键事实,持续有效:
markdown
# Long-term Memory
## User Preferences
- Preferred language: Chinese (Simplified)
- Code style: TypeScript with strict mode
- Package manager: pnpm
## Project Context
- Framework: VitePress for documentation
- Deployment: Vercel
- CI/CD: GitHub Actions
## Important Decisions
- 2025-01-10: Decided to use OpenClaw for all AI interactions
- 2025-01-12: Chose DeepSeek as primary model for cost reasons仅私聊更新
MEMORY.md 只在私聊(DM)会话中更新。群组会话中的信息不会写入长期记忆,以保护隐私。
记忆工具
Agent 通过两个内置工具与记忆系统交互:
memory_search — 语义回忆
通过语义搜索(Semantic Search)在记忆中查找相关信息:
typescript
// 工具调用
memory_search({ query: "用户偏好的编程语言" })
// 返回结果
{
results: [
{
source: "MEMORY.md",
content: "Code style: TypeScript with strict mode",
relevance: 0.92
},
{
source: "memory/2025-01-14.md",
content: "User mentioned they prefer TypeScript over JavaScript",
relevance: 0.87
}
]
}memory_get — 定向读取
直接读取指定记忆文件:
typescript
// 读取特定日期的日志
memory_get({ file: "memory/2025-01-15.md" })
// 读取长期记忆
memory_get({ file: "MEMORY.md" })压缩前的记忆持久化
当触发 压缩(Compaction) 时,Agent 会先执行一次静默 Agent 轮次(Silent Agentic Turn):
Compaction 触发
│
▼
┌──────────────────────┐
│ Silent Agentic Turn │
│ 静默记忆持久化 │
│ │
│ 1. 扫描即将被压缩的 │
│ 对话历史 │
│ 2. 提取关键事实 │
│ 3. 写入 MEMORY.md │
│ 4. 追加到每日日志 │
└──────────┬───────────┘
│
▼
执行压缩(摘要化)信息不丢失
静默持久化确保压缩不会丢失重要信息。用户偏好、关键决策和重要数据会在压缩前保存到记忆中。
向量索引
OpenClaw 对 Markdown 记忆文件构建向量索引(Vector Index),支持语义检索:
yaml
memory:
vectorIndex:
enabled: true
model: text-embedding-3-small # 嵌入模型
dimensions: 1536 # 向量维度
chunkSize: 500 # 文本分块大小(字符)
chunkOverlap: 50 # 分块重叠索引在以下时机更新:
- 新记忆写入时
- 工作区文件修改时
- 手动触发
openclaw memory reindex
混合搜索
memory_search 使用混合搜索策略,结合两种检索方式:
| 搜索方式 | 原理 | 优势 |
|---|---|---|
| 向量相似度 | 基于语义嵌入的余弦相似度 | 理解语义,不依赖关键词 |
| BM25 关键词 | 基于词频的统计匹配 | 精确匹配特定术语 |
查询: "用户偏好的编程语言"
│
┌────┴────┐
│ │
▼ ▼
向量搜索 BM25 搜索
(语义) (关键词)
│ │
└────┬────┘
│
▼
分数融合
Score Fusion
│
▼
MMR 重排序
去重 + 多样性
│
▼
最终结果时间衰减
近期的记忆条目获得更高的相关性加权:
relevance_score = semantic_score × time_decay_factor
time_decay_factor:
今天: 1.0
昨天: 0.95
本周: 0.85
本月: 0.70
更早: 0.50MMR 重排序
MMR(Maximal Marginal Relevance,最大边际相关性)用于减少搜索结果中的重复:
yaml
memory:
search:
mmr:
enabled: true
lambda: 0.7 # 0=最大多样性, 1=最大相关性
topK: 10 # 返回前 10 条结果MMR 原理
MMR 在选择每条结果时,同时考虑与查询的相关性和与已选结果的差异性,避免返回大量相似内容。
🇨🇳 中国用户须知
- 记忆文件完全支持中文内容
- 中文语义搜索建议使用支持中文的嵌入模型(如
text-embedding-3-small对中文支持良好) - 每日日志中的中文时间格式建议使用 24 小时制
