深入理解 Codex 智能体循环
来源:OpenAI 官方文章
原文链接:https://openai.com/zh-Hans-CN/index/unrolling-the-codex-agent-loop/
原文日期:2026-01-23
整理日期:2026-05-20
核心主题:Codex 不是“模型直接写代码”,而是一套运行框架在不断组织上下文、调用模型、执行工具、观察结果、压缩历史,直到任务完成。
1. 一句话结论
Codex 的核心不是单次问答,而是“智能体循环”:用户提出目标,模型判断下一步,Codex 执行工具,把结果重新放回上下文,再让模型继续判断,直到模型停止调用工具并给出最终回复。
我需要记住的是:
- 模型负责推理和决策。
- Codex 运行框架负责组织上下文、执行工具、管理权限和控制循环。
- 工具调用的结果会变成下一次推理的输入。
- 代码改动本身也是智能体的输出,不只是最后那句话。
- 上下文、缓存、压缩和权限,是 Agent 能不能稳定工作的关键。
2. 先看一张总览图
flowchart LR U["用户目标<br/>我要完成什么"] --> H["Codex 运行框架<br/>组织上下文、权限和工具"] H --> M["模型<br/>推理下一步"] M -->|"需要操作环境"| T["工具<br/>读文件、改代码、跑命令、查资料"] T --> O["环境反馈<br/>文件内容、命令输出、测试结果"] O --> H M -->|"任务完成"| R["最终回复<br/>总结改动和验证结果"]
这张图要表达的是:Codex 不是模型直接控制电脑,而是 Codex 运行框架在中间负责调度。
模型像“大脑”,工具像“手和眼睛”,Codex 运行框架像“项目经理 + 安全边界 + 上下文管理器”。
3. 原文核心信息
| 主题 | 原文讲了什么 | 对我的启发 |
|---|---|---|
| Codex 定位 | Codex 包含 CLI、Cloud、VS Code 扩展等软件智能体产品,本文重点讲底层运行框架 | 不要只把 Codex 理解成一个命令行工具,它背后是一套 Agent 执行系统 |
| Agent loop | 智能体会在“模型推理”和“工具调用”之间反复循环 | AI 编程不是一次生成,而是不断观察、执行、修正 |
| 工具调用 | 模型可以请求运行 shell、搜索、调用 MCP 工具等 | Agent 真正强的地方是能操作环境,而不只是回答文字 |
| 上下文增长 | 每轮对话都会把历史消息和工具结果带入下一次请求 | 对话越长,越容易消耗上下文窗口 |
| 提示缓存 | 旧提示作为新提示的精确前缀,有利于命中缓存 | 固定指令和工具顺序很重要,频繁改配置会影响性能 |
| 压缩机制 | 当上下文太长时,Codex 会自动压缩历史 | 长任务不是无限堆上下文,而是要把关键状态总结出来 |
| 沙盒权限 | Codex 会给 shell 工具注入权限说明,但 MCP 工具需要自己负责防护 | 工具边界和权限控制是 Agent 安全的核心 |
4. 我需要先理解的几个概念
4.1 Codex 不是模型本身
很多人会把 Codex 理解成“一个会写代码的模型”,但这篇文章强调的是:Codex 更像一个运行框架。
可以拆成三层:
| 层级 | 作用 | 类比 |
|---|---|---|
| 模型 | 根据上下文推理下一步 | 大脑 |
| Codex harness | 编排模型、工具、上下文和权限 | 项目经理 + 执行调度器 |
| 工具 | 读文件、改文件、跑命令、查资料 | 手和眼睛 |
flowchart TB A["模型层<br/>负责理解、推理、决策"] --> B["运行框架层<br/>负责上下文、权限、工具编排"] B --> C["工具层<br/>负责真实环境操作"] C --> D["工程环境<br/>代码仓库、终端、文件系统、外部服务"] D --> B
所以,Agent 能工作,不是因为模型一次性知道所有答案,而是因为它可以:
- 先读文件。
- 根据文件内容制定下一步。
- 修改代码。
- 跑测试。
- 看报错。
- 再继续修。
这就是 Agent 和普通聊天机器人的根本差异。
4.2 一次对话不等于一次模型调用
我给 Codex 发一句话,比如:
帮我修复这个构建问题
从用户视角看,这是一次请求。
但从 Codex 内部看,可能发生很多轮:
用户目标
-> 模型推理:先看 package.json
-> 工具调用:读取 package.json
-> 模型推理:再看构建配置
-> 工具调用:读取配置文件
-> 模型推理:修改脚本
-> 工具调用:写文件
-> 模型推理:运行 build
-> 工具调用:执行 pnpm build
-> 模型推理:总结结果
-> 回复用户
这整串过程,才是一个完整的 Agent loop。
5. 智能体循环是怎么跑起来的
sequenceDiagram participant User as 用户 participant Codex as Codex 运行框架 participant Model as 模型 participant Tool as 工具 participant Env as 工程环境 User->>Codex: 提出任务目标 Codex->>Model: 发送上下文和可用工具 Model-->>Codex: 请求读取文件 Codex->>Tool: 执行读取 Tool->>Env: 访问文件系统 Env-->>Tool: 返回文件内容 Tool-->>Codex: 返回工具结果 Codex->>Model: 追加结果后继续推理 Model-->>Codex: 请求修改并验证 Codex->>Tool: 写文件、运行测试 Tool-->>Codex: 返回验证结果 Codex->>Model: 继续判断是否完成 Model-->>User: 输出最终总结
这张时序图更接近真实开发过程:用户只看到“发任务”和“收到结果”,中间其实发生了多轮模型推理和工具调用。
5.1 第一步:把用户输入变成提示
用户输入只是提示的一部分。Codex 在真正请求模型之前,会把很多信息组合进去:
- 系统或开发者指令。
- 当前沙盒权限。
- 当前工作目录。
- 用户 shell。
- 项目里的
AGENTS.md等说明文件。 - 可用工具列表。
- 用户当前输入。
这解释了为什么我写好 AGENTS.md 很重要。
因为 Agent 并不是只看我最后那句话,它会把项目规则、权限限制和环境信息一起带给模型。
5.2 第二步:模型推理下一步
模型收到上下文后,不一定直接回答。
它可能做两类输出:
- 直接给用户最终回复。
- 发起工具调用。
软件工程任务里,更多时候是第二种。
例如模型可能判断:
我需要先读取 package.json,确认构建命令。
于是它会请求 Codex 执行 shell 工具。
5.3 第三步:Codex 执行工具
模型本身不能直接操作我的电脑。
真正执行命令、读文件、写文件的是 Codex 运行框架。
这也是为什么权限控制很关键:
- 哪些目录可写?
- 网络能不能访问?
- 什么时候需要用户批准?
- 是否允许执行危险命令?
文章中特别提到,Codex 注入的沙盒规则主要约束 Codex 自带的 shell 工具。其他 MCP 工具如果能操作外部系统,需要工具自身提供安全边界。
我的理解:
Agent 越强,权限边界越重要。 能干活的工具,也一定可能干坏事。
5.4 第四步:工具结果回到上下文
工具执行结果不会丢掉。
Codex 会把它追加到 input 里,作为下一次模型推理的上下文。
这就形成了一个闭环:
模型提出动作
Codex 执行动作
环境返回结果
模型基于结果继续判断
这也是为什么工具输出质量很重要。
如果命令输出太乱、太长、缺少关键错误信息,模型下一步判断就会变差。
6. 为什么上下文管理很重要
6.1 对话越长,输入越大
每次继续对话时,Codex 都要把之前的消息、工具调用和工具结果带进去。
这会带来两个问题:
- 成本变高。
- 上下文窗口可能被耗尽。
软件任务尤其容易触发这个问题,因为 Agent 可能在一轮任务里调用很多工具。
例如:
- 搜索代码。
- 读取多个文件。
- 修改文件。
- 跑测试。
- 读错误日志。
- 再修改。
- 再跑测试。
如果不管理上下文,任务还没做完,上下文窗口可能先满了。
flowchart LR A["初始上下文<br/>规则 + 用户目标"] --> B["第 1 轮<br/>读取文件结果"] B --> C["第 2 轮<br/>修改方案 + diff"] C --> D["第 3 轮<br/>测试日志"] D --> E["上下文变长<br/>成本增加、窗口变紧"] E --> F["压缩摘要<br/>保留关键状态"] F --> G["继续执行<br/>用更小上下文推进任务"]
这张图说明:长任务不能无限堆历史,需要把关键状态总结出来,再继续推进。
6.2 提示缓存为什么重要
文章里有一个很关键的性能点:新提示最好让旧提示成为它的精确前缀。
简单理解:
第一次请求:
A + B + C
第二次请求:
A + B + C + D
如果前面的 A + B + C 完全没变,就更容易复用之前的计算。
这就是提示缓存的价值。
对我使用 Agent 的启发:
- 不要在长任务中频繁改规则。
- 不要频繁切换模型。
- 不要随意改变工具列表。
- 项目规则要稳定放在前面。
- 变化的信息尽量追加在后面。
这和前端工程里的缓存思想类似:稳定部分越稳定,缓存命中率越高。
6.3 为什么 Codex 不依赖 previous_response_id
文章提到,Responses API 支持 previous_response_id 来减少反复发送历史,但 Codex 当前选择保持请求无状态。
原因主要是:
- 让不同 Responses API 提供方更容易实现。
- 支持零数据保留场景。
- 避免服务端必须保存完整历史。
我的理解:
==Codex 更偏向“客户端掌握完整上下文,服务端尽量无状态”。==
==这会带来更大的请求体,但换来更清晰的数据边界和兼容性。==
7. 压缩:长任务必须会“归纳状态”
当上下文太长时,Codex 会进行压缩。
压缩不是简单删除历史,而是把之前发生过的重要事情整理成更小的上下文,让 Agent 还能继续工作。
这对我有一个很实际的提醒:
在长任务里,我自己也应该主动帮助 Agent 归纳状态。
例如可以让 Agent 在关键节点总结:
请总结当前任务状态,包括:
1. 已完成什么。
2. 还剩什么。
3. 哪些文件被改过。
4. 当前风险是什么。
5. 下一步应该做什么。
这样能降低上下文噪声,也方便中断后继续。
8. 从前端架构师视角看这篇文章
8.1 Agent 不是外包,它更像“可调用工具的工程同事”
如果把 Agent 当外包,会只关心结果。
但从这篇文章看,Agent 更像一个运行在工程环境里的同事:
- 它会读项目上下文。
- 它会遵守项目规则。
- 它会调用工具。
- 它会根据反馈调整方案。
- 它也会受上下文窗口和权限影响。
mindmap
root((Agent 协作能力))
目标
背景清楚
验收明确
不做什么
上下文
项目规则
目录结构
构建命令
工具
读文件
改代码
跑测试
安全
沙盒权限
私密目录
人工确认
验收
Git diff
构建结果
风险说明
所以我管理 Agent 的重点不是“让它多写代码”,而是:
- 给清楚目标。
- 给清楚边界。
- 给清楚验收标准。
- 让它先探索再修改。
- 要求它跑验证。
8.2 项目文档就是 Agent 的工程接口
AGENTS.md、README、目录结构、脚本命名、测试命令,本质上都是 Agent 和项目之间的接口。
如果这些内容混乱,Agent 就会做错事。
我应该在项目里沉淀:
- 构建命令。
- 测试命令。
- 目录职责。
- 禁止修改的范围。
- 提交前检查清单。
- 常见错误处理方式。
这不是给人看的文档而已,也是给 Agent 用的上下文。
8.3 工具输出要可读、可控、可验证
Agent 很依赖工具调用结果。
所以工程化上要尽量做到:
- 构建错误清晰。
- 测试输出明确。
- lint 规则稳定。
- 脚本职责单一。
- 日志不要过度噪声。
否则模型看到的上下文会很脏,下一步判断也会变差。
9. 我以后使用 Codex 的实践准则
9.1 发任务前
我应该先写清楚:
目标:
背景:
允许修改:
禁止修改:
验收方式:
风险点:
不要只说“帮我优化一下”。
9.2 执行过程中
我应该要求 Agent:
- 先读代码再动手。
- 先讲计划再改关键文件。
- 每次改动后运行相关验证。
- 遇到权限或不确定信息时停下来说明。
- 长任务中定期总结状态。
9.3 验收时
我不能只看最后一句回复。
我要检查:
- Git diff 是否符合目标。
- 有没有改到不该改的文件。
- 构建和测试是否真的通过。
- 是否泄露了私密目录或账号内容。
- 是否留下临时文件或调试代码。
10. 这篇文章对我当前知识库的启发
我现在正在搭一个“Obsidian 写作 + 自动生成文章 + AI 协作”的知识库。
结合这篇文章,我应该这样设计:
build/作为工具和生成器目录,默认隐藏。学习/、AI工作流/、文章/、日记/作为公开内容目录。账号/、公司/永远不参与构建。- 构建脚本要有明确的排除规则。
- 每次让 Agent 改知识库,都要检查产物里是否混入私密内容。
这其实就是把 Codex 文章里的思想落到自己的项目里:
Agent 能力越强,项目边界越要清晰。
自动化越方便,安全排除规则越不能模糊。
flowchart TB A["Obsidian 写作"] --> B["公开内容目录<br/>学习、AI工作流、文章、日记"] A --> C["私密内容目录<br/>账号、公司"] B --> D["构建脚本扫描"] C --> X["强制排除<br/>不进 Git、不进发布产物"] D --> E["静态站点<br/>首页、分类页、文章页"] E --> F["Cloudflare Pages 发布"]
这张图可以直接对应我的知识库:公开目录进入自动构建,私密目录必须在构建规则里被排除。
11. 我的行动清单
- 继续完善
AGENTS.md,让 Agent 明确知道我的回答风格、目录规则和安全边界。 - 给知识库构建脚本补充“敏感目录扫描”检查。
- 给常用项目建立 Agent 任务模板。
- 每次长任务后让 Agent 输出状态总结。
- 不把 AI 的最后回复当结果,要以文件变更、构建结果和验收标准作为结果。
12. 最终理解
Codex 的本质不是“更聪明的自动补全”,而是一套能把模型、工具、上下文和权限串起来的工程系统。
我使用 Codex 的能力,也不只是会写 prompt,而是要学会设计一个适合 Agent 工作的工程环境:
- 目录清晰。
- 规则明确。
- 工具可靠。
- 输出可验证。
- 权限有边界。
- 长任务可压缩、可恢复。
这就是 AI 时代工程师需要升级的地方:从写每一行代码,转向设计 Agent 能稳定工作的系统。