Reasoning

大模型里的 effort 设置,到底在控制什么?

Mason08 MIN

推理模型通常都会提供不同的 effort 选项,例如 low、mediumhigh。不同产品对它的命名并不完全一致,有的称为“思考力度”,有的称为“推理等级”,也有一些模型 API 将它表示为一个 0 到 1 的连续数值。虽然形式有所不同,但它们表达的都是同一个概念,即允许模型在回答问题前投入多少计算资源进行推理。

大多数用户对 effort 的理解都很直观。调高以后,模型会多思考一段时间,回答速度有所下降,但通常能够得到更稳定的结果;调低以后,模型会更快给出答案,只是推理过程相对简化。

不过,这种思考强度究竟意味着什么?直觉上,人们容易认为模型在高 effort 下切换到了另一套更强的参数,或者临时获得了更多知识。事实上,大多数推理模型并不是这样工作的。

对于绝大多数推理模型而言,effort 调整的是推理阶段的计算预算,而不是模型本身。模型仍然是同一个模型,参数也没有发生变化,但它可以在生成最终答案之前消耗更多推理 token,并执行更长、更谨慎的推理过程。随着 effort 的提高,模型往往会探索更多可能的解法,对关键步骤进行额外验证,并在发现矛盾时主动回溯和修正已有推导。相反,在较低的 effort 下,模型则会倾向于尽快确定一条较为可信的推理路径,以更少的计算完成回答。

从这个角度来看,effort 更接近于一种计算预算,而不是能力开关。它不会让同一个模型突然拥有更多知识,也不会让模型切换到另一种智能水平,而只是决定模型能够在一次回答中投入多少计算资源去完成推理和验证。因此,高 effort 与低 effort 的差异,本质上并不在于模型本身,而在于模型愿意为这一次回答花费多少计算资源。


推理模型究竟多做了什么?

普通语言模型的主要任务是预测下一个 token。给它一个问题,它会根据训练中学到的文本规律,直接续写一个看起来合适的答案。推理模型依然遵循同样的生成机制,只是后训练让它更倾向于在得出结论前写出中间过程:拆解问题、尝试路径、检查结果,必要时推翻前面的判断再来一次。

数学和代码是这类训练最常见的场景,因为答案往往可以自动验证。一道数学题能用符号工具检查;一段程序能编译、运行测试。模型生成若干种解法,最终答案正确就获得较高奖励,错误则得不到奖励。经过大量尝试,它逐渐学会了一件事:对难题直接猜答案,成功率不高;把问题拆开、检查计算、修正错误,反而更容易拿到正确结果。

这就是推理模型看起来会「自我纠错」的原因。它不是真的像人一样意识到自己犯错,而是在生成过程中发现当前路线与约束不一致,于是继续生成一段修正性的文本。DeepSeek-R1的公开研究表明,仅利用可验证的结果奖励,也能把基础模型训练出较长的推理轨迹;格式奖励则帮助它稳定地区分推理与最终答案。

这类模型的能力有一个很朴素的代价:它需要生成更多 token。一次普通回答可能只需几十个 token;一次复杂推理可能会先生成几百、几千个 token 的中间过程,再输出最后几句话。更多 token 意味着更高的延迟、更高的调用成本,以及更多计算资源。effort 设置就是在这笔账上动手。

同一个模型,怎样表现出不同的 effort?

从公开模型的实现看,界面中的 effort 菜单通常会转成输入中的控制信息。比如,系统消息可能附带“Reasoning effort: low”或“Reasoning effort: high”。模型看到这段信息后,按对应方式生成后续内容。

看起来只是一句话,实际前提很高。随便给一个没有受过相关训练的模型加上「请高 effort 思考」,通常不会有什么稳定效果。它也许多写一些解释,也许完全忽略指令,甚至只是把本来简洁的答案写得更啰嗦。

有效的 effort 控制依赖于训练。模型必须见过足够多的例子,知道低 effort、正常 effort 和高 effort 分别意味着什么:低档时如何快速收敛,高档时哪些问题值得继续检查,什么时候应该停止。OpenAI 的gpt-oss开放权重模型公开支持低、中、高三档 reasoning effort,用它在延迟和推理深度之间取舍;这至少说明,effort 可以作为模型明确接受的一项控制条件。

RULE

界面上的菜单只是入口。它像汽车的挡位杆:驾驶者拨动挡位,真正决定车怎么跑的,是发动机和传动系统已经学会配合这几个挡位。对于推理模型来说,这套「传动系统」就是后训练得到的条件化推理能力。

训练时,如何把「多想一点」教给模型?

一种做法是监督微调。训练者准备不同长度、不同风格的答案,并在输入里标注相应的模式。同一类问题可以有两种目标输出:低 effort 的目标只保留必要步骤和结论;高 effort 的目标则会展示更完整的拆解、验证和错误检查。模型不断见到「同一种标签后面应出现哪种答案」,就会逐步学会两者之间的对应关系。

Qwen3提供了一个比较直观的公开例子。它把 thinking 和 non-thinking 两类数据放进同一训练流程:前者包含较长的推理过程,后者直接给出答案。训练完成后,同一个模型既能展开推理,也能切换到快速答复模式。

另一种做法发生在强化学习阶段。训练目标不只看任务是否做对,还会把生成长度纳入奖励。可以把它粗略理解为:

总奖励 = 答对的收益 − 每生成一个推理 token 的成本

低 effort 时,每多生成一个 token 的「成本」更高。模型若能用较短的过程解决问题,会得到更高奖励。高 effort 时,这项成本更低,模型便不会因为担心长度而过早收尾,可以继续检查边界条件、验证计算,或者尝试另一条路线。

Thinking Machines Lab 的Inkling就公开描述了类似方法:训练样本在系统消息中带有期望的 effort 水平,同时按 effort 调整每个生成 token 的成本。它采用的是连续数值,而不是固定的低、中、高三档,因此同一模型可以在较细的预算范围内调整输出长度。

  1. 01 / 监督微调

    为同一类问题准备不同长度的目标输出,并在输入中标注 effort;模型逐步学会标签与答案风格的对应关系。

  2. 02 / 强化学习

    总奖励同时考虑正确率与长度成本;低 effort 时每多生成一个 token 代价更高,高 effort 时允许继续检查与回溯。

  3. 03 / 两者叠加

    监督微调先教不同 effort「长什么样」;强化学习再把正确率、长度和成本校准到可用平衡点。

<think> 标签的作用

推理模型常把中间过程写在 <think>...</think> 中。这个格式很显眼,仿佛模型看到 <think> 就进入了一个特殊的「思考模式」,实际情况没有那么神秘。

语言模型先把文本拆成 token,再根据已有 token 预测下一个 token。对它而言,<think></think>、汉字、代码符号和标点都是上下文中的符号。<think> 本身不是一个函数,也不会启动某个隐藏模块。模型之所以在标签之后倾向于写较长的分析,是因为训练数据反复呈现了这样的结构:

问题
<think>
分析、尝试、验证、修正
</think>
最终答案

久而久之,模型学到一个稳定的分布:<think> 后面通常接推导性的内容,</think> 后面通常接面向用户的答案。标签的作用,是给模型一个明确的阶段信号,让它知道当前应该生成什么类型的文本。

这和文档里的「正文」「结语」很像。标题不会替作者完成写作,但它能把接下来的写作导向某种结构。<think> 也不会创造推理能力;它只是让已经通过训练学到的推理行为,在合适的位置展开。

标签还有工程上的价值。服务端或界面可以据此把推理过程和最终答案分开处理:推理段可以隐藏、单独记录或计入不同的预算,用户则只看到整理后的答复。于是,模型可以先完成一大段内部工作,再交付简短答案,而不是把整份草稿都抛给用户。

在训练中,格式奖励会帮助模型更稳定地遵守这一边界。系统除了检查答案是否正确,还检查推理是否被放进指定标签中。这个奖励负责规范输出结构;模型能否真正解决问题,主要仍取决于正确性奖励、训练数据和模型本身的能力。

BOUNDARY

<think> 解决的是「推理段在哪里」的问题,effort 解决的是「这段推理可以花多少预算」的问题。两者常常同时出现,但并不是一回事。

为什么关闭 <think>,有时真的能让模型直接回答?

有些模型在关闭 thinking mode 时,并不会给模型发送一句「请不要思考」。更直接的做法是预先在助手回复的开头填入:

<think></think>

从模型的上下文看,推理段已经开始并结束了。接下来它会更倾向于直接生成最终答案。Qwen3的公开说明就展示了类似的聊天模板控制方式:训练时先让模型同时见过思考和非思考格式,推理时再通过模板把它放进相应的回答阶段。

这种方法比自然语言指令更强,因为它不只是建议模型「回答简洁一点」,而是直接改变了它继续生成时所处的上下文位置。不过,它仍然不是万能开关。对没有学过该格式的模型,加入标签可能毫无作用;对已经支持这套格式的模型,它也只是引导输出形态,并不能保证每一次回答都又短又好。

更重要的是,展示出来的 <think> 内容不应被当作模型全部内部计算的逐字记录。它是一段受训练目标、格式约束和产品策略影响的文本。它有助于分析和调试,但不能自动证明模型的每一步都可靠,也不能代替外部验证。

低 effort 不是截断高 effort 的回答

控制推理长度最直接的办法,是设一个最大 token 数。超过这个数,模型就停止生成。这样确实能限制成本,却很容易伤到结果质量。

设想模型正在解一道多步骤题,推理写到一半被强制停止。它可能还没得到结论,也可能为了在截止前结束,仓促写出一个答案。这个过程与「要求作者写一篇 300 字摘要」完全不同:摘要需要先抓重点,再组织表达;强行截断只是在 300 字时拔掉键盘。

成熟的 effort 机制会区分两层控制。

RULE

第一层是模型学到的推理策略:低 effort 时尽量优先处理关键条件,避免展开不必要的分支;高 effort 时愿意做更充分的检查。第二层才是外部硬预算,例如最大推理 token 数、最大等待时间或最大调用成本。

有些训练方案还会专门让模型适应硬预算。做法是把正常推理过程在随机位置截断,然后保留最终答案,让模型学习在推理段被关闭后,尽量完成后续答复。这样,外部预算不再只是一次生硬的中断,模型也更可能在有限空间里交付一个可用答案。

高 effort 值不值得开到最大?

不一定。

对信息提取、格式转换、句子改写、生成固定模板这类任务,长推理往往没有必要。模型多花几十秒进行自我检查,未必比直接回答更好。相反,它可能带来更高延迟和成本。

高 effort 更适合那些无法一眼看清的任务:多步数学推导、复杂代码调试、带有许多约束的计划、长文档中多处信息的交叉核对,或者一次出错代价很高的决策支持。即便在这些任务里,也不能把高 effort 当成正确率保证。它提供的是更多搜索和验证机会,而不是免错承诺。最终答案仍可能受问题表述、训练覆盖、工具可用性和外部事实变化的影响。

  1. 01 / 先低后高

    先用低或中等 effort 跑一遍;结果可快速验证时,不必继续加预算。

  2. 02 / 遇阻再升

    出现矛盾、测试失败、约束很多,或需要严谨复核时,再提高 effort。

  3. 03 / 外部分担

    高风险任务应把 effort 与检索、代码执行、计算工具或人工审查结合,而不是单独承担可靠性。

延伸阅读

  1. Controlling Reasoning Effort in LLMsSebastian Raschka

    系统梳理 reasoning effort 的控制方式、训练信号与工程取舍,适合作为本主题的主线延伸。

  2. DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via RLDeepSeek · 2025

    仅利用可验证结果奖励,也能训练出较长推理轨迹;格式奖励则帮助稳定区分推理与最终答案。

  3. gpt-oss Model CardOpenAI

    开放权重模型公开支持低、中、高三档 reasoning effort,用于在延迟与推理深度之间取舍。

  4. Qwen3 Technical ReportQwen · 2025

    把 thinking 与 non-thinking 数据放进同一训练流程,并通过聊天模板在推理时切换回答阶段。

  5. Introducing InklingThinking Machines Lab

    训练样本携带期望 effort,并按 effort 调整每个生成 token 的成本;支持连续预算而非固定三档。