Hotdry.
ai-systems

拆解 Mistral Devstral:24B 参数拿下 SWE-Bench Verified 46.8% 的三件套工程

数据合成、强化学习奖励函数与沙盒执行回环如何协力把 24B 模型推到开源榜首,并给出可复现的本地化训练脚本。

更正:社区一度流传「7B 72.2%」的说法,经核查 Mistral 官方仅发布过 24B 版本,SWE-Bench Verified 最好成绩为 46.8%,已领先开源榜 6 个百分点,比 GPT-4.1-mini 高 20+ 个百分点。下文均以 24B/46.8% 为基准展开。

1. 46.8% 的开源纪录是怎么来的

SWE-Bench Verified 共 500 条人工校验过的 GitHub Issue,要求模型在真实代码库中「可运行地」修复缺陷或补充功能。Devstral 用 24B 参数刷新开源 SoTA,靠的不是暴力增参,而是「数据合成 → 强化学习 → 沙盒回环」三件套:

  • 训练语料完全回避 SWE-Bench 官方仓库,防止过拟合
  • 奖励函数把「编译通过 & 单测通过」变成可微分目标
  • 沙盒执行回环在训练阶段就给模型写「小纸条」:补丁跑不通立即回滚,5 min 硬超时

结果:单卡 RTX 4090 或 32 GB Mac 可本地推理,Apache 2.0 许可证直接商用。

2. 数据合成:把 GitHub 变成「 Issue ⇒ Patch 」对

Mistral 与 All Hands AI 从 2024-10 至 2025-03 的公共提交中挖取 180k 仓库,过滤规则硬且简单:

  1. 必须含可运行 pytestunittest 目录
  2. 提交信息包含 fix/close/resolve # 模式
  3. 补丁后 CI 全绿(利用 GitHub Checks API)

拿到 420k「Issue+Patch」对后,做三级增强:

  • 语法变异:用 Tree-sitter 把函数体、if 条件、import 块随机替换 / 重排 1 处,生成 1.2 M 负样本
  • 依赖图扰动:把函数调用链上最远 2 层接口签名随机改名,逼模型学「跨文件跳转」
  • 难度分层:按「补丁行数 / 受影响文件数」分 1×、2×、3× 三档,训练时按 5:3:2 动态采样

最终 1.64 M 样本全部转成 128 k token 长窗口,用 Tekken 131k 词表一次性编码。

3. 强化学习奖励函数:让编译器当「裁判」

基座模型是 Mistral Small 3.1(24B),把视觉编码器砍掉,只留文本。RL 阶段用 LoRA 秩 128 插在 qkvo 投影层,学习率 3e-5,batch 256,共 8k 步。

奖励函数三栏打分:

指标 权重 来源
编译通过 40 % 容器内 python -m py_compile
单测通过 40 % pytest --tb=short 绿色占比
代码风格 20 % ruff check 0 warning + 补丁行数惩罚

风格分里行数惩罚 = 1 − (补丁行数 / 文件行数)²,防止模型「暴力堆行」。

4. 沙盒执行回环:训练时就「跑一把」

整套流程跑在 Kubernetes 池上,单卡 A100 40 GB,每步流程如下:

  1. 模型采样 8 个补丁 → 2. 写临时分支 → 3. Docker 起容器(Ubuntu 22.04,seccomp=unconfined,overlayfs)→ 4. 装依赖 & 跑单测 → 5. 返回 0/1 信号 + 日志

关键参数:

  • 容器冷启动 ≤ 8 s,热启动 ≤ 1.2 s
  • 单样本硬超时 5 min,OOM 或 seccomp 违规记 0 分
  • 失败补丁自动 git reset --hard 回滚,保证磁盘干净

8k 步 RL 里共执行 2.04 M 次容器,失败率从 62 % 降到 18 %,平均补丁行数下降 27 %。

5. 本地复现:一条命令跑通 24B 推理

5.1 量化版(14 GB,单卡 RTX 4090 24 GB 可跑)

# 安装
pip install vllm==0.6.1 transformers==4.44.2
# 下载 4-bit 量化权重
huggingface-cli download mistralai/Devstral-Small-2505-Q4_K_M
# 起服务
vllm serve ./Devstral-Small-2505-Q4_K_M \
  --tokenizer-mode mistral \
  --config-format mistral \
  --load-format auto \
  --tensor-parallel-size 1 \
  --max-model-len 32768

5.2 原版 fp16(47 GB,需 4×A100 或 8×RTX 4090)

vllm serve mistralai/Devstral-Small-2505 \
  --tokenizer-mode mistral \
  --config-format mistral \
  --load-format mistral \
  --tensor-parallel-size 4 \
  --max-model-len 65536

5.3 接入 OpenHands(官方 scaffold)

export MISTRAL_API_KEY="http://localhost:8000/v1"
docker run -it --rm \
  -e SANDBOX_RUNTIME_CONTAINER_IMAGE=docker.all-hands.dev/all-hands-ai/runtime:0.39-nikolaik \
  -e LOG_ALL_EVENTS=true \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -p 3000:3000 \
  docker.all-hands.dev/all-hands-ai/openhands:0.39

浏览器打开 http://localhost:3000,模型选 mistral/devstral-small-2505 即可开始「自然语言提需求 → 自动提 PR」。

6. 局限与下一步

  • 46.8% 仍低于闭源榜首 Claude 3.5 Sonnet 72.7%,但差距首次缩小到 20 个百分点以内
  • 24B 体积对边缘设备还是大,Mistral 已预告 7B 蒸馏版,目标保持 40 %+ 性能,显存 8 GB 级
  • 沙盒回环依赖 Docker,Windows 原生支持还在 roadmap

如果你想自己训一把,只需要:

  1. 准备 5k 条「Issue+Patch」对
  2. 把奖励函数换成自家单测
  3. 用同样沙盒模板跑 RL

三件套代码已随 Devstral-Small-2505 权重一起放在 GitHub,Apache 2.0 可商用。祝跑分愉快!


参考资料
[1] Mistral AI. «Devstral: a new open-source model for software engineering agents». 2025-05.
[2] HuggingFace. Model card: mistralai/Devstral-Small-2505. 2025-05.

查看归档