0%

记忆与上下文协调:支撑 AI Agent 长周期任务的核心架构

记忆与上下文协调:支撑 AI Agent 长周期任务的核心架构

摘要:AI Agent 执行长周期任务(如博客发布、代码开发、项目管理)时,最大的挑战是如何在多次会话、多个工具调用之间保持状态连续性。本文基于 OpenClaw 项目的实战经验,分享记忆系统和上下文协调的核心架构设计。


一、为什么需要记忆和上下文协调?

1.1 长周期任务的挑战

场景 1:博客发布全流程

1
2
3
4
5
6
7
8
9
10
11
用户:帮我发布一篇博客
Agent: 好的,开始执行...

[5 分钟后]
Agent: ✅ 文章已创建
Agent: ✅ 内容检查通过
Agent: ✅ MR 已提交

[30 分钟后,用户回来]
用户:MR 合并了吗?
Agent: ❌ 不记得之前做了什么

问题

  • Agent 无法记住之前的操作步骤
  • 用户需要重复说明上下文
  • 任务状态丢失,需要重新开始

场景 2:多步骤代码开发

1
2
3
4
5
6
用户:帮我重构这个模块
Agent: 好的,第一步:分析现有代码...

[第二天]
用户:继续昨天的重构
Agent: ❌ 不知道昨天做了什么

1.2 核心问题

问题 说明 影响
会话中断 Agent 重启后丢失上下文 任务无法继续
状态分散 信息散落在对话历史中 难以检索和汇总
工具调用断裂 多次工具调用之间无状态传递 需要重复执行
多 Agent 协作困难 不同 Agent 之间无法共享状态 协作效率低

二、OpenClaw 的记忆架构设计

2.1 三层记忆模型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
┌─────────────────────────────────────────────────────────────┐
│ OpenClaw 记忆架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ L1: 短期记忆(上下文窗口) │
│ ├─ 当前对话历史 │
│ ├─ 最近工具调用结果 │
│ └─ 容量:262K tokens(qwen3.5-plus) │
│ │
│ L2: 中期记忆(向量数据库) │
│ ├─ LanceDB Pro 向量存储 │
│ ├─ OpenViking 自动捕获/回忆 │
│ └─ 容量:无限(语义检索) │
│ │
│ L3: 长期记忆(文件系统) │
│ ├─ memory/YYYY-MM-DD.md(每日日志) │
│ ├─ MEMORY.md(核心知识) │
│ ├─ IDENTITY.md(人格设定) │
│ └─ USER.md(用户偏好) │
│ │
└─────────────────────────────────────────────────────────────┘

2.2 记忆写入策略

原则:Text > Brain(文本 > 大脑)

1
2
3
4
5
6
7
8
9
10
❌ 错误做法:
"我记住了,下次不会犯这个错误"
→ Session 重启后,记忆丢失

✅ 正确做法:
# 写入 memory/2026-03-30.md
## 教训
- 必须使用 hexo-new 技能创建文章
- 不能跳过 Step 4 内容检查
- 严格按 SOP 执行,不跳过任何步骤

记忆固化时机

  1. ✅ 任务完成后立即写入
  2. ✅ 遇到错误立即记录
  3. ✅ Session 结束前完整总结
  4. ✅ 每日 Heartbeat 时回顾整理

2.3 上下文协调机制

问题:记忆有了,但如何在任务执行中有效使用?

解决方案:上下文协调器(Context Coordinator)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class ContextCoordinator:
def __init__(self):
self.short_term = [] # 短期记忆(对话历史)
self.mid_term = VectorDB() # 中期记忆(向量检索)
self.long_term = FileSystem() # 长期记忆(文件)

def before_task(self, task):
"""任务开始前:加载相关记忆"""
# 1. 从长期记忆加载用户偏好
user_prefs = self.long_term.read("USER.md")

# 2. 从向量数据库检索相关经验
related_exp = self.mid_term.search(task, top_k=5)

# 3. 注入到上下文窗口
self.short_term.extend([user_prefs, related_exp])

def during_task(self, step, result):
"""任务执行中:记录关键状态"""
# 记录到临时状态文件
self.long_term.append(f"task-state.json", {
"step": step,
"result": result,
"timestamp": now()
})

def after_task(self, task, success):
"""任务完成后:固化记忆"""
# 写入每日记忆
self.long_term.append(f"memory/{today()}.md", {
"task": task,
"success": success,
"lessons": self.extract_lessons()
})

三、支撑长周期任务的实战经验

3.1 任务状态机

问题:长周期任务可能跨越多个 Session,如何保持状态?

解决方案:任务状态机(Task State Machine)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// task-state.json
{
"task_id": "blog-publish-20260330",
"status": "in_progress",
"current_step": 5,
"total_steps": 9,
"steps": [
{"step": 1, "name": "预检查", "status": "success"},
{"step": 2, "name": "环境准备", "status": "success"},
{"step": 3, "name": "编写文章", "status": "success"},
{"step": 4, "name": "内容检查", "status": "success"},
{"step": 5, "name": "提交 MR", "status": "in_progress"},
{"step": 6, "name": "等待审核", "status": "pending"},
{"step": 7, "name": "Jenkins 监控", "status": "pending"},
{"step": 8, "name": "发布验证", "status": "pending"},
{"step": 9, "name": "清理通知", "status": "pending"}
],
"last_updated": "2026-03-30T23:30:00Z"
}

优势

  • ✅ 任何 Agent 接手都能知道当前进度
  • ✅ 支持任务暂停和恢复
  • ✅ 便于调试和审计

3.2 心跳式记忆维护

问题:如何确保记忆不会随时间丢失?

解决方案:心跳式记忆维护(Heartbeat Memory Maintenance)

1
2
3
4
5
6
## Heartbeat.md(每日检查清单)

- [ ] 检查未完成任务状态
- [ ] 回顾昨日记忆
- [ ] 更新 MEMORY.md
- [ ] 清理过期临时文件

执行时机

  • 每日固定时间(如 07:00)
  • Session 启动时
  • 任务间隔期

3.3 多 Agent 状态共享

问题:多个 Agent 协作时,如何共享任务状态?

解决方案:全局状态注册表(Global State Registry)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// ~/.openclaw/state-registry.json
{
"active_tasks": [
{
"task_id": "blog-publish-20260330",
"owner": "crystal",
"collaborators": ["blog", "devops"],
"state_file": "~/.openclaw/tasks/blog-publish-20260330/state.json"
}
],
"shared_memory": [
{
"name": "blog-publish-sop",
"path": "~/.openclaw/crystals/blog-publisher/SOP-MANUAL.md",
"access": ["crystal", "blog"]
}
]
}

四、最佳实践总结

4.1 记忆写入原则

原则 说明 示例
及时固化 完成后立即写入,不要依赖” mental notes” 任务完成 → 写 memory 文件
结构化 使用统一格式,便于检索 YAML Front Matter + Markdown
分层存储 短期/中期/长期分离 对话历史/向量库/文件系统
定期回顾 Heartbeat 时整理和清理 每日 07:00 检查

4.2 上下文协调原则

原则 说明 示例
状态外置 状态不依赖内存,存储到文件 task-state.json
显式传递 状态通过文件传递,不隐式依赖 读取 state → 执行 → 更新 state
幂等执行 每一步都可重复执行 Step 4 失败 → 重新执行 Step 4
审计追踪 所有操作记录日志 task-execution.log

4.3 长周期任务设计模式

模式 1:检查点模式(Checkpoint Pattern)

1
2
3
任务开始 → Step 1 → [Checkpoint] → Step 2 → [Checkpoint] → ...
↓ ↓
保存状态 保存状态

模式 2:状态机模式(State Machine Pattern)

1
2
3
4
5
{
"status": "in_progress",
"current_step": 5,
"steps": [...]
}

模式 3:心跳模式(Heartbeat Pattern)

1
每 30 分钟 → 检查任务状态 → 更新记忆 → 继续执行

五、实战案例:博客发布水晶包

5.1 任务执行记录

1
2
3
4
5
6
7
2026-03-30 21:07 - 开始博客发布验证
2026-03-30 21:30 - ❌ 失败:路径错误
2026-03-30 22:00 - ❌ 失败:缺少 Front Matter
2026-03-30 22:30 - ✅ MR #80 创建成功
2026-03-30 23:00 - ✅ Front Matter 修复 MR #81 创建
2026-03-30 23:30 - ✅ MR #81 合并
2026-03-30 23:35 - ✅ 记忆固化到 memory/2026-03-30.md

5.2 记忆文件示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 2026-03-30 记忆 - 博客发布水晶包全流程验证

## ✅ 完成的工作
- 博客发布验证(MR #80, #81)
- 配置管理优化
- 文档完善(6 个文档)

## ❌ 遇到的问题
1. 路径混乱(失败 3 次)
2. 缺少 Front Matter
3. 跳过检查步骤

## 📚 核心知识点
1. 必须使用 hexo-new 技能
2. 不能跳过 Step 4 内容检查
3. 严格按 SOP 执行

## 💡 关键教训
1. 必须写 memory 文件
2. 不要盲目尝试
3. 失败立即报告

六、总结

支撑长周期任务的核心要素

  1. 三层记忆架构 - 短期/中期/长期分离
  2. 任务状态机 - 状态外置,支持恢复
  3. 心跳式维护 - 定期回顾和整理
  4. 多 Agent 共享 - 全局状态注册表
  5. 检查点机制 - 每一步都可恢复

最终目标:让 AI Agent 像人类一样,能够:

  • 🧠 记住做过的事
  • 📝 记录关键状态
  • 🔄 从中断处继续
  • 👥 与他人协作

参考资源


作者:John
日期:2026-03-30
标签:AI Agent, 记忆系统,上下文管理,长周期任务,OpenClaw