AI 助手的上下文管理与记忆架构:从有限到无限
深入解析大语言模型的上下文限制、记忆系统设计原理,以及 OpenClaw 的工程实践
目录
问题引入
疑问
"上下文有限制,怎么可以全部读取?"
这是一个非常敏锐的问题。表面上看:
- AI 模型有固定的上下文窗口(如 128K tokens)
- 长对话超过限制就无法"记住"
- 但 AI 助手却能整理完整对话历史
答案的核心:不是一次性读取,而是通过文件系统实现"无限记忆"。
上下文窗口的本质
什么是上下文窗口?
上下文窗口 = 模型一次能处理的最大 token 数量
例:
- GPT-4 Turbo: 128K tokens
- Claude 3: 200K tokens
- Kimi: 128K-2M tokens(云服务)
Token 计算
| 类型 | Token 数 | 实际占用 |
|---|---|---|
| 系统提示 | ~2,000 | 系统保留 |
| 用户消息 | ~500/条 | 逐条累加 |
| AI 回复 | ~1,000/条 | 逐条累加 |
| 工具调用 | ~2,000/次 | 结果单独存储 |
一个 20 轮对话的估算:
系统提示: 2,000 tokens
用户消息: 20 × 500 = 10,000 tokens
AI 回复: 20 × 1,000 = 20,000 tokens
工具调用: 10 × 2,000 = 20,000 tokens
─────────────────────────────────
总计: 约 52,000 tokens
限制带来的问题
| 问题 | 表现 | 影响 |
|---|---|---|
| 记忆丢失 | 忘记之前的对话 | 用户体验差 |
| 上下文溢出 | 报错或截断 | 任务中断 |
| 信息碎片化 | 无法关联远距离信息 | 推理能力下降 |
OpenClaw 的记忆架构
分层设计
┌─────────────────────────────────────────────────────────┐
│ 当前上下文 (Context) │
│ 有限 · 会话级 · 模型直接处理 │
│ ~128K tokens │
├─────────────────────────────────────────────────────────┤
│ 会话历史 (Session) │
│ 中等 · 会话级 · OpenClaw 管理 │
│ 自动摘要 · 保留关键信息 │
├─────────────────────────────────────────────────────────┤
│ 短期记忆 (Short-term) │
│ 较大 · 文件级 · memory/YYYY-MM-DD.md │
│ 完整对话归档 · 按日期存储 │
├─────────────────────────────────────────────────────────┤
│ 长期记忆 (Long-term) │
│ 无限 · 文件级 · MEMORY.md │
│ 人工精选 · 关键决策永久保存 │
└─────────────────────────────────────────────────────────┘
各层职责
| 层级 | 存储位置 | 生命周期 | 容量 | 内容类型 |
|---|---|---|---|---|
| 当前上下文 | 模型内存 | 单次会话 | 有限 | 完整对话 |
| 会话历史 | OpenClaw 管理 | 会话期间 | 中等 | 摘要 + 最近消息 |
| 短期记忆 | memory/*.md | 数月 | 较大 | 归档日志 |
| 长期记忆 | MEMORY.md | 永久 | 无限 | 精选要点 |
数据流向
用户输入 ──→ 当前上下文 ──→ 模型处理 ──→ 生成回复
│
↓
[会话历史管理]
│
├── 接近上限?──→ 自动摘要
│ │
│ ↓
│ 保留摘要 + 最近消息
│ │
↓ ↓
[会话结束]
│
↓
写入 memory/YYYY-MM-DD.md
│
↓
Heartbeat/Cron 触发
│
↓
提取关键决策 ──→ MEMORY.md
梦境记忆系统
灵感来源:人类睡眠
| 睡眠阶段 | 大脑活动 | OpenClaw 类比 |
|---|---|---|
| 清醒状态 | 接收信息、处理任务 | 当前上下文处理 |
| 浅睡眠 | 记忆巩固开始 | Heartbeat 检查记忆状态 |
| 慢波睡眠 (SWS) | 陈述性记忆巩固 | 归档到每日文件 |
| REM 睡眠 | 程序性记忆整合 | 提取关键决策到长期记忆 |
| 清醒后 | 记忆持久化 | 读取 MEMORY.md |
时间维度映射
| 人类记忆 | AI 记忆 | 存储位置 | 保留时间 |
|---|---|---|---|
| 工作记忆 | 当前上下文 | 模型内存 | 单次会话 |
| 短期记忆 | 会话历史 | OpenClaw 管理 | 数小时 |
| 情景记忆 | 每日日志 | memory/*.md | 数月 |
| 语义记忆 | 长期记忆 | MEMORY.md | 永久 |
实现机制
1. Heartbeat(心跳)
yaml
触发频率: 每 30 分钟(可配置)
触发方式: OpenClaw 系统轮询
执行内容:
- 检查今日 memory/YYYY-MM-DD.md 是否存在
- 如有新内容,标记待归档
- 深夜时段(23:00-07:00)静默
2. Cron(定时任务)
yaml
触发频率: 每日凌晨 2:00(可配置)
触发方式: 系统定时器
执行内容:
- 读取 memory/YYYY-MM-DD.md
- 提取关键决策、待办事项、学习内容
- 更新 MEMORY.md
- 生成摘要(可选)
3. 文件持久化
workspace/
├── MEMORY.md # 长期记忆(永久)
│ ├── 个人偏好
│ ├── 重要决策
│ └── 项目上下文
│
├── memory/
│ ├── 2026-04-07.md # 今日对话(完整)
│ ├── 2026-04-06.md # 昨日对话
│ └── ...
│
├── HEARTBEAT.md # 心跳配置
│ └── 定义检查任务
│
└── scripts/
└── dream-consolidation.js # 归档脚本
与 RAG 的对比
| 特性 | 「梦境」记忆 | RAG (检索增强生成) |
|---|---|---|
| 触发方式 | 后台自动 | 查询时实时 |
| 存储方式 | 文本文件 | 向量数据库 |
| 检索方式 | 文件读取 | 语义相似度 |
| 整理方式 | 人工+自动 | 自动向量化 |
| 适用场景 | 个人助手 | 大规模知识库 |
| 可编辑性 | ✅ 直接编辑 | ❌ 需要重新索引 |
工程实现细节
核心问题:如何突破上下文限制?
关键洞察:不是一次性读取,而是分阶段处理。
实现流程:
python
# 伪代码示意
def process_long_conversation():
# 阶段 1: 会话进行中
# 实时写入文件(不受上下文限制)
for message in conversation:
append_to_file(f"memory/{today}.md", message)
# 阶段 2: 需要整理时
# 从文件读取完整历史(文件系统无限制)
history = read_file(f"memory/{today}.md")
# 阶段 3: 分段处理(每段在上下文限制内)
chunks = split(history, max_tokens=8000)
summaries = []
for chunk in chunks:
summary = model.summarize(chunk)
summaries.append(summary)
# 阶段 4: 合并摘要
final_summary = model.combine(summaries)
# 阶段 5: 写入长期记忆
append_to_file("MEMORY.md", final_summary)
上下文管理策略
策略 1: 自动摘要
yaml
触发条件: 上下文使用率 > 80%
执行内容:
- 保留系统提示
- 保留最近 10 轮对话
- 摘要更早的对话
- 替换原上下文
策略 2: 工具结果分离
yaml
工具调用结果:
存储位置: 单独的工作目录
上下文处理:
- 仅保留摘要
- 或提取关键信息
- 原始结果从文件读取
策略 3: 关键信息优先
yaml
上下文分配:
系统提示: 5%
关键记忆 (MEMORY.md): 10%
最近对话: 60%
工具摘要: 25%
文件结构详解
MEMORY.md(长期记忆)
markdown
# MEMORY.md - 长期记忆
## 用户偏好
- Name: GaryJie
- Timezone: Asia/Shanghai
- 偏好语言: 中文
- 偏好格式: 表格 + 代码块
## 重要决策
- [2026-04-07] 启用「梦境」记忆系统
- [2026-04-07] 配置 PowerShell UTF-8
## 项目上下文
- OpenClaw 部署在本地 Windows 11
- 使用 ollama/kimi-k2.5:cloud 模型
## 待办事项
- [ ] 启动 Gateway 配置定时任务
memory/2026-04-07.md(每日日志)
markdown
# 2026-04-07 记忆日志
## 今日概览
启用「梦境」记忆巩固系统...
## 重要对话
- 讨论"最大性能"应用场景
- 解释睡眠与记忆巩固的科学原理
## 决策记录
- ✅ 启用 heartbeat 记忆检查机制
- ✅ 创建记忆目录结构和脚本工具
## 学习内容
- OpenClaw 的 cron 和 heartbeat 机制区别
- Gateway 需要配对后才能使用定时任务
## 待办事项
- [ ] 启动 Gateway 配置定时任务
最佳实践
1. 记忆分层原则
| 内容类型 | 存储位置 | 示例 |
|---|---|---|
| 永久知识 | MEMORY.md | 用户偏好、重要决策 |
| 项目上下文 | workspace/*.md | 项目配置、代码结构 |
| 日常对话 | memory/*.md | 完整对话记录 |
| 临时数据 | 工作目录 | 工具结果、中间文件 |
2. 归档时机选择
yaml
Heartbeat 检查:
频率: 每 30 分钟
内容: 标记待归档内容
深夜: 静默(不打扰用户)
Cron 归档:
时间: 凌晨 2:00
原因:
- 用户不活跃
- 系统负载低
- 网络稳定
3. 上下文优化技巧
yaml
减少上下文占用:
- 使用简短的系统提示
- 合并相似问题
- 工具结果后立即摘要
- 删除重复信息
保留关键信息:
- 用户偏好始终保留
- 决策点优先级高
- 待办事项跟踪
4. 调试技巧
bash
# 查看当前上下文使用情况
openclaw status
# 手动触发记忆归档
node scripts/dream-consolidation.js
# 查看记忆文件
cat memory/YYYY-MM-DD.md
cat MEMORY.md
总结
核心问题回答
Q: "上下文有限制,怎么可以全部读取?"
A: 不是一次性读取,而是:
- 会话进行中 → 实时写入文件(文件系统无限制)
- 需要整理时 → 从文件读取完整历史
- 分段处理 → 每段在上下文限制内
- 合并输出 → 最终结果写入长期记忆
架构对比
| 方案 | 上下文限制 | 记忆持久性 | 实现复杂度 |
|---|---|---|---|
| 纯上下文 | 受限 | 会话结束丢失 | 简单 |
| 向量数据库 | 受限 | 持久 | 中等 |
| 文件持久化(OpenClaw) | 突破 | 永久 | 中等 |
| 混合方案(最佳) | 突破 | 永久 | 较高 |
未来展望
当前状态: 文件持久化 + 自动摘要
↓
下一步: 向量数据库 + 语义检索
↓
未来: 多模态记忆 + 情感理解
附录
OpenClaw 记忆配置示例
yaml
# openclaw.yaml
memory:
shortTerm:
path: memory/
retention: 30d
format: markdown
longTerm:
path: MEMORY.md
maxEntries: 1000
heartbeat:
interval: 30m
quietHours: "23:00-07:00"
tasks:
- checkMemoryStatus
- archiveDailyLog
cron:
- name: daily-archive
schedule: "0 2 * * *"
task: consolidateMemory
相关资源
- OpenClaw 文档: https://docs.openclaw.ai
- GitHub: https://github.com/openclaw/openclaw
- 社区: https://discord.com/invite/clawd
本文基于 OpenClaw 实践经验整理
整理时间: 2026-04-07