跳转至

Codex 上下文工程 — Prompt Layout + Append-only + Latent Space Moat(LastWhisper 解读)

📊 Level ⭐⭐⭐⭐ | 19.7KB

LastWhisper(北大计算机硕士)"Thinking in Context" 系列开篇,对 OpenAI 工程博客《Unrolling the Codex agent loop》的深度解读。聚焦世界级 Coding Agent 中的前沿上下文工程实践,提出两条核心观察:

  1. The Architecture of State — 缓存友好 Prompt Layout + Append-only 状态管理
  2. The Latent Space Moat — 应用层 vs 基础设施层压缩能力的不对称

  3. 原文存档

深度分析

核心观点:确定性是性能的前提

Codex 的 Prompt Layout 设计揭示了一个反直觉但普适的工程真理:在 Prompt Caching 机制下,缓存命中的关键不是内容质量,而是前缀稳定性。变化频率最低的内容(System Message / Tools / Instructions)置顶,变化频率最高的内容(对话历史 / Tool Traces)置底——这个排序不是经验法则,而是由严格前缀匹配机制推导出的必然约束。OpenAI Codex 引入 MCP 时因工具枚举顺序不一致导致 cache miss,代价是完整重计算。这对所有依赖 Prompt Caching 的 Agent 系统都有警示意义:Context Engineering 的核心工程约束是确定性排序。

技术要点:Append-only 是 Event Sourcing 在 Agent 状态管理中的具体实现

"State is a projection of events" 这个命题在 Codex 中不是隐喻,而是工程实现。状态变化时追加新消息(而非原地修改)带来的两大收益:前缀不变 → 缓存命中;因果链保留 → 可推断意图。这与 Claude Code Vs Codex Context Architecture 02 中描述的 Claude Code 激进 Context Editing 路线形成鲜明对比。两种流派并非优劣之分,而是不同工程约束下的取舍:Append-only 更保守、工程友好,适合需要稳定缓存的生产系统;Context Editing 更激进、Token 精简,但前缀破坏带来工程复杂度。

实践价值:压缩能力的不对称是结构性的,应用层应聚焦可控部分

应用层压缩(Semantic Compression)与基础设施层压缩之间存在结构性信息不对称:厂商可访问注意力分布、海量真实对话数据、专用 Fine-tuned 压缩模型,应用层无法复制这一优势。理解这一点后,Anthropic Prompt Caching Claude Code 等应用层实践的价值在于:放弃追求"更好的压缩",转而聚焦缓存友好的 Prompt Layout + 显式的 Compress/Select 策略,这是应用层真正能控制的部分。context-kit 开源工具正是这一哲学的教学实现。

深层博弈:Append-only 需要模型专门适配

LastWhisper 提出的两个方向值得深思:OpenAI 是否专门训练了模型适应 Append-only?相较 Claude Code 的 Context Editing,这种保守路线是否更有工程可维护性?前者指向模型定制成本,后者指向架构选择。如果 Append-only 需要专门模型训练才能避免上下文膨胀带来的性能衰退,那么这意味着状态管理策略不是纯工程问题,还受模型训练目标约束。

技术判断:Latent Compression 更可能是信息增强的 Semantic Compression

尽管"/responses/compact"端点使用"latent understanding"措辞,但向量表征与模型架构深度耦合使得纯 Latent Compression 的工程可行性存疑。更合理的推断是:厂商做的是 Semantic Compression,但拥有关键信息优势(注意力分布、真实数据、专用压缩模型)。这与 Harness Engineering 实践中"在不确定黑盒内部机制时,聚焦可控部分"的原则一致。

实践启示

  1. 将 Prompt 排序视为工程约束而非实现细节:在设计任何 Agent 上下文架构时,先确定变化频率梯度——低变化内容(System Prompt、工具定义)置顶,高变化内容(对话历史)置底。任何动态工具列表(如 MCP notifications/tools/list_changed)的处理都需要特别设计以保护前缀稳定。

  2. 状态变化优先 Append-only 策略:当 Agent 状态变化时(切换目录、审批模式、权限配置),追加新消息而非修改现有消息。这最大化 Prompt Cache 命中,同时保留完整因果链用于意图推断。结合 Agent Harness Context Management Working Set 中的工作集管理实践,Append-only 是生产级 Agent 状态管理的推荐方案。

  3. 在工具枚举顺序上强制规范化:MCP 工具列表、Function Calling 顺序必须硬编码到系统 Prompt 中,禁止动态排序。如果工具列表可能动态变化,必须设计独立的缓存分区策略,避免污染稳定的缓存前缀。

  4. 用 context-kit 建立上下文工程直觉:Compress/Select/Memory 三模块覆盖了应用层上下文管理的核心场景。在生产环境中,这些模块的简化版本(如基于 LLM 的语义压缩 + JIT 文件检索 + 文件系统卸载)可以实现"do the simplest thing that works"。

  5. 警惕压缩能力的结构性不对称:应用层压缩永远受限于信息劣势。不要过度投入"更智能的摘要算法",而是将资源投入到缓存友好的架构设计和规范的 Harness Engineering 实践中——这些是真正可控且可累积的工程优势。

1. Architecture of State

Prompt Layout — 缓存友好排序

Codex 的 Responses API 请求按 input 字段组装,原则:变化频率最低置顶,最高置底:

  1. System Message / Tools / Instructions(稳定)
  2. 对话历史 / Tool Traces(动态)

核心机制:Prompt Caching 要求严格前缀匹配。任何位置变动(哪怕调整两个 Tool Definition 顺序)都使后续所有 Token 缓存失效,触发完整重计算。

工程教训:Codex 早期引入 MCP 时未保证工具枚举顺序一致 → cache miss。notifications/tools/list_changed 中途响应同样破坏前缀。

效果:采样成本从理论二次增长降低为近似线性。

Append-only — 不修改,只追加

当 Agent 状态变化(切换审批模式、切换工作目录),Codex 不修改已发送消息,而是追加新消息:

  • 工作目录变了 → 追加 role=user 消息 + 新 <environment_context>
  • sandbox 配置变了 → 追加 role=developer 消息 + 新 <permissions instructions>

类比:DB migration — 不直接修改生产 Schema,而是追加 Migration 文件。"State is a projection of events"(Event Sourcing pattern)。

收益:

  1. 前缀始终不变 → 最大化 Prompt Cache 命中
  2. 因果链保留 — 切换目录"为了运行测试"是显式事件,可推断意图

代价与取舍:

  • 上下文膨胀 → 冲突/噪声影响性能
  • 保留因果链 vs 控制信噪比之间的张力
  • LastWhisper 两个推测方向:(a) OpenAI 专门训练让模型适应 Append-only;(b) Append-only 是更传统保守模式,相较 Claude Code 激进的 Context Editing 更工程友好

两种流派对比:

流派 代表 核心动作 收益 代价
Append-only OpenAI Codex 状态变化时追加 前缀稳定,缓存命中 上下文膨胀
Context Editing Anthropic Claude Code 原地修改/剪枝 Token 精简 前缀破坏,工程复杂

2. Latent Space Moat — 压缩能力的不对称

两种 encrypted_content

Codex 实际使用了 encrypted_content 字段,但承担两种不同用途:

用途 字段 含义 触发
推理链保护 type: "reasoning" 加密 o1/R1 思考过程 API 协议要求
上下文压缩 type: "compaction" 厂商压缩策略载体 上下文达阈值调用 /responses/compact

第一种不是压缩机制 — 是隐私保护载体,客户端只看到 summary,加密推理链原样回传供服务端恢复状态。

第二种才是真正压缩。原文:"preserves the model's latent understanding of the original conversation"。

Semantic vs. Latent Compression

应用层 — Semantic Compression:

  • 应用开发者能实现的压缩 = 语义重构(LLM 摘要)
  • 始终是原始信息的有损投影
  • 推理微观逻辑、注意力分布模式在文本摘要中不可避免丢弃
  • 通用模型预训练目标并非上下文压缩
  • Cognition AI(Devin)会 Fine-tune 专用压缩模型,但仍操作文本表征

基础设施层 — Latent Compression(推测):

/responses/compact 端点未公开。一个自然推测:厂商在模型隐空间对高维向量做压缩:

  • 文本是模型内部状态的低维投影
  • 隐空间含更丰富信息结构
  • 高维空间有损压缩上限更高

但有重要工程问题:

  • 向量表征与模型架构深度耦合
  • 隐空间维度/结构/语义取决于具体模型版本
  • 模型升级 → 向量表征失效 → 需重新适配

更可能的实现 — 有信息优势的 Semantic Compression:

/responses/compact 本质上仍是 Semantic Compression,但厂商有应用开发者不具备的信息优势:

  1. 模型内部状态访问 — 注意力分布、token 关注度用于指导压缩决策
  2. 海量真实用户数据 — 优化压缩策略
  3. 专用 Fine-tuned 压缩模型 — 训练数据规模和多样性远超应用层

3. context-kit 教学工具

LastWhisper 开源了 context-kit(教学原型),覆盖三大模块:

模块 实现
Compress compress_by_rule(对齐 Claude Context Editing API 结构化剪枝)+ compress_by_model(LLM 语义压缩)
Select JIT Context 渐进式检索(list_dir → grep → read_file)
Memory 上下文卸载到文件系统(Write 策略持久化)

哲学:Do the simplest thing that works!

关键 takeaway

  1. 确定性是性能的前提 — 缓存友好 = 前缀稳定 = 工程约束
  2. Append-only vs Context Editing — 两种流派长期共存(Codex 偏前者,Claude Code 偏后者)
  3. 能力不对称是结构性的 — 应用层做 Semantic Compression,基础设施层有信息优势的 Semantic Compression
  4. Codex 实测效果 — 采样成本从二次增长降低为近似线性
  5. State is a projection of events — Event Sourcing pattern 在 Agent 状态管理中的应用

与既有相关实体的关系

实体 关系 区分
entities/claude-code-vs-codex-context-architecture-02 Codex context 架构对比 5 层压缩管道 vs 容器文件系统;本篇聚焦 Codex 单边 + Append-only 核心 + Latent Moat
entities/claude-code-context-engineering-anthropic-thariq Claude 上下文工程 Anthropic 视角;本篇 OpenAI Codex 视角
entities/context-engineering-three-memory-paradigms 3 种 Memory 方案 评测对比;本篇工程实践 + 流派对比
entities/llm-observability-4-layer-model 4 层可观测性 偏运维;本篇偏架构

相关链接

相关实体

2026-09-05 SUPP:Codex 上下文管理切窗机制(若飞源码/PR 级拆解)

本文档早期版本聚焦 LastWhisper 对 OpenAI《Unrolling the Codex agent loop》的解读(Prompt Layout / Append-only / Latent Space Moat)。2026-09-05 若飞《Codex 的「记忆」大改?上下文管理架构拆解》补充了 Codex CLI 0.153.0 实验性 context management 的切窗协议与状态分离维度——四类状态分离框架、new_context/notes/history 工具协议、状态所有权表,扩展了本实体从「压缩/缓存」到「切换窗口 + 交接」的完整上下文管理图景。

四类状态分离:把「记忆」拆成不同生命周期

Codex 实验性 context management 将常被统称为「记忆」的内容拆成四类状态,每类的写入者、保存时长、覆盖规则与冲突裁决权都不同:

状态 载体 作用 生命周期
当前工作集 context window 眼前推理材料(系统指令/用户要求/最近对话/工具结果) 当前窗口,token 预算管理
交接状态 notes 跨窗口接手所需信息(目标/关键决策/当前进展/下一步),带 window ID + item ID 指向原始记录 跨窗口,模型筛选整理(检查点而非前情提要)
会话历史 history 旧窗口原始条目,可列出/读取/字面子串搜索 持久,搜索非语义检索(区分大小写)
外部权威事实 代码/Git/CI/工单 任务真实状态,不受切窗影响 独立于模型上下文

核心判断:这组实现没有为 Agent 凭空增加「永久记忆」,而是把不同可信度与生命周期的状态分开放置。模型上下文丢失可从 notes/history 重建;但外部副作用(已发请求/已提交事务)不能靠笔记猜测——结果未知时先查权威系统,再依据幂等键决定重试。

切窗协议:模型主动收尾 + Harness 硬边界兜底

切窗由模型与 Harness 共同完成,关键 PR:token budget context feature(#27438)、new context window tool(#27488)、fallback phase before automatic context rollover(#33255)、history and notes tools(#39827)、inject history notes hints(#40539)、experimental context management activation(#42385)。

两层的分工:模型判断「这一阶段是否做完」「哪些决策值得交接」(可主动调用 new_context);运行时盯住 token 余量——余量跨阈值提醒一次、基础预算耗尽注入兜底提示并留出缓冲让模型写 notes,缓冲耗尽才自动切换。thread_hint 注入上限 4000 字节、单项注入上限 1 万 token——系统不追求把旧内容重新塞满窗口,而是「短交接 + 原始历史按需读取」在预算内恢复。

与 compaction 的关系:不同成本的读取层级

摘要适合快速恢复全局,notes 适合保存明确交接状态,history 适合核对关键细节——compaction 与硬切窗口不是互斥路线,而是同一条运行链路上不同成本的读取层级。Codex 当前实验采用「短交接 + 原始历史」组合,官方产品仍保留 compaction(0.150.1 还有 remote compaction 修复),与本文档早前记录的 encrypted_content compaction 载体并存。Hermes 也在加入 compaction recall(回看压缩前内容),两个项目给压缩/交接后的内容都留了回查原始记录的入口。