目录
-
- 摘要
- [1. 引言 - 为什么需要记忆维护?](#1. 引言 - 为什么需要记忆维护?)
-
- [1.1 记忆膨胀问题](#1.1 记忆膨胀问题)
- [1.2 记忆生命周期](#1.2 记忆生命周期)
- [1.3 维护目标](#1.3 维护目标)
- [2. 记忆分类与优先级](#2. 记忆分类与优先级)
-
- [2.1 记忆分类体系](#2.1 记忆分类体系)
- [2.2 优先级定义](#2.2 优先级定义)
- [2.3 记忆标记规范](#2.3 记忆标记规范)
- [3. 自动归档机制](#3. 自动归档机制)
-
- [3.1 归档触发条件](#3.1 归档触发条件)
- [3.2 归档流程](#3.2 归档流程)
- [3.3 归档目录结构](#3.3 归档目录结构)
- [3.4 归档索引文件](#3.4 归档索引文件)
- [4. 定期清理策略](#4. 定期清理策略)
-
- [4.1 清理规则](#4.1 清理规则)
- [4.2 清理流程](#4.2 清理流程)
- [4.3 清理脚本示例](#4.3 清理脚本示例)
- [5. Heartbeat 驱动的维护](#5. Heartbeat 驱动的维护)
-
- [5.1 Heartbeat 机制](#5.1 Heartbeat 机制)
- [5.2 维护检查流程](#5.2 维护检查流程)
- [5.3 维护状态记录](#5.3 维护状态记录)
- [6. 记忆整理最佳实践](#6. 记忆整理最佳实践)
-
- [6.1 整理原则](#6.1 整理原则)
- [6.2 整理模板](#6.2 整理模板)
- [6.3 自动整理脚本](#6.3 自动整理脚本)
- [7. 实战案例](#7. 实战案例)
- [8. 监控与告警](#8. 监控与告警)
-
- [8.1 监控指标](#8.1 监控指标)
- [8.2 告警通知](#8.2 告警通知)
- [9. 常见问题与解决](#9. 常见问题与解决)
- [10. 总结](#10. 总结)
-
- [10.1 核心要点](#10.1 核心要点)
- [10.2 维护清单](#10.2 维护清单)
- [10.3 下一步](#10.3 下一步)
- 参考资料
摘要
本文详细介绍 OpenClaw 记忆系统的维护策略与自动化实践。从记忆生命周期管理、自动归档机制、定期清理策略到 Heartbeat 驱动的维护流程,全面解析如何保持记忆系统的高效运行。通过实际案例演示记忆整理、归档、清理的完整流程,帮助开发者构建自维护的智能记忆系统,避免记忆膨胀和性能下降。🧹
1. 引言 - 为什么需要记忆维护?
1.1 记忆膨胀问题
| 问题 | 表现 | 影响 |
|---|---|---|
| 文件过大 | MEMORY.md 超过 100KB | 加载变慢,Token 消耗增加 |
| 日志堆积 | 每日日志累积过多 | 搜索效率下降 |
| 信息冗余 | 重复或过时信息 | 干扰有效信息检索 |
| 上下文污染 | 无关信息混入 | AI 回复质量下降 |
1.2 记忆生命周期
是
否
是
否
创建记忆
活跃使用
定期检查
是否重要?
保留/升级
是否过时?
归档/删除
继续保留
记忆清理完成
1.3 维护目标
| 目标 | 说明 | 指标 |
|---|---|---|
| 控制大小 | 保持记忆文件合理大小 | MEMORY.md < 50KB |
| 提高效率 | 优化搜索和加载速度 | 搜索响应 < 1s |
| 保证质量 | 确保记忆内容准确有效 | 有效信息率 > 80% |
| 自动化 | 减少人工干预 | 自动化率 > 90% |
2. 记忆分类与优先级
2.1 记忆分类体系
记忆分类
核心记忆
用户信息
项目上下文
关键决策
重要记忆
用户偏好
解决方案
里程碑事件
一般记忆
日常任务
临时记录
会话摘要
临时记忆
调试信息
临时数据
测试记录
2.2 优先级定义
| 优先级 | 类型 | 保留策略 | 示例 |
|---|---|---|---|
| P0 核心 | 永久保留 | 始终保留 | 用户姓名、项目目标 |
| P1 重要 | 长期保留 | 定期审查 | 用户偏好、重要决策 |
| P2 一般 | 中期保留 | 30天后归档 | 日常任务、问题记录 |
| P3 临时 | 短期保留 | 7天后删除 | 调试日志、临时数据 |
2.3 记忆标记规范
markdown
# MEMORY.md
## [P0] 用户信息
- 姓名:张龙生
- 昵称:老大
## [P1] 用户偏好
- 表达风格:简洁
## [P2] 近期任务
- 完成第41-43篇文章
## [P3] 临时记录
- 今日调试了 Gateway 配置
3. 自动归档机制
3.1 归档触发条件
| 触发条件 | 说明 | 动作 |
|---|---|---|
| 时间触发 | 日志超过 7 天 | 移动到 archive/ |
| 大小触发 | MEMORY.md 超过 50KB | 提取非核心内容 |
| 数量触发 | 日志文件超过 30 个 | 批量归档 |
| 手动触发 | 用户请求归档 | 执行归档流程 |
3.2 归档流程
核心记忆
重要记忆
一般记忆
临时记忆
是
否
触发归档
扫描记忆文件
分类记忆内容
内容类型
保留在 MEMORY.md
审查后决定
移动到归档
标记删除
是否仍重要?
创建归档文件
清理列表
更新索引
归档完成
3.3 归档目录结构
memory/
├── MEMORY.md # 长期记忆(核心)
├── 2026-04-13.md # 今日日志
├── 2026-04-12.md # 昨日日志
├── ...
├── archive/ # 归档目录
│ ├── 2026-Q1/ # 按季度归档
│ │ ├── summary.md # 季度摘要
│ │ └── logs/ # 日志文件
│ │ ├── 2026-01-*.md
│ │ ├── 2026-02-*.md
│ │ └── 2026-03-*.md
│ └── 2026-Q2/
│ └── ...
└── .archive-index.json # 归档索引
3.4 归档索引文件
json
{
"version": "1.0",
"lastUpdated": "2026-04-13T17:00:00Z",
"archives": [
{
"period": "2026-Q1",
"files": 90,
"size": "125KB",
"summary": "完成文章1-40篇,用户偏好稳定"
}
],
"statistics": {
"totalArchived": 90,
"totalSize": "125KB",
"oldestDate": "2026-01-01",
"newestDate": "2026-03-31"
}
}
4. 定期清理策略
4.1 清理规则
| 规则 | 条件 | 动作 |
|---|---|---|
| 日志清理 | 超过 30 天 | 删除(已归档) |
| 临时记忆 | 超过 7 天 | 删除 |
| 重复信息 | 检测到重复 | 合并去重 |
| 过时信息 | 标记为过时 | 删除或更新 |
4.2 清理流程
是
否
是
否
启动清理
扫描所有记忆
识别清理目标
生成清理计划
需要确认?
请求用户确认
执行清理
用户同意?
跳过该项
更新记忆文件
记录清理日志
清理完成
4.3 清理脚本示例
bash
#!/bin/bash
# memory_cleanup.sh
MEMORY_DIR="/root/.openclaw/workspace/memory"
ARCHIVE_DIR="$MEMORY_DIR/archive"
RETENTION_DAYS=30
# 创建归档目录
mkdir -p "$ARCHIVE_DIR"
# 归档超过7天的日志
find "$MEMORY_DIR" -name "*.md" -mtime +7 -not -path "$ARCHIVE_DIR/*" -exec mv {} "$ARCHIVE_DIR/" \;
# 删除超过30天的归档
find "$ARCHIVE_DIR" -name "*.md" -mtime +$RETENTION_DAYS -delete
# 更新归档索引
python3 update_archive_index.py
echo "Memory cleanup completed at $(date)"
5. Heartbeat 驱动的维护
5.1 Heartbeat 机制
Heartbeat 是 OpenClaw 的定期检查机制,可用于驱动记忆维护:
markdown
# HEARTBEAT.md
# 心跳检查任务
## 记忆维护检查项
- [ ] 检查 MEMORY.md 大小
- [ ] 归档超过7天的日志
- [ ] 清理临时记忆
- [ ] 更新记忆索引
- [ ] 检查重复信息
5.2 维护检查流程
超过 50KB
正常
超过 7 天
正常
超过 7 天
正常
Heartbeat 触发
读取 HEARTBEAT.md
执行检查项
MEMORY.md 大小
执行精简
继续检查
日志数量
执行归档
继续检查
临时记忆
执行清理
检查完成
更新检查时间
5.3 维护状态记录
json
{
"lastMaintenance": "2026-04-13T17:00:00Z",
"checks": {
"memorySize": {
"status": "ok",
"size": "32KB",
"limit": "50KB"
},
"logCount": {
"status": "ok",
"count": 5,
"limit": 7
},
"archiveSize": {
"status": "ok",
"size": "125KB"
}
},
"actions": [
{
"type": "archive",
"files": 3,
"timestamp": "2026-04-13T17:00:00Z"
}
]
}
6. 记忆整理最佳实践
6.1 整理原则
| 原则 | 说明 | 示例 |
|---|---|---|
| 保留核心 | 核心信息不删除 | 用户姓名、项目目标 |
| 合并相似 | 合并重复或相似内容 | 多次提到的偏好合并 |
| 提取摘要 | 长内容提取关键点 | 任务列表提取摘要 |
| 标记状态 | 标记信息状态 | [已完成]、[已过时] |
6.2 整理模板
markdown
# MEMORY.md 整理模板
## [P0] 用户信息
<!-- 核心信息,永久保留 -->
- 姓名:
- 昵称:
- 时区:
## [P1] 用户偏好
<!-- 重要偏好,定期审查 -->
- 表达风格:
- 沟通语言:
- 特殊要求:
## [P1] 项目上下文
<!-- 当前项目状态 -->
- 项目名称:
- 当前目标:
- 进度:
## [P2] 重要决策
<!-- 近期重要决策,按时间倒序 -->
- YYYY-MM-DD:决策内容
## [P3] 近期任务
<!-- 近期任务,完成后归档 -->
- [ ] 任务1
- [ ] 任务2
## 归档记录
<!-- 已归档内容的索引 -->
- 2026-Q1:完成文章1-40篇
6.3 自动整理脚本
python
import re
from datetime import datetime
def organize_memory(memory_content):
"""整理 MEMORY.md 内容"""
# 1. 合并重复的用户偏好
preferences = extract_preferences(memory_content)
merged_prefs = merge_duplicates(preferences)
# 2. 提取任务摘要
tasks = extract_tasks(memory_content)
task_summary = generate_summary(tasks)
# 3. 标记过时信息
outdated = find_outdated(memory_content)
marked = mark_outdated(memory_content, outdated)
# 4. 重新组织结构
organized = reorganize(marked)
return organized
def merge_duplicates(items):
"""合并重复项"""
seen = {}
for item in items:
key = normalize(item['key'])
if key in seen:
# 合并内容
seen[key]['value'] = item['value']
seen[key]['updated'] = datetime.now()
else:
seen[key] = item
return list(seen.values())
7. 实战案例
7.1 案例一:季度归档
场景:2026年Q1结束,需要归档所有Q1的日志
步骤:
- 创建归档目录
bash
mkdir -p memory/archive/2026-Q1/logs
- 移动日志文件
bash
mv memory/2026-01-*.md memory/archive/2026-Q1/logs/
mv memory/2026-02-*.md memory/archive/2026-Q1/logs/
mv memory/2026-03-*.md memory/archive/2026-Q1/logs/
- 生成季度摘要
markdown
# 2026年Q1 摘要
## 项目进度
- 完成文章:40篇
- 完成率:40%
## 重要决策
- 采用5阶段文章结构
- 选择飞书作为主要渠道
## 用户偏好变化
- 确认喜欢简洁表达风格
- 偏好表格+代码块格式
## 统计
- 日志文件:90个
- 总大小:125KB
- 更新归档索引
json
{
"archives": [
{
"period": "2026-Q1",
"files": 90,
"summary": "完成文章1-40篇"
}
]
}
7.2 案例二:MEMORY.md 精简
场景:MEMORY.md 超过 50KB,需要精简
精简前:
markdown
# MEMORY.md (55KB)
## 用户信息
...
## 项目上下文
(包含大量历史任务详情)
## 所有决策记录
(包含90天的所有决策)
## 每日任务列表
(包含所有历史任务)
精简后:
markdown
# MEMORY.md (28KB)
## [P0] 用户信息
- 姓名:张龙生
- 昵称:老大
## [P1] 项目上下文
- 目标:100篇文章
- 已完成:43篇
- 当前进度:43%
## [P1] 用户偏好
- 表达风格:简洁
- 格式偏好:表格+代码块
## [P1] 近期决策(最近30天)
- 2026-04-10:调整文章结构
## [P2] 当前任务
- [ ] 完成第44-45篇文章
## 归档索引
- 2026-Q1:见 archive/2026-Q1/summary.md
8. 监控与告警
8.1 监控指标
| 指标 | 阈值 | 告警级别 |
|---|---|---|
| MEMORY.md 大小 | > 50KB | 警告 |
| MEMORY.md 大小 | > 100KB | 严重 |
| 日志文件数量 | > 30 个 | 警告 |
| 归档目录大小 | > 1MB | 警告 |
| 重复信息比例 | > 20% | 警告 |
8.2 告警通知
python
def check_memory_health():
"""检查记忆系统健康状态"""
alerts = []
# 检查 MEMORY.md 大小
memory_size = get_file_size("MEMORY.md")
if memory_size > 100 * 1024: # 100KB
alerts.append({
"level": "critical",
"message": f"MEMORY.md 超过 100KB ({memory_size/1024:.1f}KB)",
"action": "立即执行精简"
})
elif memory_size > 50 * 1024: # 50KB
alerts.append({
"level": "warning",
"message": f"MEMORY.md 超过 50KB ({memory_size/1024:.1f}KB)",
"action": "建议执行精简"
})
# 检查日志数量
log_count = count_log_files()
if log_count > 30:
alerts.append({
"level": "warning",
"message": f"日志文件过多 ({log_count} 个)",
"action": "建议执行归档"
})
return alerts
9. 常见问题与解决
Q1:归档后如何检索?
解决方案:
- 使用 memory_search 会自动搜索归档目录
- 查看归档索引快速定位
- 使用季度摘要获取概览
Q2:误删重要记忆怎么办?
解决方案:
- 归档而非直接删除
- 保留 30 天缓冲期
- 定期备份 MEMORY.md
Q3:如何判断信息是否过时?
解决方案:
- 检查时间戳
- 对比当前上下文
- 询问用户确认
10. 总结
10.1 核心要点
| 要点 | 说明 |
|---|---|
| 定期维护 | 通过 Heartbeat 驱动自动维护 |
| 分级管理 | 按优先级管理记忆内容 |
| 自动归档 | 超过 7 天自动归档日志 |
| 定期清理 | 超过 30 天清理归档文件 |
10.2 维护清单
- 每周检查 MEMORY.md 大小
- 每周归档旧日志
- 每月审查用户偏好
- 每季度生成摘要
- 定期备份重要记忆
10.3 下一步
- 第45篇:OpenClaw 上下文管理:Token 优化策略
- 第46篇:OpenClaw Browser:浏览器控制入门