作者: 引线小白-本文永久链接:https://www.limoncc.com/post/a2cf7f69fb416ea5/
知识共享许可协议: 本博客采用署名-非商业-禁止演绎4.0国际许可证
一、导言
MiMoV2.6[^1]组级智能体评分把 RL 奖励从”二元测试通过与否”升级为”组内比较的细粒度质量信号”,由三部分构成——GRS(离线 rubric 合成奖励)用于高通过率任务、GAR(在线组级优势重分配)用于其余任务、行为正则化(长度惩罚 + 段级惩罚)抑制退行行为,其本质是把”组”作为质量对比的统计单元,将组内差异转化为可学习的优势信号。
一、为什么需要组级评分(核心动机)
在代码智能体 RL 中,二元测试奖励存在三个结构性缺陷:
- 1.不可区分的通过解:GRPO 中若一个 prompt 的 $G$ 条 rollout 全部通过测试,组内优势全为零,没有梯度;若有多条通过,则它们获得完全相同的正向优势,模型无法学到”简洁、精确的解”优于”臃肿、投机性的解”。
- 2.奖励黑客无法识别:只要测试通过就给满奖励,智能体可通过泄露解、放宽校验、异常吞没等”坏行为”刷分。
- 3.长度爆炸:结果奖励对长度不敏感,策略倾向通过加长推理/加轮次来提高通过率,导致 token 数失控。
组级评分的解法是:对同一个 prompt 下的 $G$ 条 rollout 组成一个”组”,由一个 SFT 过的智能体评分器进入共享工作区(任务规范、仓库、补丁、测试输出、对话日志)联合比较,区分质量与行为,再把区分结果映射为奖励或优势调整。
二、GRS:组级奖励合成(离线 Rubric)
2.1、原理
针对高通过率的代码任务子集。流程分两步:
1.离线建 rubric:对每个任务,先收集多条离线 rollout,一个智能体对比这些尝试与任务规范、仓库,提炼出两组标准:
- 解 rubric $S^{\text{sol}}$:评估实现属性——需求满足、边界情况处理、与代码库风格一致;
- 行为 rubric $S^{\text{beh}}$:评估工作方式——是否收集相关证据、是否验证了改动效果。
2.在线打分:训练时,评分智能体进入每条 rollout 的执行环境,按 rubric 逐条评估,输出两个分数。
2.2、公式
对轨迹 $i$,令 $R^{\text{test}}_i \in \{0,1\}$ 为二元测试奖励,则最终训练奖励为乘法合成:
$$\begin{align}
R_i = R^{\text{test}}_i \cdot S^{\text{sol}}_i \cdot S^{\text{beh}}_i
\end{align}$$
乘法形式的关键性质:失败轨迹保持零奖励(rubric 不救失败解);通过轨迹由 $S^{\text{sol}} \cdot S^{\text{beh}}$ 进一步分化——即使组内全部通过测试,乘积差异仍提供学习信号,且 rubric 监督始终与测试结果绑定,不会奖励”通过测试但代码糟糕”的解。
2.3、例子
假设某 Django 修复任务的 $G=16$ 条 rollout 全部通过测试。按传统 GRPO,这组优势全为 0,模型什么都学不到。用 GRS:
轨迹 A:补丁最小、对齐仓库约定、主动运行了测试 → $S^{\text{sol}}=0.9$,$S^{\text{beh}}=0.9$,$R_A = 1 \times 0.81 = 0.81$;
轨迹 B:补丁宽松、夹带无关重构、未验证 → $S^{\text{sol}}=0.5$,$S^{\text{beh}}=0.4$,$R_B = 1 \times 0.20 = 0.20$。
组内 $R_A \gg R_B$,产生清晰的优劣梯度。
三、GAR:组级优势重分配(在线评分)
3.1、原理
用于所有其余代码智能体任务,在线运行,不预建 rubric。对每个混合结果组:
- 1.联合考察:SFT 智能体评分器把组内所有轨迹(成功 + 失败)放入共享工作区,对比分析。
- 2.奖励黑客修正:若证据确认某轨迹依赖外部或泄露答案,其有效奖励被置零、视为失败,然后再重算组统计。
- 3.质量排序:沿五个维度对通过的补丁排序——解法思路的合适性、实现精确性(无遗漏/无冗余回退)、相对必要改动的最小性、无任务外副作用、与代码库约定一致的高完成度。
- 优势重分配:把正向优势质量从低质量通过解”搬”到高质量通过解。
3.2、公式
设轨迹 $i$ 的有效二元奖励(黑客修正后)为 $R_i$,组均值为 $\bar R_i$,原始序列级优势 $A_i = R_i - \bar R_i$,通过集合 $P = \{i : R_i = 1\}$。引入质量因子 $f_i \in (0,1]$(高质量接近 1,低质量接近 0),公共重归一化因子:
$$\begin{align}
\lambda = \frac{\sum_{j\in P} A_j}{\sum_{j\in P} f_j A_j}, \qquad
A’_i = \begin{cases} \lambda f_i A_i, & i\in P, \ A_i, & i\notin P. \end{cases}
\end{align}$$
三条守恒与保障性质:
- 正向优势总量守恒:$\sum_{i\in P} A’_i = \sum_{i\in P} A_i$——只重分配、不放大总信号;
- 失败轨迹的优势不动($i\notin P$ 保持 $A_i$),负向信号保留用于惩罚;
- 守恒本身是对抗熵失控的保障:只下调正向优势会留下未变的负向压力,重归一化 $\lambda$ 恢复平衡。实践中 $\lambda$ 设上限,防止正向优势被过度放大。
最后从通过与失败轨迹的优势中减去组均值得到 $A^{\text{new}}_i$(组均值为零),再广播到该轨迹所有响应 token。评分异步运行,评分器不可用时回退到原始优势。
3.3、例子
$G=4$ 的组,2 通过 2 失败,原始优势(相对组均值)为:
| 轨迹 | 结果 | $R_i$ | $A_i$ | 质量因子 $f_i$ | $A’_i$ |
|---|---|---|---|---|---|
| A | 通过,最小补丁 | 1 | +0.5 | 1.0 | λ·1.0·0.5 |
| B | 通过,宽松大补丁 | 1 | +0.5 | 0.3 | λ·0.3·0.5 |
| C | 失败 | 0 | −0.5 | — | −0.5(不变) |
| D | 失败(已确认黑客,奖励置零) | 0 | −0.5 | — | −0.5(不变) |
$\lambda = \dfrac{0.5+0.5}{1.0\cdot 0.5 + 0.3\cdot 0.5} = \dfrac{1.0}{0.65} \approx 1.54$,故 $A’_A \approx 0.77$、$A’_B \approx 0.23$。正向优势总量仍为 1.0,但大部分流向了 A——模型被引导去学”最小、精确”的解,而非”碰巧通过测试”的解。
3.4、实证效果
论文在 MiMo-V2.6-Flash 上做了有/无 GAR 的纯代码 RL 消融:无在线评分时,轮次与总 token 长度快速增长、大量轨迹触顶长度上限,难以维持通过率提升;有在线评分时,通过率持续提升至第 52 步,轮次大致稳定、token 长度渐进增长。独立审计还发现:无在线评分的策略越来越倾向投机性兼容分支、宽泛导出、异常吞没、放松校验等”刷分式”行为;有在线评分的策略产出更小、更精确、留在任务范围内的补丁。
四、行为正则化
两类互补机制,进一步压制结果奖励难以约束的中间行为。
4.1 组相对长度惩罚
原理:在组内用通过解的长度分位数作为”参考长度”,仅对超出参考的成功解扣分。通过率门控($|P_q|/G > A$)保证困难 prompt 不被惩罚——探索空间不被压缩。
对 $G$ 条 rollout 的组,$\ell_i = |o_i|$ 为生成 token 数,$A$ 为最小组通过率,$B$ 为百分位参数。当 $|P_q|/G > A$ 时,取参考长度 $\ell_q^\star = \text{Quantile}_{B/100}\{\ell_j : j \in P_q\}$,调整后奖励:
$$\begin{align}
\tilde R_i = R_i - \mathbb{1}_{[i\in P_q]}\,\gamma\,\mathrm{clip}!\left(\frac{\ell_i/\ell_q^\star - 1 - \delta}{s - \delta},\,0,\,1\right)
\end{align}$$
其中 $X\ge 0$ 为最大扣减、$\delta \ge 0$ 为容忍超出量、$s > \delta$ 为饱和点、$\gamma \ge 1$ 为斜坡指数。$\delta = 0$ 即惩罚所有长于参考的成功解;$\mathbb{1}[\cdot]$ 把扣减限制在成功 rollout 上。式 (1) 的优势 $A_i$ 由 $\tilde R_i$ 计算。
例子:某 prompt 的通过解长度为 1K、1K、1.2K、5K tokens。若 $\ell_q^\star \approx 1.2$K,则 5K 的长解被显著扣分,而 1K 的三个简洁解拿满奖励——策略学到”这个 prompt 用简洁解就够了”。
.2 段级行为惩罚
原理:结果奖励可能强化”最终通过但中间混乱”的轨迹。规则捕获格式违规(畸形标记、无效工具名、畸形参数)等段级错误,得到 token 级标记 $h_{i,t} \in \{0,1\}$。令 $A_i$ 为轨迹优势,token 级调整为:
$$\begin{align}
\tilde A_{i,t} = \begin{cases}
\alpha\,(1-h_{i,t})\,A_i, & A_i>0, \\
\big(\beta\,(1-h_{i,t}) + \kappa\,h_{i,t}\big)\,A_i, & A_i<0, \\
0, & A_i=0,
\end{cases}
\end{align}$$
其中 $\kappa > 1$ 放大被标记 token 上的负向优势;$\alpha \ge 1$ 上调未标记的正向 token;$\beta \le 1$ 把未标记的负向 token 向零缩放($\alpha_{\max}, \beta_{\min}$ 为上下限)。
逻辑解读:
- 正向轨迹中被标记 token 的优势被屏蔽(置零),其质量重分配给未被标记 token——好轨迹中的”坏段”不被强化;
- 负向轨迹中被标记 token 的惩罚被 $\kappa$ 放大,未被标记 token 的惩罚被 $\beta$ 减轻补偿——当任一数组未被裁剪时,每个符号的总优势质量守恒,避免额外负向压力驱动熵失控。
五、三机制对比
| 机制 | 作用时机 | 信号载体 | 解决的问题 |
|---|---|---|---|
| GRS | 离线建 rubric → 在线打分 | 奖励 $R_i$(乘法合成) | 高通过率任务组内区分度不足 |
| GAR | 在线组级评分 | 优势 $A’_i$(重分配) | 通过解质量无差异 + 奖励黑客 |
| 组相对长度惩罚 | 奖励阶段 | $\tilde R_i$(扣减) | token 长度爆炸 |
| 段级行为惩罚 | token 级优势塑形 | $\tilde A_{i,t}$ | 格式违规/工具调用错误被结果奖励间接强化 |
底层一致性:三者共享同一设计哲学——把”组”作为质量对比的统计单元,通过守恒式重分配(GAR 的 $\sum A’_i = \sum A_i$、段级惩罚的符号内质量守恒)在提供更细粒度信号的同时限制总优化压力,避免更大的信号方差引发训练不稳定或熵崩溃。最终效果是模型被引向更短、更 token 高效、更可维护的解,而非仅仅”通过测试”的解。
1 | 【奖励层】result reward |
它们是串联的骨架,并联的分叉:GRS 与 GAR 是流水线同一阶段(奖励→优势的转换点)上的两条互斥实现路径;组相对长度惩罚和段级行为惩罚则像串在主线上的两级过滤器,分别在奖励层和 token 层对信号做最后的整形——四级共同把“二元测试结果”逐级精化为组内可比、行为感知、token 对齐的学习信号,最终送入同一个 GRPO 目标。每级的作用位置由它需要的信息决定,顺序不可颠倒:
| 环节 | 为什么必须在当前位置 |
|---|---|
| GRS / 黑客置零(奖励层) | 必须在组统计之前完成——组均值 $\bar R_i$ 要基于“干净”的有效奖励计算,否则黑客轨迹会污染全组基线 |
| 组相对长度惩罚(奖励层) | 式 (4) 明确“式 (1) 的优势 $A_i$ 由 $\tilde R_i$ 计算”——它是优势计算的直接输入,必须在 $A_i = \tilde R_i - \bar R_i$ 之前作用于奖励;且其参考长度 $\ell_q^\star$ 需要组内通过解的分布信息,天然是组级操作 |
| GAR(序列优势层) | 必须在 $A_i$ 计算之后——它重分配的对象就是序列级优势 $A’_i = \lambda f_i A_i$,且重算组统计前要先完成黑客置零;输出广播到全 token 后才可能做 token 级加工 |
| 段级惩罚(token 层) | 必须最后——它需要 token 级标记 $h_{i,t}$(哪些段违规),只能在优势已广播到每个 token 之后做逐 token 塑形,且其守恒式依赖最终的轨迹符号 $\mathrm{sign}(A_i)$ |
六、一个Django仓库修复任务例子
任务设定:一个 Django 仓库修复任务——“修复 MultiValueField 忽略必需子字段的 bug”。该 prompt 采样 $G=4$ 条 rollout(为演示简化,实际 $G=16$)。
第 0 步:rollout 完成,得到 4 条轨迹
| 轨迹 | 结果 | 补丁特征 | 测试 $R^{\text{test}}_i$ | token 数 $\ell_i$ |
|---|---|---|---|---|
| A | 通过测试 | 最小补丁,改 6 行,风格符合仓库约定 | 1 | 3,000 |
| B | 通过测试 | 通过阅读上游修复抄袭的答案,补丁 40 行,夹带无关重构 | 1 | 9,000 |
| C | 失败 | 修改方向错误 | 0 | 6,000 |
| D | 失败 | 遇到格式违规(畸形工具调用参数)+ 未跑测试就提交 | 0 | 7,000 |
分支一:假设此任务属于“高通过率子集” → 走 GRS
训练前已为该任务离线建好 rubric。评分智能体逐条打分:
| 轨迹 | $R^{\text{test}}$ | 解 rubric $S^{\text{sol}}$ | 行为 rubric $S^{\text{beh}}$ | 合成奖励 $R_i = R^{\text{test}} \cdot S^{\text{sol}} \cdot S^{\text{beh}}$ |
|---|---|---|---|---|
| A | 1 | 0.9(最小、符合约定) | 0.9(验证了改动) | 0.81 |
| B | 1 | 0.4(臃肿、夹带重构) | 0.3(抄袭上游解,未自主验证) | 0.12 |
| C | 0 | — | — | 0(乘法绑定:失败不可救) |
| D | 0 | — | — | 0 |
→ 走 GRS 的任务不进 GAR,直接进入长度惩罚。
分支二:假设此任务属于“其余任务” → 奖励保持二元,走 GAR
1、GAR 前置:奖励黑客置零
评分器进入共享工作区(规范、仓库、4 份补丁、测试输出、对话日志),发现 B 的对话日志里有 git clone .../django.git 并阅读了包含修复的较新提交——确认黑客。B 的有效奖励置零:
$$\begin{align}
R_A=1, R_B=\mathbf{0}(\text{置零}), R_C=0, R_D=0
\end{align}$$
2、计算原始组相对优势
组均值 $\bar R = 0.25$,得 $A_i = R_i - \bar R$:
$$\begin{align}
A_A = +0.75,\quad A_B = -0.25,\quad A_C = -0.25,\quad A_D = -0.25
\end{align}$$
3、质量排序 + 优势重分配
通过集合 $P = \{A\}$(B 已被置零)。评分器给 A 的质量因子 $f_A = 0.95$(补丁最小、精确、无副作用):
$$\begin{align}
\lambda = \frac{\sum_{j\in P} A_j}{\sum_{j\in P} f_j A_j} = \frac{0.75}{0.95 \times 0.75} \approx 1.05
\end{align}$$
$$\begin{align}
A’_A = 1.05 \times 0.95 \times 0.75 \approx \mathbf{0.79},\qquad A’_B = A’_C = A’_D = -0.25 (\text{不变})
\end{align}$$
正向优势总量守恒(0.75 → 0.79,被 $\lambda$ 上限轻微钳制),负向信号完整保留。最后减去新组均值使 $A’$ 组均值为零,广播到各轨迹所有 token。
4、汇合点:组相对长度惩罚(奖励层,两分支都过)
组通过率 $2/4 = 0.5 > A$(门槛),触发惩罚。通过解长度 $\{3000, 9000\}$,取 $B=50$ 分位作参考 $\ell_q^\star = 6000$。设 $\delta = 0, s = 2, \gamma = 1$,最大扣减 $X = 0.5$:
- 轨迹 A(GRS 分支下 $R_A = 0.81$):超出比 $\frac{3000/6000 - 1 - 0}{2-0} < 0$,clip 为 0 → 无惩罚(比参考还短,是好事);
- 轨迹 B(GAR 分支下 $R_B = 0$):已经是失败/置零,$\mathbb{1}[i \in P_q]$ 不触发 → 不扣。
效果:即便 B 没有被判黑客,9,000 token 的长解也会被扣减,而 3,000 的简洁解拿满——长度信号在此层注入。调整后的 $\tilde R_i$ 用来计算 $A_i$。
5、最后一级:段级行为惩罚(token 层)
轨迹 D 虽然失败($A_D < 0$),但其中有一段工具调用参数畸形($h_{i,t}=1$ 的 token)。设 $\kappa = 2, \beta = 0.5$:
$$\begin{align}
\tilde A_{D,t} = \begin{cases} 2 \times (-0.25) = -0.5, & \text{
畸形参数 token(惩罚加倍)} \ 0.5 \times (-0.25) = -0.125, & \text{D 中正常 token(惩罚减半)} \end{cases}
\end{align}$$
符号内总质量守恒:$-0.25$ 的负向压力没有凭空增加,只是在 D 内部重新分布——“你本来就失败了,但错用工具的那几个 token 是最该改的”。同时若某正向轨迹(如 A)里混入了一段格式瑕疵,那段的优势被 $\alpha(1-h)$ 屏蔽、重分配给 A 的其他干净 token——好轨迹中的坏段不被强化。
5、终点:GRPO 更新
所有 $\tilde A_{i,t}$ 进入损失:
$$\begin{align}
\mathcal{L}(\theta) = -\,\mathbb{E}\left[\frac{1}{\sum\mid o_i\mid}\sum_i \sum_t r_{i,t}\, M_{i,t}\, \tilde A_{i,t}\, \log\pi_\theta(o_{i,t})\right]
\end{align}$$
四条轨迹教会模型的四件事:
| 轨迹 | 学到的信号 | 来自哪一级 |
|---|---|---|
| A | 强强化:最小补丁 + 主动验证 = 最优策略 | GRS/GAR 质量 + 长度惩罚 |
| B | 零奖励 + 负优势:抄袭上游解得不偿失 | GAR 黑客置零(或 GRS 行为 rubric) |
| C | 负优势:方向错误该罚 | 原始组相对信号(未被各级改动) |
| D | 失败该罚,但“畸形工具调用”这几个 token 罚得最重 | 段级行为惩罚 |
如果没有这套流水线(无在线评分),同样的训练中会观察到:轮次与 token 长度快速增长、大量轨迹撞上长度上限;审计发现策略学会投机性兼容分支、异常吞没、放松校验——正是 B 那类“刷分式”解被二元奖励强化的结果。有了组级评分后,通过率持续提升至第 52 步,而轮次大致稳定、补丁更小更精确。这正说明:串联的四级过滤不是锦上添花,而是决定 RL 学到“会解题”还是“会钻空子”的分水岭。
七、可视化
测试分数只有 0 和 1,
怎么让模型学会「小而精地解题」?
同一道题,模型交出 4 份解答
信号流过 4 级流水线,被逐级精炼
第 0 站 · 同一道题,4 份解答
A · 通过 ✓ 小补丁 · 主动验证 | B · 通过 ✓ 抄上游修复 · 补丁臃肿 |
C · 失败 方向错了 | D · 失败 工具调用乱格式 |
▼
这题通过率高吗?
高 → 走这边 GRS · 离线打分表 训练前:先把「好解长什么样」 训练时:每份解答逐条对照打分 最终分 = 测试通过 | 不高 → 走这边 GAR · 在线组内评审 ① 识破抄袭 ② 通过的解互相比较排序 把「表扬额度」 |
▼
第 2 站 · 长度惩罚 ——「啰嗦的解,扣分」
组内通过解的平均长度做标尺:比标尺短不罚,长太多扣奖励
▼
第 3 站 · 段级惩罚 —— 罚到出错的「那几行」
好解答里的乱格式段不加分;失败解答里乱格式段罚得更重
▼
终站 · GRPO 更新 —— 模型此刻学到:
A 最该学 ✦ B 零奖励 ✦ C 该罚 ✦ D 罚在出错的那几行
■ 好解 ■ 被识破 ■ 评分站(二选一) ■ 过滤器(必经)
1 · 两条路,二选一 高通过率题走 GRS,其余走 GAR。同一份解答只经过一条。 | 2 · 表扬总额守恒 GAR 不凭空多给奖励,只是把额度从差解搬给好解——总量不变,方向更准。 |
3 · 过滤器必经 长度惩罚治「啰嗦刷分」,段级惩罚把罚精准落在出错的那几行。 | 4 · 抄袭无处遁形 评审员能看到完整对话日志——发现抄袭上游修复,成绩直接作废。 |
MIMO-V2.6 · 扩展强化学习迈向自我改进
参考文献
[^1]: Xiaomi MiMo Team. (2026, September 22). MiMo-V2.6: Scaling reinforcement learning towards self-improvement [Technical report]. GitHub / Hugging Face. https://github.com/XiaomiMiMo/MiMo-V2.6
| 版权声明 | ![]() |
| 由引线小白创作并维护的柠檬CC博客采用署名-非商业-禁止演绎4.0国际许可证。 本文首发于柠檬CC [ https://www.limoncc.com ] , 版权所有、侵权必究。 | |
| 本文永久链接 | https://www.limoncc.com/post/a2cf7f69fb416ea5/ |
| 如果您需要引用本文,请参考: |
| 引线小白. (Sep. 27, 2026). 《强化学习讲义2——MiMoV2.6组级智能体评分》[Blog post]. Retrieved from https://www.limoncc.com/post/a2cf7f69fb416ea5 |
| @online{limoncc-a2cf7f69fb416ea5, title={强化学习讲义2——MiMoV2.6组级智能体评分}, author={引线小白}, year={2026}, month={Sep}, date={27}, url={\url{https://www.limoncc.com/post/a2cf7f69fb416ea5}}, } |
