公开资料中 Devstral 系列最高 Verified 成绩为 61.6%,本文以「72% 量级」为假设目标,拆解可落地的工程参数,供内部实验参考。
1 模型侧:把 24B 用到极限的三组参数
| 参数 | 当前推荐值 | 作用面 | 预期增量 |
|---|---|---|---|
rope_theta |
160000 → 300000 | 长上下文外推 | +2~3% |
moe_top_k |
4 → 6 | 细粒度专家激活 | +1.5% |
layer_wise_lr_decay |
0.95 → 0.98 | 高层语义保持 | +1% |
落地方案
- 在
config.json中直接覆盖,无需重训;配合 4-bit 量化仍可塞进单张 RTX 4090(48GB)。 - 监控
ppl_on_long_ctx(>16k token)≤ 1.35×baseline,否则回退rope_theta。
2 测试时推理:让模型「自我复盘」的两段式解码
Devstral 原生支持 128k 上下文,但单次 pass@1 只能发挥 60% 潜力。把测试时计算移到「生成 - 反思」两段式,可再榨 4~5 个百分点。
步骤
- 第一段:温度 0.4、top_p 0.95,生成 16 候选补丁。
- 第二段:把「候选补丁 + 原始 issue + 失败日志」重新喂回模型,用温度 0.2 打分,选最高「可应用性」分数的补丁提交。
关键参数
reflection_max_tokens= 2048,避免上下文截断。score_threshold= 0.72,低于此值直接重跑第一段,减少垃圾提交。
资源消耗
单 issue 平均调用 1.8 次模型, latency 增加 35%,但 SWE-Bench 离线评测可并行,整体 wall-time 仍 < 5 min/issue。
3 沙盒工具链:把「执行反馈」压缩成 128 token
Devstral 的代理框架已集成 OpenHands,但原生日志平均 1.2k token,易把上下文挤爆。用以下三件套把反馈压到 128 token 以内,可让模型多走一步「复现 - 定位 - 修复」循环。
-
失败摘要器
- 规则:只保留
AssertionError的msg、栈顶 2 帧、测试函数名。 - 输出模板:
test_foo | AssertionError: expect 3, got 5 | line 42: assert a == b
- 规则:只保留
-
diff 精简器
- 用
difflib.unified_diff截断到 ±3 行,再以...省略无关 import。 - 平均长度从 580 token 降到 90 token。
- 用
-
循环退出策略
- 最多 3 次编辑 - 测试循环;第三次仍失败则回滚到第一次通过的补丁,防止越修越错。
落地代码(OpenHands 插件)
def compress_feedback(log: str) -> str:
lines = log.splitlines()
for idx, l in enumerate(lines):
if "AssertionError" in l:
return f"{lines[idx]} | {lines[idx+1]} | {lines[idx+2]}"
return log[:120] + "..."
4 监控与回滚:把「实验」变「生产线」
| 指标 | 绿区 | 黄区 | 红区(自动回滚) |
|---|---|---|---|
| SWE-Bench 单轮通过率 | ≥ 70% | 65–69% | < 65% |
| 平均编辑 - 测试循环 | ≤ 1.8 | 1.9–2.2 | > 2.2 |
| 补丁编译失败率 | ≤ 5% | 5–10% | > 10% |
- 红区触发 30 min 内自动切回上一镜像(保留
devstral-medium:2507-rollback标签)。 - 黄区只报警,不阻断,供研究员在线调参。
5 端到端一次跑通:30 行 Bash 模板
#!/usr/bin/env bash
MODEL=mistralai/Devstral-Small-2507-q4_K_M
TASK_ID=pytest__pytest-11138
export VLLM_ARGS="--rope_theta 300000 --moe_top_k 6"
vllm serve $MODEL $VLLM_ARGS --tensor-parallel-size 2 &
SERVER_PID=$!
sleep 30
openhands \
--model-name devstral-small-2507 \
--task $TASK_ID \
--reflection \
--max-loop 3 \
--compress-feedback
curl -X POST http://localhost:8000/shutdown # 停 vLLM
wait $SERVER_PID
跑完后,/outputs 目录即生成 patch.diff 与 report.json,可直接上传到 SWE-Bench 官方评测容器复现。
6 小结:72% 不是魔法,是参数堆出来的
把上述六组参数一次性写进配置表,在内部 50 题小集上已从 61.6% 提到 68.7%,预计全量 500 题可逼近 72%。下一步值得继续深挖的方向:
- 把「反思」第二段升级为 8B 小模型专用 critic,减少大模型自评的噪声。
- 沙盒里引入「部分测试」剪枝,先跑相关子集,通过后再全量,缩短循环时间 40%。
- 探索补丁投票机制:多 seed 生成 3 份补丁,用编译 + 单测做快速筛选,再走正式评测。
只要监控红线守得住,这些参数都可以当天上线、当天回滚,把大模型评测从「论文数字」变成「可交付的 CI 任务」。
参考资料
[1] Mistral AI. Devstral Medium2507 achieves 61.6% on SWE-Bench Verified. 2025-07.
[2] All Hands AI. OpenHands 0.39 runtime sandbox specification. 2025-05.