压缩内部机制深入分析
深入分析 OpenClaw 的会话历史压缩系统(src/agents/compaction.ts,406 行)。
核心常量
关键函数
computeAdaptiveChunkRatio()
根据平均消息大小动态调整块比率:
行为:
- 默认:每个块占上下文的 40%
- 大消息(> 上下文的 10%):比率降低至 15%
- 防止超大块导致溢出
chunkMessagesByMaxTokens()
将消息分割成尊重令牌限制的块:
关键特性:
- 应用
SAFETY_MARGIN补偿令牌估计不准确性 - 立即分割超大单条消息
- 保证没有块超过有效最大值
splitMessagesByTokenShare()
将消息分配到 N 个块,目标是相等的令牌份额:
策略:
- 目标是跨块的相等令牌分配
- 最后一个块吸收剩余消息
- 由
summarizeInStages()用于并行摘要
summarizeInStages()
带多阶段合并的渐进式摘要:
决策逻辑:
pruneHistoryForContextShare()
基于预算的修剪,带 tool_use/tool_result 配对修复:
关键特性:
- 分配预算:
maxHistoryShare * maxContextTokens(默认 50%) - 首先丢弃最旧的块
- 每次丢弃后调用
repairToolUseResultPairing()处理孤立的 tool_results - 在满足预算或没有更多块可丢弃时停止
优化见解
针对不同用例调整块比率
大上下文模型(例如 Claude Opus 4.6 200k):
- 使用更高的
BASE_CHUNK_RATIO(0.5-0.6) - 更少的摘要轮次
- 更好地保留细微差别
较小上下文模型(例如 32k):
- 保持
BASE_CHUNK_RATIO在 0.4 或更低 - 更激进的自适应降低
- 优先考虑在约束内适配
令牌密集型领域(代码、日志):
- 更低的
BASE_CHUNK_RATIO(0.3) - 提高
MIN_CHUNK_RATIO下限(0.2) - 补偿更高的令牌密度
安全边际的理由
SAFETY_MARGIN = 1.2(20% 缓冲)补偿:
- 字符/4 启发式遗漏多字节字符
- 特殊令牌(BOS、EOS 等)
- 代码令牌(高于平均密度)
- 格式化令牌(markdown、XML 标签)