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 买方差缩减;以及假设驱动调试如何把"抽盲盒"变成根因修复。
04.1推理导论:先想清楚,才能做对
推理是把目标转成"可验证计划"的那一层;落到机制上,显式推理是一种花 token 的策略——它用推理时算力买准确率,工程问题永远是边际准确率值不值边际 token。
面对"agent 一上来就乱动工具、做错方向",最自然的反应是"换个更聪明的模型"。这个反应抓错了杠杆。真正缺的不是模型能力,而是在动手之前先把目标拆成可验证计划的那一步。第 01 章的认知功能轴把推理单列成一格,正因为它和感知、记忆、行动一样是一个可单独施加约束的环节——而约束的方式,全都是"在哪、花多少 token 去想"。
底层机制(比"先想后做"深一层):显式推理不是一种风格偏好,而是一种消耗 token 的算力策略。本章五种技术——CoT、路由、自洽性、Tree of Thoughts、假设驱动调试——无一例外都在用推理时算力买准确率。这把统一透镜让选型变得可计算:每一次"要不要想得更深、采更多样、拆更多子任务",都等价于"边际准确率 ÷ 边际 token 与延迟"是否划算。Anthropic 在多智能体 Research 系统里把这点量化到极致:token 用量单独就解释了约 80% 的性能方差——质量的绝大部分来自"在对的分解上花了足够算力"。这一句把后面四节串成一条线。
| 痛点 | 设计回应 | 它换来的代价 |
|---|---|---|
| 多步问题一次前向算不出,直接答错 | 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 章双轴框架里"结构约束牺牲自由"的具体体现。
max_tokens。CoT 何时反伤(最颠覆"推理永远安全"的一点):Liu 等(2024/25)证明,在隐式 / 感知型 / 异常密集的任务上(统计模式学习、人脸/视觉识别、规则带大量例外的分类),强制语言化是人类"言语遮蔽效应"的机器版——显式轨迹会覆盖掉原本正确的快速直觉。o1-preview 在这类任务上相对 GPT-4o 最高掉 36.3%。它只在两个条件同时成立时反伤:深思熟虑会伤害人类完成该任务,且这个约束能迁移到 LLM;约束不迁移时(如逻辑谬误识别),CoT 保持中性或正向。设计规则因此是:按任务类型给 CoT/extended thinking 开关分档,绝不全局施加。
| 方案 | 优势 | 为什么没选 / 选中 |
|---|---|---|
| 手搓 "let's think step by step" 提示 | 透明、可见、模型无关 | 占满 context、无法在工具调用之间思考,且易过度约束轨迹 |
| 另起一次 planner LLM 调用 | 规划与执行解耦 | 多一次往返与状态同步,规划与执行的上下文割裂 |
| 原生 extended / adaptive thinking | signature 验证的多轮续跑、Opus 4.7/4.8 模型自控深度 | 选中(主流)——代价是可见性丢失(摘要/omitted)且全额计费,最新模型不能手动设 budget |
| 对所有任务全局开 thinking | 实现最省事 | 感知/隐式任务上反伤(最高掉 36.3%),必须按任务类型 gate |
# 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
最常见的成本误判:以为响应里只看到摘要(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,质量会静默降级且无从恢复。级联(cascade)反过来:先跑便宜模型,用验证器检查输出,只在失败时升级。它非预测、自纠错,不需要预先的分类器,但要为每一次升级付累加的延迟与 token,而且大模型必须等小模型先跑完才能开始。结论是:分类可靠时路由优化延迟/成本;有好的便宜验证器、又能吃下串行延迟时级联优化正确性。两条路上,分类器/验证器都是会漂移的维护负债。
| 方案 | 优势 | 为什么没选 / 选中 |
|---|---|---|
| 所有请求都用顶配 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。
| 方案 | 适用 / 优势 | 为什么没选 / 选中 |
|---|---|---|
| 单次贪心采样 | 最便宜、一条路 | 高方差估计,时对时错,浪费了多路径里的信号 |
| 自洽性 · 多数投票 | 无需验证器、不可 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):模型先对根因提出一个可证伪的假设,设计一个实验(一条调试器命令、一行日志、一个最小复现),在真实执行环境里跑、读回实际结果,让生成建立在证据而非先验上,循环到假设被确认或撞上迭代上限。
底层机制(这是 ReAct 的特化):这个循环就是第 03 章见过的 ReAct(Yao 等 2022)在调试上的特化——推理轨迹更新计划、动作把它锚定在外部证据上。Observation 步是决定性环节:它阻止模型"自信但错误"的内部模型一路复利。agentic 调试之所以难,是因为一个 bug 常在浮现处许多步之前就已产生,所以纪律是:先复现失败 → 隔离失败步 → 验证修复 → 把这次事故转成一条永久的 eval/CI 用例,让同一个 bug 不能再回归。最大的调试增益来自流程而非更强的模型。
# 假设驱动调试 = 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) # 给上限,避免抽盲盒空转
# 反模式:"抽盲盒"——跳过 ③ 直接补丁,会让错误假设一路复利放大。
| 方案 | 优势 | 为什么没选 / 选中 |
|---|---|---|
| 让模型直接重写有 bug 的代码 | 每次尝试快 | "抽盲盒"——改症状不改根因,看不见远端起因的 bug,回归率高 |
| 暴力重生成直到测试通过 | 无需理解 bug | 过拟合测试、掩盖真实根因,token 烧在盲试上 |
| 观察→假设→实验循环(AutoSD) | 可解释、命中根因、可泛化,事故转 CI eval 防回归 | 选中——代价是额外往返 + 真实执行/复现工装,但换来根因级修复 |
没有真实的 observe 步,agent 会把一个看着合理的补丁当成修复,于是错误假设一路复利。两条纪律抵消它:其一,先复现失败再动手——bug 常在浮现处许多步之前就产生,不复现等于盲猜;其二,把每次事故转成 CI eval 用例——真正止住回归的是流程,不是更大的模型。这与第 03 章"失败日记必须靠外部 oracle"是同一条不变式:信号必须可被真实世界证伪。
§本章 self-check
先合上教程,把你能想到的答案写在纸上或编辑器里。写完再点开答案对照——直接点开等于把这一节当再读一遍。
- 用"草稿纸"机制解释 CoT 为什么对多步问题有用,再说出它在什么任务上反伤、最高掉多少。
- "隐藏/摘要的 thinking 更便宜"为什么是错的?omitted 到底省了什么?
- 复杂度路由和级联的失败模式各是什么?它们分别在什么条件下更优?
- 自洽性为什么不能用在代码生成上?该换成什么、它依赖什么?
- 多智能体并行"更聪明"这句话,按 Anthropic 的数据应该怎么修正?
答案(先做完再展开)
- 自回归模型每个 token 只能做有限计算,中间 token 充当草稿纸,把一次前向算不完的多步计算串行化。它在隐式/感知型/异常密集任务上反伤(言语遮蔽效应,覆盖正确直觉),o1-preview 最高掉 36.3%,所以要按任务类型 gate。
- 你为每一个 thinking token 付费,无论响应只回摘要(Claude 4)还是空块 + signature(Opus 4.7/4.8)。
display: omitted只省流式延迟,不省成本。 - 路由预测式、一次派定,错路静默降质且无恢复,分类可靠时优化延迟/成本。级联非预测、自纠错,但累加串行延迟与 token,有好的便宜验证器时优化正确性。
- 自洽性只对可投票的离散答案有效;代码/散文不会聚成众数。该换成 Best-of-N 配外部验证器(跑测试/编译),验证器需约 ≥90% 准确,否则不如投票且会被 reward hack。
- 应修正为"多智能体更花钱":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。