使用 Codex 时,怎么少烧 Token - 项目踩坑经历

36 阅读8分钟

用 Codex 时最容易误判的一点是:你以为 Token 都花在写代码上,其实很多时候花在反复验证、跑偏调试和无边界探索上。

下面这些是项目里烧过额度后总结出来的,按消耗从高到低排。

先看结论

  1. UI 大改时,限制视觉验证次数。 页面没成型前,反复截图和浏览器检查很容易烧掉最多 Token。
  2. 复杂技术路线先做最小验证。 例如我项目中不确定 WASM、WebGPU、WebGL 哪条路能走通时,先写探针,不要直接改正式项目。
  3. E2E 不要一开始全量跑。 先跑相关页面和相关用例,收尾时再考虑全量。
  4. 小任务不要开 subagent。 大范围阅读和并行审查适合拆,小 bug 和小组件直接在当前线程做。
  5. 多语言 i18n 先冻结非目标语言。 重构和验证阶段先维护简体中文,其他语言后补。
  6. 长日志只看关键部分。 先看错误摘要、关键行和最后几十行,不要把整段输出吞进上下文。
  7. 任务边界写清楚。 不升级依赖,不改无关页面,不顺手重构样式系统。

1. UI 大改时,别让 Codex 反复做视觉验证

这是我见过最容易烧 Token 的场景。

我把一个 Vue3 网页项目的 UI 从 Vuetify 换成 Tailwind + shadcn-vue + Lucide。这不是换几个按钮,而是把底层组件体系一起换掉。表单、弹窗、菜单、图标、布局间距,全都要重新对齐。

问题出在我没有限制验证方式。Codex 改一点就打开页面看一下,再修一点,再截图,再调样式。首页还没完全迁完,5 小时额度已经烧掉了 90%。

后来我给这类任务加了一句:

先完成代码迁移,不要边改边做视觉验证。视觉验证只在页面完成后,且你认为有必要时,申请执行一次。

这句话很有用,后面再改其他页面,烧的 Token 明显减少一半以上。UI 大改时,真正贵的往往不是写代码,而是反复打开页面、截图、比较、解释截图。

页面还没成型时,看一次页面的价值不高。等结构迁完,再做一次视觉验证,通常更划算。

2. 技术路线不确定时,先做最小验证

复杂重构不要一上来就进正式项目。

我之前想用 onnxruntime-web 替代 OpenCV-DNN,在浏览器里加载一个 AI 微模型识别形状。看起来只是换个推理方案,实际问题很多,AI 能把 WASM、WebGPU、WebGL 都能讲出理由,且坑不一样。

WASM 比较稳,也比较容易拿下载进度,但速度不够理想。WebGPU 推理更快,但模型下载进度不好处理。WebGL 又涉及兼容性和包体问题。

我一开始直接让 Codex 在项目里改。结果它在几条路线之间来回试:改加载逻辑、改进度条、改 fallback、再修类型错误。5 小时剩余额度用光了,测试结果却是不能用!。

更好的做法应该是先写探针:

先不要修改正式项目。请创建一个最小验证脚本,只验证三件事:
1. onnxruntime-web WebGPU 能否成功加载模型
2. 是否能拿到模型下载进度
3. WASM 与 WebGPU 的加载时间差异大概是多少
验证完后只给结论和推荐路线。

路线没定前,业务代码越改越乱。先用最小验证把路探清楚,再回到项目里改,反而更快。

这类任务还可以加一个停止条件:

如果连续两次尝试仍失败,停止并总结原因,不要继续猜。

3. 不要一开始就跑全量 E2E

E2E 测试 UI 很有用,但不要太早全量跑。

比如你只是改登录页按钮文案,或者修一个表单校验逻辑。Codex 如果顺手跑完整 Playwright,失败的可能不只是登录页。订单页、设置页、权限页都可能因为环境、数据或旧问题失败。

这时任务会被拖偏。你本来只是想改一个页面,最后却变成分析整套系统的测试日志。

可以这样说:

只运行与当前页面相关的测试。不要运行全量 E2E;除非相关测试通过后你认为全量测试是必要的,再说明理由并等待确认。

相关测试通过之后,再决定要不要全量跑。这个顺序更省,也更容易判断失败是不是你这次改出来的。

4. 小任务不要开 subagent

subagent 不是省 Token 的默认选项。

它适合大范围阅读和并行审查。比如一个大 PR,你可以让几个 subagent 分别看安全、测试、性能和可维护性。它们各看各的,最后汇总,值得。

但如果只是修一个表单校验 bug、改一个 Vue3 组件、调一个页面样式,就没必要拆。每个 subagent 都要读上下文、跑命令、总结结果,主线程还要再合并一次。

我一般用这个判断:

这个任务范围很小,请直接在当前线程完成,不要使用 subagent。

或者写得更明确一点:

只有当任务需要并行阅读多个互不依赖的模块时,才使用 subagent。否则保持 inline execution。

能由一个人连续做完的任务,不要开 subagent。需要几个人分头看、最后汇总判断的任务,再开。

5. 多语言项目先冻结非目标语言

多语言项目也很容易扩散。

Vue3 项目里经常有 locales/zh-CN.tsen-US.tsja-JP.tsko-KR.ts。你本来只是想改一个中文文案,或者验证一个交互,Codex 可能会顺手同步所有 locale。

然后测试又因为某个语言缺 key 失败。它继续修,继续补,任务越来越大。

如果这次只是重构结构、验证交互或先跑通中文,可以直接说:

本次 i18n 只维护简体中文,其他语言保持不变。非中文 locale 引起的测试失败可以记录,但不要修。

这不是永久忽略其他语言,只是控制变量。功能稳定后,再统一补齐翻译。

6. 控制日志、截图和测试输出长度

长输出会占上下文,也会带偏判断。

终端日志、测试失败、页面 DOM、截图说明,都不要一上来给全量。先让 Codex 看关键部分,判断是否需要继续展开。

可以这样说:

如果命令输出很长,请先只读取关键错误行和最后 80 行。不要把完整日志放进上下文,除非需要继续定位。

或者:

先根据错误摘要判断问题范围;如果需要完整日志,再说明原因。

截图反馈也一样。不要只说“页面不对”。最好说清楚哪个元素、哪个状态、你希望它怎么变。

7. 把任务边界写死

很多 Token 是被“顺手”花掉的。

顺手升级依赖,顺手重构工具函数,顺手调整全局样式,顺手把无关页面也改了。每一件事看起来都合理,加起来就会让任务变大。

新手用 Codex,最重要的是先把范围压住:

只修改完成这个任务所必需的文件。不要升级依赖,不要重构无关代码,不要调整全局样式系统。

大任务也要切小。不要说“重做后台管理系统”,可以先说“只迁移用户列表页,保持功能不变”。能验收的小任务,才容易控制额度。

可用的提示词

下面这段可以放在任务开头。经常用的话,也可以整理进项目的 AGENTS.md

请优先控制 Token 消耗:
1. 先阅读相关文件并给出简短计划,不要直接大范围修改。
2. 只修改完成任务必需的文件,不要升级依赖,不要重构无关代码。
3. UI 任务先完成代码修改,视觉验证只在页面完成后且有必要时申请执行一次。
4. 测试先运行相关用例,不要默认运行全量 E2E。
5. i18n 默认只维护简体中文,其他语言冻结;相关测试错误可先记录。
6. 如果日志很长,先读取关键错误行和最后 80 行。
7. 如果连续两次尝试仍失败,停止并总结原因,不要继续猜。

最后

省 Token 不是少用 Codex,而是别让它在不确定、无边界、低价值的循环里空转。

先把范围说清楚,把验证放到合适的位置,把大问题拆成小验证。Codex 还是照样干活,只是少走很多弯路。