TL;DR:我开源了一个 agent harness:Mingbird(鸣鸟),Apache-2.0 协议,面向 Windows + Ollama 上的 2~9B 本地模型。核心数据:同一颗 2B 模型,在三个现成开源框架中得分 0.017 / 0.246 / 0.271,在 Mingbird 中为 0.821,相差 48 倍。题面、判分代码与 288 格原始分数全部公开。本文按四部分展开:问题定位、任务集设计、实验结果、机制分析。
一、问题定位:小模型在真实任务上的四种失败模式
在本地跑小模型做长任务,失败高度集中在四种模式上:
- 工具 prefill 挤占上下文:全部工具定义一次性注入,2B 模型 32K 窗口在开局就失去近半容量;
- 错误信息不回灌:harness 未将真实执行错误返回给模型,模型在错误假设上继续推理,原地打转;
- 工具调用死循环:同一条命令反复执行,没有机制判定"这一轮已经失效";
- 中途静默放弃:不报错、不交付、无任何输出,任务无声终止。
这四条都发生在模型能力边界之内,属于 harness 未接住的部分,也是本项目的改进对象。
二、任务集:基准考什么,为什么这样设计
现成的代码类基准(如 SWE-bench 一系)考的是"在大型仓库里修复 issue",那是开发者中一小部分人的工作形态;而多数人交给 AI 的是查资料写报告、清洗数据、修小脚本、做对比、写说明书这类事。要回答"本地小模型能不能干活",需要一套贴着这类真实工作出的题,所以任务集自建,并且全部公开。
任务集共 18 个,分四档,难度逐级上行,每档对应一层能力:找对信息、写出能跑的代码、串完多步流程、扛住长任务不断链。
| 档位 | 任务 | 需交付的产物 | 对应的真实场景 |
|---|---|---|---|
| 一档·检索提取 | 1 文献综述 | 综述报告 + 参考文献 + 数据表 | 论文文献综述、汇总一批转发材料 |
| 一档·检索提取 | 2 按审稿意见改稿 | 修订版 + 变更日志 | 改标书、改方案、按导师意见返工 |
| 二档·代码综合 | 3 为现有工具加功能 | 新功能 + 设计笔记 + 测试 | 在同事的脚本上加一个导出 |
| 二档·代码综合 | 4 定位并修复 bug | 修复 + 测试通过 | 接手报错的存量脚本 |
| 二档·代码综合 | 5 数据清洗管道 | 干净数据表 + 校验报告 | 把脏表格洗成能用的数据 |
| 二档·代码综合 | 6 统计分析与出图 | 两张图 + 分析报告 | 周报月报里的数据分析部分 |
| 三档·多步流程 | 7 联网调研技术选型 | 对比矩阵 + 推荐 + 来源链接 | 纠结用哪个库,需要一张对比表 |
| 三档·多步流程 | 8 设计 API 与示例服务 | 接口文档 + 可运行示例 | 把需求落成接口约定 |
| 三档·多步流程 | 9 性能剖析与提速 | 优化后代码 + 加速报告 | 半小时的脚本想三分钟跑完 |
| 三档·多步流程 | 10 从源码写用户手册 | 用户手册 | 接手没有文档的老系统 |
| 三档·多步流程 | 11 竞品对比分析 | 对比矩阵 + 推荐 + 风险清单 | 产品与运营的月度功课 |
| 三档·多步流程 | 12 课程体系设计 | 考试蓝图 + 实验 + 资源清单 | 排课、设计培训大纲 |
| 三档·多步流程 | 13 隐私合规审计 | 修复代码 + 整改计划 | 检查代码里的信息泄露风险 |
| 三档·多步流程 | 14 发版规划 | 工作量估算 + 风险矩阵 + 缓解措施 | 项目排期 |
| 三档·多步流程 | 15 实验可复现性审计 | 审计报告 + 复现脚本 | 核对他人实验能否复现 |
| 四档·长链任务 | 16 依赖链交付 | 十几个文件连轴交付 | 一个项目的完整流水线 |
| 四档·长链任务 | 17 长上下文压力 | 不丢失前置要求的产物 | 长需求文档下仍记得开头约定 |
| 四档·长链任务 | 18 断点续跑 | 进程被杀后从断点续交 | 中途断电重启,工作不重来 |
判分规则只读最终产物,不看模型的自述:文件是否存在、内容是否包含关键项、代码能否编译、图片是否为有效文件、正文是否达到字数下限、测试是否通过,全部为确定性断言,重跑判分结果一致。里程碑产物与最终产物分开记录,做到一半停止的任务拿不到最终分。压轴的第 18 题是专门设计的:任务执行到一半杀掉进程,检验能否从断点恢复继续交付。本地长任务最怕中途断电断网,这是必须考的能力。
题目与判分标准由版本化的生成脚本产出并冻结,开跑之前就全部公开,不存在赛后调整的空间。
三、实验设计
| 维度 | 设置 |
|---|---|
| harness | 4 个:Mingbird(本项目)、goose、opencode、agent-mini(均原装,未打补丁) |
| 模型 | 4 个开源模型:gemma4:e2b(2B) / qwen3.5:4b / gemma4:12b / ornith-1.5:35b |
| 任务 | 上文 18 个任务 |
| 合计 | 4 × 4 × 18 = 288 格 |
| 环境 | 同一台 Windows 机器、相同时间预算 |
| 协议 | 温度 0、关闭思考,四臂统一 |
四、结果
| 模型 | Mingbird | goose | opencode | agent-mini |
|---|---|---|---|---|
| gemma4:e2b(2B) | 0.821 | 0.271 | 0.017 | 0.246 |
| qwen3.5:4b | 0.876 | 0.801 | 0.465 | 0.706 |
| gemma4:12b | 0.906 | 0.772 | 0.539 | 0.576 |
| ornith-1.5:35b | 0.941 | 0.679 | 0.896 | 0.092 |
四臂总分:0.886 / 0.631 / 0.479 / 0.405。
结果的形状比均值更有信息量:2B 档三个对照框架集体失速,Mingbird 为 0.821,距其自身 35B 档成绩仅 0.12;到 35B 档各家追平、差距收窄。也就是说,harness 设计的收益集中在低配硬件那一档,而这正是本地部署用户实际所在的那一档。
由于每个档位只放一颗模型,存在档位与模型家族混淆的可能。因此在第二个家族(qwen3.5:2b)上重跑了整套矩阵共 72 格:0.779 对 0.239 / 0.096 / 0.017,断崖形状原样重现,数据同样公开。
五、机制分析
一个格子的前后对照。 同一任务(WF-08,即上表第 8 题)、同一颗 4B 模型,本项目 harness 的前后两个版本:
| 工具调用 | 产出文件 | 喂给模型的输入 | |
|---|---|---|---|
| 修之前 | 156 次 | 0 个 | — |
| 修之后 | 15 次 | 3 个 | 逐字节相同 |
模型、提示词、采样参数均未改动,改动的只有循环判定、完成检查与工具调用三处 harness 逻辑。这组对照可以说明:至少在这个格子上,差异完全来自 harness。
三个关键机制。
- 完成门禁:接受模型的 "done" 之前,harness 重读任务原文并要求逐项核对交付物。小模型经常在交付一半时宣布完成,这是实测收益最大的一个机制。
- 验证回灌:harness 代跑任务自带的检查,将真实失败(文件、行号、报错原文)作为工具结果回灌,使下一步推理从"实际坏在哪"开始,而非从"模型以为坏在哪"开始。
- 签名级反循环:同签名调用重复、或连续 15 轮无产出即判定死循环,处置分两级:先升级提示,再硬复位。WF-08 的 156 次调用即由这条规则收敛。
另有一条不显眼但关键的工程约束:扁平 prefill。工具按类别按需装载,出厂 prefill 钉在 797 tokens,由单测约束,增加一个字节 CI 即失败。
外部基准复核。 τ²-bench(Sierra Research),三域均使用同一颗本地 qwen3.5:4b 作为 agent:
| 域 | Mingbird | 基准自带原生 agent | opencode |
|---|---|---|---|
| retail(114 题) | 0.763 | 0.675 | 0.588 |
| airline(50 题) | 0.740 | 0.740 | 0.500 |
| telecom(114 题) | 1.000 | 0.930 | 0.991 |
前沿模型对照。 将四个 harness 全部指向同一颗云端前沿模型(本地代理伪装成 Ollama 服务,四家代码零改动),跑同样 18 个任务:
| harness | 总分 |
|---|---|
| Mingbird | 0.997 |
| goose | 0.989 |
| opencode | 0.925 |
| agent-mini | 0.478 |
两个结论同时成立:一个有缺陷的 harness 可以埋掉前沿模型一半以上的实测能力;而当 harness 都过关时,三家差距只有 0.07,模型本身仍是更大的杠杆。
六、产品形态、本地与隐私
Mingbird 是一个 Windows 桌面应用,配合 Ollama 使用,内置 17 个任务技能(11 个编码向 + 6 个通用向:文件整理、联网调研、文档摘要、Word、Excel、图片批处理),语音输入为中英双语本地转写。安装包约 175MB,中英文双语。
全部推理跑在本地 Ollama 上:开箱不存在任何云端通路,无遥测、无账号、无更新检查;代码中不存在打包上传工作目录(含 .git 历史)的机制;一键断网后,联网类工具连"组装进提示词"这一步都不会发生,可用 netstat 自行验证。
七、局限性说明
单机、单次、每档一颗模型,本实验用于观察趋势,不构成统计学结论;消融实验的 delta 小于单格执行方差,因此相关表述只取方向性;主矩阵跑在冻结的 v1.5.0 代码上,不是当前发布的 v1.9.2。Mingbird 失利的格子同样在公开数据中。
八、复现与获取
- 题面、判分代码、288 格 CSV、单格复现步骤(单机约 30 分钟):github.com/Mingbird/Mi…
- 安装包(Windows 中英文 + Linux/macOS):github.com/Mingbird/Mi…
- Apache-2.0;当前 v1.9.2,482 项测试(435 单测 + 26 集成 + 21 项 v1.9.1/v1.9.2 新增)
方法论问题(基线选取、协议设置、判分设计等)欢迎评论区讨论,包括质疑。