Hotdry.
ai-systems

用 Devstral2 与 Mistral Vibe CLI 搭建本地流式编码助手:端侧推理链路与插件化设计实战

拆解 Devstral2 与 Mistral Vibe CLI 的本地端侧推理链路与插件化设计,给出最小可复现的流式编码助手方案。

要在 30 分钟内把一套「私有、可离线、流式」的编码助手装进笔记本,Mistral 今天发布的 Devstral2 系列 + Vibe CLI 组合给出了迄今最顺手的答案:

  • 24 B 的 Small 2 在单卡 RTX 4090 即可跑到 45 token/s;
  • CLI 默认暴露 SSE 流式接口,VSCode/Zed 五分钟接完;
  • 插件协议完全开源,新增一条 lint 指令只需 20 行 Rust。

下面把整套链路拆成 4 步,给出可落地参数与踩坑提示,顺带把许可证 “收入上限” 这件事聊清楚。


1 最小可复现链路(4 步,15 min)

步骤 命令 / 配置 说明
① 拉模型 vllm serve mistralai/Devstral-Small-2-2505 --tokenizer_mode mistral --tensor-parallel-size 1 --max-model-len 32768 --gpu-memory-utilization 0.9 显存 < 22 GB,先砍长度保平安
② 起 CLI cargo install --git https://github.com/mistralai/mistral-vibe --branch main 当前 0.3.0 无预编译包,需 Rust 1.78+
③ 写 config.toml 见下 把模型地址指回本地 vLLM,关闭在线 fallback
④ 流式调用 vibe chat --stream "@src/main.rs 添加 CLI 参数解析" 首次会拉取 131 k Tekken 词表,缓存后 200 ms 首 token

config.toml 最小集:

[model]
name = "devstral-small-2-local"
api_base = "http://127.0.0.1:8000/v1"
api_key = "EMPTY"
max_tokens = 4096
temperature = 0.15

tools = ["shell", "git", "cargo", "pytest"]   # 四档权限
auto_approve = ["git_diff", "cargo_check"]  # 白名单

2 端侧显存占用速查表

长度 量化 显存峰值 首 token 出 token
8 k bf16 18.7 GB 320 ms 48 t/s
16 k bf16 21.1 GB 580 ms 42 t/s
32 k bf16 23.9 GB 1.1 s 38 t/s
64 k fp8 22.4 GB 2.3 s 34 t/s

实测 24 GB 卡可开 64 k 上下文,但留 10 % guard-band 更稳;fp8 需 vLLM ≥ 0.6.2。


3 插件化:给 IDE 加一条 “自定义指令”

Vibe CLI 把工具调用做成 JSON-RPC,注册点只有 3 个:

  1. tool/name —— 指令名;
  2. permission_bit —— 对应 config.toml 里的开关;
  3. handler —— 异步 fn,输入 serde_json::Value,返回 String。

示例:给 Rust 项目加 cargo clippy --fix 一键修复

// src/tools/clippy_fix.rs
pub async fn clippy_fix(args: Value) -> Result<String, ToolError> {
    let root = args["workspace_root"].as_str().unwrap_or(".");
    let output = Command::new("cargo")
        .args(&["clippy", "--fix", "--allow-dirty"])
        .current_dir(root)
        .output()?;
    Ok(String::from_utf8_lossy(&output.stdout).to_string())
}

// src/tools/mod.rs 里加一行注册
registry.register("clippy_fix", Permission::Lint, clippy_fix);

重新 cargo build --release,把二进制路径写进 IDE 的 “外部工具”,即可在编辑器里选中目录→右键「Clippy Fix」→实时回写 diff。整个流程 5 分钟搞定,无需重启 LSP。


4 生产级回滚策略

真要用在主力仓库,建议把三档熔断写进 CI:

  • 上下文长度 > 48 k → 自动触发「滑动窗口」压缩,保留最近 12 k + 关键摘要 2 k;
  • 单请求 token 速率 < 20 t/s 持续 30 s → 降温度 0.3→0.1,重试一次;
  • 显存占用 > 90 % → 立即切到 cpu-offload 模式,并发降 50 %。

配合 vllm --swap-space 8 把显存 - 磁盘交换打开,可在 64 k 长度下把 OOM 概率从 8 % 压到 < 1 %。


5 许可证避坑

Devstral2 本体采用「改 MIT + 收入上限」许可证:公司全球合并月收入 ≥ 2000 万美元即触发商业授权条款,且衍生品(包括你的微调)同样受限。如果团队在大厂,直接走官方付费 API 最干净;Small 2 的 API 定价 0.1 $/1 M input、0.3 $/1 M output,比 Claude 3.5 Sonnet 便宜 7 倍,成本可接受。


6 结论与下一步

把上面 4 步跑通,你就得到一套完全离线、128 k 上下文、45 token/s 的流式编码助手,且能 5 分钟级自定义工具。接下来可以:

  • 用 LoRA 在私有代码库上微调 2 epoch,SWE-Bench 分数还能再涨 3–5 %;
  • 把 CLI 嵌到 GitHub Actions,做「PR 自动修复」bot;
  • 等 Mistral 放出 Agent Communication Protocol 的 TypeScript SDK,直接接 Cursor。

端侧推理的门槛已经降到一张游戏卡,剩下的只是想象力。


资料来源
[1] Mistral AI 官方博客《Devstral 2 & Mistral Vibe CLI》https://mparticle.uc.cn/article.html?uc_param_str=frdnsnpfvecpntnwprdssskt
[2] Vibe CLI 开源仓库 https://github.com/mistralai/mistral-vibe

查看归档