DAY 49 / PHASE 6 · 新前沿工程化

推理模型工程

Routing · Thinking Budget · Agentic Reasoning · Trace 利用

2026-06-29 · BigCat

Reasoning 不是「更聪明的模型」,是一个更贵更慢、且会过度思考的旋钮。

前置概念 → ai-ml-daily Day 28 (推理模型)

// WHY THIS MATTERS

o1 / o3 / DeepSeek-R1 / Claude extended thinking 让「推理能力」变成一个可调参数。但工程现实是:大多数团队要么全量打开 thinking(成本和延迟翻几倍,简单任务还更不准),要么从不打开(该用的复杂任务也硬扛标准模型)。这一期不讲 reasoning model 是什么、RL 怎么训出 CoT——那是 ai-ml-daily Day 28 的事。这里只讲四个工程决策:什么请求该路由到 reasoning思维预算怎么给(以及为什么「想得越久越准」是错的)、agentic loop 里怎么调推理且不破坏协议reasoning trace 能信到什么程度。核心反直觉:更长的思维链常常更不准,而你为它付了双倍的 token。

// 01

路由决策:什么请求才值得 reasoning

论断:reasoning model 不是默认档,是按「任务可验证 + 步数不可预先压缩」触发的高成本档。

背景与原理

reasoning model 用 test-time compute 换准确率:把更多 token 花在隐藏的思考上。Snell 等人 2024 的 Scaling LLM Test-Time Compute Optimally(arXiv 2408.03314)给出关键工程结论——最优策略取决于任务难度:简单题上加推理几乎无收益,难题上 test-time compute 才可能比单纯放大模型参数更划算。所以路由的判据不是「重要不重要」,而是三条同时满足才升档:(1) 答案可验证(数学/代码/逻辑有客观对错);(2) 需要多步规划且步数无法预先压成 workflow;(3) 错误成本高于多花的钱和延迟。反过来,检索问答、格式化、分类、改写、抽取——这些一步到位的任务路由到 reasoning 纯属烧钱,还常因「过度思考」掉准确率。

请求进来 │ ▼ ┌─────────────────────┐ 否 │ 答案客观可验证? ├────────▶ 标准模型(快/便宜) └──────────┬──────────┘ │ 是 ▼ ┌─────────────────────┐ 否 │ 多步 & 步数不可预知? ├────────▶ workflow / 标准模型 └──────────┬──────────┘ │ 是 ▼ ┌─────────────────────┐ 低 │ 错误成本 vs 2-5× 开销 ├────────▶ 标准 + 自检 └──────────┬──────────┘ │ 高 ▼ reasoning 模型 + 思维预算分级

实战示例

把路由写成代码层的前置分类,而不是「全量上 o3」:

def route(task):
    # cheap 分类器(标准模型/规则)先判难度档
    if task.kind in ("lookup", "format", "classify"):
        return ("claude-haiku-4-5", None)            # 不开 thinking
    if task.kind in ("math", "plan", "debug") and task.verifiable:
        return ("o3", "medium")                     # 升档 + 中预算
    return ("claude-sonnet-4-6", None)

一个被低估的事实:同一个 reasoning 模型族里,小号开高推理常常打不过大号开低推理,但便宜得多——所以路由表里要同时调「模型大小」和「推理档位」两个维度,不是只调一个。

失败模式:把 reasoning 当「质量保险」全量打开。结果是 (1) 延迟从 1s 涨到 10s+,流式首 token 体验崩塌;(2) 简单任务准确率不升反降(见 §2 过度思考);(3) 账单 3-5×。reasoning 是定向武器,不是默认护盾。
进阶资源 · Snell et al. Scaling LLM Test-Time Compute Optimally, arXiv 2408.03314 · OpenAI Reasoning best practices, developers.openai.com
// 02

思维预算:更长不等于更准

论断:thinking budget 是个有甜区的旋钮——过低欠思考、过高过度思考,两头都掉准确率。

背景与原理

两家给了不同的控制面。OpenAI 用 reasoning_effort(low / medium / high);Anthropic extended thinking 历史上用 budget_tokens(必须 < max_tokens),但在 Opus 4.6 / Sonnet 4.6 上 budget_tokens 已弃用,改成 adaptive thinking——深度交给 effort 自适应,模型自己决定想多久。关键反直觉来自两篇实证:Underthinking of o1-like LLMs(arXiv 2501.18585)发现模型会在思路间频繁跳转、不深挖;而过度思考的反面同样存在——思维链越长,平均准确率反而可能下降,模型陷入重复与自我推翻。换句话说,预算不是越大越好,每个任务类型有自己的甜区,要靠 eval 找,不能拍脑袋给满。

实战示例

# OpenAI o-series:effort 是主旋钮(Responses API)
resp = client.responses.create(
    model="o3", reasoning={"effort": "medium"}, input=task)

# Anthropic extended thinking(3.7 ~ 4.x < 4.6):显式 budget_tokens
resp = client.messages.create(
    model="claude-sonnet-4-5", max_tokens=8000,
    thinking={"type":"enabled", "budget_tokens": 4000},  # 必须 < max_tokens
    messages=msgs)

# 4.6+:budget_tokens 弃用,改 adaptive thinking — 深度交给 effort
thinking={"type":"enabled"}   # 模型自适应,配合 effort 旋钮

工程做法:按任务档位设三级预算(low/medium/high 或 ~1k/4k/16k token),用一组带 ground truth 的题扫一遍,画「预算 vs 准确率」曲线,取拐点而非顶点。多数任务会在中档触顶,高档只增成本不增分。

失败模式:(1) 给简单分类任务塞高预算——触发过度思考,准确率反降、延迟暴涨。(2) budget_tokens 设得≥max_tokens 直接报错;记住思考 token 占用的是同一个输出额度。(3) 在 4.6+ 上还硬塞 budget_tokens 老代码——已弃用,迁移到 effort。
进阶资源 · Anthropic Extended thinking 文档, docs.claude.com/.../extended-thinking · Wang et al. Underthinking of o1-like LLMs, arXiv 2501.18585
// 03

Agentic loop 里的推理:interleaved thinking 与协议坑

论断:在 agent 里用 reasoning,最大的坑不是何时开,而是 tool 调用之间必须原样保留 thinking block。

背景与原理

标准 reasoning 是「想完再答」。但 agent 需要「想一下→调工具→看结果→再想→再调」——这就是 interleaved thinking(Anthropic 用 beta header interleaved-thinking-2025-05-14 开启):模型可以在每次 tool 调用前后插入思考,根据 tool_result 调整下一步。OpenAI o3/o4-mini 则把工具调用原生训进 CoT,让模型在思考中决定何时用工具。这里有个极易踩的协议坑:多轮之间,你必须把上一轮 assistant 返回的 thinking block(连同它的 signature)原样回传。很多 harness 为了省 token 把 thinking 当「废话」strip 掉——结果要么报错,要么割裂了模型的推理链,agent 行为骤然变差。interleaved 模式下思考 token 还会累计跨多个 block,预算语义和单轮不同。

单轮 reasoning: [think ........] → answer agentic interleaved: [think]→tool_use──▶ tool_result ──▶[think]→tool_use──▶ ... → answer ▲ ▲ └── 这些 thinking block 必须随 messages 原样回传(含 signature) strip 掉 = 协议错 / 推理链断裂

实战示例

msgs = [{"role":"user", "content": task}]
while True:
    r = client.beta.messages.create(
        model="claude-sonnet-4-5", max_tokens=8000,
        betas=["interleaved-thinking-2025-05-14"],
        thinking={"type":"enabled", "budget_tokens":4000},
        tools=schemas, messages=msgs)
    msgs.append({"role":"assistant", "content": r.content})  # ← 原样存 thinking+tool_use
    if r.stop_reason != "tool_use": break
    msgs.append({"role":"user", "content": run_tools(r.content)})
    # 关键:不要在这里删 r.content 里的 thinking block

另一个工程要点:reasoning 在 agent 里最值钱的地方是规划与纠错——开局让它想清楚整体计划、tool 失败后让它想为什么失败。中间纯粹的机械 tool 调用不必每步高推理,按需调档。

失败模式:(1) compaction / 历史裁剪时把 thinking block 删了——interleaved 模式下报错或推理断裂;要保留就整轮保留。(2) 把 reasoning model 塞进一个步数固定的流程当 agent 用——那是 workflow,标准模型 + 代码控制流更快更稳(见 Day 3)。
进阶资源 · Anthropic Extended thinking · interleaved thinking, docs.claude.com/.../extended-thinking · OpenAI o3/o4-mini function calling guide, developers.openai.com/cookbook
// 04

Prompt 反模式与 trace 的诚实用法

论断:给标准模型调好的 CoT prompt 搬到 reasoning model 上往往帮倒忙;reasoning trace 也不能当忠实解释。

背景与原理

reasoning model 自带内部思考,外部再让它「think step by step」是冗余甚至有害的——OpenAI 官方指南明确:这类模型偏好简洁直接的 prompt,硬加 CoF 引导和大量 few-shot 反而可能拉低表现(Simon Willison 2025 年那篇 prompting 建议总结得很清楚)。所以从 GPT-4 时代搬来的「让我们一步步思考 + 5 个示例」模板要拆掉。第二个陷阱关于 reasoning trace 的可信度:思维链读起来条理分明,但它不是模型决策的忠实记录——可解释性研究反复显示模型会事后合理化(backward rationalization)。所以别 parse CoT 文本去做下游硬决策,也别因为「思路看着对」就信结论。要信,就用可验证的最终输出(跑测试、对数值、查引用),而不是信过程叙述。

实战示例

# BAD:把 GPT-4 的 CoT 模板原样套给 o3 / extended thinking
"Let's think step by step. Here are 6 examples... Now reason carefully:"
# → 冗余引导 + 大量 few-shot,常拉低 reasoning model 表现

# GOOD:简洁直给,把约束讲清楚,让模型自己想
"修复这个并发 bug。约束:不改公共 API,保持向后兼容。"
# 需要 markdown 时(OpenAI o 系列)在 developer message 首行:
"Formatting re-enabled"

eval 上的反直觉守则:不要假设更长的思考 = 更可信。给 reasoning 输出做评估时,盯客观正确率,别被冗长缜密的 trace 唬住——「想得满满当当却答错」在难题上很常见,本质是用一个不完美的验证器去筛不完美的推理链,错误被「洗」得更自信而已。

失败模式:(1) 把 reasoning model 当成「会解释自己」的模型,拿 CoT 当审计证据——它是表演,不是日志。(2) 继续堆 few-shot CoT 模板,钱花了表现还降。(3) 用 LLM-judge 评 reasoning 时奖励「思路详尽」,等于训练模型过度思考。
进阶资源 · Simon Willison OpenAI reasoning models: advice on prompting, simonwillison.net · DeepSeek-R1(RL 激励推理), arXiv 2501.12948

// 综合实战 · 给你的 agent 加一层「推理路由 + 预算」

把四点串成一个能落地的周末改造:给现有 agent 接上推理分级,而不是全量开或全量关。

  1. 路由层(§1):在 LLM 调用前加一个 cheap 分类器,把请求打成 lookup/format → 标准小模型、math/plan/debug 且可验证 → reasoning。记录每类的命中率。
  2. 预算扫描(§2):对升档的任务类型,准备 10-20 道带 ground truth 的题,扫 low/medium/high 三档,画准确率曲线,取拐点写进路由表。多半你会发现 medium 已触顶。
  3. agentic 接线(§3):若 agent 需要边想边调工具,开 interleaved thinking,并审计你的 message 拼接——确认 thinking block 跨轮原样保留、compaction 不误删。
  4. prompt 瘦身(§4):删掉所有「step by step」引导和冗余 few-shot,改成简洁直给 + 明确约束。A/B 对比瘦身前后。
  5. 诚实 eval:评估只看可验证的最终正确率与 p95 延迟、单请求成本;绝不奖励 trace 长度。对账你会得到一张「准确率 / 成本 / 延迟」三轴表——这就是推理工程的全部决策依据。

做完这套,你对「要不要上 reasoning」就不再凭感觉,而是有一张按任务类型标好档位与预算的路由表——省钱、降延迟,且常常更准。

// ENGLISH GLOSSARY

Reasoning Model
用 test-time compute(隐藏思考 token)换准确率的模型,如 o1/o3、DeepSeek-R1、Claude extended thinking。
Test-Time Compute
推理时(而非训练时)投入的额外算力。Snell 2024:最优分配取决于任务难度。
Thinking Budget
分给内部思考的 token 上限。Anthropic budget_tokens / OpenAI reasoning_effort
Adaptive Thinking
Opus/Sonnet 4.6+ 取代固定 budget_tokens 的机制,深度由 effort 自适应。
reasoning_effort
OpenAI o 系列的推理深度旋钮:low / medium / high。
Interleaved Thinking
tool 调用之间插入思考的模式(Anthropic beta header)。需跨轮保留 thinking block。
Overthinking / Underthinking
过度思考(冗长、自我推翻、降准)与欠思考(思路频繁跳转不深挖)两类失败。
Backward Rationalization
模型先得结论再编理由。故 CoT trace 不是忠实的决策记录。

// 深入思考

如果 reasoning trace 不忠实,为什么把它回传给模型(interleaved thinking)还能提升 agent 表现?
关键区分「对外解释」和「对内工作记忆」。trace 作为给人看的因果解释不可信(事后合理化);但作为模型自己下一步推理的条件输入是真实有用的——它把中间结论缓存进了上下文,后续 token 在它之上继续算。所以 strip 掉会断链(损失工作记忆),而拿它当审计证据会被骗(不是忠实日志)。同一段文本,两种用途,可信度完全不同。
既然存在「预算甜区」,为什么厂商不直接让模型自适应决定想多久,而要暴露 budget/effort 旋钮?
4.6 的 adaptive thinking 正是往「自适应」走。但旋钮仍有价值:(1) 自适应是模型对难度的主观估计,会系统性偏差(简单题也过度想);(2) 生产要的是可预测的成本与延迟上限,纯自适应让 p95 不可控;(3) 不同业务对「准确率 vs 延迟」权衡点不同,需外部强制。所以趋势是「自适应为主 + effort 给上界」,而非纯自动。
路由分类器本身要花一次 LLM 调用。什么时候这层路由反而得不偿失?
当请求分布高度同质(几乎都是同一档难度)时,路由只是徒增一跳延迟与成本——直接定档更好。路由划算的前提是难度分布宽高档显著贵:省下的大模型/高推理调用要远超分类成本。优化手段:用规则/小模型/缓存做分类(亚秒、近乎免费),把昂贵判断留给真正模糊的请求;甚至可以用上游元数据(任务类型、来源)零成本路由。
「短答案常比长答案更准」——这是否意味着我们该惩罚长输出?怎么不把该想的难题也压短?
不能一刀切惩罚长度,否则难题被欠思考。正解是按难度分层:易题压短(防过度思考),难题给够预算(防欠思考),由 §1 的路由 + §2 的预算扫描共同决定。统计上「短更准」很大程度是幸存者偏差——模型在没把握时倾向写更长。真正的杠杆是匹配「思考量 ↔ 真实难度」,而非单调地奖励或惩罚长度。
reasoning model 把工具调用训进 CoT(如 o3)。这对 Day 3 的 harness 设计意味着什么?
意味着「何时调工具」的决策从 harness 部分让渡给了模型内部。好处:模型能在思考中权衡是否需要工具、并行多调;代价:harness 对控制流的可见性下降,permission gate 仍须在执行层物理拦截(模型在 CoT 里「决定」不等于被允许)。设计上 harness 要从「编排每一步」退到「定义边界 + 拦截危险动作 + 兜底循环」,把战术决策交给模型,自己守战略护栏。

// 延伸阅读