什么是推理

几周前,有人分享了一篇论文,展示了如何从权重未公开的模型中提取推理轨迹。再加上一些关于诱导模型泄露推理轨迹的线上讨论,我出于好奇仔细研究了一下。Twitter 上似乎充满了关于这件事的一知半解和混乱说法,所以这篇文章也许能帮一些人理解到底发生了什么。

隐藏轨迹

推理轨迹通常对我们是隐藏的。我们对此抱怨过,但大多数时候也只能接受。好在权重开放的模型会把它们展示出来;从这些模型的表现看,推理轨迹可能很长,也可能很混乱。这大概也是把它们和通常展示给用户的内容分开的一个好理由。

至少,界面需要能识别这些轨迹。业界已经很擅长把推理轨迹说得特殊又神秘,但它们其实就是文本:模型被训练成在最终答案之前,先把自己的思考作为回复的一部分写进一个草稿区。

GPT-OSS 的 Harmony 回复格式很容易看出这一点:

<|channel|>analysis<|message|>
I need to work this out ...
<|end|><|start|>assistant<|channel|>final<|message|>
The answer is ...
<|return|>

这些标记是特殊 token,但夹在中间的推理内容和最终答案使用的是“同一种文本”(只不过 GPT 的思维链文本读起来确实很有意思)。当模型采样到 analysis 通道 token 时,解析器会把后面的文本路由到一个单独的数据流,并通过 Responses API 暴露出来。对于闭源模型,推测是用一个简单模型来删改并总结这部分内容。

推理强度

有多少预算会用在推理上?早期 API 暴露过推理 token 预算,让人感觉它像是采样过程的一个属性。但实际上,推理强度是写进系统提示词里的。GPT-OSS 会把这句话放进系统提示词:

Reasoning: low

就这样。训练会产生相应的行为,比如让模型输出切换到 analysis 通道的 token 序列。这也解释了为什么改变推理强度会让 KV cache 失效。我猜闭源 GPT 模型把推理强度叫作 “juice”,因为你可以问大多数模型它还有多少 juice。

在 DeepSeek 的 DwarfStar 里,如果开启最高推理强度,系统提示词会加上这段:

Reasoning Effort: Absolute maximum with no shortcuts permitted.
You MUST be very thorough in your thinking and comprehensively decompose the
problem to resolve the root cause, rigorously stress-testing your logic against
all potential paths, edge cases, and adversarial scenarios.

不要思考

因此,推理 token 的去向是一种学出来的约定:模型被训练成不要把草稿内容放进 final 通道。如果你诱导它以为自己正在这个通道里,它就可能泄露 token。我们甚至见过一些旧模型,在关闭 thinking 的情况下,把推理写进 bash 工具,然后把自己的想法 echo 到 /dev/null

所以从某种意义上说,对一些模型来说,唯一“特殊”的行为是不思考。有时这是通过“机械地”移除模型平常用来思考的方式来做到的。在 DwarfStar 里,关闭 thinking 时会预填 </think>,开启 thinking 时会使用 <think>;这两个 token 分别用于关闭和开始思考。GPT-OSS 不会预填,而是让模型自己决定走哪条路。

不过可以推测,有些模型服务 API 在开启推理时会预填开头 token,这样模型就不会自己采样到它;在关闭推理时,也可能阻止模型采样推理 token,因为这很容易被检测出来。这也许能解释为什么一个自定义 think 工具可以诱导模型把一部分推理放到不该去的地方——但只有在原生推理被关闭时才会这样。

有趣的是:这篇博客触发了安全检查

很好笑的是,我没法用 GPT 5.6 terra 给这篇博客做拼写和语法检查,因为它触发了安全过滤。最后只好换成 Kimi。

GPT-5.6-terra 拒绝给这篇博客做拼写检查