记忆与上下文协调:支撑 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 执行,不跳过任何步骤
|
记忆固化时机:
- ✅ 任务完成后立即写入
- ✅ 遇到错误立即记录
- ✅ Session 结束前完整总结
- ✅ 每日 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): """任务开始前:加载相关记忆""" user_prefs = self.long_term.read("USER.md") related_exp = self.mid_term.search(task, top_k=5) 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_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
| { "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. 失败立即报告
|
六、总结
支撑长周期任务的核心要素:
- ✅ 三层记忆架构 - 短期/中期/长期分离
- ✅ 任务状态机 - 状态外置,支持恢复
- ✅ 心跳式维护 - 定期回顾和整理
- ✅ 多 Agent 共享 - 全局状态注册表
- ✅ 检查点机制 - 每一步都可恢复
最终目标:让 AI Agent 像人类一样,能够:
- 🧠 记住做过的事
- 📝 记录关键状态
- 🔄 从中断处继续
- 👥 与他人协作
参考资源:
作者:John
日期:2026-03-30
标签:AI Agent, 记忆系统,上下文管理,长周期任务,OpenClaw