文章摘要
9月23日,英伟达研究院与斯坦福大学联合团队推出基于对比学习的轻量决策模型CLM,首发版本CLM-8B采用双编码器架构,仅需训练2000万参数的投影头,检查点仅75MB。该模型速度远超同类基线Jev,轻量微调后在两大基准测试刷新验证器领域SOTA,相关资源已公开,团队预告多模态版本CLM-35B即将推出。

9月23日,来自斯坦福大学与NVIDIA Research的联合团队推出了一款基于对比学习目标训练的System One决策模型——Contrastive Language Models(简称CLM)。首发版本CLM-8B采用状态编码器与动作编码器的双架构设计,能够将当前状态与候选动作映射到同一嵌入空间,通过余弦相似度计算完成打分,可直接作为零样本动作分类器和验证器使用。

该模型的骨干网络为冻结的Qwen3-8B,仅需训练2000万参数的MLP投影头即可完成部署,最终生成的检查点文件仅75MB。在零样本场景下,CLM的性能表现与对照基线Jev不相上下,但延迟仅为后者的1/9;经过轻量微调后作为轨迹验证器,它在DeepSWE(81.6%)与Terminal-Bench 2.1(87.6%)两大基准测试中刷新了验证器领域的最新纪录,推理速度比Jev快4至6倍。

实际应用案例

<p style="font-weight:bold;">案例一:Chrome恐龙跑酷游戏</p>
<p>CLM可以实现零样本直接游玩Chrome内置的小恐龙跑酷游戏:每一步将当前屏幕状态与四个候选动作输入模型进行打分,选择得分最高的动作执行。在单张RTX 4090显卡上,该流程的平均延迟约为16毫秒,而对照基线Jev的延迟为150毫秒,速度提升可达9倍。</p>

<p style="font-weight:bold;">案例二:客服工单智能分诊</p>
<p>在官方测试环境中,团队输入了一条真实语气的用户工单:「我的发票被扣了两次,打电话还没人接!」,并同时提出三个不同类型的问题:是否紧急、该由哪个团队处理、客户愤怒程度分级。CLM通过一次调用即可完成全部作答,输出结果为紧急度84.8%、应路由至计费团队(98.8%概率)、客户愤怒等级为「Very angry」(100%匹配)。单次打分延迟约10毫秒,冷缓存状态下整轮往返约1秒,后续缓存命中后可进一步缩短响应时间。</p>

技术架构与训练细节

<p style="font-weight:bold;">基础架构设计</p>
<p>CLM由两个结构一致的编码器组成:状态编码器与动作编码器,二者分别将输入内容映射到共享嵌入空间,状态与动作对的匹配得分即为两个嵌入向量的余弦相似度。每个编码器的核心是冻结的LLM骨干网络Qwen3-8B,仅提取最后一个token的隐藏状态,经过L2归一化后通过MLP投影头输出单位长度的嵌入向量。整个训练过程中,只有2000万参数的投影头会接收梯度更新,骨干网络保持冻结状态。</p>
<p>这种轻量化的训练设计大幅降低了实验成本:LLM的嵌入向量可以预先计算并在不同投影头配置间复用,在Nemotron DQA数据集上完成完整预训练仅需单张RTX 4090显卡运行约一小时。训练完成后,两个编码器即可直接作为零样本动作分类器使用:新的状态输入状态编码器后,与各候选动作的嵌入向量逐一计算相似度,通过softmax函数即可得到答案分布。</p>

<p style="font-weight:bold;">训练目标与三阶段数据配方</p>
<p>模型的预训练阶段采用双向InfoNCE损失函数:给定一批B个配对的状态-动作样本,计算B×B的相似度矩阵,对每个正样本对(s_i, a_i)同时优化两个方向的检索任务——从状态检索动作和从动作检索状态。将正对的相似度经过温度参数τ缩放后进行softmax计算,同批次的其余样本作为负例参与训练。中期训练阶段会在此基础上引入硬负样本,即在状态到动作的检索任务中,除批次内负样本外额外加入K个语义相近的错误答案作为硬负例。</p>
<p>CLM的完整训练分为三个阶段,逐步提升状态与动作的对齐精度:</p>
<ol style="padding-left:20px;">
  <li>预训练阶段:使用约6000万对Nemotron DQA问答样本,将问题作为状态、答案作为动作,从大规模语料中学习通用语义表示。</li>
  <li>中期训练阶段:引入约3000万条由Gemini 2.5 Flash-Lite生成的合成硬负样本,针对部分DQA问题构造语义相近但错误的答案,按硬负例损失规则加入训练。</li>
  <li>后训练阶段:使用约100万条智能体轨迹数据,包括Agent Data Protocol数据集以及Endless-Terminals、LiteCoder-Terminal-SFT的终端轨迹数据,将每一步交互表示为状态-动作对,让模型适配具体的决策场景。</li>
</ol>

<p style="font-weight:bold;">关键训练优化与验证</p>
<p>团队通过两组消融实验验证了训练配方的有效性:第一组实验证明硬负样本不应在训练初期就加入,仅使用预训练数据时top-1准确率为52.1%,加入中期训练后提升至69.2%,而直接从硬负样本开始训练虽然初期进度更快,但最终峰值仅为62.4%且容易出现过拟合,同等算力预算下两阶段方案的准确率高出约7个百分点。</li>
<p>第二组实验验证了后训练阶段的数据回放策略的重要性:混合40%的Nemotron DQA回放数据与60%的智能体轨迹数据进行后训练时,Nemotron硬负样本的top-1准确率仅从69%微降至68.5%,而仅使用智能体轨迹数据进行训练时,准确率会下跌至56.2%。</p>

<p>预训练后的模型表示空间得到了显著优化:在回答「Who wrote the play Romeo and Juliet?」这一问题时,原始Qwen3-8B模型将最高概率赋予了错误答案,正确答案William Shakespeare仅排在第三位(概率19.8%),而经过CLM预训练后的模型将正确答案排在第一位,概率达到54.2%,证明对比预训练成功将模型的表示空间调整为可用的决策空间。</p>

<p style="font-weight:bold;">缩放定律与性能优化</p>
<p>团队在Nemotron DQA数据集上开展了缩放实验,发现InfoNCE损失随训练算力、数据量、投影头规模和编码器规模的变化均符合幂律分布,四个维度需要联合缩放才能达到最优验证性能,其中扩大编码器(LLM骨干)规模带来的收益最为显著。</p>
<p>在固定算力预算的前提下,测试损失随投影头参数量的变化曲线在对数参数空间中近似为抛物线,其最低点即为该数据预算下的最优投影头规模;训练预算越大,最优投影头规模也越大,最优头规模与训练token数几乎呈精确线性关系(N* ∝ D^1.02,约每参数需要310个token)。</p>
<p>CLM-8B是团队缩放计划中的一环,按照上述规律训练了多个规模的模型并进行外推。团队预告多模态版本CLM-35B已经进入训练阶段,预计下月初发布,此前团队还发布过机器人变体CoVer-VLA,用于视觉语言模型的验证缩放研究。</p>

<p>得益于状态与动作的解耦编码设计,两侧的嵌入向量可以分别缓存并独立复用,在动作集合固定而状态持续变化的场景中优势尤为明显:例如在游戏场景中,4个动作的嵌入向量可以在开局前预先计算完成,每一步仅需将新的画面输入状态编码器,与缓存的动作嵌入进行相似度计算即可,每步前向传播的计算量从5次降低至1次。候选动作数量越多、上下文越长,这种优化带来的加速效果越显著,当候选动作数量约为1000个时,CLM的速度比Jev快13倍。</p>

性能表现实测

<p style="font-weight:bold;">零样本性能对比</p>
<p>团队在计算机使用、游戏、工具调用等多个任务上开展了零样本对比测试,CLM与Jev的成功率互有胜负,在BFCL v4与WikiRacing两项任务中略低于Jev,但所有测试场景下的延迟均低于Jev。加速效果在候选动作数量较多(如WikiRacing场景)或动作可以跨状态复用(如恐龙跑酷游戏)时最为显著,官方测试数据显示最高加速比可达9倍。</p>

<p style="font-weight:bold;">智能体基准测试成绩</p>
<p>测试设定为:先使用前沿模型为每个任务采样多个候选解(DeepSWE任务使用Opus 5模型,Terminal-Bench 2.1任务使用Fable 5模型),再使用CLM或Jev作为验证器从候选解中挑选最优结果。测试在38个留出的DeepSWE任务与30个留出的Terminal-Bench 2.1任务上开展,延迟数据在H100显卡上测得。</p>
<p>测试结果显示,Jev在这类长程任务中表现不佳,其成绩甚至低于随机挑选一个候选解的Pass@1基线;而经过轻量微调后的CLM在两个基准测试中均刷新了验证器的SOTA成绩,DeepSWE任务达到81.6%的正确率(31/38),验证推理速度比Jev快4.1至5.7倍。</p>

<p style="font-weight:bold;">候选规模扩大时的延迟表现</p>
<p>候选动作数量越多、上下文长度越长,动作缓存带来的优势越明显:当每个候选动作对应15个token、总候选数约为1000个时,CLM的延迟为44毫秒,Jev为579毫秒(快13倍),约束解码方法的延迟则高达4285毫秒;当固定5个候选动作、上下文长度拉长至约1000个token时,CLM的延迟为36毫秒,Jev为333毫秒(快9倍),约束解码方法的延迟为3402毫秒。</p>

模型部署与使用方法

<p style="font-weight:bold;">模型下载</p>
<pre><code>pip install -U modelscope

modelscope download --model Contrastive-LM/CLM-v0.1-8B --local_dir ./CLM-v0.1-8B

<p style="font-weight:bold;">推理服务部署</p>
<pre><code>pip install contrastive-lm

1. 启动编码器(Qwen3-8B嵌入服务)

vllm serve Qwen/Qwen3-8B --served-model-name qwen3-8b --runner pooling --max-model-len 2048 --port 8090 &

2. 启动CLM API服务(8700端口,首次运行自动下载75MB投影头参数)

clm-serve

<p style="font-weight:bold;">多类型问题一次性调用</p>
<pre><code>from clm import CLMClient, Choice, Noul, Score

client = CLMClient() # 默认地址为http://127.0.0.1:8700
r = client.system_one(
state=“Customer: my invoice was charged twice and nobody answers the phone!”,
questions={
“urgency”: Noul(instructions=“Is this urgent?”),
“department”: Choice(instructions=“Which team should handle this?”,
criteria={“billing”: “Charges, invoices, refunds”,
“technical”: “Bugs and outages”}),
“frustration”: Score(instructions=“How frustrated is the customer?”,
criteria=[“Calm”, “Frustrated”, “Very angry”]),
}
)
print(r.answers[“urgency”].noul) # 0.41022 命题为真的概率
print(r.answers[“department”].choice) # billing
print(r.answers[“frustration”].score) # 1.98386 期望等级0…2

<p style="font-weight:bold;">自由候选排序</p>
<p>对于best-of-N答案、工具名称、下一步动作等自由候选场景,可以使用进程内引擎直接排序,无需启动单独的API服务:</p>
<pre><code>from clm import Engine

engine = Engine(emb_url=“http://127.0.0.1:8090/v1/embeddings”)
engine.rank(“What causes tides on Earth?”,
[“The Moon’s gravitational pull.”, “Photosynthesis in plants.”,
“Because the Earth is round.”])

返回结果示例:[{‘rank’: 1, ‘candidate’: “The Moon’s gravitational pull.”, ‘prob’: 0.997}, …]

<p style="font-weight:bold;">模型微调</p>
<p>在自有数据集上微调CLM仅需要训练投影头参数,官方提供了DeepSWE任务的复现与微调脚本:</p>
<pre><code># 复现DeepSWE留出38任务结果(31/38 = 81.6%)

modelscope download --model Contrastive-LM/deepswe-clm-heads-8k --local_dir heads/deepswe
python evaluation/bon_eval.py --hf-dataset Contrastive-LM/deepswe-clm-embeddings-8k
–checkpoint heads/deepswe/best_head.pt
–tasks-file heads/deepswe/heldout_tasks.json --n 4 --window 12

微调DeepSWE专用投影头

python train/finetune.py --task clm --init-ckpt “$(clm-download)”
–out-dir runs/deepswe --holdout-tasks heads/deepswe/heldout_tasks.json --batch 512

以上内容不代表本平台立场,仅供读者参考