Claude Code vs Codex 上下文架构:五层压缩管道 vs 容器文件系统¶
Ch01.286 Claude Code vs Codex 上下文架构:五层压缩管道 vs 容器文件系统¶
📊 Level ⭐⭐ | 12.9KB |
entities/claude-code-vs-codex-context-architecture-02.md
核心命题¶
Claude Code 与 Codex 在"如何让模型看到需要的信息"上给出了方向完全相反的答案:
- Claude Code:精密的五层压缩管道,把有限上下文窗口用到极致
- Codex:容器文件系统绕开上下文限制,按需读取,理论上无上限
Claude Code:上下文窗口是一切的边界¶
Claude 4.6 系列上下文窗口 100 万 token,但在实际软件工程任务(反复读取大文件、运行命令、解析输出)里比预想更快填满。
CLAUDE.md 四层结构¶
上下文注入入口,按优先级从低到高:
| 层级 | 范围 | Token占用 | 典型内容 |
|---|---|---|---|
| L1 全局 | ~/.claude/CLAUDE.md | 全部注入 | 个人代码风格偏好、常用命令别名 |
| L2 用户 | ~/.claude/ 里的 @import | 全部注入 | 通过 @import 引入其他文件 |
| L3 项目 | ./CLAUDE.md(git 追踪) | 全部注入 | 架构约定、构建命令、测试流程 |
| L4 本地 | ./CLAUDE.local.md(gitignore) | 全部注入 | 本地路径、临时调试开关 |
四层都在 context assembly 时硬注入——无论 token 多少,总是出现在上下文里。
Auto Memory:LLM 驱动的记忆选取¶
不用向量相似度检索,而是用专门 LLM 调用做记忆选取:
MEMORY.md(索引/摘要)先注入上下文- 需要时 LLM 扫描 frontmatter 的
description字段,选出最相关的至多 5 个记忆文件 - 代价:牺牲向量检索效率
- 收益:人类可读、可版本控制的记忆系统(普通 Markdown)
Claude Code 五层压缩管道¶
按代价从低到高依次触发,每层只在更轻的层不足以解决问题时才启用:
第一层:Budget Reduction(预算削减)¶
- 触发:任何包含大型工具输出的 turn
- 机制:每个工具有
maxOutputTokens预算。bash默认约 50K token。超限时在写入对话历史前截断,追加[output truncated: N bytes total, showing last M bytes] - 特点:最轻量层,数据进入上下文前就介入,不修改已有历史
第二层:Snip(片段截断)¶
- 触发:context 超过阈值(依模型窗口而定)
- 机制:从最早非系统消息开始,识别并截断大型
tool_result消息块。只截断工具输出,不截断用户消息和 assistant 文本。插入[content snipped to save context]占位符 - 特点:纯文本操作,不调用模型,延迟极低
第三层:Microcompact(微压缩)¶
- 触发:Snip 之后 context 仍接近上限
- 机制:专门压缩模型调用,把连续工具调用/结果序列压缩成短摘要
- 例子:
read file A → content、read file B → content→ "读取了 A、B 两个配置文件,关键信息:[摘要]" - 特点:需要额外 LLM 调用,有延迟和成本,但保留语义信息而非直接截断
第四层:Context Collapse(上下文折叠)¶
- 触发:context 持续接近上限,Microcompact 已多次触发
- 机制:读时投影设计——不修改 REPL 数组(对话历史的内存表示),而是:
- 在 collapse store 存储一条摘要消息(对之前全量历史的语义压缩)
- context assembly 时用"摘要 + 最近 N 轮历史"替代完整历史
-
完整历史仍保存在磁盘(JSONL 文件),不丢失
-
特点:读时投影设计保证完整审计记录同时控制当前上下文大小
第五层:Auto-compact(自动压实)¶
- 触发:context 使用量超过约 95%(接近上下文窗口上限)
- 机制:一次性全量重压——用压缩 prompt 把整个对话历史重写成结构化工作状态摘要,替换历史,重置对话
- 效果:从模型视角看像开始新对话,但工作状态(已完成的工作、当前进度、关键发现)通过摘要保留
- 特点:代价最高层——额外 LLM 调用、明显延迟、信息损耗(压缩总有损)
Codex Cloud Agent:文件系统即上下文¶
根本不同:不是管理上下文里有什么,而是按需从文件系统取。
仓库快照注入¶
任务启动时把整个 GitHub 仓库克隆进容器。之后模型通过 shell 命令按需访问任何文件——没有"把所有相关文件塞进上下文"步骤。
实际约束¶
- Codex 不受"一次性必须塞进上下文"约束,理论上可处理任意大代码库
- 但模型必须能正确判断需要读哪些文件
- 依赖搜索(grep、find)和模式识别定位相关代码
- 风险:代码库组织不规范或问题需要跨很多文件时,可能遗漏关键上下文
没有 CLAUDE.md 等效物¶
项目上下文通过以下方式传递:
- 任务描述本身(提交任务时显式说明约束)
- README 和文档文件(模型主动读取)
- 代码本身(从已有代码模式里推断风格约定)
偏向"从代码里读取约定"而非"从配置文件里读取约定"。
两种策略关键差异¶
| 维度 | Claude Code | Codex | ||
|---|---|---|---|---|
| 核心策略 | 主动注入 + 压缩管理 | 按需读取 + 自主判断 | ||
| 上下文控制 | 精确控制(代价:压缩有损) | 无上限(代价:可能遗漏关键文件) | ||
| 完整性 | 高——只要压缩算法够好,模型看到的是完整有组织的 | 中——依赖模型判断文件优先级 | ||
| 延迟 | 压缩有额外延迟 | 每次 shell 读取都是工具调用,有延迟 | ||
| 适用场景 | 同步交互(用户可能在任何时候问"你刚才为什么这么做") | 异步执行(中间过程不需要对用户可解释) |
执行模型差异根源¶
Claude Code 的同步交互需要每轮对话都有完整上下文(用户可能随时追问),而 Codex 的异步执行只需要完成任务,中间过程不需要对用户可解释。
深度分析¶
五层管道的协同逻辑¶
五层压缩管道不是独立运作的,而是按代价梯度排列的防御体系:
| 层级 | 触发阶段 | 干预方式 | 调用模型 | 代价 |
|---|---|---|---|---|
| Budget Reduction | 数据入口前 | 截断工具输出 | ✗ | 极低 |
| Snip | context 超阈值 | 文本截断+占位符 | ✗ | 极低 |
| Microcompact | Snip 不够 | LLM 摘要连续工具调用 | ✓ | 中等 |
| Context Collapse | 持续压力 | 写时投影+读时替换 | ✗ | 低(I/O) |
| Auto-compact | 约 95% 上限 | 全量重压缩 | ✓ | 极高 |
Budget Reduction 和 Snip 是纯机械操作(不调模型),构成了 90%+ 场景的第一道防线。只有当这两层无法解决问题时,才动用 Microcompact 的 LLM 调用能力。
"读时投影"的设计哲学¶
Context Collapse 的读时投影(read-time projection)是整个管道里最值得细究的设计:
传统方案:把历史改写成摘要 → 保存摘要 → 丢弃原始数据 → 上下文变小 Claude Code:保存原始数据 → 生成摘要 → 读时用"摘要+最近轮次"替代 → 原始数据仍在磁盘
这意味着上下文可见性和历史完整性被解耦了。Auto-compact 是这个设计哲学的极端版本——它在触发时确实会丢弃原始历史,但它产生的是结构化工作状态摘要而非简单截断,而且通过压缩 prompt 的精心设计尽量保留"已完成的工作、当前进度、关键发现"这三个维度。
Codex "文件系统即上下文"的隐含成本¶
Codex 的方案看起来优雅,但有两个隐藏成本:
-
每次读取都是工具调用:模型发出 shell 命令读文件 → 等待执行 → 解析输出。这比直接塞进上下文多了网络往返和进程创建的 overhead。在高并发场景下这是实质延迟。
-
模型判断失误的风险:当代码库有 100 万行,模型不可能遍历所有文件。它依赖 grep/find 做模式匹配。但当问题的上下文分散在多个看似无关的文件里时(大型重构场景),模型可能遗漏关键文件而不自知。Claude Code 的压缩管道至少保证了模型"看到"的信息是完整且有组织的。
两种架构背后的认知假设¶
这两套架构代表了两种截然不同的认知假设:
- Claude Code 假设:模型需要尽可能完整的上下文才能做出高质量决策;遗漏任何关键信息都可能导致错误的方向
- Codex 假设:模型需要的是正确的上下文,而非更多的上下文;按需读取降低了总上下文量,反而可能提升决策质量
这两个假设在不同的任务类型下各有胜负。
实践启示¶
选型建议¶
- 同步协作场景(Code Review、调试、带用户旁观的修改):选 Claude Code 的压缩管道——用户随时可能追问,模型必须有完整上下文
- 异步批处理场景(大型重构、跨仓库迁移、夜间巡检):Codex 的按需读取更合适——中间过程不需要对用户可解释,上下文上限更有价值
Claude Code 用户:理解 Auto Memory 的取舍¶
Auto Memory 不用向量检索而用 LLM 驱动选取——这意味着你可以直接编辑 MEMORY.md 来管理记忆。当你发现某个重要项目上下文没有被正确回忆起时,可以手动在 frontmatter 的 description 字段补充关键词,让 LLM 的相似度判断更准确。这是少见的"人类直接介入 agent 记忆系统"的设计,值得利用。
Claude Code 用户:监控压缩层级¶
当你在长会话里观察到 ⚠️ context rebuilding 或类似信号,说明 Auto-compact 已触发——这是高代价操作。可以通过提前清理 memory/ 目录或主动折叠会话(开启新会话并通过 MEMORY.md 传递上下文)来避免被动触发 Auto-compact。
Codex 用户:维护项目文档¶
由于没有 CLAUDE.md 等效机制,Codex 高度依赖模型主动读取 README 和代码来推断项目约定。这意味着高质量的 README 和代码注释的密度直接影响了 Codex 的执行质量。在大型代码库中维护一份结构清晰的 ARCHITECTURE.md(说明关键文件位置和模块边界)是提高 Codex 准确率的最有效手段。
相关主题¶
- Claude Code 架构 — Claude Code 完整架构分析
- context window management comparison — 多框架上下文管理对比(Aparna Dhinakura)
- Claude Code Harness Deep Dive — Founder Park 深度分析(含 Auto-compaction)