1. 当思维链被“藏起来”,对齐工程师到底在防什么
OpenAI 首席科学家 Jakub Pachocki 在《Unsupervised Learning》访谈里抛出一个反直觉判断:思维链之所以不直接展示给用户,核心原因不是商业保密,而是怕被“监督污染”。一旦把推理过程放进产品界面,产品团队迟早会像优化其他输出一样去优化它——让它更礼貌、更简洁、更适合公开展示。而一旦这种训练信号介入,思维链就不再是模型“自然流露”的内部独白,而变成了另一个被对齐过的表演层。对做强化学习和对齐研究的人来说,这等于亲手关掉了唯一一扇能观察模型真实动机的窗户。
这件事和“驾驭工程”(harness engineering)直接相关。Pachocki 在访谈里说得很清楚:harness 的实现本身在很长一段时间里都不该成为限制,我们会得到越来越通用的 harness,能迁移到 coding 之外的领域。换句话说,未来你不需要为法律、金融、医疗各造一套调用框架,Codex 这类系统拿去做非编码任务也已经“挺不错”。但通用 harness 带来一个副作用:模型自主运行的时间跨度变长,中间步骤变多,你能直接看到的推理轨迹反而更少。这时候,怎么在工程上保留“可观察性”,就成了每个接入方要自己解决的问题。
这篇面向关注 AI 对齐与强化学习的读者,交付一套可复制的 Codex 配置骨架(settings.json / config.toml),以及通过 TaoToken 统一 Key/API 通道接入的完整步骤。同时给出验证思维链可见性与监督污染风险的检查动作——不是让你去破解隐藏思维链,而是在你自己的 harness 里建立一套“训练信号与观察信号解耦”的工程习惯。适合谁:正在用 Codex 或类似 coding agent 做长时程任务、又不想在接入层把可观察性弄丢的工程师。
2. TaoToken 前置:统一 Key 与 API 通道为什么先配
在讲 Codex 配置之前,先把接入层理清楚。很多人一上来就改 settings.json,结果模型通道和 harness 配置混在一起,排查时分不清是网络问题、鉴权问题还是配置问题。我的做法是先把 API 通道独立出来,用 TaoToken 做统一入口,这样后面换模型、换 harness 都只动一层。
TaoToken 在这里的角色是统一 Key/API 通道:你拿到一个 Key,通过https://taotoken.net/api这个 base URL 去调用模型,不用在 Codex 配置里散落多个厂商的 endpoint 和密钥。对做对齐实验的人来说,这一点很实际——你经常需要在不同模型之间切换做对比,如果每个 harness 都硬编码一套鉴权,实验记录会非常乱。
具体操作分三步。第一步,去控制台创建 API Key,地址是https://taotoken.net/console,登录后在 API Keys 页面生成。第二步,把 Key 存到环境变量里,不要写进配置文件明文。Linux/macOS 下:
export TAOTOKEN_API_KEY="sk-你的key"Windows PowerShell:
$env:TAOTOKEN_API_KEY="sk-你的key"第三步,确认 base URL 是https://taotoken.net/api,注意这个地址不带任何查询参数。如果你在文档里看到带 UTM 的链接,那是给网页访问用的,API 调用只用纯 base URL。
注意:环境变量方式在 Codex 的某些启动模式下可能读不到,如果你用 systemd 或 launchd 托管,记得在 service 文件里显式声明 Environment。我踩过的坑就是本地 shell 能跑、后台服务读不到 Key,排查了半小时才发现是环境变量作用域问题。
模型对话能力可以先在https://taotoken.net/models这类对话入口验证,确认 Key 和通道没问题,再去配 Codex。如果你打算长期跑编码和 Agent 任务,Coding Plan 页面https://taotoken.net/coding-plan里有针对长时程任务的配额说明,值得先看一眼再决定用哪种调用方式。
3. 可复制配置:Codex 的 settings.json 与 config.toml 骨架
Codex 的配置分两层:一层是编辑器/客户端侧的 settings.json,管 UI 行为、快捷键、文件监听;另一层是 config.toml,管模型通道、harness 参数、工具权限。下面这套骨架是我实测能跑通的最小可用版本,你可以直接复制后改 Key 引用。
先看 settings.json。放在 Codex 的用户配置目录下,Windows 通常在%APPDATA%\Codex\,macOS/Linux 在~/.config/Codex/:
{ "codex.modelProvider": "taotoken", "codex.baseUrl": "https://taotoken.net/api", "codex.apiKeyEnv": "TAOTOKEN_API_KEY", "codex.observeReasoning": true, "codex.reasoningSummaryMode": "summary", "codex.maxAutonomousSteps": 40, "codex.toolApproval": "on-write", "codex.logLevel": "info" }这里几个参数值得展开。observeReasoning设为 true,意思是让 harness 保留推理摘要的接收通道,但注意这不等于你能看到完整思维链——Pachocki 说的隐藏是产品层不展示,harness 层能不能拿到摘要取决于模型侧返回什么。reasoningSummaryMode设成summary而不是full,是刻意的:full 模式在部分模型上会触发额外的对齐过滤,反而让摘要变得不可信。maxAutonomousSteps设 40 是一个保守值,长时程任务可以往上调,但每调高一次,你丢失中间观察点的风险就大一分。toolApproval设on-write表示写文件前要确认,读操作放行,这是防止 Agent 在长任务里跑偏的第一道闸。
再看 config.toml,放在同一目录:
[model] provider = "taotoken" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" model = "codex-latest" timeout_seconds = 120 [harness] max_steps = 40 step_timeout_seconds = 90 enable_reasoning_trace = true trace_retention_days = 7 [tools] allow_read = true allow_write = true allow_shell = false require_approval_for = ["write", "shell"] [logging] level = "info" log_reasoning_summary = true log_full_prompt = falseenable_reasoning_trace = true和log_reasoning_summary = true是这套配置里最关键的两个开关。它们的作用不是让你看到隐藏思维链,而是在 harness 侧记录模型返回的推理摘要,形成一份可审计的轨迹。trace_retention_days = 7是保留窗口,做对齐实验时可以调长,但要注意存储成本。allow_shell = false是默认关闭的,因为 shell 权限在长时程任务里是最容易出问题的——模型可能为了“完成任务”执行你根本没预期的命令。需要时再单独开,并且配合require_approval_for。
提示:config.toml 里的
model字段不要写死具体版本号,用codex-latest这类别名,方便在 TaoToken 侧切换模型时不用改本地配置。如果你要做严格的对照实验,再临时锁定版本。
4. 验证请求:确认通道通、摘要回、轨迹留
配置写完,先做三层验证,别急着跑长任务。
第一层,验证 API 通道。用 curl 直接打 TaoToken 的接口,确认 Key 有效、base URL 正确:
curl -s https://taotoken.net/api/v1/models \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ | head -c 500返回里应该能看到可用模型列表。如果返回 401,检查 Key 和环境变量;如果返回 404,检查 base URL 是不是多写了路径。
第二层,验证 Codex 能通过 harness 拿到推理摘要。启动 Codex 后跑一个最小任务,比如让它读一个文件并总结:
codex run --task "读取 ./README.md 并总结成三句话" --config ~/.config/Codex/config.toml跑完后检查日志目录,应该能看到reasoning_summary字段。如果这个字段是空的,说明enable_reasoning_trace没生效,或者模型侧没有返回摘要。这时候不要急着调reasoningSummaryMode到 full,先确认通道和配置版本。
第三层,验证轨迹留存。在日志里找trace_retention_days对应的文件,确认摘要被写进去了。这一步的意义在于:当你后面发现模型行为异常时,有历史轨迹可以回溯,而不是只能看最终输出。
成功的结果长这样:curl 返回模型列表,Codex 任务正常完成,日志里reasoning_summary有内容且full_prompt为空(因为我们设了 false)。这三条都满足,说明你的 harness 在“可观察性”和“训练信号解耦”这两件事上做对了。
5. 本篇常见错排查:摘要为空、轨迹丢失、权限误开
摘要字段为空。最常见的原因是reasoningSummaryMode设成了none,或者模型侧对当前任务类型不返回摘要。先检查配置,再换一个明确需要多步推理的任务试,比如“分析这个函数的三个潜在 bug”。如果还是空,去 TaoToken 的接入文档https://taotoken.net/doc确认当前模型是否支持摘要返回。
轨迹文件没生成。检查trace_retention_days是否大于 0,以及日志目录是否有写权限。另一个隐蔽原因是log_full_prompt = false时某些 harness 版本会连带跳过摘要写入,这是实现上的耦合 bug,升级 Codex 或显式设log_reasoning_summary = true可以绕过。
shell 权限被意外打开。如果你在 config.toml 里把allow_shell设成 true 又忘了加require_approval_for,Agent 可能在长任务里执行任意命令。排查方法是看日志里的tool_call记录,确认每次 shell 调用都有 approval 标记。没有的话,立刻改回 false。
模型切换后摘要格式变了。不同模型返回的摘要结构可能不一样,如果你的下游解析脚本硬编码了字段名,换模型就会挂。建议在 harness 侧做一层适配,而不是让解析逻辑直接吃原始返回。
长任务中途丢失观察点。这是maxAutonomousSteps设太大导致的。每 10 步左右应该有一个检查点,把当前摘要和状态落盘。Codex 本身不强制这个,需要你在 harness 里加钩子。
6. 把可观察性当成工程习惯,而不是临时调试
Pachocki 在访谈里反复强调一个点:思维链监控的价值在于它没有被直接监督过,所以能泄露模型的真实内部机制。这个逻辑放到工程实践里就是——你的 harness 里那些“没有被产品化训练信号污染”的观察通道,才是最可信的。一旦你为了好看、为了演示去优化它们,它们就废了。
所以这套配置的核心不是让你看到更多,而是让你在接入层保留一个不被优化的窗口。reasoningSummaryMode = summary、log_full_prompt = false、trace_retention_days = 7,这些参数都是在做同一件事:让观察信号和训练信号保持距离。长期跑编码和 Agent 任务的话,Coding Plan 里的配额和长时程说明值得结合自己的任务时长一起看,别等到轨迹把存储撑爆了才想起来调保留窗口。
如果你还没配 Key,从https://taotoken.net/api-keys生成一个,然后按第 2 节的步骤把环境变量设好。接入文档在https://taotoken.net/doc,遇到通道问题先查那里,比在配置里瞎改快得多。