Skip to content
广告 · 本站推荐广告

记忆

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.50

MMR 重排序

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 小时制

下一步

基于MIT协议开源 | 内容翻译自 官方文档,同步更新