高三教室里,小明和小红水平相当。一模考试,小明 40 分钟做完卷子就趴着睡觉;小红花同样的时间做完,再用剩下的时间逐题检查:把计算重新验算一遍、换一种解法确认结果、对拿不准的题多推演几步。二模成绩出来,小红比小明高出十几分。老师点评:不是小红突然变聪明了,而是她学会了「考试时多花时间检查」。 大模型也有同样的故事。传统模型拿到问题就像小明一样「秒交卷」——你说一句,它立刻回一句,从不回头检查。而测试时计算(Test Time Compute,简称 TTC)的理念是:同一个模型,在回答问题时多投入一些计算量——多推演几步、多尝试几个答案、多验证几遍——最终输出的质量就能显著提升。OpenAI 的 o1 模型就是这一思路的明星代表。 这篇文章会用「考试检查」这条线,带你完整理解 TTC:它是什么、计算花在了哪里、o1 是怎么做到的、收益有多大、怎么控制预算,以及它的代价和边界。
理解 TTC 是在不改变模型参数的前提下、用推理时的计算量换取答案质量的核心理念,是读懂 o1 等推理模型和前沿推理优化方案的关键。
目录
可视化演示
展示Best-of-N/树搜索/自迭代三种测试时计算策略、训练与测试扩展的权衡关系,以及边际递减效应与最优区间。
本节配有交互动效(进入视口后自动加载,约 3KB)。
'+_captions.strategies+'
概念原理:考试时多检查几遍
回到开头的小红。她为什么检查有效?因为她知道,自己第一次作答时可能粗心、可能漏条件、可能算错一步。检查不是重做一遍那么简单,而是把「会做的题」稳定地转化成「做对的题」。这个转化的关键,发生在考试进行中——而不是考试之前。
传统大模型的推理(Inference)流程就像「不检查的考生」:输入一句话,模型基于训练时学到的知识直接生成答案,整个过程一次性完成,没有回头路。训练阶段(Training)决定了模型「会多少知识」,而推理阶段只负责「把知识说出来」。长期以来,研究者把大部分算力都花在训练上,推理时则追求快、省。
测试时计算把注意力转向了推理阶段。它允许模型在生成答案之前、期间或之后,投入额外的计算资源:写一份推演草稿、生成多个候选回答、反复比对验证,最后才给出结论。这笔额外开销记为 C_test,与训练开销 C_train 合在一起,构成模型生命周期里的总计算量。TTC 的核心命题就是:在 C_test 上多花一点预算,不必改动 C_train,也能换来更高的答案质量。
所以 TTC 不是什么魔法,它把「考试时多检查」这件朴素的事搬到了模型身上。同一个模型、同一份训练数据,推理策略不同,最终表现可以差出好几个数量级。这正是它吸引人的地方——不动模型一根汗毛,只调整「交卷前的动作」,成绩就上去了。
- 总计算量 C_total模型从训练到推理的全生命周期总计算开销,相当于「学习+考试」的全部精力投入。
- 训练计算量 C_train平时「刷题学习」阶段消耗的算力,对应模型学习知识库的过程。
- 推理计算量 C_test回答问题时额外「检查验算」投入的算力,是 TTC 关注的焦点。
实现方式:检查答案的三种姿势
小红检查试卷时,通常有三种姿势。第一种,沿着自己的解题过程重新读一遍,看每一步有没有漏洞——这叫「顺着看」。第二种,把同一道题用另一种方法完全重做一遍,两边答案一致才算放心——这叫「换着做」。第三种,做完所有题后,让旁边成绩更好的同学帮忙把把关——这叫「找外援」。
TTC 世界里正好对应三种主流实现方式。第一种是思维链(Chain-of-Thought):让模型把推理步骤一步步写出来,而不是直接跳到最后答案。写步骤的过程给了模型「自我发现」的机会,很多错误在书写过程中就被纠正了。第二种是多次采样 + 多数投票(Majority Voting):同一个问题让模型独立生成 N 个答案,统计哪个答案出现得最多,就选它。相当于让 N 个「平行时空的自己」各做一遍,以众数为准。第三种是验证器重排(Verifier Re-ranking):额外训练一个打分器,对多个候选答案逐一评分,挑分数最高的输出——这就是「找外援」。
多数投票的数学表达非常简洁:每个候选答案 y 的得票数等于所有采样结果中等于 y 的次数,最终选择得票最多的那个。
三种姿势可以叠加使用:先思维链写步骤,再多次采样扩大候选,最后用验证器挑最优。计算量花得越多,答案越稳——当然,前提是你知道怎么花。这就像小红检查时既顺着看、又换着做、还请了外援,自然比只盯着答案发呆的小明强得多。
- 每次采样 y_i模型第 i 次独立生成的回答,每次采样都从模型的概率分布中抽出一个结果。
- 投票计数遍历所有候选答案 y,统计被多少样本选中。示性函数
1[...]在条件成立时取 1,否则取 0。 - 众数结果在所有候选答案中,挑取得票数最高的那个作为最终输出。
o1 模型:把检查练成本能的「考神」
小红只是「会检查」,而真正的高手把检查练成了本能。考场上的顶尖学霸不会在每道题上都平均用力,他会快速判断题目难度,简单题直接过,中等题一边做一边验,压轴题则反复推演、尝试多条思路,甚至推翻重来。OpenAI 的 o1 模型,就是被训练出了这种「考试本能」的学霸。
o1 是第一个把测试时计算大规模产品化的前沿模型。普通大模型被训练成「看到问题立刻作答」,o1 则通过强化学习学会「多想一想再作答」。它在推理时会生成一段很长的内部思考轨迹(俗称隐藏思维链),包含多步推演、假设检验和回溯,最后只把结论呈现给用户。训练 o1 时,奖励函数会鼓励模型在推理过程中多探索、多验证——思考质量越高,最终答案越有可能正确,模型就越倾向采用这种思考策略。
从强化学习的视角看,o1 的优化目标是最大化思考轨迹对应的期望奖励,这里的奖励直接由最终答案是否正确决定。
o1 的意义在于证明了 TTC 不只是实验室里的技巧,而是一条可以产品化的道路。当你在屏幕上看到 o1 显示「正在思考……」时,你要知道,那不是卡顿,而是它的「检查时间」——它正在用训练阶段学到的考试策略,为你的问题付出额外的计算量。
- 策略 π_θ参数为 θ 的模型,定义了生成各种思考轨迹的概率分布。
- 轨迹 τ一次完整推理过程中的思维链加上最终答案,可以理解为「检查过程的完整记录」。
- 期望奖励对所有可能轨迹的奖励求加权平均,目标是找到让期望奖励最大化的策略参数。
性能收益:多花的力气值不值
小红多检查半小时,真的能提分吗?答案是:能,但有边界。做口算题,检查 30 遍也不会让 1+1 变成别的数;做压轴大题,多检查几遍却可能从「毫无思路」变成「完整解出」。检查的价值,取决于题目本身值不值得检查。
TTC 的收益同样遵循这种「先快后慢」的规律。以小学数学应用题数据集 GSM8K 为例:直接作答(零额外计算)准确率约 50%;加上思维链,准确率提升到 70% 左右;再做多次采样与多数投票,可以接近 90%。但这个提升不是线性的——完成从 50% 到 90% 的跨越,只需少量额外计算;而想从 90% 提升到 95%,往往需要翻好几倍的计算量。经验上,准确率与推理计算量的关系可以近似写成一条指数饱和曲线。
这条曲线给我们的启示是:TTC 的投资回报率在最开始最高。对大多数实际系统来说,与其让模型「无限检查」,不如把预算花在刀刃上——用最少的额外计算拿到最大的提升,这和考试中「先把会做的题全部做对,再钻研难题」是一个道理。
- 基础准确率当额外计算量为 0 时,准确率等于 90 - 50 = 40%,对应「直接作答」的基线水平。
- 增长项随着测试时计算量 C_test 增加,指数项不断减小,准确率随之上升。
- 天花板当计算量趋于无穷时,指数项趋近于 0,准确率收敛到 90% 的上限。
预算控制:检查也要讲性价比
考场上的时间就那么多,小红不可能对每道题都检查到最后一秒。聪明的做法是:先快速扫一遍卷子,把简单题直接拿下,把时间省给中难题;对压轴题,先花三分钟试一种思路,不行就换另一种;最后还剩五分钟时,不管有没有做完,都要停下来涂答题卡。这就是预算控制。
TTC 系统同样需要计算预算管理。如果对每个问题都无脑堆计算,成本会迅速失控,用户体验也会变得不可接受。常见的策略有三:一是按难度分配——用一个小模型或启发式规则预估问题难度,难题给更多采样次数;二是自适应长度——让模型根据推理过程的置信度决定何时停止继续思考;三是超时保护——设置硬性的计算量上限 C_max,一旦达到上限就强制终止,输出当前置信度最高的答案。实际工程中还有几条铁律:用小模型预估难度、把采样过程并发化、动态调整超时阈值,这些都能显著降低 TTC 的边际成本。
数学上,每个请求的预算可以写成难度估计值的线性函数,并受上限约束。
预算控制的本质是把「检查时间」当作一种稀缺资源来分配。同一个模型,预算分配得好,简单题秒答、难题深入思考,整体体验远胜于对每道题都「平均用力」。这也是 TTC 从论文走向工程必须要跨过的一道坎。
- 难度估计 d(x)对输入问题 x 的困难程度打分,取值通常在 0 到 1 之间,1 表示极难。
- 线性预算通过系数 α 把难度映射成计算预算,难度越高,分配的检查资源越多。
- 上限截断取预算与上限的较小值,保证任何请求都不会消耗超过 C_max 的计算量。
适用场景:哪些题值得检查
如果整张卷子都是判断题和默写题,小红就算把检查时间用到极致,分数也纹丝不动。反之,如果卷子里有大量需要多步计算的大题,检查的价值就非常可观。所以「检查有没有用」首先要问:「题目是不是那种值得检查的题?」
TTC 最适合具有「可验证性」的任务——存在明确的标准答案,或者结果可以被自动检验。三类典型场景:数学推理(步骤可逆推、结果可验证)、代码生成(生成的程序可以运行单元测试)、复杂规划(多步决策可以模拟回放、检查每一步是否合理)。在这些场景里,思维链、多次采样、验证器都有用武之地。反之,在开放对话、创意写作、情感分析等主观任务上,TTC 的收益很小——没有一个「标准答案」存在,多算几遍并不能让故事变得「更正确」。
判断一个场景值不值得引入 TTC,可以计算投入产出比:每多花一份计算成本,能换来多少准确率提升。
用考试来类比就是:检查大题的收益远高于检查选择题。做 TTC 方案时,第一步不是调参数,而是先确认业务场景是否具备可验证性。选错了战场,付出再多计算量也是白费。
- 准确率提升 ΔAccTTC 方案与基线方案的准确率之差,衡量「多检查」带来的收益。
- 额外成本 ΔCostTTC 方案与基线方案的推理计算量之差,衡量「多检查」付出的代价。
- 投入产出比 ROI每单位额外计算成本带来的准确率增益,ROI 越高越值得投入。
挑战局限:考试检查的代价
考试检查不是没有代价。小红有时候把对的答案改错了;有时候在一道难题上死磕太久,导致后面的简单题没时间做;有时候明明已经做完了,却因为反复检查而怀疑自己,把心态搞崩。这些「过度思考」的代价,TTC 同样存在。
TTC 的局限可以概括为四件事。成本:一次深思熟虑的推理,计算量可能是普通推理的 10 到 100 倍,直接反映在服务器开销和电费上。延迟:用户不会永远愿意等——你问一句「今天天气如何」,等一分钟才回复是不可接受的。过度思考:模型可能对简单问题反复摇摆,甚至把本来正确的答案改错,这也是为什么预算控制至关重要。验证依赖:TTC 的收益高度依赖任务可验证性,在没有标准答案的领域,思维链和投票都只是「自我感觉良好」。从 Scaling 角度看,边际收益随计算量增加而衰减。
理解了这些代价,才能真正用好 TTC。它不是免费的午餐,而是一笔需要精打细算的投资。就像小红最终学会了「看菜下饭」——简单题不过多纠缠,难题才全力投入——一个成熟的推理系统,应该把 TTC 用在值得的地方,并时刻守着预算这条生命线。进阶的学习路线,也自然沿着「可验证任务 → 预算控制 → 验证器训练 → 强化学习思考策略」层层深入。
- 边际收益 ΔAcc在计算量 C 的基础上,再微小增加一点计算量带来的准确率增量。
- 幂律衰减收益与计算量的负幂次成正比,C 越大,增益项越小。
- 衰减指数 αα 是大于 0 的常数,刻画收益下降的速度,α 越大衰减越快。
AI 应用场景
数学竞赛辅导系统
阶段:推理优化
解决的问题:传统大模型直接作答竞赛题的准确率偏低,经常在关键步骤出错;对同一道题反复「硬想」也得不到更好结果。引入 TTC 后,系统让模型先写出完整思维链,再多次采样候选解法,最后用验证器对每一步推理打分,选出最可靠的解答。这样即使模型本身没有变强,输出的正确率也会大幅提升。
具体案例:某在线数学学习平台接入推理模型后,将竞赛题解答正确率从 45% 提升到 85%。代价是平均响应时间从 2 秒增加到 20 秒,平台通过「简单题秒答、难题多思考」的预算控制策略,把整体体验维持在用户可接受的范围。
代码自动修复助手
阶段:推理优化
解决的问题:大模型生成的代码补丁经常无法通过编译或测试,传统做法是让工程师反复修改提示词。TTC 让模型一次性生成多个候选补丁,再用自动化测试作为「验证器」运行每个补丁,选出唯一通过测试的那个。
具体案例:某 AI 编程助手的 Bug 修复功能,从「生成 1 个补丁直接返回」改为「生成 10 个补丁并行跑测试,只返回通过的版本」,修复成功率提升了近一倍,误报率大幅下降。因为「能通过测试」这个验证条件天然适合 TTC,投入回报极高。
自动化运维智能体
阶段:推理优化
解决的问题:运维智能体在执行多步骤操作时,一步出错可能导致严重后果。TTC 让智能体在行动前先进行多轮「沙盘推演」——用思维链模拟每一步操作的结果,评估风险后再真正执行。
具体案例:某云计算公司的智能运维系统,在处理「磁盘扩容」这类多步任务时,先让模型规划完整操作序列,再对每一步做模拟验证;只有全部步骤通过模拟的任务才被真正执行。系统操作成功率从 60% 提升到 95%,危险操作次数下降 80%。
Python 演示
# -*- coding: utf-8 -*-"""测试时计算模拟:多数投票与动态预算分配""" import randomfrom collections import Counter class WeakModel: """弱模型:不同难度题目的基础正确率不同""" def __init__(self, acc_map): self.acc_map = acc_map self.wrong_pool = ["选项A", "选项B", "选项C", "选项D"] def answer(self, question, difficulty): """返回一个回答,可能正确也可能错误""" if random.random() < self.acc_map[difficulty]: return question return random.choice(self.wrong_pool) def majority_vote(model, question, difficulty, n_samples): """多次采样 + 多数投票:用众数作为最终答案""" votes = [ model.answer(question, difficulty) for _ in range(n_samples) ] return Counter(votes).most_common(1)[0][0] def assign_budget(difficulty): """动态预算:难度越高分配越多采样次数""" budget_map = {"easy": 1, "medium": 5, "hard": 30} return budget_map[difficulty] def evaluate(model, difficulty, n_samples, trials=500): """统计指定难度和预算下的最终准确率""" question = "标准答案" hit = 0 for _ in range(trials): if majority_vote(model, question, difficulty, n_samples) == question: hit += 1 return hit / trials def main(): model = WeakModel({"easy": 0.95, "medium": 0.60, "hard": 0.35}) print("难度 预算 准确率") for difficulty in ["easy", "medium", "hard"]: budget = assign_budget(difficulty) acc = evaluate(model, difficulty, budget) print(f"{difficulty:6s} {budget:3d}次 {acc:7.2%}") if __name__ == "__main__": main()
self.acc_map = acc_map保存不同难度题目的基础正确率,相当于给不同「科目难度」预设答题水平。random.random() < self.acc_map[difficulty]以对应概率返回正确答案,否则从错误池中随机抽一个,模拟模型的「粗心错误」。Counter(votes).most_common(1)[0][0]统计所有候选答案,取出现次数最多的那个,实现多数投票。budget_map = {"easy": 1, "medium": 5, "hard": 30}简单题只采样 1 次,难题采样 30 次,体现动态预算控制思想。hit / trials用大量重复实验估计准确率,让随机波动的影响降到最低。
常见误区
误区我以为 TTC 就是让模型变得更大更强,多花计算是指训练更大的模型、用更多的参数。反正效果提升都来自「烧更多算力」。
正解完全不是一回事。TTC 不改变模型参数量,也不修改训练过程,它是在推理阶段多花计算——同一个模型、同样的权重,只是回答问题时多思考几轮、多采样几次。「考试时多检查」和「考前换个更聪明的脑子」是两种截然不同的策略。
为何常见:大家习惯把「效果提升」和「模型变大」绑定在一起,忽略了推理策略本身也是一项可以优化的变量。
误区反正多花计算就能提升性能,那所有任务都上 TTC 好了,简单问答、闲聊、写作文统统先把计算量拉满。
正解TTC 只对「有标准答案、结果可验证」的任务有效,比如数学推理、代码生成、多步规划。对开放对话、创意写作等主观任务,不存在「标准答案」,多算几遍也不会让回答变得「更正确」。
为何常见:看到论文里 TTC 让准确率翻倍,容易以为有普适性,忽略了那是特定可验证任务上的实验结果。
误区既然 TTC 有效,那就把预算拉满,采样 100 次一定比采样 10 次好。计算量翻倍,准确率也翻倍,何乐而不为?
正解收益曲线是「先快后慢」的指数饱和形态,计算量超过阈值后准确率提升趋近于零,甚至可能因为过度思考而轻微下降。采样太多不仅浪费算力,还可能引入「重复性错误」——模型会以同样错误的方式错很多次。
为何常见:多数投票的直觉是「次数越多越稳」,忽略了模型采样之间的错误是相关的,不是独立随机的。
误区o1 在推理时「即兴发挥」地思考,模型自己决定要思考多久、怎么思考,这种能力是推理时自然涌现出来的。
正解o1 的「思考策略」是训练阶段通过强化学习学出来的。它知道何时该多思考、何时该收手,是训练时用大量数据和算力打磨出来的行为模式,不是推理时随机出现的。推理阶段只是执行这套学到的策略。
为何常见:从用户视角看,模型确实在推理时「想」了很久,容易误以为思考能力是在线涌现的,忽略了背后的强化学习训练。
面试题
Q1. 测试时计算(TTC)发生在哪个阶段?
- A.数据预处理阶段
- B.模型训练阶段
- C.推理响应阶段← 正确答案
- D.模型评估阶段
答案:C。TTC 的核心是「推理时多花计算量」,发生在模型收到问题到输出答案的推理响应阶段。数据预处理、训练、评估都发生在推理之前,不涉及「回答问题时检查」的含义。
Q2. 下列哪项属于典型的 TTC 方法?
- A.扩大训练数据
- B.增加模型参数
- C.采用思维链← 正确答案
- D.提升学习率
答案:C。思维链(Chain-of-Thought)让模型在推理时写出详细步骤,是 TTC 的典型实现方式。扩大训练数据、增加模型参数属于训练阶段的改进,提升学习率是优化器参数,都与「推理时多花计算」无关。
Q3. 多数投票中,模型被要求回答同一个问题 11 次,结果 5 次输出 A、4 次输出 B、2 次输出 C,最终答案应该是什么?
- A.随机选一个答案
- B.最终选择答案 A← 正确答案
- C.最终选择答案 B
- D.最终选择答案 C
答案:B。多数投票取出现次数最多的答案,A 出现了 5 次、B 出现 4 次、C 出现 2 次,所以选 A。这就像让多个「平行时空的自己」各做一遍,以众数为准。
Q4. 设直接作答准确率为 50%,加思维链后 70%,再加多数投票到 85%,继续加大预算到 90% 后几乎不再提升。这最符合哪种规律?
- A.准确率线性持续增长
- B.计算量越大提升越大
- C.边际收益逐渐递减← 正确答案
- D.准确率与预算成反比
答案:C。准确率的提升幅度从 20 个百分点→15 个百分点→5 个百分点,说明边际收益在递减,最终趋平。虽然准确率总体上升,但绝不是线性增长,也不是「提升越大」。
Q5. 下列哪些场景更适合使用 TTC?
- A.数学证明题← 正确答案
- B.代码缺陷修复← 正确答案
- C.开放型闲聊对话
- D.多步任务规划← 正确答案
答案:ABD。数学证明、代码修复、多步规划都具有「可验证性」——有标准答案或可通过测试/模拟验证,TTC 收益大。开放闲聊没有标准答案,多算几遍不会让对话变得更「正确」。
Q6. o1 模型的「思考能力」主要来自哪一步?
- A.推理时的随机搜索
- B.训练阶段的强化学习← 正确答案
- C.用户给出的思维链提示
- D.更大的上下文窗口
答案:B。o1 的思考策略是训练阶段通过强化学习学出来的,奖励函数鼓励模型采用质量更高的推理轨迹。它不是推理时随机涌现的,也不是靠用户提示或更大的上下文窗口。
Q7. TTC 的常见实现方式包括哪些?
- A.思维链逐步推理← 正确答案
- B.多次采样加投票← 正确答案
- C.增大模型参数量
- D.验证器重排答案← 正确答案
答案:ABD。思维链、多次采样投票、验证器重排是 TTC 的三大主流实现方式,都发生在推理阶段。增大模型参数量属于改变模型本身,不属于 TTC。
Q8. 设计 TTC 计算预算时,需要权衡哪些因素?
- A.问题本身的难度← 正确答案
- B.用户可接受的延迟← 正确答案
- C.推理计算的成本← 正确答案
- D.训练数据规模大小
答案:ABC。预算控制的核心是根据问题难度分配计算量,同时受用户延迟耐受度和推理成本约束。训练数据规模是训练阶段的事,与推理预算无关。
Q9. TTC 与传统推理的核心区别是什么?
- A.使用更大的模型
- B.推理时投入额外计算← 正确答案
- C.改用更小的学习率
- D.增加训练的数据量
答案:B。TTC 与传统推理用同一个模型,区别只在于推理阶段是否投入额外计算量来检查、验证、改进答案。它不涉及模型规模、学习率或训练数据。
Q10. 当 TTC 计算量超过最优预算后继续增加,最可能发生什么?
- A.准确率持续线性上升
- B.准确率保持不变直到崩溃
- C.收益递减甚至轻微下降← 正确答案
- D.计算越多答案越简洁
答案:C。超过最优预算后,边际收益趋近于零,准确率曲线趋平;在极端情况下,过度思考可能把正确答案改错,导致轻微下降。这与「计算量越大越好」的直觉相反,所以预算控制才如此重要。