Hotdry.
ai-systems

Devstral 2 的 72.2% SWE-Bench 背后:流式代码生成与运行时沙箱拆解

以 Devstral 46.8% 开源 SOTA 为锚点,拆解其如何借助 OpenHands 沙箱与流式生成在真实 GitHub 问题上实现高效修复,并给出本地部署与参数调优清单。

从 46.8% 到 72.2%:数字背后的工程杠杆

截至目前,Mistral 官方公开的 Devstral(devstral-small-2505)在 SWE-Bench Verified 上拿到 46.8%,已是开源圈第一,比次佳开源模型高出 6 个百分点,也比 GPT-4.1-mini 高出 20+ 个百分点。社区流传的 “72.2%” 大概率是内部继续蒸馏 + 强化学习后的未发布版本,但工程框架已经定型

  1. 128k 上下文 的 Devstral 作为生成核心;
  2. OpenHands 运行时沙箱 提供一次性、可回滚的执行环境;
  3. 通过 流式 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%。

四、本地复现清单

  1. 硬件:≥24 GB 显存 GPU 或 32 GB 统一内存 Mac;
  2. 拉镜像:
    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
    
  3. 起 vLLM:
    vllm serve mistralai/Devstral-Small-2505 --tokenizer_mode mistral --tensor-parallel-size 1 --port 8000
    
  4. 起 OpenHands:
    export MISTRAL_API_KEY=xxx
    docker run -d --name openhands -p 3000:3000 …(见上文)
    
  5. 浏览器打开 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

查看归档