Chapter 04 · 推理

推理:用 token 换准确率的艺术

第 03 章讲了记忆把经验沉淀下来;推理是认知功能轴上"想清楚"的一格,决定 token 花在思考还是行动。这一章把这一格做深:显式推理本质上是一种花 token 买准确率的策略,本章每一节都在回答同一个工程问题——这一次的边际准确率,值不值这一次的边际 token 与延迟。

本章你将建立的 schema

  • CoT 为什么管用:中间 token 是把一次前向算不完的多步计算"串行化"的草稿纸;以及它何时反伤(言语遮蔽,最高掉 36.3%)。
  • extended thinking 的计费与控制面:隐藏/摘要 ≠ 省钱,你为每个 thinking token 付费;Opus 4.7/4.8 是 adaptive,手动设 budget 会 400 报错。
  • 复杂度路由 vs 级联:5–60x 价差驱动路由,但错路是隐藏成本;级联自纠错却累加延迟。
  • 并行探索(自洽性 / Best-of-N / ToT / 编排者-工作者)如何用 token 买方差缩减;以及假设驱动调试如何把"抽盲盒"变成根因修复。
花 token 买准确率 推理 = 推理时算力策略 04.2 CoT 草稿纸·可反伤 thinking budget·计费 04.3 路由 / 级联 5–60x 价差 04.4 并行探索 投票·BoN·ToT·多智能体 04.5 假设驱动调试 观察→假设→实验
图 04.1本章的五节挂在同一个透镜上:每种推理技术都用推理时算力换准确率。注意:Anthropic 多智能体 Research 系统里,单是 token 用量就解释了约 80% 的质量方差——所谓"推理更强",绝大部分是"算力花得对、花得够",而不是某种神秘的智慧。

04.1推理导论:先想清楚,才能做对

推理是把目标转成"可验证计划"的那一层;落到机制上,显式推理是一种花 token 的策略——它用推理时算力买准确率,工程问题永远是边际准确率值不值边际 token。

为什么需要它

面对"agent 一上来就乱动工具、做错方向",最自然的反应是"换个更聪明的模型"。这个反应抓错了杠杆。真正缺的不是模型能力,而是在动手之前先把目标拆成可验证计划的那一步。第 01 章的认知功能轴把推理单列成一格,正因为它和感知、记忆、行动一样是一个可单独施加约束的环节——而约束的方式,全都是"在哪、花多少 token 去想"。

底层机制(比"先想后做"深一层):显式推理不是一种风格偏好,而是一种消耗 token 的算力策略。本章五种技术——CoT、路由、自洽性、Tree of Thoughts、假设驱动调试——无一例外都在用推理时算力买准确率。这把统一透镜让选型变得可计算:每一次"要不要想得更深、采更多样、拆更多子任务",都等价于"边际准确率 ÷ 边际 token 与延迟"是否划算。Anthropic 在多智能体 Research 系统里把这点量化到极致:token 用量单独就解释了约 80% 的性能方差——质量的绝大部分来自"在对的分解上花了足够算力"。这一句把后面四节串成一条线。

表 04.1 · 推理这一格,到底在买什么
痛点设计回应它换来的代价
多步问题一次前向算不出,直接答错CoT:把中间步骤显式写成 token每题固定多花一段 thinking token(约 3–5x)
简单题用顶配模型,贵且慢复杂度路由:分级派给最便宜可胜任的模型多一个会漂移的分类器,错路静默降质
单次采样是高方差估计,时对时错并行探索:采 N 条路再聚合(投票/验证/搜索)选中本章主线——N 倍 token,且要任务可聚合
调试时凭直觉乱改、改了又退化假设驱动调试:观察→假设→实验→结论多几轮真实执行的往返,但拿到可解释的根因
想一想

一个团队把同一个 agent 的所有任务都默认开 extended thinking,准确率确实涨了,账单也涨了 4 倍。Leader 说"贵但值,毕竟更准"。按本章透镜,这个判断哪里太草率?

展开答案(先停 10 秒再点)

"全局开 thinking"把一个逐任务的边际决策当成了一刀切。准确率的涨幅不是均匀分布的——多步数学/逻辑题边际收益大,而感知型 / 隐式模式 / 异常密集的任务上 CoT 会反伤(04.2 量化到最高掉 36.3%)。正确做法是按任务类型给 CoT 开关分档(gate by task type),把 token 花在边际准确率高的那部分上,而不是无差别地为所有任务付 4 倍。

04.2CoT 与 extended thinking:草稿纸、计费与反伤

CoT 管用是因为自回归模型每个 token 只能做有限计算,中间 token 充当草稿纸、把多步计算串行化;Anthropic 把它落成 thinking 块——但隐藏/摘要不等于省钱。

为什么需要它

"让模型一步到位给答案"在多步问题上系统性地失败,因为一次前向传播能做的计算量是有界的。CoT(思维链,Wei 等 2022)的本质不是"提示技巧",而是给模型一块草稿纸:把一次算不完的计算拆成跨多个 token 的串行步骤。Anthropic 把这件事做进了 API——extended thinking 让模型在专门的 thinking 块里先推理,再给出可见答案。

底层机制(计费是最反直觉的一点):thinking 块由 budget_tokens 限定,且必须严格小于 max_tokens,否则请求报错。关键计费事实:你为每一个 thinking token 付费,即使 Claude 4 只回一段由更便宜模型生成的摘要,或在 Opus 4.7/4.8 上把 thinking 字段设为空、display 设为 omitted 只留一个加密 signature。所以"隐藏/摘要 = 省钱"是错的——omitting 只省流式延迟,不省成本。在最新模型上 thinking 是 adaptive 的:深度由模型自己决定,手动设 budget 直接 400 报错;控制面从"你设预算"反转成了"模型自己定速"。提示层面,高层指令"think deeply and try multiple approaches"胜过逐条规定"step 1… step 2…",因为过度约束推理轨迹会抽掉模型自己需要的自由度——这正是第 01 章双轴框架里"结构约束牺牲自由"的具体体现。

一次 assistant turn prompt 问题进来 thinking 块 budget < max_tokens 可见答案 摘要/omitted 计费 = 全部 thinking token(隐藏也照付) 交错思考·工具调用 budget 可跨 turn 超 max_tokens
图 04.2thinking 在可见答案之前发生,计费覆盖整段。注意:在工具循环里必须原样回传之前的 thinking 块(连同其 signature),否则续跑会断;交错思考时 budget 跨整个 turn,因此可以超过单次 max_tokens。

CoT 何时反伤(最颠覆"推理永远安全"的一点):Liu 等(2024/25)证明,在隐式 / 感知型 / 异常密集的任务上(统计模式学习、人脸/视觉识别、规则带大量例外的分类),强制语言化是人类"言语遮蔽效应"的机器版——显式轨迹会覆盖掉原本正确的快速直觉。o1-preview 在这类任务上相对 GPT-4o 最高掉 36.3%。它只在两个条件同时成立时反伤:深思熟虑会伤害人类完成该任务,且这个约束能迁移到 LLM;约束不迁移时(如逻辑谬误识别),CoT 保持中性或正向。设计规则因此是:按任务类型给 CoT/extended thinking 开关分档,绝不全局施加。

表 04.2 · 原生 extended thinking vs 手搓 CoT 提示
方案优势为什么没选 / 选中
手搓 "let's think step by step" 提示透明、可见、模型无关占满 context、无法在工具调用之间思考,且易过度约束轨迹
另起一次 planner LLM 调用规划与执行解耦多一次往返与状态同步,规划与执行的上下文割裂
原生 extended / adaptive thinkingsignature 验证的多轮续跑、Opus 4.7/4.8 模型自控深度选中(主流)——代价是可见性丢失(摘要/omitted)且全额计费,最新模型不能手动设 budget
对所有任务全局开 thinking实现最省事感知/隐式任务上反伤(最高掉 36.3%),必须按任务类型 gate
extended_thinking.py Python
# extended thinking 的三个机制点:分档、计费、续跑
def reason(task, model):
    # 1) 按任务类型 gate——感知/隐式任务上 CoT 会反伤(最高 -36.3%)
    if task.kind in ("perceptual", "implicit_pattern", "exception_heavy"):
        return model(task, thinking=None)        # 不开 thinking,别覆盖快速直觉

    # 2) Opus 4.7/4.8 是 adaptive:手动设 budget 会 400,让模型自己定速
    if model.is_adaptive:
        resp = model(task, thinking={"type": "enabled"})     # 无 budget_tokens
    else:
        resp = model(task, thinking={"type": "enabled",
                                     "budget_tokens": 8000})  # 必须 < max_tokens

    # 3) 计费 = 全部 thinking token,即使只回摘要或 omitted(隐藏不省钱)
    bill = resp.usage.thinking_tokens + resp.usage.output_tokens

    # 工具循环:必须原样回传上一轮 thinking 块(连 signature),否则续跑断裂
    for tool_call in resp.tool_calls:
        obs = run(tool_call)
        resp = model(task, prior_thinking=resp.thinking_blocks, observation=obs)
    return resp.answer
陷阱 · "隐藏的 thinking 更便宜"

最常见的成本误判:以为响应里只看到摘要(Claude 4)或空块 + signature(Opus 4.7/4.8)就没被计费。错——你为生成的每一个 thinking token 付费,display: omitted 只削减流式延迟,不削减账单。两条配套陷阱:把 budget_tokens 设成 ≥ max_tokens 会直接报错(交错思考除外,那时预算跨整个 turn);在 Opus 4.7/4.8 上手动设 budget 返回 400,这些模型只接受 adaptive。

04.3复杂度路由与级联:把算力花在刀刃上

路由用一个便宜分类器把 prompt 映射到"最便宜可胜任的模型"(Haiku 解析 → Sonnet 推理 → Opus 攻坚);级联则是 cheap→验证→升级——两者失败模式正好相反。

04.2 决定"想多深",这一节决定"在哪个模型上想"。经济驱动是 5–60x 的价差:Haiku 约每百万 token 0.25–1 美元,Opus 约 5–15 美元。路由(router)是一个置于模型调用之前的便宜分类器(常用 Haiku 本身,约 430ms),把 prompt 映射到难度档、再派给该档最便宜可胜任的模型,能省 40–70%。它是 Anthropic 五个工作流模式之一。

路由:预测式,一次派定 分类器 Haiku·约 430ms Haiku · 解析 Sonnet · 推理 Opus · 攻坚 错路 → 静默降质 无恢复·分类器会漂移 级联:非预测式,失败才升级 便宜模型 验证器 不过 升级贵模型 代价:每次升级都累加便宜模型的延迟 + token
图 04.3路由(上)一次派定、错路无恢复;级联(下)自纠错但累加延迟。注意:分类器和验证器本身都是模型,是一笔维护负债——语义路由会随意图漂移,所以路由永远要配一个合理的默认值、一条 fallback、以及 trace 日志。

底层机制(错路是隐藏成本):路由是预测式的——一次就把模型选定,一旦把难题误判成简单题派给 Haiku,质量会静默降级且无从恢复。级联(cascade)反过来:先跑便宜模型,用验证器检查输出,只在失败时升级。它非预测、自纠错,不需要预先的分类器,但要为每一次升级付累加的延迟与 token,而且大模型必须等小模型先跑完才能开始。结论是:分类可靠时路由优化延迟/成本;有好的便宜验证器、又能吃下串行延迟时级联优化正确性。两条路上,分类器/验证器都是会漂移的维护负债。

表 04.3 · 难度不均,怎么分配模型
方案优势为什么没选 / 选中
所有请求都用顶配 Opus不会因选错降质简单题也付 5–60x 价差,账单与延迟全顶满
按端点静态绑定模型零运行时开销同一端点难度不均,要么过配要么欠配,无法随 prompt 适配
复杂度路由(一次派定)省 40–70%、并行友好、延迟低选中(分类可靠时)——但错路静默降质且无恢复,分类器随意图漂移
级联(cheap→验证→升级)自纠错、无需预先分类器累加串行延迟与 token,且依赖一个可靠的便宜验证器
想一想

团队上线了一个语义路由器,灰度时省了 55% 成本、准确率不降,于是当作"装好就不用管"的基础设施。三个月后客诉激增,但监控面板上没有任何报错。发生了什么?

展开答案(先停 10 秒再点)

这是路由的标志性失败:错路静默降质 + 意图漂移。三个月里用户的提问分布变了(新功能、新话术),语义路由器的决策边界没跟着更新,于是一批本该上 Opus 的难题被持续派给 Haiku——质量掉了,但因为是"预测式、一次派定、无恢复",没有任何异常被抛出,监控自然全绿。这正是为什么路由不能 fire-and-forget:必须配合理默认值、fallback、以及 trace 日志,并预期意图漂移、定期重训分类边界。

04.4并行探索:用 token 把方差换成准确率

自洽性、Best-of-N、Tree of Thoughts、编排者-工作者,本质都在对付同一件事——单次采样是模型能力的高方差估计;多采几条再聚合,就能把方差换成准确率。

为什么需要它

贪心解码一次只给一条推理路径,而这条路径是模型真实能力的高方差抽样:同一道题,模型有时走对、有时走偏。把这一条样本当成"模型的答案",就把随机性误当成了能力上限。并行探索的统一思路是:多采几条,再用某种方式聚合,让正确信号从噪声里浮出来。第 03 章的外部 oracle在这里再次出现——Best-of-N 的验证器和它是同一类东西。

四种聚合方式,机制各异。自洽性(CoT-SC,Wang 等 2023):在 temperature>0 下采 N 条独立 CoT,再对最终答案多数投票——正确路径互相一致、错误路径四散,众数因此集中到真值。GSM8K 在 N=40 时从 56.5% 提到 74.4%,不需要任何验证器或训练。Best-of-N(BoN):把投票换成外部验证器/奖励模型打分选最高,能处理不可投票的输出(代码、散文),但验证器需约 ≥90% 准确,否则比朴素投票还差,且会被 reward hacking。Tree of Thoughts(ToT,Yao 等 2023):在生成之上加搜索——每步生成 k 个候选"想法",让模型自评(sure/maybe/impossible),保留 top-b(beam),用 BFS/DFS 配回溯前瞻;Game of 24 从 4% 跳到 74%,代价是每个节点要多次 LLM 调用。编排者-工作者是 agent 层的同一招:主 agent 拆解查询、并行派 3–5 个各有独立 context 的子 agent、再综合,Anthropic Research 实测相对单 Opus +90.2%,但 token 成本约 15x。

自洽性 · 投票 7 7 3 多数 = 7 无需验证器 Best-of-N · 验证器 A B C 验证器选 B 需 ≥90% 准 ToT · 搜索剪枝 根 剪 ✗ 留 ✓ 深入·前瞻 三者共同代价:N× token;只在任务可聚合 / 可搜索时划算 agent 层对应编排者-工作者:+90.2% 但 ~15x token
图 04.4三种聚合并列:投票(左)靠路径互相否决、Best-of-N(中)靠验证器打分、ToT(右)靠自评剪枝搜索。注意:投票只对可投票的离散答案有效;代码/散文/多字段 JSON 不会聚成众数,必须改用带验证器的 Best-of-N,而验证器一旦低于约 90% 准确就会被 reward hack,更多算力反而降质。
表 04.4 · 自洽性(投票)vs Best-of-N(验证器)
方案适用 / 优势为什么没选 / 选中
单次贪心采样最便宜、一条路高方差估计,时对时错,浪费了多路径里的信号
自洽性 · 多数投票无需验证器、不可 reward hack(GSM8K 56.5→74.4)选中(可投票答案)——但只对离散可投票输出有效,近似答案的信号被丢
Best-of-N · 验证器选最高处理开放式输出(代码/散文),可更聪明只与验证器一样好(需 ≥90% 准,否则不如投票),且引入可被 hack 的奖励面
Tree of Thoughts · 搜索带前瞻/回溯(Game of 24 4→74%)每节点多次 LLM 调用,多数生产任务付不起搜索预算

底层机制(并行只在任务可分解时划算):编排者-工作者用 token 买并行——Anthropic Research 用约 15x token 换来 +90.2%,且 token 用量单独解释了约 80% 的质量方差。但它只在任务能拆成独立线程时奏效(广度优先搜索、信息量超过单个 context window)。在紧耦合任务上(写代码、任何需要共享演进状态的事),并行子 agent 会重复劳动、丢失连贯——Anthropic 早期原型甚至给一个琐碎查询派了 50 个子 agent。所以 Anthropic 自己的规则是:只在任务价值能覆盖这笔花费时才加这层复杂度。

想一想

一个团队把自洽性套用到代码生成上:采样 N=20 份候选补丁,对它们多数投票选最常出现的那份。结果质量还不如单次采样。问题出在哪?

展开答案(先停 10 秒再点)

自洽性只对可投票的离散答案有效——它假设正确路径会收敛到同一个最终答案,错误路径四散。但代码(以及散文、多字段 JSON)几乎不会两份逐字相同,"众数"根本不成立:20 份补丁往往是 20 个不同字符串,多数投票退化成随机选。开放式输出该用 Best-of-N 配一个外部验证器(跑测试、编译、reward model)——也就是把第 03 章的外部 oracle 接进来,让能跑通测试的那份胜出,而不是让最常见的字符串胜出。

04.5假设驱动调试:把"抽盲盒"变成科学方法

调试的反模式是"抽盲盒"——凭直觉补丁、试错改症状;修复是科学调试循环:提出可证伪假设 → 设计实验 → 在真实环境观察 → 下结论,循环到证据收敛。

04.4 决定"采几条路",这一节决定"怎么在真实世界里验证一条路"。LLM 在调试时天然爱"抽盲盒":它擅长模式匹配出一个看着合理的补丁,于是急着改症状。修复是科学调试循环(AutoSD 的 hypothesize→observe→conclude):模型先对根因提出一个可证伪的假设,设计一个实验(一条调试器命令、一行日志、一个最小复现),在真实执行环境里跑、读回实际结果,让生成建立在证据而非先验上,循环到假设被确认或撞上迭代上限。

① 复现失败 先稳定复现 ② 提出假设 可证伪·指向根因 ③ 实验·观察 真实执行·读回结果 ④ 结论 收敛→修复+转 CI eval 未收敛 → 改假设
图 04.5科学调试是 ReAct 在调试上的特化:第 ③ 步的真实观察是决定性环节。注意:bug 往往在浮现处许多步之前就产生了,所以必须"先复现失败"再隔离失败步——没有真实 Observation,模型自信但错误的内部模型会一路复利放大。

底层机制(这是 ReAct 的特化):这个循环就是第 03 章见过的 ReAct(Yao 等 2022)在调试上的特化——推理轨迹更新计划、动作把它锚定在外部证据上。Observation 步是决定性环节:它阻止模型"自信但错误"的内部模型一路复利。agentic 调试之所以难,是因为一个 bug 常在浮现处许多步之前就已产生,所以纪律是:先复现失败 → 隔离失败步 → 验证修复 → 把这次事故转成一条永久的 eval/CI 用例,让同一个 bug 不能再回归。最大的调试增益来自流程而非更强的模型。

scientific_debug.py Python
# 假设驱动调试 = ReAct 特化:Observation 来自真实执行,不是模型先验
def debug(bug_report, max_iters=8):
    repro = reproduce_failure(bug_report)      # 先稳定复现——否则一切都在猜
    if not repro.stable:
        return "无法复现:bug 常在浮现处许多步之前产生,先收窄复现"

    for _ in range(max_iters):
        # ② 可证伪假设:明确指向某个根因,而不是泛泛"问题在这一带"
        hypo = llm(f"针对 {repro} 提出一个可证伪的根因假设,并给出验证它的实验")

        # ③ 在真实环境里跑实验,读回实际结果(ReAct 的 Observation)
        obs = run_in_real_env(hypo.experiment)  # 调试器命令 / 日志 / 最小复现

        # ④ 用证据下结论;收敛则修复并固化成回归用例
        if hypo.confirmed_by(obs):
            fix = llm(f"根因已确认为 {hypo};给出修复")
            add_ci_eval_case(repro)             # 把事故转成永久 eval,防回归
            return fix
        repro = repro.with_evidence(obs)        # 没收敛:带着新证据改假设
    return escalate_to_human(bug_report)        # 给上限,避免抽盲盒空转
# 反模式:"抽盲盒"——跳过 ③ 直接补丁,会让错误假设一路复利放大。
表 04.5 · 假设驱动调试 vs 直接生成补丁
方案优势为什么没选 / 选中
让模型直接重写有 bug 的代码每次尝试快"抽盲盒"——改症状不改根因,看不见远端起因的 bug,回归率高
暴力重生成直到测试通过无需理解 bug过拟合测试、掩盖真实根因,token 烧在盲试上
观察→假设→实验循环(AutoSD)可解释、命中根因、可泛化,事故转 CI eval 防回归选中——代价是额外往返 + 真实执行/复现工装,但换来根因级修复
陷阱 · 让调试 agent 直接补症状("抽盲盒")

没有真实的 observe 步,agent 会把一个看着合理的补丁当成修复,于是错误假设一路复利。两条纪律抵消它:其一,先复现失败再动手——bug 常在浮现处许多步之前就产生,不复现等于盲猜;其二,把每次事故转成 CI eval 用例——真正止住回归的是流程,不是更大的模型。这与第 03 章"失败日记必须靠外部 oracle"是同一条不变式:信号必须可被真实世界证伪。

§本章 self-check

先合上教程,把你能想到的答案写在纸上或编辑器里。写完再点开答案对照——直接点开等于把这一节当再读一遍。

  1. 用"草稿纸"机制解释 CoT 为什么对多步问题有用,再说出它在什么任务上反伤、最高掉多少。
  2. "隐藏/摘要的 thinking 更便宜"为什么是错的?omitted 到底省了什么?
  3. 复杂度路由和级联的失败模式各是什么?它们分别在什么条件下更优?
  4. 自洽性为什么不能用在代码生成上?该换成什么、它依赖什么?
  5. 多智能体并行"更聪明"这句话,按 Anthropic 的数据应该怎么修正?
答案(先做完再展开)
  1. 自回归模型每个 token 只能做有限计算,中间 token 充当草稿纸,把一次前向算不完的多步计算串行化。它在隐式/感知型/异常密集任务上反伤(言语遮蔽效应,覆盖正确直觉),o1-preview 最高掉 36.3%,所以要按任务类型 gate。
  2. 你为每一个 thinking token 付费,无论响应只回摘要(Claude 4)还是空块 + signature(Opus 4.7/4.8)。display: omitted 只省流式延迟,不省成本。
  3. 路由预测式、一次派定,错路静默降质且无恢复,分类可靠时优化延迟/成本。级联非预测、自纠错,但累加串行延迟与 token,有好的便宜验证器时优化正确性。
  4. 自洽性只对可投票的离散答案有效;代码/散文不会聚成众数。该换成 Best-of-N 配外部验证器(跑测试/编译),验证器需约 ≥90% 准确,否则不如投票且会被 reward hack。
  5. 应修正为"多智能体更花钱":token 用量单独解释了约 80% 的质量方差,+90.2% 的代价是约 15x token,且只在任务可拆成独立线程时划算。
进阶挑战 · 刚好够不着

给一条 agent 流水线设计"自适应推理预算"

本章五节都在回答同一个问题:这一次的边际准确率值不值边际 token。把它们组合成一条流水线:一个进来的任务,应该先路由分档(04.3)、再决定开不开 CoT(04.2,注意按任务类型 gate)、难任务才上并行探索(04.4)、输出再过假设驱动验证(04.5)。设计一个预算分配策略,让总 token 花在边际收益最高的环节上,并说清在哪个环节、用什么信号决定"加码还是收手"。代价是什么?

提示(卡住再展开)

关键在把"边际准确率 ÷ 边际 token"做成一个可观测的升级阶梯,而不是固定配置。可考虑:路由器先给一个难度分;难度低直接 Haiku 不开 thinking;中档开 adaptive thinking 单次跑;只有当一个便宜验证器/外部 oracle(第 03 章那种)判定结果不收敛时,才升级到并行探索或假设驱动循环——也就是把级联(04.3)的"失败才升级"思想套到整条流水线上。代价是每一道闸门本身都是模型调用与维护负债(会漂移的分类器、需 ≥90% 准的验证器),而且串行闸门会累加延迟。这正好呼应本章的统一透镜:每加一层算力,都要先问它的边际准确率能不能覆盖边际 token。