One to More, More to One: Category-Aware Iterative Expert Training for Software Engineering Agents
Jie Zhao, Ziyu Jiang, Suhang Zheng, Minghui Shan, Xiaoxiao Xu, Lin Qu
cs.SE, cs.CL, cs.LG
2026-09-20
阿里用SWE Labeler按仓库域拆出服务、应用、系统三类专家,经RRE迭代后再用标签路由MOPD合成单模型,Pro-618解析率58.04%,比Qwen3.6-27B基座高5.39点。
仓库级软件工程(SWE)任务共用同一套「读仓库、改代码、跑测试」的接口,但任务本身差得很远:修服务层逻辑、改用户界面、动基础设施,证据从哪来、工具怎么用、怎么验,都不一样。现有做法大多把这些任务扔进同一个池子做联合强化学习,再用一个总分汇报进度。
问题是总分会骗人。阿里把这个现象叫「类别跷跷板」(category see-saw):某一类涨了,另一类可能在跌,总分还看起来稳。他们在 SWE-bench Pro 的审计子集 Pro-618 上跑联合 RL,618 题按 A/B/C 分成 221/201/196,曲线里确实出现类别互踩。把训练数据按类配平(Balanced RL,每类 516 题,总共只要 1548 题)能把总分维持在接近水平,也抬了一点最弱类的平均增益,但对立运动没消失。
所以这篇要回答的是:按任务类别先训出更强专家,再把能力收回一个可部署的单模型。
整条链路分四块:可执行任务、SWE Labeler、Refresh-Repair-Expand(RRE)专家训练、标签路由的多教师在线蒸馏(MOPD)。
SWE Labeler 是一个有出处的多轴标注系统。两个语义轴:任务类型(26 个 L1、119 个 L2,从 ISO 维护分类、CWE、重构目录落地)和仓库域(21 个 L1、108 个 L2,按软件生态分)。另有改动范围、认知复杂度、预估耗时三个四档量表。细标签一人一个专家会把 RL 预算撕碎,主实验只拿仓库域 L1,硬映射成三条路线:A 是服务、数据和安全,B 是面向用户的应用,C 是系统、工具链和运行时。
基座是同一份 Qwen3.6-27B,agent 脚手架是 R2E-Gym。专家训练不请外部大模型给轨迹,全靠环境可执行奖励。
RRE 每个类别独立转两轮。先做 Agentic-miniRL:长程多轮 SWE 轨迹上的 MiniRL。组内用 RLOO 留一法基线(G=8),因为可执行成功本来就稀,若把当前轨迹算进组均值,唯一的成功优势会被削成 7/8;RLOO 把它留在 1.0。K1 正则打在奖励路径上管漂移。对行为策略和当前策略的概率错配做截断重要性采样。loss 按 assistant 轮次归约,因为一轮动作长短差很多。
然后 Refresh:用 4 次新 rollout 重测当前训练集的掌握度。平均分涨了不代表每道题都涨。初始 RL 在 2769 条训练记录上,1108 条升、839 条降(30.3%)、822 条持平。接着 Repair SFT:只回放该专家上一阶段自己跑出来、且通过 verifier 的成功轨迹。掌握越差、配额越多,0 到 1 次成功给 4 条,全对只留 1 条。最后 Expand:把基座通过率为 0 或 1、当初没进训练集的题抽样加进来,按新掌握度重选下一轮 RL 前沿。饱和题和从没成功过的硬零题不占主预算。
最后用标签路由的 MOPD 把三个专家合成一个学生。学生从原始基座起步,在自己生成的轨迹上向对应类别教师学,环境奖励不进学生 loss。优势函数是模仿项加上 ReLU 门控的奖励外推:只保留教师相对参考策略(就是初始基座)概率更高的方向,λ=1.25。不加门控时正负外推几乎互相抵消,ReLU 是为了给这项一个稳定方向。A/B 任务记录上采样到与 C 一样的 1652 条,总共 4956 条,不增加新题。
Pro-618 三轮均值如下。
| 策略 | Full | Pro-A | Pro-B | Pro-C |
| 基座 | 52.64 | 51.73 | 54.39 | 51.87 |
| Pooled RL | 55.50 (+2.86) | 54.75 | 56.72 | 55.10 |
| Balanced RL | 55.34 (+2.70) | 54.45 | 57.05 | 54.59 |
| 三类专家(各管一类) | — | 59.58 (+7.84) | 58.87 (+4.48) | 57.48 (+5.61) |
| MOPD 单模型 | 58.04 (+5.39) | 58.07 (+6.33) | 59.37 (+4.98) | 56.63 (+4.76) |
相对 Pooled RL,MOPD 总分高 2.54 点,三类分别高 3.32、2.65、1.53 点,最小类别提升 1.53 点。相对 Balanced RL,最小类别提升 2.04 点。专家增益回收率:A 80.8%、B 111.1%(学生比专家还高 0.50 点)、C 84.8%。
训练集上 Repair SFT 更硬:A/B/C 成功率从初始 RL 的 46.05 / 45.54 / 43.28 拉到 56.28 / 59.59 / 52.75。839 条初始 RL 退步记录里,751 条进了 Repair;其中 A/B/C 分别有 69.8%、73.0%、61.3% 回到或超过基座水平。
SWE-bench Multilingual(300 题,SWE-agent):MOPD 59.00%,基座 56.22%(+2.78),Pooled 55.56%,Balanced 57.00%。三类都高于两条联合 RL 基线;C 与基座持平(都是 61.74%),增益集中在 A(+6.48)、B(+8.00)和未归类的 27 题(+6.17)。相对 Balanced RL 的 bootstrap 区间穿过零([-0.78, 4.78]),这条外推要打折。
给做 SWE agent 后训练的人三条可落地的判断。
联合 RL 的总分不够当优化目标。类别对立运动在配平数据之后还在,问题不全是采样比例。把仓库级 SWE 当成一个匀质域来训,会把内部再分配藏起来。
专家不是切完数据就完事。初始按类 RL 在 Pro-618 上只比基座高 0.66 到 1.81 点,还低于 Pooled RL 终点。真正拉开的是 RRE:用自己的成功轨迹修、按掌握度换题,两轮之后专家才超过 Pooled。类别切分改变的是学什么,RRE 管的是学得住学不住。
蒸馏可以不靠外部教师轨迹。三个专家同源、同一套工具接口,学生走自己的长程轨迹,教师只在学生实际访问的前缀上给分布。对已经有可执行环境和强基座、但不想再请一个更大模型产轨迹的团队,这条路径比「大模型采样再 SFT 再 RL」更自洽。代价也很清楚:三套专家加教师前向,算力不是免费的。
这是渐进改进,不是新范式。框架把已有的 MiniRL、MOPD、ExOPD 接到 SWE 类别结构上,贡献在问题定义和训练组织。
论文写了硬路由:一道题可以跨类,却被塞进一个专家。K 怎么选、算力怎么摊,没做消融。同源教师可能太像加不进新信号,专精过头又可能蒸馏不稳。Pro-618 是从 731 题里抠掉已知坏环境、坏 grader 的 618 题,结果不能外推到完整 Pro。Pass rate 不等于补丁质量,防 hacking 协议挡得住本地 git 翻历史和 sandbox 篡改,挡不住预训练背题和弱 verifier。整条框架没有拆开每个优化零件、回放策略或路由粒度各自贡献多少。
另外几处读下来站得不稳。Multilingual 上 C 没涨,未归类 27 题相对两条联合 RL 还掉了,路由覆盖之外的任务在集成时被牺牲。MOPD 的 SSG(0.63)比 Balanced RL(0.04)更宽,总分和最小类增益都更高,但更均匀的是配平联合训。专家选 checkpoint 看的是对应 Pro 子集,有用目标集做模型选择的味道。单次 run 的类别曲线带着评估噪声,论文也承认了。