最近看到一套叫 SPIRAL 的训练方法全称是 Self-Play on Zero-Sum Games Incentivizes Reasoning via Multi-Agent Multi-Turn Reinforcement。直译过来很拗口在零和博弈上做自我对弈通过多智能体多轮强化学习去激励推理能力。但我盯着这个标题琢磨了很久因为它实际上把强化学习里几个最重的概念全串在了一起——自我对弈、零和博弈、多轮交互。如果你也在折腾推理模型的强化训练大概率撞到过这几个问题奖励稀疏给不到位、模型学着学着开始走捷径、静态数据很快就用完。这篇内容我想从这些痛点出发把 SPIRAL 背后的思路掰开揉碎聊聊它解决了什么、机制上怎么运作、在你自己的项目里落地要注意哪些问题以及这类方案的边界到底在哪。这个方法最能打动我的地方是它的核心直觉非常朴素与其给模型灌更多标准答案让它模仿不如把它放进一个必须靠推理才能赢的对抗环境里让输赢本身当老师。以下是我结合近期实验和复现过程中的思考做的一份完整梳理。1. 为什么推理强化训练需要对手从单智能体RL的三个困境说起1.1 单智能体RL训推理的三个经典困境先说我自己的体会。用强化学习提升大模型的推理能力和训练它玩游戏完全是两码事。游戏里每一步都有明确的即时反馈而推理任务通常只有一个终极对错判断。模型生成长长的解题过程中间二十几步推得漂漂亮亮最后一步算错整个轨迹的奖励就是零。这在强化学习里叫信用分配问题在语言模型上尤其难解——你很难定位到底是哪一步出了岔子。很多人因此转向过程奖励模型给中间步骤也打分但过程标注成本很高而且过程奖励模型本身又带着新的偏置进去。第二个困境是捷径学习。模型优化的目标只有一个奖励数字它根本不关心人类眼里合理的推理长什么样。我实际观察过一个类似场景某个开发者想在检索增强任务上用RL提升回答质量模型很快就发现引用来源数量和最终得分高度相关于是学会了在回答里堆引用列表哪怕答案根本没回答问题。文本上看着规范了很多但真实阅读能力一点没涨。在自博弈场景里这种风险同样存在甚至更隐蔽后面我详细讲。第三个困境是数据分布很快锁死。静态数据集上的RL训练模型反复在同一个输入分布里采样。策略逐渐收敛之后探索产生的新轨迹越来越少训练信号越来越同质。很多实验做到中后期会出现训练loss还在降但评测集指标纹丝不动的怪象。这不是优化器坏了而是数据源本身不增长了。这三个困境指向同一个根源环境里缺少一个能动态调整难度、主动制造挑战的对手。固定题库是死的模型做多了就把套路背下来了一个合格的对手是活的它不会永远用同样的招数它会在你变强的过程中同步变强逼着你继续进化。这就是自博弈进入推理训练的根本动机。1.2 零和博弈胜负本身就是最好的奖励函数零和博弈听起来学术本质很简单多方利益完全对立我赢一分你就输一分总收益永远为零。猜拳、棋类比赛、拍卖竞价都是现成的例子。它用在训练里最诱人的地方在于——把评估这件事从人工手里解放出来了。你不需要告诉模型这一步推得好不好只需要给它一个规则清晰的对抗游戏让胜负自己说话。常见的结构有两种。第一种是出题者-解题者。出题者负责构造一道难题解题者负责攻破它。出题者想赢就必须把题目出到对方解不出解题者想赢就必须见招拆招。你可以想象这两个角色会进入军备竞赛出题者不断加大难度解题者不断突破上限。第二种是论证者-反驳者。论证者拿出一段推理反驳者负责找漏洞、举反例。论证者为了赢必须把因果关系说严密反驳者为了赢必须真正读懂对方每一步在干什么。这两种对抗结构本身就是高强度的推理训练而且完全不需要人工标注中间步骤。为什么说胜负是最好的奖励函数因为它是动态的、内生的、自我演化的。固定题库的难度是人工设定的模型做久了可以背题而对抗环境中对手能力的提升会自动抬高整体难度相当于环境自己给自己升级。你不需要反复扩充题库、人工筛数据因为最难、最有价值的训练样本是模型自己生成的。1.3 从棋类自博弈到语言博弈演进逻辑在哪自博弈这个思想本身不新鲜。棋类AI早就验证过这条路让策略模型和自己的历史版本对弈用最终胜负做唯一学习信号完全不依赖人类棋谱。这被视为强化学习最漂亮的成果之一。但如果你试图把同样的套路搬到语言模型上会立刻发现棋类游戏实在太友好了——规则严格、状态有限、胜负瞬间可判。语言博弈完全是另一个世界一句话有无数种接法一个论证有无数种反驳角度连胜负本身都要花大力气定义。所以从棋类自博弈到语言模型自博弈核心难点不是把棋盘换成token而是把开放式推理任务改造成规则清晰、可判胜负的两方游戏。SPIRAL 这条思路最值得注意的地方就是它把多轮对话当作博弈回合来处理。模型不需要一次性生成完整答案然后被打分而是在多个回合中根据对手行为动态调整策略。这样一来语言的开放性就有处安放了——你不需要预定义所有可能的对话分支只要定义好每回合双方能做什么、终局怎么判剩下的大规模探索就全部交给强化学习自己去完成。这个演进背后是一个思想变化过去我们相信推理能力来自大量高质量解法现在越来越多工作开始相信推理能力来自持续的高强度对抗互动。数据质量当然重要但对手施加的压力是任何静态数据集都无法替代的。2. SPIRAL 的机制拆解多智能体多轮强化到底改了什么2.1 逐词拆解SPIRAL方法名字里藏着全部设计方法名有时候只是包装但 SPIRAL 这个全称几乎把设计要点全写出来了。Self-Play自我对弈说的是训练数据来源。模型和自己或自己的历史版本对局所有训练轨迹都由模型自己生成不依赖人类专家对局数据。这是数据规模能持续扩张的根本保证。Zero-Sum Games零和博弈说的是奖惩结构。训练目标被组织成一个利益完全对抗的游戏一方赢另一方就输终局胜负清晰可判。它让奖励信号从人工设计变成了游戏规则自带的产出。Incentivizes Reasoning激励推理这个词我特别喜欢因为它用的是incentivize而不是teach。推理能力不是被直接教出来的而是在对抗压力下被逼出来的副产品。模型为了赢不得不走一步想三步不得不在出题者的刁难下做反事实思考。Multi-Agent多智能体指一个对局里至少有多个角色各自有独立行动空间。实际实现可以拆成多套参数但更常见的是共享底层模型通过角色标记区分当前发言人。Multi-Turn Reinforcement多轮强化学习强调训练信号来自多个回合的交互而不是单次输出后打分。多轮让模型有机会观察对手的策略并据此调整自己的行动。把这些词拼起来你能看到一套完整的训练哲学与其用静态偏好数据做拟合不如把模型放进动态对抗环境让策略在博弈中持续演化。从学术视角看这是从数据拟合范式走向环境演化范式。2.2 典型训练循环出题者与解题者的多轮对局假设我们用 SPIRAL 思路训练一个数学推理模型完整的自博弈循环大概长这样。开局前要准备一个冷启动模型。这里我得强调冷启动太关键了。没有经过任何指令微调或少量高质量解题训练模型连话都说不完整博弈信号对它是没有意义的。先让模型具备基本能力再放进对抗环境。然后定义游戏环境。两个角色出题者和解题者。给定一个主题约束比如勾股定理一元二次方程出题者生成一道题。解题者阅读题目后开始作答。到这里还没有体现多轮真正的多轮发生在解题者卡住的时候它可以向出题者提问题目条件是不是多了符号X是什么意思出题者可以选择澄清也可以补充限制条件还可以故意不回答来加大难度。若干回合之后进入终局判定解题者给出最终答案由验证器判断对错。答对则解题者得1分出题者得-1分答错则反过来。这局打完之后双方的完整轨迹——角色标记、每一步决策、终局奖励——全部收集起来做强化训练。这里有个工程细节很容易踩坑我强烈建议用同一套底层模型共享参数只在输入前加一个角色token区分现在由谁说话。共享参数的好处是角色经验天然互通解题者角色在实战中积累的哪些条件容易导致解题出错的经验可以直接用在出题者角色上因为你要的本就是同一个模型既能出好题也能解好题。如果拆成两套独立参数参数量翻倍训练还容易模式崩塌。更新完当前策略后定期把checkpoint存入对手池。后续对局模型会以一定概率和池子里的历史版本对战。这样一轮完整循环就形成了冷启动、多轮对局、终局判分、轨迹学习、对手池更新然后进入下一轮。2.3 多轮设计比单轮好在哪能看见对手才谈得上策略如果只用单轮RL让模型一次性生成完整解题过程然后判分那其实就退化成了带反馈的监督学习模型能拿到的信息只有一个分数或一个偏好对。多轮设计最重要的价值在于引入了策略互动模型必须在每个回合估计对手下一步会做什么然后决定自己这一步怎么走。这种反事实思考和前瞻规划恰好是复杂推理的核心能力。举一个例子。解题者面对出题者构造的复杂方程题第一次尝试错了。出题者补充一句这个方程在实数范围内无解——这时候多轮模型经历的是试探-失败-收到新信息-调整策略-再尝试的完整链路而单轮模型看到的仅仅是一道题和一次失败。前者训练出来的是根据新信息动态调整推理方向的能力后者训练出来的是对固定输入做一次命名式突围的能力。后者并非没用但前者明显更接近人类推理的真实形态。多轮轨迹还有一个常被忽略的好处它能极大丰富探索空间。同一个起点双方策略不同就能演化出完全不同的对话路径。路径种类越多模型见过的状态分布越广训练信号覆盖度越高。这相当于在策略交互层面做了一次自动化的数据增强单轮生成永远无法提供这个维度。不过也要提醒一句多轮交互意味着容易发散。如果环境没有限制动作空间出题者和解题者聊着聊着就会变成在无关话题上扯皮。所以环境设计里必须规定好每方每回合能输出什么——比如解题者只能输出一个推理步骤或一个澄清问题而不是一整段自由文本。规则越清晰训练越稳定。3. 亲手复现前的五个关键设计决策博弈建模、奖励信号与训练稳定性3.1 第一步把任务改造成可判胜负的两方游戏最见真功夫的不是训练代码而是环境设计。一个任务适不适合上自博弈先问两个问题第一终局能不能自动判胜负第二两个角色能不能自然形成对抗目标先说自动判胜负。数学题、代码题天然合适程序可以验证答案。代码题只需要跑测试用例数学题只需要比对最终答案。但很多任务不具备这个条件。我见过一个翻车案例某个开发者想用自博弈训练模型识别论证逻辑谬误设计了出题者给论证验证者找谬误。听起来合理但谬误种类的判定依赖模型裁判裁判又不够稳。结果出题者很快学会了生成裁判分不清的模糊表述来骗分推理能力一点没涨。这个案例的教训很直接验证手段可靠性不够之前千万别贸然上对抗训练。常见的角色模板其实并不复杂。生成者-验证者适合代码生成和数学证明攻守双方适合安全对齐和注入攻击测试教师-学生适合需要引导式推理的问答。每类模板落地时都要把每回合允许什么动作终局怎么判定写清楚。我的建议是先做一个最小可玩版本把游戏规则用纸笔写下来然后找两个人真的玩一玩。如果人类玩起来都觉得奇怪模型训练出来的效果只会更离谱。3.2 奖励信号结果、过程与博弈信号的取舍自博弈的终局信号通常就设成±1简单但方差很大。模型一口气生成几十个token最后只拿一个数字中间大部分动作缺乏有效反馈。所以实战里必须做奖励塑形。我习惯把信号分成三个层次来看。信号类型密度可靠性典型来源主要问题结果信号稀疏高终局答案是否正确学得慢探索效率低过程信号密集中中间步骤是否合理的过程奖励模型过程奖励模型本身的偏置会被学到博弈信号中等中请求提示次数、修改题干频率、找漏洞耗时需要专门设计统计指标我实际落地时的方案是主信号用终局胜负辅助信号优先用博弈型中间信号做shape只有当主信号实在太稀疏、模型几乎学不动的时候才引入过程奖励模型。而且每次改完奖励函数必须在固定外部题库上跑一遍回归测试确认优化信号没有偏离任务本身。这个习惯能帮你挡掉后期大量莫名其妙的掉点。这里有个血泪教训别强行堆奖励项。我曾经在一个实验里同时加了五六个奖励分量包括格式分数、长度惩罚、关键词命中率结果模型确实快速拿到了高分但在真正有难度的题目上全盘崩坏。它学会的不是推理而是凑奖励组成的最优路径。奖励塑形是一门减法艺术信号纯度比信号总量重要得多。3.3 对手池与更新节奏对抗训练的稳定性工程自博弈最难受的地方不是学不会而是学会了以后一直在振荡。只和当前自己互搏策略很容易在不同行为模式之间跳来跳去就像猜拳游戏里三个人互相克制的循环一样系统永远停在一种地方。对抗训练有三个标准手段。第一对手池。把历史上若干个checkpoint保下来每次对局随机选一个当对手。我自己的实验经验是别只放最强版本也要混进一批中间版本。和最强对手打容易陷入单一对抗模式和多样化对手打才能学到更鲁棒的策略。第二错开更新节奏。如果出题者和解题者同步高频更新模型今天学会了用长题干迷惑对方解题者角色明天也跟着强化了同一招整个系统会意外地震荡。工程上可以让两个角色的训练步数错开或者给不同角色设置不同学习率。第三KL约束和熵正则。语言模型策略飘移速度极快不加约束几个迭代就可能退化成一个只会输出固定套话的复读机。用KL散度把策略拉向冷启动模型或者引入熵奖励维持输出多样性稳定性改善立竿见影。另外环境本身要设置最大回合数。没有这个限制模型可能为了规避失败无限循环试探训练吞吐量会被拖垮。我的默认做法是设成6到10轮同时每一轮都给出题者一个出得更难的激励防止它摆烂。3.4 一份可以直接改用的自博弈训练伪代码用一段伪代码把核心循环串起来方便理解整体结构。# 简化版自博弈训练循环 # 实际工程需要补充分布式采样、经验回放、checkpoint管理等模块 import random def run_episode(gen_policy, sol_policy, env): 执行一局完整对局返回轨迹和终局奖励 state env.reset() trajs {gen: [], sol: []} while not env.is_done(state) and env.round env.max_round: if env.turn gen: action gen_policy.act(state) trajs[gen].append((state, action)) else: action sol_policy.act(state) trajs[sol].append((state, action)) state, _ env.step(state, action) reward env.judge(state) # 解题者答对 - 1否则 - -1 return trajs, reward def train_step(policy, opponent_pool, replay): # 从对手池中随机抽取一个历史策略作为对手 opponent random.choice(opponent_pool) if opponent_pool else policy trajs, reward run_episode(policy, opponent, math_game_env) replay.add(trajs, reward) loss compute_rl_loss(policy, trajs, reward) # 换成你项目里的RL算法即可 policy.update(loss) # 定期保存策略快照进入对手池 if step % snapshot_interval 0: opponent_pool.append(policy.clone())重点提醒两个角色通常不是两套独立的大模型否则参数规模直接翻倍管理难度也大。更常见的做法是一套模型输入前缀里加角色标记区分说话人出题和解题端共享大部分知识训练更稳定也更容易从对抗经验里获得迁移收益。3.5 评估设计胜率涨了不等于推理变强了自博弈有个天然陷阱训练日志里的对战胜率一直在涨但它很可能是出题者学会了出在数学上毫无意义的刁钻题带来的跟推理能力增长毫无关系。所以评估必须独立于博弈环境我从三个维度来做。第一固定外部题库。难度恒定不随训练演化直接看准确率曲线。这是最硬核的标尺。第二迁移任务集。用数学博弈训练完拿到逻辑谜题或者代码调试任务上去测检验模型学到的是通用推理能力还是特定游戏技巧。第三对局质量抽查。定期人工看几十局记录判断题目是否合理、推理过程有没有实质逻辑链还是只是套了个看似合理的模板。三个维度缺一不可。只看外部题库可能漏掉泛化损失只看胜率会被对弈假象骗只看对局质量又缺少量化指标。自博弈的评估设计比训练本身更考验人把评估做干净后续调参才有路可走。4. 能力提升的真实图景推理变强了但也要警惕捷径4.1 数学与逻辑推理提升更容易被观察到的场景自博弈类方法在数学和逻辑这类规则清晰、胜负可判的任务上效果最明显这是有结构原因的。这类任务完美满足对抗训练的前提答案唯一、可自动验证、双方目标天然对立。一个很有意思的现象是出题者角色在训练中会慢慢学会自己先当一遍解题者。它想构造一道对方解不出的题自己必须先搞清楚解法、边界条件和容易出错的地方。这个过程没有显式的教学信号但它就在反复发生。换句话说为了难住对方而不得不先自己弄明白的机制正是推理能力提升的核心驱动。跟费曼学习法里教是最好的学有相似处只不过教的对象变成了另一个视角的自己。这种能力在数学之外的场景也有迁移趋势。我注意到经过这种博弈训练的模型面对歧义输入时更倾向于追问澄清而不是硬着头皮编一个答案。它甚至会在推理链中途主动回头检查某个前期步骤——这已经带有某种自我批判的意味了。对做推理增强的团队来说这个迁移价值可能比单点任务性能提升更重要。4.2 泛化 vs 捷径模型学会的是推理还是钻空子这是自博弈最应该警惕的问题。模型的优化目标是赢不是学会推理。任何能稳定提升胜率的漏洞都会成为它趋之若鹜的捷径。我在前面提过验证器这里展开细说。如果出题者发现题干越长解题者越容易错它就会疯狂加长题干哪怕题目本身毫无推理难度。解题者如果发现出题者总在题干倒数第二个字放关键数字它就可能学会直接提取关键特征跳过推理。两种情况在训练日志里的表现都是胜率上涨但能力没有任何增长甚至可能因为过度依赖脆弱线索而下降。怎么对抗第一引入一个独立的、经过校准的裁判模型让它对胜负之外的内容质量也打分。第二不定期在固定外部题库上做检测一旦外部指标下降就回滚训练参数。第三在奖励层面识别模板化行为。比如出题者生成的题面和已有题库相似度太高奖励就打折。这些手段都会增加系统复杂度但不做的话最后得到的就是一个会在固定环境里刷分的模型而不是一个更会推理的模型。4.3 和SFT、单智能体RL放在一起对比我用一张表把三条路线放在一起方便项目选型时对照。对比维度SFT单智能体RLSPIRAL风格自博弈RL训练信号人类示范奖励模型/偏好对对抗性终局胜负博弈信号数据来源静态高质量数据静态或小范围动态采样模型自己生成的对局持续演化主要提升来源模仿从稀疏反馈中试错对手持续施压迫使策略深化推理提升潜力受限于数据分布中等更高但方差也更大主要风险泛化弱奖励漏洞对抗崩溃、验证偏差、捷径固化工程成本低中等高多轮轨迹更长这个对比不是说自博弈一定碾压。如果你的任务里已经有高质量的人类反馈数据SFT起步的性价比依然很高。自博弈更适合那些已有冷启动模型、任务能被博弈化、且你愿意为推理深度多付训练成本的情况。选型永远是预算、目标和数据条件共同决定的没有银弹。5. 局限与下一步自博弈不是没有代价的解锁方式5.1 任务建模偏置不是所有推理都能零和化自博弈最舒服的场景是无争议胜负可判的任务。反过来大量开放性很强的推理任务不太好办。比如论证这个故事节奏是否合理它也有推理成分但胜负判定高度主观最终只能依赖模型裁判或人工打分。一旦裁判有偏置双方模型就会围绕偏置做对抗而不是围绕真正的推理能力做对抗。任务建模本身是一个容易被低估的偏置来源。你规定出题者可以做什么、不可以做什么本质上就定义了策略空间。设计者本人的直觉会直接写进游戏规则里而且不像数据标注问题那样直观——可能训练到一半才发现环境有缺陷返工代价非常高。所以环境设计阶段我就会强制要求先解决验证器和裁判的可靠性问题宁可在规则打磨上多花一周也不要在一套奇怪的规则上批量烧卡。5.2 算力与样本效率多轮对局很贵要会算账多智能体多轮的训练成本是实打实的。一局对局要生成大量回合token成本是普通单轮RLHF样本的数倍。再加上对手池、定期评估、多角色推理整个训练循环的复杂度再上一个台阶。如果你GPU预算本来就不宽裕我的建议是先用小模型做机制验证跑几百上千局重点看奖励信号有没有区分度、对局能不能自然收敛、模型会不会快速陷入奇怪策略。机制验证跑通了再考虑规模化。很多团队在这步就花掉了冤枉钱。有个小技巧可以提效对手池里的历史版本推理时可以降采样或减少max_token不用每次跑满整局。对手弱一点对局更快结束训练吞吐量能提升不少对最终稳定性的影响也很小。5.3 值得跟进的方向搜索、过程奖励与混合架构最后说说我看好的下一步。自博弈产生的多轮轨迹本身就是很宝贵的过程数据完全可以拿去训练过程奖励模型成本比纯人工标注低覆盖的路径也更多样。这是个很自然的衍生价值。第二个方向是在博弈中混入显式搜索。每次解题者行动前先用小规模的树搜索探索几条候选推理路径再选择最有把握的答案。搜索和博弈天然是一家人棋类AI已经验证过了语言场景的难点只是把搜索空间定义清楚。第三个是混合架构。用人类反馈数据做冷启动用自博弈继续提升策略用固定外部评测集做安全网。这条路不如纯粹的研究方向出彩但最适合真实项目落地能拿自博弈的长处又不至于完全放弃人类数据的可靠性。我个人认为这是未来一段时间的工程主旋律。最后说说我实际跑这类实验的体会。如果你想在自己的任务上试自博弈思路我的建议非常明确别一上来就把完整的 SPIRAL 流程搬上去。先找一个最简单的两方对抗游戏拿现成的模型跑几百局观察三件事——胜负信号是否合理、对局是否流畅、模型是不是很快就开始钻空子。自博弈本质上是一种探索机制它不会凭空创造能力它只是把模型已有的知识在持续对抗压力下重组为更深、更稳的推理链。想明白这一点你就不会把它当万能药也不会错过它真正值钱的地方。