更正:社区一度流传「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 仓库,过滤规则硬且简单:
- 必须含可运行
pytest或unittest目录 - 提交信息包含 fix/close/resolve # 模式
- 补丁后 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,每步流程如下:
- 模型采样 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
如果你想自己训一把,只需要:
- 准备 5k 条「Issue+Patch」对
- 把奖励函数换成自家单测
- 用同样沙盒模板跑 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.