预训练 Scaling Law 买的是知识密度,对齐买的是服从性,这两条线在 2024 年之后撞上了同一堵墙:数学、代码、多步规划类任务的正确率不再随参数平滑上升。破墙的第三条维度是推理时多算------o1 在 2024 年 9 月证明了它,DeepSeek-R1 在 2025 年 1 月把它开源化、机制化。这条路线的底牌说破了并不神秘:模型单次采样会犯它不该犯的错,而错误率可以通过"多想、多试、挑对的"被系统性压低。本文拆四件事:为什么多算有效、思维链在算什么、RL 怎么教会长思考、以及这一切在服务侧的账单长什么样。
一、覆盖率的数学:为什么多算有效
最朴素的机制是重复采样加筛选。设单次正确率 ppp、采 nnn 次:
python
def coverage(p, n): # "至少一次做对" 的概率
return 1 - (1 - p) ** n
for n in [1, 4, 16, 64]:
print(f"n={n:3d}: p=0.1 → {coverage(0.1, n):.2f}")
# n= 1: 0.10 n=4: 0.34 n=16: 0.82 n=64: 0.998
独立假设下 64 次采样能把 10% 的单次正确率推到近乎必中。但实测曲线远比这悲观------DeepMind 对竞赛代码的覆盖分析给出的是对数增长:错误不是独立的运气问题,而是高度相关的系统性失败。这个 gap 本身就是工程指南:重复采样的收益上限由多样性决定,温度、提示变体、不同模型混合,都是在拉开样本相关性。
两个已经工业化的变体:
python
def best_of_n(problem, n=16, temp=0.9):
cands = [llm(problem, temp=temp) for _ in range(n)]
scores = [reward(problem, c) for c in cands] # 可验证域: 跑测试/对答案
return cands[max(range(n), key=lambda i: scores[i])]
def self_consistency(problem, n=16, temp=0.9):
answers = [llm(problem, temp=temp) for _ in range(n)]
top = Counter(normalize(a) for a in answers).most_common(1)
return top[0][0] # 多数投票: 免验证器, 换 "答案有唯一众数" 假设
自一致在 GSM8K 上加 40 条采样路径把 PaLM-540B 提了近 18 个点,是"无验证器场景"的默认解;BoN 则是可验证域(代码有单元测试、数学有标准答案)的标准解。由此推出 2024 年那篇测试时计算 Scaling 研究的核心结论:同样的 FLOPs 预算,小模型多采样在不少域上胜过大模型单发------算力从"买更大的记忆"重新分配到"买更多的尝试",是训练 Scaling 与测试时 Scaling 的分岔口。
二、思维链:把串行计算写进上下文
多采样回答了"算力换覆盖",思维链回答"单次内部多算"。机制可以一句话拆穿:Transformer 的串行计算深度只有网络层数那么深,CoT 把中间结果写进上下文,用序列长度换计算深度 ------每生成一个 Token,整个网络对全部历史重新做一次满深度前向,kkk 步推理展开成 kkk 次前向,注意力在这里扮演串行状态机的读写头,KV Cache 就是工作内存。
预训练语料里的推理文本给了模型这个"执行器"的雏形,但真正把"长思考"推成主导行为的是 RL(下一节)。RL 训出的长思维链会涌现出一组预训练分布里罕见的行为:回溯 ("等等,我之前那步有问题")、自我验证 (把结论代入原题检查)、中途换路------DeepSeek 把 R1-Zero 训练日志里的这类时刻称为"aha moment",它是策略内化的标志,不是被 prompt 表演出来的。
长思考也有病,叫过度思考:简单题也铺陈几百行推理。思维长度的最优分配天然重尾(难题值得百倍于易题的算力),但模型不自知难度。s1 的预算强制给出一个惊人简洁的旋钮:
python
def think(problem, budget):
text = llm(problem, stop=["</think>"], max_tokens=budget)
while n_tokens(text) < budget: # 想得太短?
text = text.replace("</think>", " Wait,") # 强制续想
text = llm.continue(text, stop=["</think>"])
return llm.continue(text + "</think>") # 预算耗尽, 放行作答
一千条精选样本微调出的模型,靠这个"不许提前交卷"的机制在预算增加时持续涨分------测试时 Scaling 在推理长度这个轴上也被验证了。今天的 API 已经把它产品化为 thinking budget / reasoning effort 参数,本质都是把算力分配的选择权从模型移交给用户。
三、RL 怎么教会长思考
第 3 篇拆 RLVR 时留了一句"RLVR 只在有规则奖励的域成立",长思考训练正是它的主战场。R1-Zero 的配方极简到值得整段记录:从 V3-base 出发,不做任何 SFT,直接 GRPO,奖励只有两条硬规则------答案对给 1 分,格式对(思维链包裹在标签里)给格式分。没有过程监督、没有偏好模型、没有思维链模板,长推理行为从纯结果奖励里自己长了出来。
但纯 RL 版本有个工程教训:涌现的思考没人读得懂------中英混杂、排版混乱。R1 正式版因此改成多阶段流水线:少量人工长 CoT 冷启动 SFT → 推理域 RL(学到反思)→ 拒绝采样生成可读数据再做一轮 SFT(固化可读性)→ 全场景 RL(推理+通用对齐合并)。先用 SFT 立好格式骨架,再用 RL 长出能力,最后回炉把可读性焊死------这个次序是 2025 年推理模型训练的通用模板。
过程奖励模型的路线值得单独对表。Lightman 等 2023 年用 80 万条人工逐步标注(PRM800K)证明按步监督显著优于只看结果(MATH 上 ORM 被 PRM 反超),但人工逐步标注贵到无法复制,后续工作转向自动标注------用蒙特卡洛补全估计"这一步之后最终做对的概率",当作步骤质量分数。两条路线的权衡:
| 结果监督 (ORM) | 过程监督 (PRM) | |
|---|---|---|
| 奖励信号 | 最终对错 | 每步的后续成功率 |
| 标注成本 | 低(自动) | 高 / 自动化引入偏置 |
| 用途 | RL(GRPO 群体相对) | RL + 测试时搜索引导 |
| 风险 | 奖励稀疏、推理路径漂移 | 步级分数噪声、标注者偏置 |
关键分工:RL 训练用规则奖励(干净、不可刷)就够;PRM 的真正主场在测试时搜索------按步打分的价值是能引导树搜索,这是纯结果奖励做不到的。
蒸馏是绕过 RL 的捷径,且有明确的适用边界。R1 把 80 万条教师轨迹 SFT 进 Qwen/Llama 全系小模型,得到 R1-Distill 系列;论文自己给出的对比结论是:小模型(<32B 量级)直接上 RL 不如蒸馏教师轨迹,蒸馏之后再 RL 才是上限。原因直白------RL 需要模型先具备足够的基础策略多样性供奖励筛选,小模型的候选池太浅;教师轨迹相当于把多样性外包给了大模型。
四、搜索:结构化的测试时算力
采样是平铺算力,搜索是分层分配算力。把 PRM 当节点价值函数,推理过程当树,经典 MCTS 几乎原样可用:
python
import math, random
class TNode:
def __init__(self, state, parent=None):
self.state, self.parent, self.children = state, parent, []
self.N, self.V = 0, 0.0 # 访问计数, PRM 价值累计
def uct_select(node, c=1.4):
return max(node.children, key=lambda ch: # 探索: 访问少的价值补分
ch.V / ch.N + c * math.sqrt(math.log(node.N + 1) / ch.N))
def mcts_step(root, llm, prm, k=4):
node = root
while node.children and node.N > 0: # 1. 选择: 沿 UCT 下探
node = uct_select(node)
for step in llm.propose(node.state, k): # 2. 扩展: 每步 k 个候选
node.children.append(TNode(node.state + [step], node))
leaf = random.choice(node.children) # 3. 评估: 叶节点 PRM 打分
v = prm.score(leaf.state)
while leaf is not None: # 4. 回传: 价值上传到根
leaf.N += 1; leaf.V += v; leaf = leaf.parent
UCT 的"不确定性高就多探索"正好对上覆盖率分析里的相关性问题:分支间不是等价的抽签,把算力倾斜给没验证过的高潜力分支,等价于对冲系统性失败。代价同样清晰:一次 MCTS 的调用次数是 BoN 的许多倍、PRM 分数本身带偏置、且整棵树的 KV 与调度复杂度都由服务侧买单。工程现实是搜索只在分支可评估、领域可验证(代码、形式化证明、规划)的头部场景站得住,通用对话里 BoN/自一致就够。
搜索谱系的两个端点由此看清:一端是 CoT 的隐式搜索 (模型内部一条路径自带的回溯与验证,单分支、低成本、无显式评分),一端是 MCTS 的显式搜索(多分支、显式价值、可解释但昂贵)。RL 长思考的训练成果,本质上是把显式搜索的行为蒸馏进单条路径------这也是它成为默认形态的原因:把搜索成本折进模型权重,换来推理时的平坦扩展曲线。
五、服务侧的账单:思考是 decode 负载
推理模型改变了推理服务的负载画像,账要按第 5 篇的框架重新算。思考 Token 是纯 decode 流量:一条原本几百 Token 的回复,现在垫着数千到数万 Token 的思维链------单请求 TPOT 不变,总延迟与 token 数线性膨胀,decode-bound 特征被极端强化。这部分算力不换来任何参数知识,全部是一次性的"现场熟虑"。
三个服务侧对策已经成型:思维链与上下文缓存的关系重构 ------多轮对话里系统提示和历史的 KV 命中率极高,但被截断的历史思维链缓存价值归零(后续轮次几乎不引用上轮的思考过程),系统必须区分"可缓存前缀"与"可丢弃思考";思维的预算接口 ------thinking budget、reasoning effort 让用户按任务难度买算力,把重尾分配交给市场;流式思考------思维链边生成边吐给用户,掩盖总延迟。
成本结构也随之分层:推理模型的每百万 token 单价显著高于同尺寸非推理模型,且溢价主要来自思考 token 的期望长度------不是模型变贵了,是每次调用内嵌了一次现场搜索。
六、收束
| 机制 | 算力买什么 | 边界 |
|---|---|---|
| 重复采样 + 验证 | 覆盖率(对数增长) | 需可靠 verifier |
| 自一致投票 | 答案分布的众数 | 多正确解任务失效 |
| 长思维链 | 串行计算深度 | 过度思考、延迟成本 |
| RL 内化长思考 | 回溯/验证策略 | 域需可验证 |
| MCTS + PRM | 结构化探索树 | 步级评分偏置、调用成本 |
| 蒸馏 | 教师的多样性外包 | 上限锁死在教师 |
六种机制共享同一个入场条件:可验证性 。代码有测试、数学有答案、棋局有胜负------在这类域里测试时算力可以无限兑换成正确率;换到开放式写作、战略判断这类没有客观 verifier 的域,覆盖率的数学立即失效,多采样只会收获风格方差。推理模型的边界不是模型能力,而是验证器存在与否。
一句话收束:**训练 Scaling 买下的是知识------可缓存、可蒸馏、边际成本趋零;测试时 Scaling 买下的是熟虑------不可缓存、必须每次现场发生。**推理模型的经济学全部写在这两句话的差价里。