AI/ML 详解:推理模型

Day 28 · 2026-06-14
面向:有编程经验的非 AI 方向工程师
工程对应 → super-individual D5: Agent Design(怎么把"会思考"的模型用进 agent 工作流)

测试时计算Test-time Compute / o1 架构

范式转移推理
一句话类比

普通 LLM 像一次 O(1) 查表——不管问题多难,都是一次前向传播立刻吐答案,计算量固定。推理模型(o1 / DeepSeek-R1)则像数据库的查询优化器:简单查询走 fast path,复杂查询愿意在运行时多花 CPU 做规划、试错、回溯,再返回结果。本质是把"算力预算"从训练时一次性投入,挪一部分到每次请求的运行时按需投入

它解决什么问题 + 工作机制

痛点:再大的模型,单次前向的计算深度是固定的——这对"想一眼就答"的题没问题,但对需要多步推演的数学题、代码题,等于逼一个人在 0.5 秒内脱口而出答案,必然出错。2024 年 OpenAI o1 给出的答案是:让模型在回答前先生成一长串内部思考(chain of thought),把"想"这个动作变成可以花更多 token、更多时间的过程。

机制核心不是 prompt 技巧,而是训练方式:o1 用强化学习(RL)训练模型自己"学会怎么想"——奖励信号来自最终答案对不对(数学、代码这类可自动验证的领域),模型在试错中学会拆解步骤、识别并纠正自己的错误、此路不通就换条路。2025 年 DeepSeek-R1 进一步证明:纯 RL(不靠人工标注的推理过程)就能自发涌现出反思、验证、回溯这些行为。

两条 scaling 轴(推理模型的核心洞察)

训练时算力 投一次,所有请求受益(传统路线)
测试时算力 每次请求按需投,难题多想会儿

准确率 ∝ log(测试时 token):
想 1K token
想 8K token
想 32K token ↑ 边际递减但持续上升

关键反直觉:在推理模型里,"更聪明"可以靠"想更久"换——这是"做大模型"之外的第二条 scaling 路径。代价是延迟和 token 成本陡增。

代码示例
from openai import OpenAI
client = OpenAI()  # 需要 OPENAI_API_KEY

# 推理模型的关键参数:reasoning_effort 控制"想多久"
resp = client.chat.completions.create(
    model="o1",
    reasoning_effort="high",  # low/medium/high:高=更多测试时算力
    messages=[{"role": "user",
               "content": "一个三位数,各位数字之和为 12,"
                          "百位是个位的两倍,十位比个位大 1,求这个数。"}]
)
print(resp.choices[0].message.content)
# 注意:内部 reasoning tokens 你看不到(OpenAI 隐藏),但要付费
print(resp.usage.completion_tokens_details.reasoning_tokens)  # 监控思考成本
常见误区 + 实践场景
"推理模型更强,什么都用它"——错。对"总结这段话""改写邮件""查个事实"这类不需要多步推演的任务,推理模型只是更慢更贵,质量未必更高,有时反而因为"想太多"把简单问题复杂化。判断标准:这题需要打草稿吗?需要 → 推理模型;脱口而出就行 → 普通模型。
📌 妈妈场景:用推理模型做需要严谨多步的决策辅助——比如"给定这三个学区房的价格、通勤、学校排名数据,做一个加权对比并指出隐藏风险"。这类题模型需要"算草稿",o1/R1 的逐步推演明显优于普通模型。
Takeaway + 思考题
💡 推理模型的本质是"用运行时算力买准确率"——它把"思考"从瞬时动作变成了可调节的资源。
🤔 你的工作流里,哪些任务值得为"模型多想 30 秒"付出 10 倍 token 成本?哪些是浪费?

思维链推理Chain-of-Thought (CoT)

机制中间状态
一句话类比

CoT 就是给黑盒函数加 print 调试——把模型本来藏在权重里、一步算完的隐藏计算,外化成一串可见的中间 token。这些 token 又被喂回模型当下一步的输入,等于模型用自己的输出当暂存盘(scratchpad)。没有 scratchpad,复杂运算只能在一次前向里硬挤;有了它,串行计算被展开成更多步。

它解决什么问题 + 工作机制

痛点的根源在架构:Transformer 单次前向的计算深度是固定的(层数决定)。一道需要 20 步推演的题,硬塞进固定深度等于让算力不够用。CoT 的机制巧妙:自回归生成是串行的——模型每吐一个 token,都能把已生成的全部 token 重新读一遍再算下一个。所以让它先写出推理步骤,相当于把"计算"摊到 token 序列长度上,用序列长度换有效计算深度。

2022 年 Wei et al. 发现:只要在 few-shot 例子里展示推理过程(而非只给答案),大模型在数学、常识推理上的准确率大幅跃升——而且这种能力只在足够大的模型上涌现。即 "Let's think step by step"。

为什么 CoT 有效:把固定深度摊成序列长度

直接答 问题 → [一次前向,深度固定] → 答案 ✗ 易错

CoT 问题 → 步骤1 → 步骤2 → 步骤3 → ... → 答案
     └─ 每步都读全部历史再算 → 有效计算深度 ∝ 步数 ─┘

注意区分两层:CoT prompting(Day 3 讲过的提示技巧,靠 prompt 诱导)和推理模型内建的 CoT(o1/R1 通过 RL 训练,自发生成且远比人写的长、会自我纠错)。后者是把前者从"技巧"升级成了"模型的原生能力"。

代码示例
from anthropic import Anthropic
client = Anthropic()

# 用 <thinking> 标签给普通模型显式开辟 scratchpad(CoT 的手动版)
resp = client.messages.create(
    model="claude-opus-4-8", max_tokens=1024,
    messages=[{"role": "user", "content":
        "先在 <thinking> 里逐步推演,再在 <answer> 里给最终答案。\n"
        "问题:仓库每天进货 50 件、出货 80 件,初始 600 件,第几天清空?"}]
)
# 模型会先写推理过程(净减 30/天 → 600/30=20),再给答案
print(resp.content[0].text)
# 工程上:<thinking> 段可在展示给用户前剥离,只留 <answer>
常见误区 + 实践场景
"模型写出的推理过程 = 它真实的思考过程"——不一定。研究反复表明 CoT 可能是事后合理化(post-hoc rationalization):模型先有了倾向,再编一套看起来合理的步骤。所以不能把 CoT 文本当作模型可信度的证据——步骤通顺不代表答案对,也不代表它"真的这么想"。
📌 妈妈场景:跨学科思考时,让模型显式写出推理链再下结论——比如"用复杂性科学的视角分析这个组织问题"。可见的推理链让你能逐步审查哪一步的类比站不住脚,而不是只能接受/拒绝一个黑盒结论。
Takeaway + 思考题
💡 CoT 的本质是用"序列长度"换"计算深度"——它不是让模型变聪明,而是给了它打草稿的空间。
🤔 如果模型的推理链可能是事后编的,你该如何设计验证机制来判断答案是否真的可信?(下一节就是答案的一半)

自我验证Self-Verification / Process Reward

验证奖励模型
一句话类比

生成答案是 writer,验证答案是 reviewer——就像写代码 vs code review,写单测 vs 跑单测。关键洞察:验证往往比生成容易(看懂一个证明比自己想出来简单,复现 bug 比发现 fix 简单)。推理模型利用这个不对称——用一个验证器(verifier / reward model)来检查生成器的输出,把"难的生成"问题部分转化成"易的验证"问题。

它解决什么问题 + 工作机制

痛点:模型推理链很长时,一步错则步步错——一个早期的小算错会被后续步骤"理所当然"地继承,最后给出自信而错误的答案。怎么知道哪步错了?两类验证器:

  • ORM(Outcome Reward Model,结果奖励)——只看最终答案对不对,像端到端测试。简单但反馈稀疏:知道错了,不知道错在哪一步;
  • PRM(Process Reward Model,过程奖励)——给推理链每一步打分,像逐行 lint / 单步断点。反馈密集,能精确定位第一个出错的步骤。

2023 年 OpenAI 的 "Let's Verify Step by Step" 给出关键实证:在高难度数学(MATH 数据集)上,过程监督(PRM)显著优于结果监督(ORM)。直觉:告诉模型"第 3 步错了"比只说"最终答案错了"信息量大得多——前者把信用分配(credit assignment)问题精确到了步骤级。

ORM vs PRM:反馈粒度的差异

步骤1 ✓ 步骤2 ✓ 步骤3 ✗ 步骤4 ✓ 步骤5 → 答案
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ORM 只看末尾 "答案错" (不知错在哪)
PRM 逐步打分 "第3步错" (精确定位 → 可针对性纠错/重试)

自我验证还有更轻量的形态:让模型自己检查自己("重新审视上面的推理,有没有算错?")。但要警惕——验证器本身也是模型,会有盲区,模型对自己错误的"自纠"能力有限,独立训练的验证器通常比"自己查自己"更可靠。

代码示例
def verify_steps(problem, solution_steps):
    # 用一个独立调用当"验证器",逐步检查(PRM 的轻量实现)
    prompt = f"""问题:{problem}
解题步骤:
{chr(10).join(f'{i+1}. {s}' for i, s in enumerate(solution_steps))}

逐步检查每一步是否正确。只输出第一个出错的步骤编号;
全部正确则输出 OK。"""
    r = client.messages.create(
        model="claude-opus-4-8", max_tokens=256,
        messages=[{"role": "user", "content": prompt}])
    return r.content[0].text  # "OK" 或 "第 3 步错误:..."

# 用法:生成 → 验证 → 若有错,带着"第N步错"的信号重试
verdict = verify_steps("求 17×23", ["17×20=340", "17×3=51", "340+51=391"])
常见误区 + 实践场景
"让模型自己说'我检查过了,没问题'就可信了"——错。模型常常自信地确认错误答案(验证器和生成器共享同样的知识盲区)。真正有效的自我验证要么用独立训练的验证器,要么用外部可验证信号(代码就跑一遍、数学就代入验算)——把验证锚定到模型之外的客观真相。
📌 妈妈场景:让 AI 做关键计算/决策时,显式要求第二步独立验证——"用另一种方法重新算一遍核对"。比如算投资回报,先用复利公式,再让它用逐年累加验证,两个结果对不上就说明有错。
Takeaway + 思考题
💡 验证比生成容易,是推理模型的杠杆支点——但"自己查自己"有盲区,独立/外部验证才靠谱。
🤔 在你的领域里,哪些问题的"验证"远比"求解"容易?这些正是 AI 推理 + 验证最能发力的地方。

Best-of-N 采样Best-of-N Sampling

采样策略投机
一句话类比

Best-of-N 就是分布式系统的 scatter-gather + ranking:同一个问题并行采样 N 个候选答案(scatter),再用验证器选出最好的一个(gather + rank)。它和 hedged requests(对冲请求)同源——多发几个请求,取最优那个,用冗余换质量。而 self-consistency(自洽)是它的特例:N 个答案做多数投票,类似 Raft 的 quorum 表决。

它解决什么问题 + 工作机制

痛点:模型采样有随机性(temperature > 0),一次生成可能恰好走错路。但"偶尔能答对"≠"答不对"——如果正确答案在 100 次采样里出现过哪怕几次,我们只要有办法把它挑出来,准确率就能大幅提升。两种"挑"的策略:

  • Self-Consistency(多数投票)——采样 N 条推理链,对最终答案投票,取出现最多的那个。数学上是对推理路径做边际化:答案 = argmax 累计到该答案的路径数。无需额外验证器,免费提升;
  • Verifier-guided(验证器选优)——用训练好的 verifier 给 N 个候选打分,选最高分。2021 年 Cobbe et al.(GSM8K 那篇)证明:验证器选优比单纯做大模型更省算力,且随样本数持续提升。
Best-of-N:scatter → gather → rank

      ┌→ 候选1 → 答案 A
问题 → 采样×N ┼→ 候选2 → 答案 B ┐
  (temp>0) ├→ 候选3 → 答案 A ├→ 选优 → A
      └→ 候选4 → 答案 A ┘
  投票:A 出现 3 次 → 胜出 / 或验证器打分选最高

这是测试时计算最直接的体现:N 越大,花的算力越多,准确率越高(log 关系,边际递减)。o1 这类模型则更进一步——把"采样 + 验证 + 回溯"内化进单条长推理链,而不是外部跑 N 次。

代码示例
from collections import Counter

def self_consistency(problem, n=10):
    answers = []
    for _ in range(n):
        r = client.messages.create(
            model="claude-opus-4-8", max_tokens=1024,
            temperature=0.8,  # 必须 >0 才有多样性
            messages=[{"role": "user",
                       "content": f"逐步推理后,最后一行写 '答案: X'。\n{problem}"}])
        ans = extract_final_answer(r.content[0].text)  # 解析末行
        answers.append(ans)
    # 对最终答案做多数投票(边际化掉不同推理路径)
    return Counter(answers).most_common(1)[0][0]

# N 个独立推理路径殊途同归 → 答对的概率比单次高得多
best = self_consistency("一支笔 3 元,买 7 支再打 9 折,共多少钱?", n=10)
常见误区 + 实践场景
"Best-of-N 里 N 越大一定越好"——有上限。(1) 成本随 N 线性涨,准确率只 log 涨,性价比迅速下降;(2) 多数投票只对"有唯一确定答案"的题有效(数学、选择题),开放写作没法投票;(3) 如果模型系统性地犯同一个错,100 个候选会一致地错——投票放大的是共识,不是真相
📌 妈妈场景:做有标准答案的高风险计算(税务、剂量、财务)时,手动跑 self-consistency——同一问题问 3-5 次,答案一致才采信,分歧就是危险信号,提示你需要人工介入核对。
Takeaway + 思考题
💡 Best-of-N 用"采样冗余 + 选优"把随机性变成优势——但它放大的是共识,对系统性错误无能为力。
🤔 投票放大共识不放大真相——在群体决策、科学共识里,这个陷阱你还在哪些地方见过?
工程对应 → super-individual D5: Agent Design

深入资源Further Reading

深入思考Deep Questions

1. "测试时计算"和"做大模型"是两条 scaling 路径,它们是替代还是互补?2026 年该怎么权衡?
互补且相乘的,不是替代。做大模型(训练时算力)提升基础能力上限——"懂多少"、单步推理多准;测试时计算提升把已有能力榨干的程度。两者像CPU 主频 vs 允许程序跑多久:主频低的 CPU 跑再久也算不出超纲题,但主频够了,多给时间就能解更难的。实践权衡:(a) 基础任务用小模型 + 低 effort;(b) 难题用强模型 + 高 effort;(c) 测试时计算有边际递减(log),"无脑加 effort"到某点就不划算,不如换更强的基础模型。2024-2025 的行业转向:当预训练数据接近枯竭、训练时 scaling 边际下降,测试时计算成了新的增长曲线——这是 o1/R1 路线爆发的根本原因。分布式类比:像"垂直扩展(更强单机)" vs "给单次请求更多超时预算"——两个旋钮,按 workload 调。
2. CoT 可能是"事后合理化"——那推理模型给出的长思考链到底有没有认知价值?我们该信任它什么、不信任它什么?
要把 CoT 拆成两个功能分别评估。功能一:作为计算载体——CoT token 给了模型额外的串行计算空间,真实有效,去掉准确率会掉,证明它不只是装饰。功能二:作为可解释性窗口(faithfulness)——"这串文字忠实反映了模型的真实推理吗?"这部分不可全信:模型可能受 prompt 里的偏见影响却在 CoT 里只字不提,或先有结论再补步骤。所以正确姿态:信任 CoT 的"算力价值",怀疑它的"自白价值"。它是 scratchpad,不是测谎仪。实践含义:(1) 用 CoT 提升答案质量——放心;(2) 用 CoT 审查"模型哪步想错了"——有用但带怀疑,可见步骤未必是真实因果;(3) 把 CoT 当"置信度证据"——危险,通顺的推理链常常包着错误答案。这也是为什么验证(第3节)不能只靠读模型自己的推理链,要锚定外部信号。深一层:它逼我们重想"理解"是什么——一个系统能产出有用的中间步骤,却不忠实反映其内部机制,它算"会推理"吗?神经科学里也有镜像:人类的"自我解释"同样大量是事后合理化。
3. 第3节(验证器选优)和第4节(Best-of-N)其实是同一件事的两面——它们和 o1 的"单条长思考链"是什么关系?
外部并行 vs 内部串行两种实现同一思想的方式,思想都是"探索多条路径 + 选择/纠正"。Best-of-N(外部):跑 N 次独立采样,每条路径互不知晓,最后用投票或验证器在结果层面选优——好处是简单、可并行、可控;坏处是 N 条路径完全冗余,互相不能借鉴,且"选优"只在最后发生。o1/R1(内部):把搜索压进一条长链——模型在生成过程中自己"试一条路 → 发现不对 → 回溯 → 换一条",验证和探索交织在一条序列里,后面的步骤能利用前面失败的教训。这更接近人类解题:不是平行做 10 份卷子选最好的,而是一份卷子上反复涂改。代价是这条能力得靠 RL 专门训练(普通模型不会自发回溯)。趋势上 o1 这种"内化搜索"更高效——信息在链内复用,不浪费。但两者不互斥:可对 o1 再叠 Best-of-N,进一步压榨准确率,代价是成本叠乘。搜索算法视角:Best-of-N 像独立随机重启,o1 内部搜索更像带回溯的 DFS / 束搜索——后者用状态记忆避免重复探索。
4. 推理模型擅长"可验证领域"(数学、代码)。那在没有客观对错的领域(写作、战略、人际判断),这套范式还成立吗?
核心约束被点中了:推理模型这波突破高度依赖"可自动验证"的奖励信号——数学答案能对照、代码能跑测试,RL 才有干净的奖励。一旦进入没有客观真值的领域,三个机制全部松动:(1) RL 训练缺奖励信号——"这篇文章好不好"没有自动判分器,只能用人类偏好(贵、慢、有偏)或用另一个模型当裁判(引入裁判自己的偏见);(2) 验证不再比生成容易——判断一个战略决策是否正确,可能和做出它一样难,甚至要等数年才知道结果,验证的杠杆消失;(3) Best-of-N 的投票失效——开放问题没有"唯一答案"可投票。所以现状是:推理模型在软领域的增益远小于硬领域。但有部分迁移:(a) 软问题里常可分解出可验证的子结构——战略分析里的"市场规模计算""财务模型"是硬的,可用推理模型,再由人做软判断;(b) 过程合理性仍可部分检查——逻辑自洽、有无自相矛盾、是否遗漏关键因素,比"最终对错"易判。对"AI 超级个体"的启示:人最不可替代的价值,正向"无法自动验证的判断"集中——审美、价值排序、在不确定中下注。AI 把"有标准答案的思考"商品化了,反而凸显了"定义什么是好答案"的人类专属性。
5. 如果"准确率 ∝ log(测试时算力)",那是否存在一个问题——只要愿意花无限算力,AI 就能解任何题?边界在哪?
不能,边界是真实存在且多重的。第一重,log 关系本身就是天花板的信号:要把准确率从 90% 提到 99%,可能要 10 倍算力;99% 到 99.9% 再要 10 倍——指数成本换线性收益,很快撞上经济墙。第二重,基础能力是硬上限:测试时计算只能逼近模型已有能力的上限,不能凭空创造模型不具备的知识或推理模式。一个没学过群论的模型,想再久也证不出需要群论的定理——多想只是把"它能想到的东西"探索得更充分,不是无中生有。第三重,验证信号的有无(见上一题):没有可验证奖励的领域,加算力没有可靠的"选优"依据,多想可能只是把错误想得更精致。第四重,有些问题计算不可约(computational irreducibility):某些问题没有捷径,必须真的一步步算到底,再聪明的"思考"也压缩不了。这恰呼应了复杂性科学里 Wolfram 的洞察。更准确的图景:测试时计算是个强力但有界的旋钮——它让"模型力所能及但需要功夫的题"可解,却碰不到"超出能力上限"和"本质不可约"的题。对超级个体的含义:AI 的杠杆在"已知方法、需要耐心执行"的问题上最大;真正的创造性突破仍然稀缺——而这正是人最该投入的地方。