模型: gpt-5.4 (openai/gpt-5.4) 生成日期: 2026-04-01 书名: Claude Code VS OpenCode:架构、设计与未来 章节: 第5章 — 会话与上下文管理 Token消耗: 约 19,000 input + 4,200 output(估算)
5.3 上下文压缩
上下文压缩解决的是一个越来越现实的问题:会话越长,模型越贵、越慢、越容易失真。这里可以引入一个非标准但很形象的术语——上下文腐烂。它不是教材里的正式概念,而是工程界对“上下文一长,旧信息变噪声,新信息被淹没,模型开始忘重点、重复搜索、误判状态”的统称。其底层原因之一,正是 Transformer 注意力计算随序列增长而急剧变贵,常被粗略概括为 O(n²) 级别压力。
OpenCode 的策略比较直接:当上下文接近上限时,触发 session/compaction.ts,调用专门的 compaction agent 生成继续工作所需的摘要;同时还能 prune 旧工具输出,把早期但价值较低的长结果标记为已 compacted。也就是说,OpenCode 的压缩不是简单截断,而是“摘要 + 清理旧结果”的双动作。它试图保留任务连续性,同时把无关的工具噪声扔掉。
Claude Code 的上下文管理更像一套五层防线。第一层是阈值预警,autoCompact.ts 会根据模型窗口和 buffer 计算 warning / blocking 状态;第二层是 microCompact,优先清掉可再生的旧工具结果,用 [Old tool result content cleared] 这类桩文本换回 token;第三层是 sessionMemoryCompact,优先利用已提炼的会话记忆来构造更轻的后压缩上下文;第四层是完整 compaction,生成 summary 并写入 compact_boundary;第五层是 reactiveCompact 一类兜底机制,在 prompt-too-long 已经发生时再做补救。所谓“五层防御”,本质上就是从“轻量去噪”到“重度重写”的分级治理。
这种设计非常像缓存体系:能局部替换就不整页重写,能复用旧摘要就不重新总结,实在不行再做整段压缩。它的优势是用户感知更平滑,不必每次都经历一次重型总结;缺点则是系统实现明显更复杂,边界条件很多,例如 resume 后 boundary 如何重建、哪些内容该保留以维持 prompt cache、哪些 tool/result 不能拆开等。
OMO 在 OpenCode 基础上又往前推了一步:它不仅会压缩,还会抢先式压缩。src/hooks/preemptive-compaction.ts 显示,系统在工具执行后根据 token cache 判断使用率,Anthropic 1M 上下文下默认在 78% 左右就先触发 summarize,而不是等真正撞线。这个思路很重要:优秀 Agent 不该等错误发生后再解释,而应在错误还没发生时就重排上下文。
更关键的是,OMO 发现压缩最容易伤到的不是“聊天内容”,而是“工作协议”。因此它专门加了 compaction-todo-preserver:压缩前抓取 todo 快照,session.compacted 后再检查并恢复。其意义在于,很多系统压缩后还能记得任务目标,却忘了任务清单;还能记得讨论主题,却丢了执行状态。OMO 要保护的正是这条最脆弱的工作链。
graph TD
subgraph "Claude Code:五层防线"
CC1["自动压缩<br/>Token 阈值触发"] --> CC2["片段压缩<br/>裁剪历史片段"]
CC2 --> CC3["微压缩<br/>增量清理"]
CC3 --> CC4["会话记忆<br/>压缩记忆文件"]
CC4 --> CC5["上下文塌缩<br/>旧消息 → 摘要"]
end
subgraph "OMO:抢先式 + 保护式"
OMO1["抢先式压缩<br/>在溢出前触发"] --> OMO2["上下文注入器<br/>保留关键上下文"]
OMO2 --> OMO3["Todo 保护器<br/>压缩时保护任务清单"]
end
subgraph "OpenCode:摘要并重置"
OC1["检测阈值"] --> OC2["生成摘要"]
OC2 --> OC3["携带摘要重置上下文"]
end
因此,上下文压缩的最佳实践并不是“把旧内容变短”这么简单,而是三件事同时成立:先去噪、再总结、最后保护任务状态。如果只能总结而不能保护工作进度,压缩就会把智能体从“持续施工”打回“重新开工”。这正是会话系统与任务系统的根本差别。