ARTICLE · 988971
OpenAI Codex 源码研究(六):上下文管理——多条压缩路径与两种触发阶段
长会话会持续消耗上下文窗口。直接截断可能丢失关键条件,简单总结又可能抹平细节。Codex 因此把压缩拆成一组模块,而不是塞进一个“总结函数”。
四条主要压缩路径
这里的“inline”指压缩流程由当前 Codex 进程编排,不表示模型在本机运行。具体使用哪条路径,会受到模型能力、远端服务和会话状态影响。
compact_token_budget 负责预算相关计算,compact_model_fallback 提供模型降级路径。模块拆分反映了一个重要事实:上下文压缩同时涉及预算、模型选择、远端能力和失败恢复。
两种触发阶段
回合前压缩
run_turn 在记录新用户消息和上下文更新之前调用 run_pre_sampling_compact。该函数会先处理 previous-model 压缩,再检查上下文预算;达到阈值时以 CompactionPhase::PreTurn 运行压缩。
源码中的 TODO 指出当前局限:检查时还没有把即将注入的上下文变化和用户输入计入预算。更理想的实现,应在这些待进入内容可能越过阈值时提前压缩。
回合中压缩
当连续采样在同一 Turn 内触及上下文限制时,主循环还会以 CompactionPhase::MidTurn 运行自动压缩,然后继续处理回合。
因此,准确表述不是“只在回合边界压缩”,而是:Codex 区分回合前与回合中两个压缩阶段。
压缩依赖稳定的模型视图
首次采样前,Session 会捕获 StepContext,并保留该 Turn 及其内联压缩使用的模型可见状态。环境选择与回合环境快照则提供目录等运行上下文。
这样做的价值是减少同一回合中“压缩看到的历史”和“采样看到的历史”不一致。它不能自动解决所有并发问题,但为可重现性提供了清晰边界。
对自建团队的启示
- 单独建模预算:阈值、待注入内容和可用窗口应明确计算;
- 区分触发阶段:回合前预防与回合中恢复解决的是不同问题;
- 为压缩准备降级路径:压缩失败后继续无限膨胀会放大故障;
- 固定模型可见状态:同一操作链应尽量基于一致的上下文视图。
本文基于 OpenAI Codex commit
343074d的静态源码分析。文中的架构判断不等同于对安全性、性能或生产成熟度的背书。