深入解析 OpenClaw 的 compaction 配置优化过程,从 safeguard 模式迁移到 lossless-claw (LCM),解决双重压缩触发问题,给出最佳实践配置方案。
背景
在使用 OpenClaw 构建 AI Agent 系统时,上下文管理是核心挑战之一。随着对话历史增长,Token 消耗会迅速逼近模型上下文窗口上限。OpenClaw 提供了 compaction(上下文压缩)机制来自动处理这个问题,但默认配置并不总是适合所有场景。
本文记录了从 safeguard 模式迁移到 lossless-claw (LCM) 的完整过程,以及在此过程中遇到的问题和解决方案。
问题现象
当系统提示词(system prompt)非常大时——包含工作区文件(AGENTS.md、SOUL.md、TOOLS.md 等)、大量工具定义、飞书多账号配置,总计约 30-50k tokens——默认的 compaction 配置会过早触发压缩。
关键配置参数:
{
"compaction": {
"mode": "safeguard",
"reserveTokens": 120000,
"maxHistoryShare": 0.85,
"recentTurnsPreserve": 5
}
}
maxHistoryShare: 0.85 意味着对话历史达到上下文窗口 85% 时就触发压缩。对于大 system prompt 的场景,可用历史空间被严重压缩。
根因分析
问题的根本原因是双重压缩冲突:
- OpenClaw 内置 compaction:基于 token 阈值自动触发
- lossless-claw (LCM):第三方压缩插件,基于 DAG 树状结构
当两者同时工作时,LCM 压缩后的历史可能又被内置 compaction 二次压缩,导致上下文丢失。
解决方案
方案:统一到 LCM
禁用内置 compaction,只保留 LCM:
{
"compaction": {
"mode": "default",
"reserveTokens": 999999,
"maxHistoryShare": 0.85,
"recentTurnsPreserve": 0
}
}
关键参数说明:
| 参数 | 作用 | 推荐值 |
|---|---|---|
mode |
压缩模式 | default(非 safeguard) |
reserveTokens |
预留给 system prompt 的 token 数 | 999999(实际上永不触发) |
maxHistoryShare |
历史占上下文比例上限 | 0.85 |
recentTurnsPreserve |
保留最近 N 轮不压缩 | 0(交给 LCM 处理) |
LCM 的优势
LCM (lossless-claw) 的压缩策略更智能:
- DAG 树状结构:将对话历史组织为有向无环图,保留关键节点
- 按需展开:通过
lcm_expand指令可以恢复被压缩的上下文 - 无损压缩:不丢失信息,只是改变存储密度
效果对比
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 有效上下文利用率 | ~50% | ~85% |
| 压缩信息丢失 | 偶尔丢失 | 无损 |
| 压缩触发频率 | 频繁(双重触发) | 仅 LCM 按需 |
| 298 条长会话稳定性 | 经常断档 | 稳定运行 |
最佳实践
- 大 system prompt 场景:设置
reserveTokens: 999999,让内置 compaction 实际上不触发 - 启用 LCM:作为唯一的压缩系统
- 监控 Token 使用:定期检查 session_status 了解消耗情况
- 定期清理历史:对于超长会话,适时使用 /new 开启新会话
总结
OpenClaw 的 compaction 系统设计灵活,但需要根据实际使用场景调整配置。对于多 Agent 协作、大 system prompt 的复杂场景,推荐使用 LCM 作为唯一压缩方案,避免双重压缩带来的上下文丢失问题。
作者:Jacky | 分类:DevOps & Tools | 标签:OpenClaw, AI Agent, 上下文管理
Full-Stack Developer with 10+ years of experience, specializing in QT C++ desktop application development and AI Agent systems.





