第 01 模块 · 2 节

上下文窗口与文件选择

《Codex 进阶实战》01 多文件与复杂任务 · 本节时长 32 分钟

上下文是有限的,得「精打细算」

Codex 每次能「记住、参考」的信息量是有限的——这就是上下文窗口。塞得太多,它记不住重点、容易乱,还更贵更慢。这一节学怎么选择文件、管好上下文

贯穿项目file-lib 里,上下文管理是每天的功课。它已经有好几个模块(stringiopath),如果每次让 Codex 都「读一下整个仓库」,很快就把窗口塞爆。今天这一节,我们用「上下文清单」技巧,给 file-lib 新增一个 date 日期工具模块,让 Codex 只盯它该看的文件。

上下文窗口是什么

上下文窗口 = Codex 在一次任务里能看到的信息上限。你说了什么、它读了哪些文件、做了什么,都算在窗口里。

窗口满了会怎样?

  • 记不住早先的信息(被挤掉了)
  • 判断变差、容易犯错
  • 更贵、更慢

所以,上下文不是越多越好,是越「精」越好。一个直观的理解:上下文就像你在电脑前的一叠资料,能摆下的就那么多。资料摆得越多、越乱,你找重点越慢、越容易看错。让 Codex 高效,就是让它面前「只有它需要的那几页」。


文件选择:别让 Codex 看无关文件

跨文件任务里,最常见的浪费是「让它读整个仓库」或「读一堆无关文件」。

做法:明确告诉它看哪些、别碰哪些。

❌ 「看一下这个项目,帮我改登录」 ✅ 「看 src/auth.ts 和 src/utils/validator.ts,帮我改登录校验」

给它必要的最小文件集,它专注、你省钱。在 file-lib 里,同样是加一个 date 模块,两种问法天差地别:

❌ 「给 file-lib 加个日期工具」(它可能要读全部模块才能确定怎么写) ✅ 「参照 lib/string.js 的写法,新建 lib/date.js,在 index.js 里导出。只需看 lib/string.js、index.js 和 test/string.test.js」

后者把「该参考谁、该改谁、不用管谁」一次说清,Codex 两三页资料就够用。


一个「上下文清单」技巧

动手前,让 Codex(或你自己)列一下:

这次任务需要看哪些文件?
- src/auth.ts(改)
- src/utils/validator.ts(参考)
- 测试文件(验证)
不需要:其余所有

「需要看的」列清楚,「不需要的」说清楚,上下文就精了。这个清单有个好处:你自己在列的时候就会想清楚——哦,其实不用读 string.js,只需要参照它的格式;其实 io.js 跟这个任务没关系。人先想清,Codex 才不乱看。


分阶段喂,别一把梭

一个大任务,别把所有文件一次性塞进去。分阶段喂

第 1 阶段:只给「需求 + 相关代码」让它理解
第 2 阶段:确认方向后,再给「要改的文件」
第 3 阶段:给「测试/验证」,收尾

每阶段只喂当下的必要信息,上下文一直保持干净。拿 file-libdate 模块举例,你可以分三次:

【阶段一】参照 lib/string.js 的导出风格,我想加一个日期模块。
先只给 lib/string.js 和 index.js 的导出部分,说说你会怎么写。
【阶段二】方向 OK。现在新建 lib/date.js,提供 formatDate 和 isWeekend,
并在 index.js 里导出。
【阶段三】再给 test/string.test.js 作参考,为 date 模块写测试,跑一遍。

三次喂,每次窗口都干干净净,Codex 不会把前两步的冗余信息带到第三步。


记不住早期信息怎么办

长任务里,它「忘了前面」是窗口满了。对策:

  • 及时确认:每完成一步,让 Codex 总结一下当前状态
  • 分段推进:别让一个会话无限拉长,分阶段做
  • 必要时开新会话:带上关键结论重新开始

第 3 条很多人不敢用,其实很关键。file-lib 做到后面,如果 Codex 明显「忘了前面定好的模块命名规则」,别硬扛,直接开新会话并带上一句关键约定:

新会话。约定:file-lib 的所有工具函数都用 const fn = (...) => 风格,
每个模块默认导出一个对象,模块命名用 camelCase。
现在给 date 模块加一个 leapYear 判断函数。

把「该记住的约定」写进开场,即使它忘了上一会话,也知道从哪开始。重开会话 ≠ 前功尽弃,而是换个更干净的工作台。


小结

  1. 上下文窗口有限:塞太满会记不住、变贵变慢
  2. 文件选择:只给必要的最小文件集,别喂无关的
  3. 列「上下文清单」:需要的看、不需要的说清
  4. 分阶段喂,别一把梭;记不住就分段/重开
练习给 file-lib 加 date 日期工具模块。①三步走:先列「上下文清单」(该参考 string.js、该改 index.js、不用管其余);再分三个阶段喂给 Codex(先给参考文件让它理解 → 再让它新建 date.js 并导出 → 最后写测试验证)。②怎么判断做对了:每个阶段 Codex 都在读你指定的最小文件、没主动去翻无关模块、最终整体测试全绿且 index.js 能导出 formatDate。③卡住了怎么办:如果 Codex 一口气读了不该读的文件,打断它说「停,只按我的清单看」;如果窗口塞爆导致它忘了开头约定,开新会话并把约定写进开场。

常见坑:让 Codex 自己决定「读哪些文件」

最常见的浪费是把文件选择权交给 Codex。你以为说句「你看看该读啥」省事,结果它保守起见把整个 src/ 都读了,窗口瞬间满了大半,后面的判断质量直线下降,还多花了钱。

避坑办法:文件选择永远是你先做主,Codex 只在你给的范围内活动。给它一个「白名单」思维——它只能从你点名的文件里选,看不到名单外的:

只看这几个文件,别的不要读:
- lib/date.js(新建)
- index.js
- lib/string.js(参照风格)
其他任何文件都不要主动打开。

当你发现 Codex 开始「主动探索」的时候,说明边界松了,立刻用这句话收紧。上下文管理不是 Codex 的事,是你的责任。 省下的每一分上下文,都是为「关键判断」留的余量。


下一节,讲处理大型代码库的技巧。