
摘要:大语言模型(LLM)的性能提升长期依赖"参数扩容、数据增量、训练加算"的训练时缩放(Training-Time Scaling)范式,但该路径面临成本指数级增长、边际收益递减的瓶颈。Test-Time Scaling(TTS,测试时缩放/推理时扩展)作为全新技术范式,无需重新训练模型、不修改权重,仅在推理阶段通过投入额外计算资源、优化推理策略或引入外部验证,即可实现模型输出精度、鲁棒性与推理能力的显著提升。本文从核心定义、本质原理、主流算法分类、数学推导、工程代码实现、性能应用、挑战与未来方向,全面拆解大模型Test-Time Scaling,为算法研发与工程落地提供系统化参考。
关键词:大语言模型;Test-Time Scaling;推理优化;思维链;自洽性;温度缩放;预算强制
一、引言:从"训练堆资源"到"推理挖潜力"
大模型的发展历程,始终围绕"缩放定律(Scaling Law)"展开------早期研究者发现,模型性能随参数规模、训练数据量、计算量的增加呈幂律提升。为此,行业长期陷入"堆参数、堆数据、堆算力"的训练时缩放竞赛:从7B到70B、再到405B参数,训练成本从百万级攀升至亿级,但复杂推理任务(如数学解题、代码生成、逻辑论证)的性能增益却持续衰减。
与此同时,大量预训练好的大模型仍存在"推理潜力未被完全挖掘"的问题:单次前向生成的"短视推理"无法覆盖复杂问题的多步逻辑,单一输出易受采样噪声影响,概率分布未校准导致置信度失真。在此背景下,Test-Time Scaling(TTS) 应运而生------它将性能提升的重心从"训练阶段"转移到"推理阶段",核心逻辑是用推理阶段的额外计算,换取模型输出质量的量级提升,成为当前大模型高效迭代的核心方向。
从OpenAI o1系列的"长思考"机制,到李飞飞团队S1模型的"预算强制"策略,再到DeepSeek R1的推理扩展优化,TTS已在数学推理、代码生成、科学问答等硬核任务上证明:无需重训、无需扩参,仅靠推理阶段的合理计算分配,小模型也能逆袭超大模型。本文将系统性解析这一技术范式,从原理到代码,从理论到工程,完整呈现TTS的全貌。
二、Test-Time Scaling核心定义与本质
2.1 核心定义
Test-Time Scaling(TTS,测试时缩放/推理时扩展),是指模型完成训练并固定权重后,在推理(测试/部署)阶段,通过增加计算资源投入、优化推理策略、引入外部验证或动态调整推理路径,在不修改模型参数、不重新训练的前提下,提升模型输出准确性、鲁棒性、推理能力与概率校准度的技术范式。
其核心特征可概括为三点:
- 无训练成本:不涉及参数微调、预训练或增量训练,仅作用于推理流程;
- 计算换精度:通过增加推理时的计算量(如多轨迹生成、多步迭代、验证校验),换取性能提升;
- 动态自适应:可根据问题难度、计算预算、延迟要求,动态调整推理策略与计算投入。
2.2 与Training-Time Scaling的核心区别
TTS与传统训练时缩放(参数缩放、数据缩放、计算缩放)是大模型性能提升的两条互补路径,核心差异如下表:
| 对比维度 | Training-Time Scaling(训练时缩放) | Test-Time Scaling(测试时缩放) |
|---|---|---|
| 作用阶段 | 模型训练(预训练/微调)阶段 | 模型推理(部署/测试)阶段 |
| 权重修改 | 必须修改、更新模型权重 | 完全固定权重,无任何参数改动 |
| 成本属性 | 一次性高成本(训练算力、数据、时间) | 推理时增量成本(按请求计费) |
| 性能增益 | 边际收益递减,参数量越大增益越小 | 随推理计算量增加持续增益(初期显著) |
| 适用场景 | 通用能力提升、基础模型迭代 | 复杂推理、高精度输出、定制化任务 |
| 灵活性 | 低,训练完成后能力固定 | 高,可动态调整策略适配不同请求 |
2.3 本质原理:从"单次推理"到"深度思考"
大模型单次前向推理的本质,是基于输入prompt生成固定长度的token序列,受限于"上下文窗口"与"单步生成"的约束,复杂问题的多步逻辑无法充分展开。TTS的本质,是打破单次推理的限制,通过多轨迹、多步骤、多验证的方式,让模型在推理阶段完成"深度思考",具体体现在三个层面:
- 空间扩展:生成多条独立推理轨迹(如Self-Consistency),覆盖不同解题路径,通过投票/验证筛选最优解;
- 时间扩展:增加推理步骤(如CoT、Budget Forcing),让模型逐步拆解问题、迭代优化答案;
- 概率校准:调整模型输出的logits分布(如Temperature Scaling),修正置信度失真,提升预测可靠性。
三、Test-Time Scaling主流算法分类与原理
当前TTS已形成四大技术流派,覆盖轨迹扩展、概率校准、验证反思、动态计算四大方向,兼顾精度、效率与工程落地性,以下结合数学推导、代表工作与核心逻辑逐一解析。
3.1 轨迹扩展类:多路径探索,投票择优
该流派核心是生成多条独立推理轨迹,通过集成学习的思路筛选最优输出,适用于数学推理、逻辑论证等"答案唯一、路径多样"的任务,是TTS最基础、最易落地的方向。
3.1.1 Self-Consistency(自洽性)
核心原理:摒弃传统的贪心解码(Greedy Decoding),通过随机采样生成N条独立的推理链(含中间步骤+最终答案),统计答案出现的频率,选择频率最高的结果作为最终输出。
数学表达 :
设模型生成的推理轨迹集合为 T = { T 1 , T 2 , . . . , T N } \mathcal{T} = \{T_1, T_2, ..., T_N\} T={T1,T2,...,TN},每条轨迹对应答案 a i a_i ai,则最终答案 a ∗ a^* a∗ 为:
a ∗ = arg max a ∑ i = 1 N I ( a i = a ) a^* = \arg\max_{a} \sum_{i=1}^N \mathbb{I}(a_i = a) a∗=argamaxi=1∑NI(ai=a)
其中 I ( ⋅ ) \mathbb{I}(\cdot) I(⋅) 为指示函数,满足条件时取1,否则取0。
代表工作:作为TTS的经典基线,Self-Consistency在GSM8K、MATH等数学推理基准上,将LLaMA-2 7B的准确率提升15%-25%,且无需额外训练,仅修改推理解码策略。
3.1.2 ToT(Tree of Thoughts,思维树)与MCTS
核心原理:将推理过程建模为树状结构,每个节点代表一个推理步骤,通过蒙特卡洛树搜索(MCTS)探索最优推理路径,相比Self-Consistency的"平行采样",更擅长多步复杂推理(如几何证明、算法设计)。
核心优势:支持推理步骤的回溯、剪枝与优化,避免陷入局部最优解,在复杂逻辑任务上性能远超简单多轨迹采样。
3.2 概率校准类:修正分布失真,提升置信度
该流派核心是调整模型输出的logits分布,修正训练与推理阶段的数据分布偏移,提升概率预测的可靠性 ,其中Temperature Scaling(温度缩放) 是最经典、最通用的方法,适用于所有分类与生成任务。
3.2.1 Temperature Scaling(温度缩放)
核心原理 :通过一个可学习的温度系数 T T T,对模型输出的logits进行缩放,校准softmax后的概率分布,解决模型"过度自信"或"信心不足"的问题。
数学推导 :
模型原始输出logits为 z = [ z 1 , z 2 , . . . , z K ] z = [z_1, z_2, ..., z_K] z=[z1,z2,...,zK],经温度缩放后的logits为 z ′ = z / T z' = z / T z′=z/T,最终概率分布为:
p i = exp ( z i / T ) ∑ j = 1 K exp ( z j / T ) p_i = \frac{\exp(z_i / T)}{\sum_{j=1}^K \exp(z_j / T)} pi=∑j=1Kexp(zj/T)exp(zi/T)
- 当 T > 1 T > 1 T>1 时,分布更平滑,降低模型过度自信,减少错误答案的高置信度;
- 当 T < 1 T < 1 T<1 时,分布更尖锐,增强模型对正确答案的置信度,提升确定性任务的性能。
训练与推理 :温度系数 T T T 仅需在少量验证集上通过交叉熵损失优化(无需修改模型权重),推理时直接代入缩放即可,计算开销可忽略。
工程价值:在开放问答、文本分类、推理任务中,可将模型的ECE(期望校准误差)降低60%以上,同时提升准确率5%-10%。
3.3 验证反思类:自我校验,迭代优化
该流派核心是引入"生成器-验证器"架构,或让模型自我反思、修正推理错误 ,通过"生成→验证→反思→优化"的闭环,提升复杂推理的正确性,代表工作为李飞飞团队的Budget Forcing(预算强制) 与S1模型。
3.3.1 Budget Forcing(预算强制)
核心原理:为模型设定推理token预算(如最大思考token数),强制模型在推理阶段生成足够长度的"思考步骤",直到推理逻辑完整或达到预算上限,避免"短视推理"导致的逻辑缺失。
核心逻辑:
- 模型接收问题后,先生成中间思考步骤(隐式/显式);
- 监控思考token数,未达预算则继续生成反思、补充步骤;
- 达到预算后,输出最终答案,确保复杂问题的推理步骤充分展开。
实验效果:S1-32B模型通过Budget Forcing,在AIME24数学基准上准确率达56.7%,超越OpenAI o1-preview(44.6%),且仅用1000个样本微调,训练成本不足50美元。
3.3.2 生成器-验证器协同(GenPRM、Verifier-Guided TTS)
核心原理:用一个轻量验证器(Verifier)评估生成器(Generator)输出的推理轨迹质量,筛选高置信度轨迹,或引导生成器修正错误步骤,实现"用小验证器赋能大生成器"。
优势:验证器参数量远小于生成器(如1/10),计算开销低,可大幅提升复杂推理的准确率,同时控制推理成本。
3.4 动态计算类:按需分配,效率最优
该流派核心是根据问题难度、延迟要求、计算预算,动态调整推理策略与计算投入,避免"简单问题浪费算力、复杂问题算力不足",是工业级部署的核心优化方向。
3.4.1 自适应停采(Adaptive Stopping)
核心原理:无需固定采样轨迹数N,而是通过监控轨迹的答案一致性、验证器得分,当结果收敛时提前停止采样,在保证精度的前提下减少计算量。
3.4.2 动态Token分配
核心原理:简单问题分配少量推理token,复杂问题自动扩容上下文与思考步骤,结合KV缓存复用,平衡推理效率与性能。
四、Test-Time Scaling工程代码实现
以下提供三类核心TTS方法的Python代码实现,基于Hugging Face Transformers框架,可直接适配LLaMA、Qwen、Mistral等主流开源大模型,兼顾简洁性与工程实用性。
4.1 Temperature Scaling 实现(概率校准)
python
import torch
import torch.nn as nn
from transformers import AutoModelForCausalLM, AutoTokenizer
class TemperatureScaler(nn.Module):
"""温度缩放校准器,仅优化温度参数T,不修改模型权重"""
def __init__(self, model: AutoModelForCausalLM, init_temp: float = 1.0):
super().__init__()
self.model = model
self.temperature = nn.Parameter(torch.tensor(init_temp, dtype=torch.float32))
def forward(self, input_ids, attention_mask=None, labels=None):
# 模型前向推理,获取原始logits
outputs = self.model(input_ids=input_ids, attention_mask=attention_mask)
logits = outputs.logits
# 温度缩放
scaled_logits = logits / self.temperature
# 计算损失(若有标签)
loss = None
if labels is not None:
loss_fct = nn.CrossEntropyLoss()
loss = loss_fct(scaled_logits.view(-1, scaled_logits.size(-1)), labels.view(-1))
return scaled_logits, loss
# 推理阶段使用
def infer_with_temp_scaling(model_path: str, prompt: str, temperature: float = 0.8):
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16, device_map="auto")
scaler = TemperatureScaler(model, init_temp=temperature).to("cuda")
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
with torch.no_grad():
scaled_logits, _ = scaler(**inputs)
# 贪心解码
output_ids = torch.argmax(scaled_logits, dim=-1)
response = tokenizer.decode(output_ids[0], skip_special_tokens=True)
return response
4.2 Self-Consistency 实现(多轨迹投票)
python
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
from collections import Counter
def self_consistency_infer(model_path: str, prompt: str, num_samples: int = 8, max_new_tokens: int = 512):
"""
Self-Consistency多轨迹采样,投票输出最优答案
:param num_samples: 采样轨迹数
"""
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16, device_map="auto")
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
answers = []
for _ in range(num_samples):
# 随机采样生成轨迹(temperature>0引入随机性)
outputs = model.generate(
**inputs,
max_new_tokens=max_new_tokens,
do_sample=True,
temperature=0.7,
top_p=0.9,
pad_token_id=tokenizer.eos_token_id
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 提取最终答案(需根据任务定制解析逻辑)
answer = response.split("答案:")[-1].strip() if "答案:" in response else response.strip()
answers.append(answer)
# 投票选择最优答案
counter = Counter(answers)
best_answer = counter.most_common(1)[0][0]
return best_answer, counter
4.3 Budget Forcing 实现(思考步骤强制)
python
def budget_forcing_infer(model_path: str, prompt: str, max_think_tokens: int = 2048, max_new_tokens: int = 512):
"""
Budget Forcing:强制模型生成足够思考步骤,再输出答案
:param max_think_tokens: 最大思考token预算
"""
tokenizer = AutoTokenizer.from_pretrained(model_path)
model = AutoModelForCausalLM.from_pretrained(model_path, torch_dtype=torch.bfloat16, device_map="auto")
# 初始prompt加入思考指令
think_prompt = f"{prompt}\n请逐步思考,详细推导解题步骤,再给出最终答案:"
inputs = tokenizer(think_prompt, return_tensors="pt").to("cuda")
think_tokens = 0
response = ""
# 迭代生成思考步骤,直到达到token预算
while think_tokens < max_think_tokens:
outputs = model.generate(
**inputs,
max_new_tokens=128,
do_sample=False,
pad_token_id=tokenizer.eos_token_id
)
current_output = tokenizer.decode(outputs[0], skip_special_tokens=True)
response = current_output
think_tokens = len(tokenizer.encode(response)) - len(inputs["input_ids"][0])
# 更新输入为当前输出,继续生成
inputs = tokenizer(response, return_tensors="pt").to("cuda")
# 预算耗尽,生成最终答案
final_prompt = f"{response}\n最终答案:"
final_inputs = tokenizer(final_prompt, return_tensors="pt").to("cuda")
final_outputs = model.generate(**final_inputs, max_new_tokens=max_new_tokens, do_sample=False)
final_answer = tokenizer.decode(final_outputs[0], skip_special_tokens=True).split("最终答案:")[-1].strip()
return final_answer, response
五、Test-Time Scaling性能表现与应用场景
5.1 核心性能增益
TTS在各类复杂任务上的性能提升已被大量实证研究验证,核心数据如下:
- 数学推理:S1-32B通过Budget Forcing,AIME24准确率+12.1%,MATH500+9.2%;Self-Consistency将LLaMA-2 7B在GSM8K的准确率从62%提升至81%;
- 代码生成:DeepSeek R1结合TTS,在KernelBench上生成GPU内核的正确率达96%,超越人类工程师;
- 科学问答:GPQA钻石级任务中,TTS加持的模型准确率提升10-15个百分点,接近人类专家水平;
- 概率校准:Temperature Scaling将ECE降低60%以上,模型置信度与真实准确率的匹配度大幅提升。
5.2 典型应用场景
- 高精度推理任务:数学解题、逻辑论证、代码审计、科学计算,需多步思考与验证;
- 低延迟高精度部署:云端API服务,通过动态TTS平衡延迟与精度;
- 小模型逆袭:7B/13B小模型通过TTS,在特定任务上超越70B/405B大模型;
- 鲁棒性提升:对抗样本、分布外(OOD)数据,通过多轨迹与验证降低错误率;
- 端侧部署:结合量化与轻量化TTS,让端侧小模型具备复杂推理能力。
六、核心挑战与局限
尽管TTS潜力巨大,但当前仍面临四大核心挑战,制约其大规模工业落地:
- 边际收益递减:随推理计算量增加,性能增益逐渐衰减,采样数从1→8提升显著,8→32增益有限;
- 计算与延迟成本:多轨迹采样、长思考步骤会增加推理延迟与算力消耗,实时交互场景需权衡;
- 泛化性不足:多数TTS策略针对特定任务(如数学推理)优化,跨领域、跨任务泛化能力待提升;
- 可解释性缺失:多轨迹、隐式思考的推理过程难以追溯,调试与故障定位困难;
- 工程复杂度:动态策略、验证器协同、KV缓存优化等,增加推理系统的开发与维护成本。
七、未来发展方向
针对现有挑战,TTS的研究正朝着高效、自适应、通用、可解释的方向演进,核心趋势包括:
- 高效TTS算法:基于稀疏采样、轨迹剪枝、复用KV缓存,在保证精度的前提下降低计算开销;
- 自适应TTS框架:根据问题难度、用户预算、设备性能,自动选择最优TTS策略,实现"按需计算";
- 通用TTS范式:构建跨任务、跨领域的统一TTS框架,摆脱对任务特定策略的依赖;
- 可解释TTS:可视化推理轨迹、步骤归因,让隐式思考过程可追溯、可调试;
- 端云协同TTS:端侧执行轻量TTS,云端处理复杂TTS,实现效率与能力的平衡;
- 多模态TTS:将TTS扩展到文本、图像、语音、视频多模态推理,赋能具身智能、自动驾驶等场景。
八、总结
Test-Time Scaling是大模型性能提升范式的革命性转变,它打破了"训练堆资源"的固有路径,证明推理阶段的深度优化,同样能带来性能的量级跃升。从多轨迹投票到概率校准,从预算强制到动态计算,TTS已从理论探索走向工程落地,成为小模型逆袭、高精度推理、低成本部署的核心技术。
尽管当前仍面临效率、泛化性、可解释性等挑战,但随着算法与工程的持续优化,TTS必将成为大模型推理的标准范式,推动AI从"大参数、大训练"走向"小参数、深思考",让大模型的能力普惠到更多场景与设备。