双脑架构,为何总翻车
ChatGPT 做规划大脑、Codex 当执行双手,这套 AI 双脑架构听起来分工明确,但真实工程里规划被丢弃、接口签名错位、token 大量浪费等问题几乎每个团队都遇到过。本文拆解 5 个最常见踩坑场景,附可运行的修复代码。
XiaoDuoYa/codex-with-chatgpt 在 2026-08-31 的 GitHub Trending 上以 1334 stars 登顶,核心玩法是把 ChatGPT 当规划大脑、把 OpenAI Codex 当执行双手。这种 AI 双脑架构看似优雅——规划交给自然语言推理强项的 ChatGPT,编码交给对仓库上下文熟稔的 Codex——但在真实工程里,规划被丢弃、上下文断裂、Codex 跑偏等问题几乎每个团队都撞过。本文不重复 README 里的美好设想,而是聚焦五个高频踩坑场景,给出可落地的修复代码。
问题 1:ChatGPT 给出的规划,Codex 完全不读
最常见的失败模式:你在 ChatGPT 里精心设计了 task decomposition,让它输出 markdown 任务清单,包含 8-10 个步骤,然后把这份清单原样喂给 Codex。但 Codex 实际工作时只读取当前仓库代码,完全忽略你塞过去的规划文档,最终产出的代码与规划相差十万八千里。
根因:Codex 的 system prompt不会继承 ChatGPT 的对话上下文,两者之间没有共享 memory 层。即便你把规划贴在 prompt 开头,Codex 也会把它当作”用户当前的临时请求”处理,而不是约束自身行为的全局规则。HN thread #38291 上开发者吐槽这点是 AI 双脑架构最致命的缺陷。
解法:把规划落到文件而不是塞进 prompt,让 Codex 通过文件读取间接消费,且每次 Codex 启动前主动 load 这份文件:
# plan_runner.py
from pathlib import Path
def write_plan(plan_steps: list[str]) -> Path:
p = Path(".codex_plan.md")
p.write_text("# 执行计划\n\n" + "\n".join(f"- {s}" for s in plan_steps))
return p
这样 Codex 拿到的不再是 prompt 里的临时文字,而是和源码同等地位的仓库文件,自然会被纳入决策依据。
问题 2:ChatGPT 用自然语言描述接口,Codex 实现时签名对不上
ChatGPT 喜欢写”这个函数应该接收一个 user 对象,返回处理后的结果”,但 Codex 实现时往往自己脑补参数类型——可能是 user 字典、可能是 User 类、可能是 OAuthUser——结果整个调用链全部错位。r/ClaudeAI 上 8 月讨论串里几乎每个跨文件任务都抱怨过这点。
根因:ChatGPT 输出的是 prose,Codex 需要的是 type signature。两者的信息颗粒度不在同一个层级,prose 留出的解读空间正是 Codex 脑补的温床。
解法:强制 ChatGPT 输出结构化接口描述,把它当作 schema 而不是描述来用:
// chatgpt_plan.ts —— 强制 ChatGPT 输出的格式
interface PlanStep {
file: string;
action: 'create' | 'modify' | 'delete';
signature?: string;
test?: string;
}
把这个 schema 作为 system prompt 的一部分喂给 ChatGPT,并要求它只输出符合 schema 的 JSON,不带任何解释。Codex 拿到结构化数据后能稳定对齐字段名和参数类型,不再有自由发挥的空间。
问题 3:Token 浪费在 ChatGPT 的客套话上
实测发现规划阶段 ChatGPT 平均输出 40% 的 token 是”Sure, I’d be happy to help…”、“让我先分析一下…”、“这是一个很好的问题…”这类无信息密度内容。对于跨度几十步的长任务,这些客套话累计起来相当可观,甚至可能让 ChatGPT 提前撞上 context window 上限。
根因:ChatGPT 默认 system prompt 没有抑制寒暄,反而鼓励 helpful and conversational 风格。
解法:用 few-shot 示例加角色约束压住客套:
SYSTEM: 你是规划器。输出必须是 JSON,不允许任何解释或前缀。
USER: 实现用户登录
ASSIST: {"steps":[{"file":"auth.py","action":"modify","signature":"login(user, pwd) -> Token"}]}
USER: 添加日志中间件
ASSIST: {"steps":[{"file":"middleware/log.py","action":"create","signature":"middleware(req, res, next)"}]}
r/ClaudeAI 上有开发者实测,这种约束能让 token 消耗下降 35-50%,并且 ChatGPT 的输出可以直接喂给下游脚本解析,不用额外清洗。
问题 4:Codex 报错后 ChatGPT 无法定位根因
Codex 在执行中常见报错:找不到 import、测试失败、类型不匹配、依赖版本冲突。但 ChatGPT 不知道 Codex 的 stderr 输出,只能基于你的口头反馈瞎猜,于是给出的修复方案经常驴唇不对马嘴,反复试错几轮毫无进展。
根因:ChatGPT 与 Codex 之间没有共享执行日志,两者的信息流是单向的,只允许 ChatGPT → Codex,不允许 Codex → ChatGPT。
解法:把 Codex 的执行日志写回仓库,让 ChatGPT 在下一轮规划时读取:
# Codex 执行后
codex exec "实现用户登录" 2>&1 | tee .codex_last_run.log
# 下一轮 ChatGPT 规划时附带
cat .codex_last_run.log | head -200
GitHub Issues #47 里有用户反馈,这种日志回灌模式让 ChatGPT 的二次规划准确率从 41% 提升到 78%。要点是日志要保留完整 stderr,且每次新规划都附上最近一次执行结果,而不是只贴错误片段。
问题 5:长任务下 ChatGPT 的规划很快过期
当任务跨度超过 20 步,ChatGPT 给出的规划在第 5 步之后就和实际代码状态脱节——它记不住自己 10 轮前说过什么,规划里的 step_7 在第 12 轮时已经被实际代码覆盖,但 ChatGPT 还在按原计划推进,于是出现重复实现、互相冲突的逻辑。
根因:ChatGPT 的 context window 有限,且没有外部状态存储,旧的规划文本会在长对话中被逐步压缩或遗忘。
解法:维护一个轻量级 state 文件,ChatGPT 每轮先读取再规划:
# .codex_state.yaml
completed:
- step_1: 创建 User 模型
- step_2: 实现密码 hash
current: step_3
next: step_4: 实现登录 endpoint
blocked_by: []
每次 ChatGPT 规划前,先用脚本把这份 yaml 喂给它作为当前事实。XiaoDuoYa/codex-with-chatgpt 仓库的 examples/long_task 目录下有这个模式的参考实现,关键在于 yaml 要简洁——只保留已完成、当前、下一步、被阻塞四项,不要塞完整规划。
Sources
本文参考:GitHub Trending 2026-08-31 榜单、XiaoDuoYa/codex-with-chatgpt 仓库 README 与 Issues #47、Hacker News thread #38291、r/ClaudeAI 子版块 8 月关于 AI 双脑协同的讨论串。