Codex Context Compaction 真相:Agent 为什么压缩后还能接着干活?
如果你长时间用过代码 Agent,大概率遇到过这种场景:前面半小时还在很认真地查仓库、跑测试、解冲突,下一轮突然像换了个人,只记得“正在处理一个项目”,但忘了分支名、PR 编号、刚才失败的是哪个测试。
这类崩坏通常不发生在第一轮。它发生在上下文被压缩之后。
所以过去很多人的习惯很保守:上下文快满之前,先让 Agent 写一份交接文档;重要任务做到一半,尽量不要自动 compact;能新开会话就新开会话。听起来麻烦,但至少可控。
最近 Codex 的风向不太一样。越来越多用户开始把上下文窗口这件事交给系统自己处理。它自动压缩,继续跑,再压缩,再继续跑。最让人意外的不是它“还能回答”,而是它在复杂任务里还能记住不少低层事实:分支、stash、merge commit、构建结果、用户最后一句确认。
这背后不是某个提示词突然写得更聪明了。更准确地说,Codex 把 compact 从“一段摘要”做成了一次状态迁移。

图:长程 Agent 真正需要保住的是现场碎片,而不只是文章主线。
窗口不见了,不代表窗口不重要
Codex App 曾经把 context window 的使用比例放在主界面上。后来这个指示器被挪到了二级入口,只能通过 /status 或 /compact 之类的命令查看。这个改动让不少重度用户很不爽。
原因很好理解。对短问答来说,上下文窗口只是一个技术参数;对长程 coding 来说,它更像油表。你不一定每秒盯着它,但你需要知道车还能跑多远。
Codex 团队当时给出的方向是 “vibe contexting”:用户不再需要主动管理上下文。
这句话如果放在一年前,很像产品经理的漂亮话。因为压缩一直是 Agent 链路里最脆弱的地方。它不是把文本缩短那么简单,而是在决定哪些事实还能活到下一轮,哪些事实永远丢掉。
Codex 敢把窗口感知降级,真正依赖的是下面几层机制:入口截流、远程压缩、系统脚手架重建,以及服务端和模型的配合。
真正进入 compact 之前,很多内容已经被处理掉了
很多人以为上下文管理就是“满了以后压一下”。Codex 不是这么干的。
在 full compact 之前,它已经先把一批容易撑爆窗口的内容压住了:
| 位置 | Codex 怎么处理 | 这意味着什么 |
|---|---|---|
| 工具输出 | 工具结果进入历史时就做 middle truncation,保留头尾 | 中间细节可能直接消失 |
| 终端输出 | PTY 原始输出只留头尾,总量有限 | 大日志不会完整进上下文 |
| Hook 结果 | 太大的 hook 输出写到临时文件,只给预览和路径 | 模型需要时可以再读,但不会默认吃满窗口 |
| 历史消息 | 清理不成对的 tool call/output、孤儿输出和不支持的图片 | 保证请求结构干净 |
| 系统上下文 | 只追加变化部分,不每轮重复塞满配置 | 降低固定上下文的增长速度 |
这里有个细节挺重要:很多截断发生在内容进入历史的那一刻。也就是说,它们发生在 prompt cache 形成之前。
这不是洁癖,是成本问题。模型服务端的前缀缓存依赖逐 token 一致。如果一条旧工具结果已经进入历史,后面再回头改它,改动点之后的缓存可能全废。对十几万 token 的长程会话来说,一次 cache miss 可能就是一轮账单和延迟的数量级变化。
Codex 的选择比较硬:先在入口控制住体积。代价也很明确,被截掉的内容未必能回来。
Local Compact:一份交接文档能救简单任务,救不了复杂现场
Codex compact 的第一条路叫 Local Compact。它的做法并不神秘:让当前模型给后续模型写一份 handoff summary。
流程大概是这样:

图:Local Compact 以明文摘要替换旧历史
这套方案非常像人类工程师写交接文档。写得好,后面的人能接上;写漏了,后面的人只能猜。
Local Compact 最大的问题就在这里:压缩后的 replacement history 里,很多原始材料不会再出现。assistant 的中间判断、tool call 的原始结果、reasoning、web 结果,大多只能靠 summary 间接留下来。
简单任务还能扛住。比如开一个 GitHub issue、补一条评论、确认几个 label,summary 抓住主线就行。
复杂任务不一样。长程 coding 里真正致命的常常是小事实:
- 当前在哪个分支;
- 哪个 stash 是临时绕过签名用的;
- 哪个测试 315/315 通过;
- 哪个构建失败是 x86_64 slice 缺失;
- 用户最后是否已经验收。
这些东西如果没被 summary 写进去,下一轮模型不会“自然想起来”。它只能重新查,或者老老实实说不知道。
Remote Compact:客户端看不懂,但效果明显不一样
第二条路是 Remote Compact。这里开始变得有意思。
更多推荐


所有评论(0)