03 · Codex 看到的上下文从哪里来
你直接把这句话扔给 Codex 会怎样?看下面四阶段,Codex 给的答案完全不一样:
⏱️ 预计阅读 13 分钟 | 🎯 目标:把 Codex 的判断从「凭直觉」换成「凭证据」
上一篇讲 Codex 任务管线 7 步。第 3 步「收集上下文」是一切的地基。 这一篇要回答:上下文具体由哪些东西组成?为什么"上下文质量 = Codex 输出质量"?怎么用
AGENTS.md(项目规则文件)让上下文长期稳定?
🎬 同一个 bug,给不同上下文会怎样
你遇到一个问题:
点击保存按钮后没反应。你直接把这句话扔给 Codex 会怎样?看下面四阶段,Codex 给的答案完全不一样:
| 阶段 | 你给的上下文 | Codex 的回应 |
|---|---|---|
| ① 只给现象 | "点击保存按钮没反应" | 瞎猜:可能是事件未绑定 / 表单校验失败 / API 报错 / 状态未更新 / 样式遮挡……5 个方向都有可能 |
| ② 加页面路径 | + "发生在 /settings/profile" | 定位到具体文件,能开始读相关组件 |
| ③ 加控制台报错 | + "Cannot read properties of undefined (reading 'email')" | 方向变了:不是按钮事件,是数据结构缺字段 |
| ④ 加最近改动 | + "昨天把 user profile API 从 /api/user 切到 /api/profile" | 建立强假设:新 API 返回结构变了,前端仍按旧结构读取 → 直接命中根因 |
🤔 不是 Codex 突然变聪明,是你给了它能推理的证据。
✋ Codex 输出质量 ≈ 上下文质量。这是这一篇的核心。
🧱 上下文不是一团信息,是 5 层栈
很多新手把上下文理解成"我在聊天框里写过的话"。这远远不够。Codex 的真实上下文有 5 层,每层来源不同,作用也不同:
stateDiagram-v2
direction TB
[*] --> Task
Task: 1️⃣ 任务上下文<br/>(本次要做什么)
Project: 2️⃣ 项目上下文<br/>(项目怎么组织)
Local: 3️⃣ 局部代码上下文<br/>(任务相关的文件)
Rule: 4️⃣ 规则上下文<br/>(AGENTS.md / 团队规范)
Feedback: 5️⃣ 反馈上下文<br/>(测试 / 报错 / 审查)
Task --> Project: 决定方向
Project --> Local: 决定工作方式
Local --> Rule: 决定具体怎么改
Rule --> Feedback: 决定不能做什么
Feedback --> Task: 决定下一步调整
note right of Task: 来自你的提示词
note right of Project: 来自 README / package.json / 目录
note right of Local: 来自 Codex 主动读文件
note right of Rule: 来自 AGENTS.md 等规则文件
note right of Feedback: 来自命令运行结果
| 层 | 是什么 | 来源 | 缺它会怎样 |
|---|---|---|---|
| 1️⃣ 任务(task) | 本次要解决的具体问题 | 你的提示词 | Codex 不知道要干什么 |
| 2️⃣ 项目(project) | 项目技术栈、目录结构、运行方式 | README.md / package.json / 目录 | 凭空想象项目结构 |
| 3️⃣ 局部代码(local code) | 本次任务直接相关的源文件 | Codex 主动读 / 你贴的代码 | 改错文件 |
| 4️⃣ 规则(rule) | 项目长期约定 | AGENTS.md / 团队规范 | 重复犯同类错(如包管理器用错) |
| 5️⃣ 反馈(feedback) | 执行后产生的新证据 | 测试输出 / 构建报错 / 你的审查 | 改完一次就停,不能修正 |
💡 5 层合起来才是 Codex 真正的"工作现场"。少哪一层,Codex 就在哪一层"靠猜"。
后面 §🎯 给上下文的 4 步法、§📜 AGENTS.md 章节会逐层落地。
🤔 为什么 Codex 经常"乱改"?
新手抱怨最多的是「Codex 乱改」。但拆开看,"乱改"几乎都是上下文缺失的症状:
flowchart LR
A1[范围缺失] -->|"优化登录体验"| B1[改 UI / API / 路由 / 状态<br/>全部都改]
A2[禁止事项缺失] -->|"没说不能装新依赖"| B2[安装第三方表单库]
A3[验收标准缺失] -->|"没说怎么算完成"| B3[跑个不相关测试就交差]
A4[项目规则缺失] -->|"没说项目用 pnpm"| B4[执行 npm install<br/>污染 lock 文件]
style A1 fill:#fee2e2,stroke:#ef4444
style A2 fill:#fee2e2,stroke:#ef4444
style A3 fill:#fee2e2,stroke:#ef4444
style A4 fill:#fee2e2,stroke:#ef4444
| 表象 | 真实原因 | 解法 |
|---|---|---|
| 改了一堆文件 | 没限定范围 | 提示词写"只改 X 目录" |
| 装了新依赖 | 没限定禁止事项 | 提示词写"不新增依赖" |
| 跑错测试就报完成 | 没验收标准 | 提示词写真实验证命令 |
| 用了错的命令 | 没项目规则 | 写进 AGENTS.md,一劳永逸 |
🎯 解决"乱改"不是骂它"别乱改",而是把缺失的上下文补回去。
📐 上下文质量的 3 个维度:怎么算"好上下文"?
不是堆得越多越好。好上下文同时满足 3 个维度。先看「真实性 × 相关性」的 2×2 矩阵:
| 🎯 高相关 | 🌫️ 不相关 | |
|---|---|---|
| ✅ 高真实 | ⭐ 高质量上下文 · 项目目录树 · 完整报错信息 · AGENTS.md 规则· 当前任务相关源文件 | 真实但跑题 · 修登录 bug 时读到的支付模块代码 · 与任务无关的旧测试 👉 浪费上下文窗口 |
| ⚠️ 不真实 | 🚨 高危误导 · 凭印象的口头描述("应该是用 ... 吧") · 复制来的别项目提示词 👉 让 Codex 朝错方向加速 | 噪音 · 无关的历史对话 · 过期截图 👉 稀释注意力 |
💡 右上角才是你想要的。其他三格各有各的麻烦,最危险的是左下→左上的高危误导(看着相关其实假)。
| 维度 | 含义 | 反例 |
|---|---|---|
| 🔍 真实性 | 来自项目文件 / 命令输出 / 测试结果 | 凭印象的口头描述("这个项目用 npm" 但 lockfile 显示 pnpm) |
| 🎯 相关性 | 跟当前任务直接相关 | 修登录按钮,扫了支付模块代码(噪音) |
| ⏱️ 时效性 | 反映当前状态而非历史 | 旧 README、旧截图、半年前的报错 |
⚠️ 3 维度排序:真实 > 相关 > 时效。 真实但跑题,至少不会带偏方向;不真实即使相关,也会让 Codex 朝错方向加速。
🎯 怎么给 Codex 好上下文?4 步法
不要一上来直接让 Codex 改代码。下面 4 步是稳妥顺序:
第 1 步 · 让它画地图
第一次进入项目,先要项目级地图:
请阅读当前项目,不要修改文件。
请输出:
- 项目用途
- 技术栈
- 主要目录职责
- 启动和测试命令
- 你认为最重要的 5 个文件
- 哪些是确认的、哪些只是推测第 2 步 · 让它定位任务
针对具体任务,让它指出相关文件:
我要做:{任务}
请先收集上下文,不要修改文件。
输出:
- 涉及哪些文件、它们的关系
- 还需要我补充什么
- 哪些地方修改风险最高
- 建议的最小修改范围第 3 步 · 让它分类信息
要求它把已有信息分四类,避免把推测当事实:
请把当前掌握的信息分四类:
- ✅ 事实:从文件 / 命令 / 明确输入确认的
- 💭 推断:基于事实推出的、说明依据
- ❓ 不确定:还不能确认的、会影响任务的
- 🚀 下一步:为确认不确定信息要做什么第 4 步 · 你确认后才执行
如果 ❓ 不确定项里有关键问题,先问、先查、不动手。
flowchart LR
Map[1️⃣ 画地图] --> Locate[2️⃣ 定位任务]
Locate --> Classify[3️⃣ 分类信息]
Classify --> Check{你审查}
Check -->|关键不确定| Ask[问 / 查 / 只读分析]
Check -->|信息齐了| Execute[4️⃣ 执行]
Ask --> Locate
style Check fill:#fef3c7,stroke:#f59e0b
style Execute fill:#dcfce7,stroke:#22c55e
💡 这 4 步都不写代码。听起来慢,实际比"猜了一通改完再回滚"快得多。
📜 AGENTS.md:项目门口的工作说明
新手最强大的杠杆是 AGENTS.md(Codex 的项目规则文件)。写一次,长期生效,不用每次提示词重复说。
它是什么?
AGENTS.md 是面向编程 Agent(智能代理)的开放格式,类似给 Agent 看的 README。规范由 OpenAI Codex 与 Cursor、Amp、Jules、Factory 等共同支持,目前由 Linux Foundation 下的 Agentic AI Foundation 维护。
Codex 怎么读它?(指令链 / instruction chain)
Codex 启动时按"全局 → 项目根 → 当前目录"逐层串联:
flowchart TB
G["🌐 全局<br/>~/.codex/AGENTS.md<br/>(或 AGENTS.override.md)"]
P["📁 项目根<br/>repo/AGENTS.md"]
S["📂 子目录<br/>repo/src/AGENTS.md"]
C["📍 当前目录<br/>repo/src/feature/AGENTS.md"]
G --> P --> S --> C --> Final["🎯 最终指令链<br/>越靠近 cwd 优先级越高"]
style Final fill:#dcfce7,stroke:#22c55e,stroke-width:2px
| 关键规则 | 说明 |
|---|---|
| 一目录一文件 | 每层最多读一份 AGENTS.md |
| 越近越优先 | 子目录可覆盖父目录指令(因为追加在后面) |
| 优先级链 | AGENTS.override.md > AGENTS.md > project_doc_fallback_filenames 配置的备选名 |
| 大小限制 | project_doc_max_bytes 默认 32 KiB,超了会截断 |
| 加载时机 | 每次 Codex 启动加载一次(CLI 通常一会话一次) |
该写什么进 AGENTS.md?
✅ 适合:
- 启动 / 测试 / 构建命令(pnpm dev / pnpm test ...)
- 包管理器(用 pnpm,不要用 npm)
- 目录职责(src/api 是后端、src/ui 是前端)
- 编码风格(用 TypeScript 严格模式)
- 禁止事项(不要改 db migration、不要碰 .env)
- 验收要求(提交前必须 pnpm test 通过)
❌ 不适合:
- 一次性临时要求(写在本次提示词里)
- 商业秘密 / 个人偏好(私有,别开源)
- 大段产品文档(超过 32 KiB 会被截断)
- 时效性强的事实(很快过期)⚠️ 超过 32 KiB 怎么办? 拆到子目录下分别写,或调高
project_doc_max_bytes上限(但更建议拆分)。
⚖️ 上下文 vs 记忆 vs 提示词:边界在哪?
很多新手把这三个混用。其实它们生命周期完全不同:
| 类型 | 生命周期 | 适合放什么 | 不适合放什么 |
|---|---|---|---|
| 📝 当前提示词 | 本次任务 | 任务目标、临时边界、特定验收标准 | 每次都要重复说的项目规则 |
| 📜 AGENTS.md | 项目长期 | 项目命令、目录职责、编码风格、禁止事项 | 个人偏好、临时要求、商业秘密 |
| 📖 README | 项目长期 | 项目用途、安装、运行方式、FAQ(常见问题) | 面向 Agent 的指令细节 |
| 🧠 记忆 (memory) | 跨任务跨项目 | 用户长期偏好、反复出现的经验 | 项目级规则(每个项目都不同) |
| 📊 命令输出 | 本次反馈 | 当前验证结果、错误证据 | 背景知识 |
🎯 判断口诀:
- 这个项目里每个人都该知道?→ 写
AGENTS.md- 这次任务临时要这样?→ 写当前提示词
- 跨项目都要遵守?→ 写记忆 / 全局
~/.codex/AGENTS.md- 当前这一步的证据?→ 命令输出 / 报错粘贴
🎓 3 个上下文管理习惯
① 让它先分类,再行动
把「事实 / 推断 / 不确定 / 下一步」四分要求写进每个复杂任务的提示词:
请把当前信息分四类输出:
✅ 事实 / 💭 推断 / ❓ 不确定 / 🚀 下一步➡️ 显著减少幻觉(hallucination,AI 把推测当事实输出)。
② 上下文不足时停下来,不要硬上
如果缺少关键信息,不要猜,不要修改文件。
先列出缺口和需要确认的问题。➡️ 涉及支付 / 数据迁移 / 权限 / 删除 / 生产发布时尤其重要 —— 缺上下文硬做的代价远大于停下来问的代价。
③ 给读取预算和阶段
请先读取最相关的 10 个文件。
如果需要扩大范围,先说明原因。或者分阶段:
第一阶段只建立目录地图。
第二阶段追踪具体功能。
第三阶段才提出修改方案。➡️ 防止 Codex 一上来全库扫描几十个文件,拿到一堆相似 / 旧 / 生成文件后判断变慢。
🚫 常见误解 → ✅ 正确理解
| ❌ 误解 | ✅ 正解 |
|---|---|
| Codex 已经知道整个项目 | 它需要主动读取相关文件才能建立现场 |
| 发过一次背景就永远记得 | 长对话会被压缩,重要规则应写进 AGENTS.md |
| 报错让它自己猜,不用贴 | 完整报错是最高价值上下文,必须粘贴 |
| 规则越多越好 | 规则要短、明确、可执行(32 KiB 也是物理上限) |
| 上下文越多越好 | 上下文有质量差异:真实 > 相关 > 时效 |
| 我已经告诉它项目用什么了 | "我说"不算证据,让它从 lockfile / 配置 验证 |
🔍 想再深一层(点击展开)
🪟 上下文窗口 vs 项目知识库(GPT-5.4 1M 容量怎么用)
新手容易把"Codex 能看到上下文"理解成"Codex 已经拥有整个项目知识库"。这不准确。
上下文窗口(context window)更像 一张当前工作台:
- 桌上能放:任务说明、几份文件、命令输出、规则片段、对话记录
- Codex 根据工作台上的材料推理
- 工作台空间有限,注意力也有限
2026 现状:GPT-5.4 在 Codex 里实验性支持 1M(一百万)token 上下文窗口 —— 这意味着工作台变大了,但不等于该把所有东西塞进去:
- 放太少 → 不知道现场
- 放太多 → 注意力被无关材料稀释
- 最优做法:把当前任务最有用的材料放工作台,长期规则放
AGENTS.md,跨任务偏好放记忆
💡 核心结论:1M context 是上限不是建议值。好材料的少,胜过全材料的多。
☢️ 上下文污染:5 种常见污染源
上下文不只是缺失会出问题,错误上下文同样会带偏 Codex。常见污染:
| 污染源 | 例子 | 后果 |
|---|---|---|
| 🗑️ 过期 README | 半年前写的"用 npm" 但项目早改成 pnpm | Codex 一直用错命令 |
| 📦 已废弃目录 | pages/ 已迁移到 app/ 但旧目录没删 | 改了不生效的代码 |
| 🧪 旧测试文件 | 已废弃的 spec 还在 | 跑了通过但其实没验证 |
| 📋 复制来的提示词 | 别项目的提示词包含错误规则 | 错误传染 |
| 🗣️ 你自己的不确定描述 | "应该是用 ... 吧" | 推测被当事实写进 diff |
防御提示词:
请不要把我的描述都当成事实。
请用项目文件验证关键假设,并标出哪些是确认的、哪些仍是推测。🩺 案例完整版:从一句话到根因(医生问诊式)
回到开头的"保存按钮没反应"案例。这个 bug 排查的全过程像医生问诊:
sequenceDiagram
participant 你
participant Codex
participant 项目
<br />
你->>Codex: 点击保存按钮没反应
Codex->>你: 5 个可能原因都猜一遍(噪音)
<br />
Note over 你,Codex: ⬇️ 加上下文 ⬇️
<br />
你->>Codex: + 页面是 /settings/profile
Codex->>项目: 读 ProfileForm.tsx
Codex->>你: 找到 onSubmit handler
<br />
你->>Codex: + 控制台报 Cannot read 'email' of undefined
Codex->>你: 方向变了:数据缺字段,不是事件没绑
<br />
你->>Codex: + 昨天把 /api/user 改成 /api/profile
Codex->>项目: 对比新 API 返回结构
Codex->>你: 根因:profile 接口返回结构变化,<br/>前端仍按旧字段读取关键观察:每补一层上下文,Codex 给的答案完全不同。 不是模型变聪明,是它能用的证据变多了。
📝 上下文管理万能提示词模板
复杂任务直接套用:
请为下面任务建立高质量上下文,不要修改文件。
<br />
任务:
{写任务}
<br />
请按下面格式输出:
<br />
一、确认事实
- 只写从文件 / 命令输出 / 明确提示中确认的信息
- 每条标出来源(文件路径 / 命令名)
<br />
二、合理推断
- 写根据事实推断出的信息
- 每条说明依据
<br />
三、不确定信息
- 写还不能确认但会影响任务的信息
<br />
四、需要补充的问题
- 问最关键的 3 到 5 个
<br />
五、建议下一步
- 上下文足够:给计划
- 上下文不足:先列缺口,不动手📖 术语速查表
| 英文 / 缩写 | 中文 | 一句话解释 |
|---|---|---|
| context | 上下文 | Codex 当前能看到的所有信息 |
| context window | 上下文窗口 | 模型一次能处理的最大文本量(GPT-5.4 实验支持 1M) |
| AGENTS.md | — | 给 Agent 看的项目规则文件,格式开放 |
| AGENTS.override.md | — | 优先级更高的覆盖文件 |
| instruction chain | 指令链 | Codex 把多个 AGENTS.md 串联成一份指令的机制 |
| project root | 项目根 | 通常是 git 仓库根目录 |
| CODEX_HOME | — | 全局配置目录环境变量,默认 ~/.codex |
| project_doc_max_bytes | — | AGENTS.md 大小上限配置项,默认 32 KiB |
| hallucination | 幻觉 | AI 把推测当事实输出 |
| memory | 记忆 | 跨任务跨项目保留的长期偏好 |
📖 官方文档来源:
📝 本章自检
| # | 问题 | 对应章节 | 自检 |
|---|---|---|---|
| 1 | Codex 上下文的 5 层栈分别是什么?哪层来自 AGENTS.md? | 🧱 5 层栈 | ☐ |
| 2 | 「保存按钮没反应」从一句话变到根因,靠的是什么? | 🎬 钩子场景 + 案例完整版 | ☐ |
| 3 | 哪些信息该写进 AGENTS.md?哪些不该?为什么有 32 KiB 限制? | 📜 AGENTS.md | ☐ |
✅ 过关标准(这次放在折叠块里):
展开看答案 ⬇️
"Codex 输出质量 ≈ 上下文质量。模型负责推理,上下文负责给推理提供材料。"
把 5 层上下文(任务 / 项目 / 局部 / 规则 / 反馈)一一对位,再用 AGENTS.md 把项目级规则固化下来 —— 这是高质量交付的工程基础。
📚 下一篇
- ➡️ 04 · AGENTS.md 为什么能改变 Codex 行为 —— 把这一篇里
AGENTS.md那段展开成完整方法 - 📖 编写项目规则文件
- ⚙️ 配置 Codex 基础选项
- 🧠 使用记忆能力
🧭 一句话记住
模型负责推理,上下文负责给推理提供材料。
材料错了,再强的推理也偏;材料缺了,再好的计划也漏。