9.26 大语言模型研究简报:CLM-8B 用对比学习替代 Agent 中大量生成式决策
CLM-8B用对比学习替代 Agent 中大量生成式决策发布时间北京时间2026 年 9 月 24 日 14:54机构Stanford 等状态开源模型 代码 技术博客当前不是同行评审论文时间说明按研究者集中发布公告时间2026-09-24 06:54 UTC换算。核心进展Stanford团队提出Contrastive Language ModelCLM核心思路是不要让大模型每一步都“生成”动作而是直接在候选动作里做匹配和选择。传统 Agentstate → LLM → 生成call_search_toolCLMstate embedding ↔ candidate action embeddings → 相似度打分 → 选择动作CLM-8B 基于冻结的Qwen3-8B encoder只训练两个约20M 参数的 projection head分别编码 state 和 action并使用双向InfoNCE contrastive loss训练。训练数据约包括6000 万条 Nemotron QA3000 万 synthetic hard negatives100 万条 agent trajectories。为什么重要CLM 最关键的优势是action embedding 可以提前缓存。例如一个 Agent 有固定的 100 个工具就不需要每一步都让大模型重新阅读全部工具描述并生成工具名只需要编码当前 state → 与缓存好的 action vectors 做 dot product团队报告在部分 tool-calling、computer-use 和 gaming 任务中CLM-8B 相比 Jev 可实现最高约9× 更低 latency候选动作约 1000 个时最高约13× 加速。这些结果来自作者实验应等待更多独立复现。技术意义这代表一种新的 Agent 分层推理方式大型 reasoning model → 负责规划 / 产生候选小型 contrastive model → 负责 select / rank / verify也就是把昂贵的“生成式推理”和廉价的“动作选择”拆开。未来 Agent 不一定每一步都调用一个大模型而可能是少量高成本 reasoning 大量低成本 decision与此前工作的关系CLM 与 TypeSafe 的Jev都属于近期的System One decision model路线。CLM 更进一步把 state 和 action 解耦成可独立缓存的表示并把训练明确建立在 contrastive learning 上。它的边界也很清楚CLM 不会生成新方案只能从已有候选中选择。因此它更适合作为 reasoning model 的补充而不是替代通用 LLM。CLM 工作流程CLM 的工作流程是把 Agent 的“下一步做什么”从生成问题改造成状态—动作匹配问题。整体可以分成三步。第一步是Contrastive State-Action Pre-training。CLM分别用State Encoder和Action Encoder把当前状态S SS和候选动作A AA编码到同一个向量空间里。训练时正确的state-action pair被拉近错误组合被推远当前状态S i S_iSi​应该和正确动作A i A_iAi​相似而和其他动作不相似。所以模型最终学到的是一个打分函数s c o r e ( S , A ) s i m ( E s ( S ) , E a ( A ) ) score(S,A)sim(E_s(S),E_a(A))score(S,A)sim(Es​(S),Ea​(A))本质上不是“生成动作”而是学习“这个状态和这个动作匹不匹配”。第二步是Create Action Candidates系统先明确当前有哪些可选动作例如图里的left / jump / right run这些动作通过模板改写成自然语言候选例如Mario should jump.然后统一经过Action Encoder得到action embeddings。这里有一个非常重要的工程优势如果动作集合固定这些action embeddings可以提前算好并缓存不需要每一步都重新编码。第三步是Zero-shot Action Classification运行时只需要把当前游戏画面编码成state embedding然后分别和所有候选action embedding计算相似度S ↔ A 1 , A 2 , A 3 , … S \leftrightarrow A_1,A_2,A_3,\dotsS↔A1​,A2​,A3​,…经过softmax后得到每个动作的概率例如left5%jump80%right run15%于是系统直接选择jump所以整个workflow可以压缩成状态编码 → 候选动作编码 → 向量相似度打分 → 选择最高分动作 → 执行相比传统 LLM Agentstate → LLM autoregressive decoding → 生成动作文本CLM 变成state embedding × cached action embeddings → similarity → select这就是它最大的思想变化。更抽象地看CLM把Agent决策拆成两类问题生成式模型负责“想出有哪些可能动作”对比模型负责“从这些动作里选哪个”。所以它特别适合tool selection、UI action selection、游戏动作、verifier/ranker这类“候选集合已知”的任务。一句话总结CLM的核心是用对比学习把Agent的动作决策转化为state-action retrieval/classification先把状态和动作映射到同一表示空间再通过相似度快速选择最合适的动作从而替代大量昂贵的生成式推理。动作向量缓存Action Embedding Cache这张图讲的是CLM最核心的工程机制Action Embedding Cache动作向量缓存。它建立在CLM的双编码器bi-encoder / two-tower结构上。核心思想是动作通常不变状态每一步都在变。既然动作的 embedding 与当前状态无关就提前算一次并缓存运行时只重新编码当前状态。具体来看。第一步系统预先把所有候选动作编码成向量z a i E a ( a i ) z_{a_i}E_a(a_i)zai​​Ea​(ai​)例如图里的left →z a 1 z_{a1}za1​jump →z a 2 z_{a2}za2​right run →z a 3 z_{a3}za3​right jump →z a 4 z_{a4}za4​这些action embedding一旦算好就存进cache。只要动作定义没有变化后续每一个时间步都可以重复使用不需要重新经过Action Encoder。第二步运行时只对新状态做一次前向传播。比如在时间t ttMario看到一个新的画面z s ( t ) E s ( s t ) z_s(t)E_s(s_t)zs​(t)Es​(st​)因为环境发生了变化所以state embedding不能缓存必须每一步重新计算。接下来 CLM 直接计算当前状态与所有缓存动作的相似度s c o r e i z s ( t ) ⊤ z a i score_iz_s(t)^\top z_{a_i}scorei​zs​(t)⊤zai​​即z s ⋅ z a 1 , z s ⋅ z a 2 , z s ⋅ z a 3 , z s ⋅ z a 4 z_s\cdot z_{a1},\quad z_s\cdot z_{a2},\quad z_s\cdot z_{a3},\quad z_s\cdot z_{a4}zs​⋅za1​,zs​⋅za2​,zs​⋅za3​,zs​⋅za4​取分数最高的动作a ∗ arg ⁡ max ⁡ i z s ⊤ z a i a^*\arg\max_i z_s^\top z_{a_i}a∗argimax​zs⊤​zai​​图中Step T的结果是jump。Mario跳起来以后到了t 1 t1t1画面变化了。系统只重新算z s ( t 1 ) E s ( s t 1 ) z_s(t1)E_s(s_{t1})zs​(t1)Es​(st1​)然后再次与同一批缓存的action embeddings比较这次可能得到right jump所以整个在线循环实际上非常简单New State → State Encoder → 与 Cached Actions 做 Dot Product → Argmax → Execute → New State最重要的机制其实是State–Action解耦。CLM学的是f ( s , a ) E s ( s ) ⊤ E a ( a ) f(s,a)E_s(s)^\top E_a(a)f(s,a)Es​(s)⊤Ea​(a)注意这里State Encoder和Action Encoder是分开的。正因为E a ( a ) E_a(a)Ea​(a)不依赖当前的s ss它才能提前计算。如果模型采用的是这种结构f ( s , a ) T r a n s f o r m e r ( [ s ; a ] ) f(s,a)Transformer([s;a])f(s,a)Transformer([s;a])也就是把state和action拼起来一起送进模型那么每换一个action都必须重新做一次forward(state, left) → forward (state, jump) → forward (state, right run) → forward (state, right jump) → forward就无法有效缓存动作。CLM 的 bi-encoder 则变成Offline: left → Action Encoder → za1 ┐ jump → Action Encoder → za2 │ right run → Action Encoder → za3 ├─ Cache right jump → Action Encoder → za4 ┘ Online: state → State Encoder → zs zs × [za1, za2, za3, za4] ↓ argmax ↓ action这就是这张图真正想强调的结构优势。图最下面的1 pass vs 5 passes也来自这个机制。如果有 4 个动作没有缓存时一个时间步可能需要1 次 State Encoder4 次 Action Encoder总共约1 4 5 145145次encoder forward有缓存以后四个动作都已经提前编码只剩1 11次State Encoder forward。之后的四个dot product是非常便宜的向量运算因此图里称为大约4× faster。当候选动作数量变成100、1000甚至更多时这个思路的价值会更明显。其计算可以粗略写成没有cacheC state N C action O ( N d ) C_{\text{state}}N C_{\text{action}}O(Nd)Cstate​NCaction​O(Nd)有cacheC state O ( N d ) C_{\text{state}}O(Nd)Cstate​O(Nd)其中N NN是候选动作数量d dd是embedding维度。真正昂贵的Transformer forward从随N NN增长变成基本固定的一次。因此这张图实际上体现了三个机理Dual Encoder / Representation DecouplingState和Action独立编码到同一embedding space。Action Embedding Caching静态动作提前编码运行过程中反复复用。Similarity-based Decision决策不依赖autoregressive generation而是通过dot product / similarity argmax完成。可以把CLM的整个inference思路概括为把Agent的在线决策从“每一步重新理解并生成一个动作”转化成“只编码变化的状态再从预计算的动作向量库里检索最匹配的动作”。这也是CLM能做低延迟Agent的关键它优化的不只是模型大小而是把计算从重复的Transformer forward转化成一次编码 大量廉价向量匹配。当然这个机制有一个明确前提候选动作需要相对稳定且可以预先定义。 如果每一步都会动态产生全新的工具或参数化动作新动作仍然需要先经过Action Encoder缓存的收益就会下降。CLM 三阶段训练路线这张图讲的是 CLM 的三阶段训练路线本质上是把模型从“学会一般语义匹配”逐步训练成“能区分相似动作”最后适配真实 Agent 决策。第一阶段Pre-training用约 6000 万条互联网级 QA 数据做基础训练。核心作用是先让模型学会“什么样的输入和答案在语义上是匹配的”。也就是建立一个通用的 state/action 或 query/answer 表示空间。这个阶段主要学广泛语义不强调 Agent 场景。第二阶段Mid-training加入约 3000 万条 synthetic hard negatives。所谓 hard negative就是“看起来很像正确答案但其实不对”的候选。比如Mercury 是正确答案Venus / Earth / Mars 都是合理但错误的候选这一步的核心机制是不只是把正样本拉近还要学会把“很像但错误”的候选推远。它主要提升 CLM 的决策边界让模型在多个相似 action 中做更精细的区分。第三阶段Post-training再用约 100 万条 Agent trajectory 做后训练。这里数据不再是普通问答而是真实 Agent 场景例如代码编辑下一步做什么GUI / embodied task 下一步执行哪个动作工具调用时该选哪个 action这一阶段的目标是把通用的 contrastive matching 能力适配到实际 Agent 的 action selection / verification 上。所以整个训练逻辑可以概括成通用语义对齐 → 难负样本强化区分能力 → Agent 轨迹适配真实决策三个阶段分别解决三个问题Pre-training“什么是相关的”Mid-training“几个很像的候选里哪个才是真的对”Post-training“在真实 Agent 环境里下一步到底该做什么”总结下来就是CLM 先用大规模 QA 学语义空间再用 hard negatives 学判别边界最后用 Agent trajectories 把这种判别能力转化成实际的动作选择能力。相关链接官方 GitHubCLM-8B Hugging Face项目技术博客研究者发布帖