上下文预算分配深入分析
分析 OpenClaw 的 200k 令牌上下文预算如何在每次 LLM 调用中分配给不同组件。
总预算
预算细分
1. 系统提示(2,000-8,000 令牌)
由 src/agents/system-prompt.ts 的 buildAgentSystemPrompt() 构建:
条件部分(~20 个组件):
- 基本身份和能力
- 工作区感知
- 工具使用指南
- 特定于频道的说明(Telegram、Discord、Slack 等)
- 会话管理说明
- 错误处理协议
- 多轮对话指南
- 所有者显示密钥说明(如果配置)
- 自定义系统提示添加
令牌范围: 2,000-8,000 令牌,取决于活动功能
2. 技能目录(1,500-3,000 令牌)
来自 src/agents/skills/workspace.ts:
计算:
- 最多 150 个技能
- 最多 30,000 字符
- 最坏情况下 ~7-8k 令牌(字符/4 启发式)
- 典型: 1,500-3,000 令牌
3. 工具定义(2,400-3,600 令牌)
来自 Pi Agent SDK 的 24 个核心工具:
- 每个工具定义:~100-150 令牌
- 总计:24 × ~100-150 = 2,400-3,600 令牌
核心工具包括:
- Bash、Read、Write、Edit
- Glob、Grep
- WebFetch
- NotebookEdit
- TodoWrite
- Skill
- 以及 14+ 其他
4. 记忆(RAG)注入(500-2,000 令牌)
来自 src/memory/manager.ts:
每个片段:
- 最多 700 字符
- 每个片段 ~175 令牌(字符/4)
典型注入:
- 3-10 个片段
- 总计:500-2,000 令牌
5. 压缩保留(20,000 令牌)
目的:
- 压缩操作的缓冲
- 确保摘要提示有足够空间
- 包括
SUMMARIZATION_OVERHEAD_TOKENS = 4,096
触发点: 当上下文达到 ~180k(200k - 20k)时开始压缩
6. 会话历史(剩余:~163,000-174,000 令牌)
计算:
典型范围: 163,000-174,000 令牌(总预算的 60-80%)
这是上下文预算的最大消费者。
按用例划分的预算分配
最小会话(空历史)
典型活跃会话
接近压缩会话
压缩触发逻辑
优化策略
1. 减少系统提示大小
- 删除不必要的特定于频道的说明
- 使用条件提示
- 节省: 1,000-2,000 令牌
2. 限制技能目录
- 将
MAX_SKILLS_IN_PROMPT减少到 100 - 按会话过滤无关技能
- 节省: 500-1,000 令牌
3. 延迟加载记忆片段
- 仅在明确需要时注入记忆
- 使用相关性评分
- 节省: 500-1,500 令牌
4. 激进的历史修剪
- 将
maxHistoryShare从 0.5 降低到 0.4 - 更早触发压缩
- 权衡: 上下文保留较少