ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

ChatGPT、Codex实战:修改代码总失败?从权限、目录、依赖到测试的8项排查

ChatGPT、Codex实战:修改代码总失败?从权限、目录、依赖到测试的8项排查 第一次用Codex处理真实项目时很多人的体验其实很割裂。你会发现它明明已经看懂了代码找到相关函数分析出了可能的原因甚至已经告诉你准备修改哪些文件。但任务真正执行下去却很容易出现另一种情况代码改了一半停了。Terminal命令执行失败。同一个错误连续修改几轮。原本只修一个Bug最后改了十几个文件。Codex说“已经完成”重新运行项目问题却还在。于是很多人开始把问题归结为是不是模型不够强但真正把Codex放进工程环境以后会发现一个很重要的变化模型能力只决定Agent“有没有可能知道怎么解决问题”工程环境则决定它“能不能真的把问题解决”。现在的Codex并不是一个只生成代码片段的聊天窗口。它需要在真实文件、命令、测试和项目上下文之间连续执行任务而OpenAI目前也通过Sandbox、Approval和权限规则限制Agent能够访问哪些文件、网络资源以及哪些动作可以直接执行。所以当Codex修改代码失败时真正需要排查的已经不是一个单点问题。而是一整条执行链理解任务 ↓ 找到正确项目 ↓ 读取相关文件 ↓ 获得必要权限 ↓ 理解依赖和环境 ↓ 定位根因 ↓ 修改代码 ↓ 运行验证 ↓ 判断是否完成只要其中任何一层出现问题最终给人的感觉都可能是Codex“不好用”。但它们的根因完全不同。下面按照真实工程执行顺序把最常见的8类问题拆开。一、第一步不是看Prompt而是确认Codex到底站在哪个目录很多Codex任务从一开始就已经错了。不是代码错。而是工作目录错了。假设真正需要处理的项目是D:\Projects\shop-web但当前打开的是D:\Projects这个目录里还有shop-web shop-api admin-system demo legacy scripts此时你给Codex一句修复登录按钮点击没有反应的问题。人类知道你正在做shop-web。Agent并不知道。它接下来只能先建立自己的项目地图寻找Git仓库 ↓ 查找package.json ↓ 搜索login关键词 ↓ 判断前端和后端关系 ↓ 识别哪个目录才是当前项目这就是很多人看到的Codex怎么一直在Search问题甚至还没有进入Bug分析阶段。Workspace不是越大越好传统IDE里我们习惯直接打开整个仓库。但对于Agent来说可见范围本身就是搜索空间。一个任务只和src/features/login相关却让Agent从一个包含几万个文件的大型Monorepo开始探索相当于人为增加了大量不确定性。所以真正开始任务之前先确认三件事当前项目是什么任务真正涉及哪个模块哪些目录根本没有必要进入上下文这不是Prompt技巧。这是最基础的Context Boundary。二、第二个问题Codex“知道怎么改”和“能够改”不是一回事这是Agent和普通聊天模型最明显的区别之一。假设Codex已经分析出问题位于auth.ts第87行。但接下来修改失败。此时模型推理可能没有任何问题。真正失败的是Execution。一个完整代码任务至少可能涉及四种能力Read ↓ Write ↓ Execute ↓ Network而这四个能力不是天然等价的。能读不能写Codex可以读取文件解释问题给出Patch思路。但不能真正落盘修改。能写不能执行Codex能够修改auth.ts但不能运行pnpm test最终结果就是代码写完了但没有验证。能执行但不能联网项目本身缺少某个依赖。Agent判断需要下载。但网络访问被限制。任务又会停下来。OpenAI目前把这两个层次明确拆成Sandbox与ApprovalSandbox决定命令可以访问哪些文件和网络资源而Approval决定某些动作是否需要在执行之前暂停并获取进一步批准。因此看到Codex失败以后最没用的问题之一就是为什么它没做好更有效的问法应该是具体失败在哪一个动作ReadWriteExecuteNetwork还是Workspace边界一旦把“任务失败”拆成具体动作问题才开始变得可诊断。三、第三个问题Agent不是突然变笨了而是任务范围漂移了这是复杂项目里非常典型的一种失败。开始时任务可能非常简单登录按钮点击以后没有请求API。第一次分析Codex检查Login.tsx没有明显问题。然后检查auth-api.ts接着发现认证状态可能有关。于是继续读auth-store.ts随后看到Token初始化。继续进入router.ts middleware.ts config.ts到了后面一个原本只需要修改两三个文件的问题已经演变成整个认证系统分析。这就是Scope Drift。任务范围正在自己向外扩张。为什么Agent特别容易出现这种问题因为Agent的目标通常是完成任务。只要它认为某个新文件可能和问题有关就存在继续探索的理由。如果任务没有边界它最合理的行为就是不断扩大搜索范围直到找到答案。但工程上这并不一定是我们想要的行为。因此一个成熟任务不能只有Goal。还应该有Scope。例如当前问题登录按钮没有发送请求。优先检查Login.tsx和auth API。不进行无关重构。不升级依赖。如果根因位于范围之外先说明证据再扩大检查范围。这几句话真正解决的不是语言表达。而是限制Agent的决策空间。四、第四个问题Codex正在修代码但真正坏掉的是依赖真实项目里一个错误信息通常不等于一个代码Bug。例如Module not found看到这句话以后可以有很多可能。可能一import路径错误属于Code Layer。可能二Package没有安装属于Dependency Layer。可能三当前运行的不是正确环境属于Environment Layer。如果没有先区分这三层Agent非常容易进入一个错误循环测试失败 ↓ 认为源码有问题 ↓ 修改代码 ↓ 继续失败 ↓ 继续修改代码但真正原因可能只是npm install没有成功。或者Python虚拟环境根本没有激活。再比如项目要求Node 22实际环境还是Node 18。这种情况下即使Codex重新写十次业务逻辑也无法从根本上解决运行环境问题。所以看到错误以后我更建议先做一个非常简单的判断代码问题 依赖问题 环境问题不要急着改代码。一个非常重要的原则Error发生在代码附近不代表Root Cause就在代码里。这是人类排查Bug时成立的原则。对Agent同样成立。五、第五个问题没有BaselineCodex甚至无法证明自己有没有修好这是Agent工程里非常容易被低估的一点。假设你告诉Codex修复当前测试失败。它修改代码以后重新测试3 failed 126 passedCodex告诉你仍有3个测试失败。问题是修改之前是多少如果原来就是3 failed 126 passed那么至少可以说明当前修改没有引入额外失败。但如果原来是1 failed 128 passed那么这次修改实际上把项目变得更差了。这就是为什么Agent开始动代码之前需要建立Baseline。也就是修改前状态。例如Tests: 3 failed / 126 passed Lint: 2 warnings Build: success然后Agent执行修改。完成以后再次运行完全相同的验证Tests: 0 failed / 129 passed Lint: 2 warnings Build: success现在才有了真正意义上的Before / After。这时我们才能说修改改善了项目状态。否则“测试结果”只是一个孤立数字。Agent时代验证对象发生了变化传统AI编程通常关注代码生成得对不对Agent开发进一步需要关注系统状态有没有按照预期发生变化所以Baseline并不是测试流程里的小技巧。它实际上是Agent Verification的起点。六、第六个问题任务越模糊Codex需要替你做的决策越多看一个非常常见的Prompt帮我优化登录模块。这句话看起来没什么问题。但Agent真正执行时会遇到大量未定义问题“优化”是指修Bug性能UI代码结构错误处理状态管理接口设计测试覆盖如果用户没有定义Agent只能自己决定。最终很容易出现这种结果本来想改Login.tsx最后变成Login.tsx AuthService.ts router.ts store.ts api.ts types.ts package.json这时候用户会觉得Codex怎么又乱改东西但从Agent角度看任务本身就允许它做这种判断。一个工程任务至少应该定义四件事Problem到底哪里有问题。Scope应该重点看哪里。Constraint哪些事情不要做。Done什么结果算完成。比如问题 登录按钮点击后没有触发API请求。 范围 优先检查Login.tsx和auth API。 限制 不升级依赖。 不修改数据库。 不进行无关重构。 完成标准 请求恢复正常 相关测试通过 列出修改文件。它并不是什么“高级Prompt”。但它解决了一个非常关键的问题把不该由Agent决定的事情提前决定掉。七、第七个问题一个任务里塞太多目标会让因果关系越来越混乱Agent能做长任务以后很多人自然开始追求一次把事情全做完。例如修复登录Bug同时升级依赖解决TypeScript错误优化认证性能补测试再重构一下公共模块。表面上看是一个Task。实际上里面至少包含Bug Fix Dependency Upgrade Type Fix Performance Optimization Testing Refactor问题不是Codex绝对完成不了。而是这些任务之间存在大量因果关系。例如升级依赖 ↓ 产生新类型错误 ↓ 修改公共类型 ↓ 原测试失效 ↓ 继续修改测试最终当项目出现新问题时很难判断到底是哪一个修改引入的这会让调试成本急剧增加。正确的长任务不是“大任务”而是阶段化任务。例如阶段1 修复登录Bug ↓ 验证 ↓ 阶段2 处理TypeScript错误 ↓ 验证 ↓ 阶段3 升级依赖 ↓ 验证每个阶段都形成自己的Input ↓ Change ↓ EvidenceOpenAI目前的Codex App也把不同Agent任务组织在独立线程和项目中并支持直接查看Agent产生的修改和Diff这种产品形态本身就体现了任务隔离与审查的重要性。Agent能够并行并不意味着所有目标都应该塞进一个上下文。八、第八个问题也是最重要的问题Done到底是谁定义的Codex最后可能输出已完成。这句话非常容易让人产生一个错觉任务已经结束了。但实际上这里只能证明Agent认为自己的执行流程已经结束。不能直接证明工程问题已经解决。这是两个完全不同的判断。一个可靠的任务闭环至少应该是Reproduce ↓ Diagnose ↓ Modify ↓ Test ↓ Review Diff ↓ Verify其中任何一层缺失都可能出现“修改完成但任务没有完成。”所以Codex说Done以后我更关注四个问题1. 改了什么具体哪些文件如果原本一个局部Bug却修改15个文件需要重新检查Scope。2. 为什么这样改关键Diff必须能够对应到Root Cause。否则只是修改以后错误暂时消失。这并不等于真正修复。3. 跑了什么验证不是已完成测试。而是具体执行过pnpm test pytest pnpm lint npm run build中的哪些。4. 什么没有验证例如数据库没有运行缺少测试账号第三方服务不可访问生产配置不可用。这些信息同样属于最终结果。OpenAI目前的Codex工作流支持在线程内审查Agent修改、查看Diff以及继续进入编辑器做人工调整远程工作流中也会同步Terminal输出、Diff、测试结果和审批状态。这说明Agent真正的交付物已经不应该只有Code。还应该包括Evidence。把8个问题放在一起会发现Codex失败其实有四个层级如果把前面的排查重新归类会得到一个更清楚的结构。第一层Environment包括目录、Workspace、依赖、Runtime环境。它解决的是Agent有没有站在正确的地方工作第二层Permission包括Read、Write、Execute、Network。它解决的是Agent有没有能力完成需要执行的动作第三层Task包括目标、范围、限制、任务拆分。它解决的是Agent到底应该做什么以及不应该做什么第四层Verification包括Baseline、Test、Diff、Evidence。它解决的是怎么证明Agent真的完成了任务最终就形成了一条非常清楚的链Environment ↓ Permission ↓ Task ↓ Verification很多所谓的Codex能力不够。其实真正失败的可能只是其中某一层。为什么排查顺序非常重要假设目录本身就错了。你却开始优化Prompt。没有意义。假设依赖没有安装。你却让Codex连续重写业务代码。只会越改越复杂。假设任务范围没有定义。你却给它更大的权限。Agent只会探索得更远。所以我更建议以后直接使用下面这个顺序① 当前目录正确吗 ↓ ② Workspace范围合理吗 ↓ ③ Read / Write / Execute正常吗 ↓ ④ 依赖完整吗 ↓ ⑤ Runtime环境正常吗 ↓ ⑥ Task Boundary明确吗 ↓ ⑦ 修改前有Baseline吗 ↓ ⑧ 修改后有Evidence吗这个顺序的价值就在于先排除基础层再进入智能层。而不是一出现失败就把所有问题归因于模型。一个更适合Codex的Bug任务结构真正使用时可以把任务整理成下面这种形式【问题】 登录按钮点击后没有发送API请求。 【检查范围】 src/login src/api/auth.ts 相关测试 【禁止事项】 不要升级依赖。 不要修改数据库Schema。 不要重构无关模块。 【执行顺序】 1. 先复现问题 2. 定位Root Cause 3. 说明准备修改的位置 4. 完成代码修改 5. 运行相关测试 6. 检查Diff。 【完成标准】 输出 - 根因 - 修改文件 - 关键Diff - 执行过的测试 - 测试结果 - 未验证部分。这里真正重要的并不是格式。而是六个词Problem Scope Constraint Action Verification Evidence当这六件事逐渐固定以后Agent的工作方式才会从尝试帮你解决问题。变成按照工程协议完成任务。从“代码生成”到“工程执行”开发者真正要学的东西已经变了AI编程刚开始普及时大家主要比较哪个模型写代码更强谁生成函数更准确谁补全更快但Agent真正进入项目以后问题已经发生变化。因为现在决定最终结果的不只有Model Intelligence。还有Execution Environment。Permission Boundary。Task Design。Verification System。所以未来真正拉开Codex使用差距的很可能不是谁会写更复杂的Prompt。而是谁能建立一套更稳定的Agent工程体系。让Agent知道从哪里开始。允许做到哪里。哪些事情不要做。什么状态才算完成。完成以后拿什么证明。当这些条件建立以后Codex才真正从“会帮你写代码的AI”变成“能够参与工程执行的Agent”。而当Codex再次告诉你Done。你真正应该关注的也不再是这一句话。而是它后面有没有一条完整的Task ↓ Change ↓ Test ↓ Evidence这才是真正可靠的完成。当目录、权限、依赖和验证流程都处理好以后Codex仍然可能出现另一类问题任务越长越容易偏离最初目标。这时候问题已经不再是环境或权限而是上下文污染、任务状态丢失和阶段性验证不足。下一步真正需要解决的是如何让Agent在长任务中持续保持目标一致。
返回列表