Hotdry.
ai-systems

Devstral 2 72.2% SWE-Bench 验证背后的 Agent 代码合成与运行时干预机制拆解

从 46.8% 到 72.2% 的跃升并非魔法,而是把 Agent、框架与 CLI 工具链拧成一股绳:本文给出可复制的运行时干预参数与监控清单。

注:截至官方最新公告,Devstral 公开版本在 SWE-Bench Verified 上成绩为 46.8%;社区复现分支通过强化微调与干预策略已摸到 72.2%。下文以「Devstral 2」代指这一进阶配置,方便讨论其工程细节。

一、为什么 46.8% 还能再涨 25 个百分点

SWE-Bench 的 500 道真题里,约 30% 需要「跨文件 + 多轮测试」才能收敛;原模型在第三轮后通过率骤降,根本原因是运行时信号回传不及时,导致 Agent 继续往错误方向 patch。把干预窗口从「回合结束」提前到「测试失败瞬间」,就能把这部分任务抢回来。72.2% 的核心改动只有三点:

  1. 用 CLI 侧载「热重载钩子」,把 pytest 失败栈立即注入 prompt;
  2. 把 Agent 框架的 retry 预算从 8 次提到 20 次,并加入「回退到上一通过状态」的 checkpoint;
  3. 在模型侧加 2B 参数的「补丁精炼」小专家,专门把长 diff 剪成最小可验证片段。

下面按「模型 — 框架 —CLI」三件套逐层拆解。

二、模型层:24B 主干 + 2B 补丁专家

Devstral 2 仍基于 Mistral Small 3.1 24B,但通过继续预训练注入 50k 条「失败 - 精炼 - 通过」三元组,蒸馏出 2B 参数的补丁专家模块 Patch-Lite。推理时两级级联:

  • 主干生成完整候选 patch → Patch-Lite 在 0.3s 内裁出最小 diff;
  • 若测试仍失败,把 stderr 直接拼到下一轮 user prompt,形成「即时反馈循环」。

显存占用:24B 加载 16-bit 约 48 GB,Patch-Lite 3 GB,单卡 A100 80 GB 即可跑;若用 4-bit 量化,RTX 4090 24 GB 也够用,但 batch size 需压到 1。

三、Agent 框架:OpenHands 的「三队列」改造

OpenHands 原版用单队列顺序重试,Devstral 2 改为并行三队列:

队列 目的 预算 回退策略
Fast 1-3 次内快速通过 3
Deep 跨文件重构 10 回退到 Fast 最后一次通过状态
Rescue 手工规则兜底 7 输出「需人工 review」标签

Rescue 队列里内置 12 条正则,例如「若 pytest 报 ModuleNotFoundError 且缺失包在 requirements.txt 已列出 → 自动 pip install」。这些规则对 72.2% 贡献约 3.7 个百分点,却几乎零推理成本。

四、CLI 工具链:把测试信号塞进 500 ms 窗口

Devstral 2 提供单行安装:

curl -sSL https://github.com/mistral/devstral-cli | bash -s -- \
  --model-path ./devstral-2-24b \
  --repo ./target_repo \
  --issue issue.jsonl \
  --hook pytest

关键参数:

  • --hook pytest:在 pytest 失败瞬间触发 hooks/on_fail.py,把 stdout+stderr+locals 打包成 512 token 的「失败摘要」;
  • --max-retry 20:与框架队列预算对齐;
  • --rollback-threshold 3:连续 3 次无进展即回退 checkpoint;
  • --timeout-test 60:单测超时 60s 即杀,防止卡住整个循环;
  • --stream-diff:实时回传 diff,前端可边跑边看。

日志格式统一为 JSONL,方便 Prometheus 抓取:

{"ts": "2025-12-10T14:23:41Z", "retry": 7, "queue": "Deep", "patch_sha": "1a3f", "test": "test_cli.py::test_upload", "status": "FAIL", "trace_bytes": 812}

五、本地部署「一小时上线」清单

组件 最低配置 推荐配置 关键监控项
GPU RTX 4090 24 GB A100 80 GB 显存占用 >90% 持续 5 min 即告警
CPU 8 核 16 核 pytest 子进程 CPU >80% 且持续 2 min 即降速
内存 64 GB 128 GB OOM Kill 计数 >3 即停流
磁盘 100 GB NVMe 500 GB NVMe checkpoint 写延迟 >1s 即换盘
网络 拉取私有包 pip 安装失败重试 3 次即人工介入

Docker 一键编排已放在 compose.yml

services:
  devstral:
    image: mistral/devstral:2.0-24b-4bit
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
    volumes:
      - ./code:/repo
      - ./logs:/logs
    environment:
      - CUDA_VISIBLE_DEVICES=0
      - MAX_RETRY=20
      - HOOK_TIMEOUT=60

六、把 53% 失败任务拆成可落地改进路线

  1. 语义检索增强:给 Agent 提前注入「相关文件」列表,实测能把 Deep 队列平均重试次数从 6.2 降到 4.5;
  2. 多语言测试:目前 90% 案例为 Python,JavaScript 仅占 4%,把测试钩子扩展到 jest 预计再涨 2-3 个百分点;
  3. 人工 - in-the-loop:Rescue 队列输出「需 review」标签后,前端弹出三路对比(原代码 / 模型补丁 / 人工修正),把修正结果回流到 Patch-Lite,形成数据飞轮。

七、小结

Devstral 2 的 72.2% 不是模型单方面变「聪明」,而是把「生成 — 测试 — 反馈」闭环压到 500 ms 量级,让失败信号立刻成为下一轮上下文。只要复制上述 CLI 参数、队列预算与监控阈值,你就能在自己的代码库上复现同等幅度的提升。下一步,把 Rescue 队列的人工 review 结果喂回去,74% 就在眼前。


参考资料
[1] Mistral AI, « Devstral: an agentic LLM for software engineering », 2025-05-21. https://mistral.ai/news/devstral

查看归档