拓展阅读

展开 Codex 的执行循环

观察每轮输入如何变化,以及工具结果如何回填。

推荐阅读 05 / 12本地中文导读

对应资料:Unrolling the Codex Agent Loop [S004]

沿着对象与状态理解本章

把模型、宿主、工具画成不同泳道后,问“谁真正改变了文件”就有明确答案。跟踪每条返回消息,再判断需要继续调用模型、执行工具还是结束;不要把模型说完成当成环境已经完成。

下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。

动态图解 · F22

把一个Agent任务拆成真正发生的几轮

同一句用户任务,为什么可能调用模型不止一次?

LLM生成下一步提议,宿主执行获准的动作,把结果再交给LLM。这是外层任务循环;每次模型调用内部还要经历逐Token生成。外层的一轮工具行动不等于内部生成一个Token,两种“循环”不能混用。

调用标识把某次工具请求与其结果连接的ID。
工具结果程序实际执行后返回的内容。
上下文本轮明确交给模型的信息,而非整个电脑状态。

输入与适用条件:构造的只读教学任务:文件config.txt含timeout=30。泳道展示职责边界,不声称调用了真实商业API;数据和动作顺序固定。

1 / 8 · 1. 用户任务:读config.txt中的timeout

第1步,共8步

窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。

把一个Agent任务拆成真正发生的几轮:1. 用户任务:读config.txt中的timeout用户宿主LLM文件工具用户任务:读config.txt中的timeout模型请求:任务+read_file工具定义模型输出:call_id=c1,path=config.txt宿主校验后读取文件工具结果:timeout=30下一轮输入:原任务+调用+结果模型回答:配置的timeout为30宿主显示回答;任务结束

模型尚未看到磁盘文件。先区分用户给的任务与环境真实内容。

未读取

默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。

为什么需要

模型可以借助工具获得新证据,而不把一切都塞入参数。

怎样实现

按请求、校验、执行、结果回填、继续决策组织循环。

可能的代价与误解

忘记回填工具结果会让模型重复请求;把输出文本当执行证明会误报完成。

如何判断是否做对

对照每轮模型输入和工具日志,确认结果与call_id匹配。

把一次Codex任务展开为多轮输入

本篇对应Codex Agent Loop的公开机制。以下轨迹是原创教学示例,不是真实产品日志,也不声称展示隐藏Prompt。模型与工具交替工作,Harness维护调用和结果。[S004]

第1轮:目标 + 项目指导 + 工具定义
       → 模型请求搜索exclude
第2轮:加入搜索结果
       → 模型请求读取过滤器和测试
第3轮:加入源码与复现结果
       → 模型提出补丁
第4轮:加入补丁应用结果
       → 模型请求测试
第5轮:加入测试观察
       → 继续修复或给出有证据的交付

输入组装决定模型“知道什么”

工作目录存在源码,不代表源码进入输入。工具定义告诉模型能做什么,不代表动作已发生。历史中一句“测试可能通过”也不能变成已通过状态。

因此调试Agent时,应分别检查可访问、已读取、已解释和已验证。缺证据先修检索与输入;有证据但误用,再考虑提示、模型或验证方式。[S045][S102]

工具输出如何被利用

返回应包含足够上下文与明确错误类型。文件不存在、权限不足和文件为空不能都表示成空字符串。模型看到不同观察,才可能选择合适后续动作。[S058]

原创例子:搜索结果只有“filter.py”,模型需再猜路径;返回“路径、匹配行、片段、是否截断”更容易定位。返回整个仓库则可能造成另一种噪声问题。

长任务为何需要压缩与外置

每轮结果累积,历史可能变长。压缩保留任务连续性,但不能保证完整恢复所有细节。重要原始日志与版本应外置并保留引用。[S089][S084]

不要把压缩看成模型重新学习了任务,也不要把缓存命中看成永久记忆。它们分别改变内容表示与计算复用。

运行状态如何与界面分离

App Server等接口让不同客户端围绕会话与事件交互。界面进度、模型意图和实际环境结果不应混为一谈。[S064]

练习:在补丁应用后断开客户端,恢复时先查看文件版本和执行记录,再决定是否继续。重复显示一条消息无妨,重复执行有副作用的动作却可能产生问题。

完成本篇后,应能从一条最终回答追溯必要动作和证据,而不是只凭模型自述判断任务完成。

继续深入:第6章 · 真实编码Agent 或阅读拓展阅读目录6.1的逐项讲义。所有链接均为本地内容。

运行示例 · G05

一个修复任务,为什么产生三次模型调用

输入与条件。任务是把 config.json 的超时从3改成5,工具有read、write、test。下面是确定的教学轨迹,而非真实模型自主运行。

步骤与对象内部动作中间结果 / 新状态
1调用1输入用户任务+可用工具说明模型提出read,尚未承诺文件已修改。
2工具1结果读取版本v7,timeout=3结果连同调用ID进入历史。
3调用2输入任务+read调用+结果模型提出在v7基础上写timeout=5。
4工具2结果写入成功,得到v8宿主仍未证明功能测试通过。
5调用3输入新版本和测试返回pass模型归纳变更与验证;如果模型还需自行提出test,则还要增加一轮。
6计数区别用户看见一个任务后端可能有多次模型请求和多次工具操作。

把过程连起来。一轮模型调用的输出不是任务的全部生命周期;哪些工具由模型决策、哪些由宿主自动触发必须说清。

边界与反例。本例test由宿主固定触发,因此三次调用成立;不要与“每一步工具都须另一次模型提议”的配置混计。

依据与适用范围:[TOOLS]。示例输入和场景由本书明确设定。

记录保存在本机浏览器。

输入关键词即可检索。

↑ ↓ 选择 Enter 打开Esc 关闭 · 仅本地搜索

阅读设置

阅读设置仅保存在本机浏览器,不上传任何数据。