从 46.8% 到 72.2%:数字背后的工程杠杆
截至目前,Mistral 官方公开的 Devstral(devstral-small-2505)在 SWE-Bench Verified 上拿到 46.8%,已是开源圈第一,比次佳开源模型高出 6 个百分点,也比 GPT-4.1-mini 高出 20+ 个百分点。社区流传的 “72.2%” 大概率是内部继续蒸馏 + 强化学习后的未发布版本,但工程框架已经定型:
- 以 128k 上下文 的 Devstral 作为生成核心;
- 用 OpenHands 运行时沙箱 提供一次性、可回滚的执行环境;
- 通过 流式 diff 输出 让模型边生成边测试,缩短反馈闭环。
下面把这三层拆开,给出可落地的参数与脚本,方便你在本地或内网复现一条 “Devstral 式” 自动修复流水线。
一、模型层:24B 参数的 “小” 怪兽
Devstral 基于 Mistral-Small-3.1 微调,仅保留文本编码器,专为代码代理任务优化。关键规格:
- 参数量:24 B,可在单张 RTX 4090 或 32 GB Mac Studio 上跑满速;
- 上下文:128 k token,足够一次性吞进整个中型项目(≈400 个文件);
- 分词器:Tekken 131k 词表,对代码符号更友好,平均压缩率比 Llama-2 高 12%。
如果你用 vLLM 本地推理,推荐启动参数:
vllm serve mistralai/Devstral-Small-2505 \
--tokenizer_mode mistral \
--config_format mistral \
--load_format mistral \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.95 \
--max-num-seqs 32 \
--enable-prefix-caching
enable-prefix-caching可把共同文件头缓存到显存,第二次迭代延迟降 40%;max-num-seqs不宜再抬高,24B 在 24 GB 显存上接近上限。
二、代理层:OpenHands 运行时沙箱
OpenHands(原 OpenDevin)给 Devstral 提供了一次性的 Docker 运行时:
- 镜像:
docker.all-hands.dev/all-hands-ai/runtime:0.39-nikolaik,内置 Python 3.11、Node 20、pytest、npm、poetry 等常用工具链; - 每次任务启动新容器,/workspace 目录挂载为 tmpfs,保证副作用不落地;
- 容器内 sshd + code-act-agent 负责把模型输出的 bash/python 命令转发到沙箱执行,回传 stdout、stderr、退出码。
一条命令即可拉起:
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 \
--add-host host.docker.internal:host-gateway \
--name openhands \
docker.all-hands.dev/all-hands-ai/openhands:0.39
前端在 3000 端口,后端自动把 Devstral 作为 llm_model 填到 settings.json:
{
"llm_model": "mistral/devstral-small-2505",
"llm_api_key": "${MISTRAL_API_KEY}",
"agent": "CodeActAgent",
"max_iterations": null,
"confirmation_mode": false
}
confirmation_mode=false让模型无需人工点确定,全自动化跑完测试;max_iterations=null表示直到解决或撞 50 轮上限才停。
三、流式生成:diff-token-diff 反馈闭环
Devstral 在 OpenHands 里启用了流式 diff 模式:模型一次只生成一个文件 patch,立刻 apply → 跑测试 → 把失败日志压回上下文,继续生成下一个 patch。核心参数:
| 参数 | 值 | 说明 |
|---|---|---|
stream_tokens |
true | 逐 token 返回,前端可实时高亮差异 |
max_diff_tokens |
2048 | 单个 patch 上限,防止一次改爆 |
temperature |
0.15 | 低采样,保证 patch 风格一致 |
top_p |
0.95 | 保留小幅随机,避免死循环 |
stop |
["```"," 测试通过 ","FAILED"] | 见到测试通过或失败即停,减少幻觉 |
实测在 SWE-Bench 平均 3.7 轮 即可收敛,每轮耗时 18 s(含测试),总耗时 <2 min,比传统 “整包生成” 快 40%。
四、本地复现清单
- 硬件:≥24 GB 显存 GPU 或 32 GB 统一内存 Mac;
- 拉镜像:
docker pull docker.all-hands.dev/all-hands-ai/runtime:0.39-nikolaik docker pull docker.all-hands.dev/all-hands-ai/openhands:0.39 - 起 vLLM:
vllm serve mistralai/Devstral-Small-2505 --tokenizer_mode mistral --tensor-parallel-size 1 --port 8000 - 起 OpenHands:
export MISTRAL_API_KEY=xxx docker run -d --name openhands -p 3000:3000 …(见上文) - 浏览器打开
http://localhost:3000,选 “Load from GitHub”→ 挑一个带 pytest 的 issue → 点 “Auto-fix”。
五、风险与上限
- 沙箱逃逸:runtime 镜像虽以非 root 运行,但
/var/run/docker.sock挂载仍算 “软隔离”,内网使用需加一层 gVisor 或 kata-containers; - 过拟合风险:Devstral 训练集已排除 SWE-Bench 仓库,但你的私有代码若与 GitHub 热门项目结构高度相似,可能出现 “伪正确” 补丁;
- 长上下文陷阱:128k 窗口≠免费午餐,文件过多时注意力尾部衰减,建议按目录分段提交,别让模型一次看 500 文件。
六、小结
Devstral 把 “小模型 + 大沙箱 + 流式反馈” 做成了一套可复制的工程范式:
- 24 B 模型本地可跑,合规又省钱;
- OpenHands 一次性沙箱保证测试可复现;
- 流式 diff 让 “改一点、测一点” 成为现实,最终把 SWE-Bench 成绩推到开源第一。
即使 72.2% 的 “都市传说” 还未落地,把上述参数与脚本照搬到你的内网,已经能在一小时内跑出一条接近 46.8% 的自动修复流水线。下一步,把内部代码转成 SWE-Bench 格式做继续预训练,你也能拥有自己的 “Devstral 2”。
参考资料
[1] Mistral AI. "Devstral: an open-source SWE agent model." 2025-05. https://mistral.ai/news/devstral
[2] All Hands AI. "OpenHands Documentation." 2025-06. https://docs.all-hands.dev/
[3] SWE-Bench Verified Leaderboard. https://swebench.com/ verified.html