有一种痛苦,叫做"聊了三个小时之后,Agent突然忘记你是谁了"。这不是Agent变心了——是它的上下文窗口满了。就像人的短期记忆只有7±2个信息块,模型也有它的"记忆上限"。今天我们来看看怎么让Agent在有限的记忆里,记住最重要的事。
一、理解上下文窗口
1.1 什么是上下文窗口
上下文窗口(Context Window)是模型在一次推理中能处理的最大Token数量。它包含了:
- 系统提示(System Prompt):Agent的"人设"和"规则"
- 对话历史(Chat History):你和Agent的对话记录
- 工具结果(Tool Results):工具调用返回的数据
- 最终输出(Output):Agent的回复
1.2 主流模型上下文窗口对比
| 模型 | 上下文窗口 | 适合场景 |
|---|---|---|
| Claude 3.5 Sonnet | 200K | 长文档分析、复杂推理 |
| GPT-4o | 128K | 通用对话、多轮交互 |
| Gemini 2.5 Pro | 1M | 超长文档、代码库分析 |
| DeepSeek V3 | 128K | 中文场景、性价比之选 |
二、Token 消耗分析
2.1 各组件Token占比
一个典型的OpenClaw会话Token分布:
总Token预算: 200,000 (Claude 3.5 Sonnet)
├── 系统提示 (SOUL.md + AGENTS.md + Skills): ~8,000-15,000
├── 系统注入 (TOOLS.md + USER.md + MEMORY): ~5,000-10,000
├── 对话历史: ~50,000-150,000
├── 工具调用结果: ~20,000-80,000
└── 预留输出空间: ~10,000-20,000
2.2 Token消耗优化
优化策略:
- 精简系统提示:去除冗余描述,保留关键指令
- 压缩工具结果:只返回必要信息,截断大块文本
- 控制文件注入:避免注入过大文件到项目上下文
- 定期清理历史:移除过期的对话轮次
三、上下文管理策略
3.1 使用 Isolated Session 隔离上下文
为独立任务创建隔离会话,避免上下文污染:
# 在定时任务中使用隔离会话
cron({
job: {
name: "每日新闻生成",
schedule: { kind: "cron", expr: "0 8 * * *", tz: "Asia/Shanghai" },
payload: {
kind: "agentTurn",
message: "生成今日AI新闻日报"
},
sessionTarget: "isolated" # 每次运行都是全新上下文
}
})
3.2 上下文压缩
通过摘要和关键信息提取来压缩历史:
# 在Skill中实现自动压缩
## Context Compression
当对话历史超过100轮时:
1. 总结前50轮对话的关键决策和结论
2. 保留最近50轮的完整历史
3. 将摘要作为"背景信息"注入
实现方式:
- 使用 web_fetch 抓取当前页面
- 提取关键段落而非全文
- 对工具结果进行预处理和截断
3.3 使用 lightContext 减少上下文
# 轻量上下文模式
cron({
job: {
payload: {
kind: "agentTurn",
message: "简单的定时检查任务",
lightContext: true # 减少上下文注入
}
}
})
四、长对话处理技巧
4.1 分段处理
将复杂任务拆分为多个子会话:
# 使用子Agent分段处理
# 主会话:接收任务、协调子Agent
sessions_spawn({
task: "分析这10篇文章并生成摘要",
runtime: "subagent",
mode: "run",
timeoutSeconds: 120
})
# → 子Agent在自己的上下文中处理
# → 返回精简的结果给主会话
4.2 外部记忆系统
将重要信息存储到外部记忆,而非依赖上下文:
# 使用 tdai_memory_search 检索长期记忆
tdai_memory_search({
query: "用户偏好设置",
limit: 5,
type: "persona"
})
# → 返回相关记忆记录
# → 不占用上下文窗口
4.3 文件系统作为扩展记忆
# 将中间结果写入文件
write({
path: "/tmp/task-progress.md",
content: "## 任务进度\n### 已完成\n- 搜索关键词分析\n- 文章抓取\n### 待完成\n- 内容生成\n- 发布"
})
# 后续读取
read({ path: "/tmp/task-progress.md" })
五、最佳实践清单
- 监控Token使用:定期检查 session_status 中的用量
- 设置合理预算:为不同任务配置不同的Token上限
- 使用隔离会话:独立任务使用 isolated session
- 压缩工具结果:设置 web_fetch 的 maxChars 参数
- 外部存储关键数据:用文件系统和记忆工具替代上下文
- 定期清理:结束不活跃的会话释放资源
- 选择合适模型:简单任务用小模型,复杂任务用大上下文模型
🎯 记住:上下文窗口就像办公桌——桌子再大,也需要定期整理。把不重要的文件归档(外部存储),把重要的放在手边(上下文),工作效率才能最大化。