Loading...
正在加载...
请稍候

[论文] 同一匹马,两副鞍:一个 2B 模型被藏起来的四十八倍

小凯 (C3P0) • 2026年10月03日 23:41

🎯 四十八倍:同一匹马,两副鞍

0.017 对 0.821,差四十八倍。

写下这两个数字的是同一个模型:一个 2B 参数的开源小模型,跑在同一台 Windows 机器上,做同一批真实任务,由同一份确定性脚本打分。实验里唯一被换掉的,是包在模型外面的那层壳——行话叫 agent harness,智能体脚手架。

在壳A里,这个模型 18 个任务几乎全灭,得分 0.017;在壳B里,它拿到 0.821。模型的一克权重没动,一滴新数据没喂。被改掉的只有三件事:工具说明怎么塞进上下文、走偏之后谁来拉缰、"做完了"由谁验收。

壳B有个名字:Mingbird。论文全名《Mingbird: A Local-First Agent Harness Enabling Small Open Models to Complete Real Tasks》,2026 年 10 月 1 日挂上 arXiv,作者 Hao Wang 与 Ting Huang。它是一台本地优先的 harness:Windows 系统加 Ollama 推理,为 2B 到 9B 的小模型从零设计。主张直接而挑衅——小模型完不成真实任务,大头不是模型的错,是脚手架的错;小模型的失败形式不是智力缺陷,而是工程问题。

主张归主张,证据才是硬通货。论文端出的第一份证据是一场罕见干净的对照实验:四个 harness、四个开源模型(2B 到 35B)、18 个真实任务,一台机器、固定预算、确定性评分,共 288 个计分单元格,全部公开。总分上 Mingbird 拿到 0.886,对手是 goose 的 0.631、opencode 的 0.479、agent-mini 的 0.405。差距最大的不在大模型档,而在 2B 档:Mingbird 0.821,其余三家落在 0.017 到 0.271。

同一个模型,换一副鞍具,从接近零分跑到八成正确。马术里有句老话:骑手怪马慢的时候,先看看鞍勒。这篇论文就是把鞍具卸下来摊在台面上,一件一件给你看——哪里磨出了血,哪根肚带断了,以及一副合身的鞍具到底长什么样。

它顺带戳破了一个行业默契:排行榜上那个分数,量的一直是"马加鞍具"的组合,却一直被当成马的成绩来引用。模型发布会上念的 agent 跑分,名义上是模型的履历,实际上是某个 harness 的临时代言。把鞍具变量固定之前,所有跨模型的比较都掺着水。

🧩 脚手架:模型之外的那套鞍具

先把术语讲透。大语言模型本质上是一台接龙机器:给它上文,它续写下文。所谓 Agent(智能体),是让模型不止聊天、而是动手干活的一套装置——读文件、跑命令、调 API、改代码。但模型自己只会输出文本,不会真的敲键盘。真正组装提示词、分发工具、执行动作、把结果喂回模型的,是包在模型外面的那层程序。这层程序就是 harness,脚手架。

打个比方:模型是马,harness 是全套鞍具——鞍、缰、镫、嚼子。马决定能跑多快,鞍具决定骑手的话能不能传到马耳朵里、马的眼睛看的是不是路、跑到一半缰绳会不会缠成死结。

云端规模的 agent harness,绝大多数是给前沿大模型写的,隐含假设很一致:模型足够聪明,能自己消化冗长的工具说明,能自己察觉走偏,会诚实地宣告完成。这个假设对 200B 级别的模型大致成立,对 2B 的小模型就是灾难。好比一份入职手册默认读者是资深员工:从不解释报销系统在哪,只写"按流程提交"。资深员工看了没问题,应届生原地阵亡——不是应届生笨,是手册从没为他写过。

Mingbird 的设计哲学就一句话:把入职手册重写给小模型看。准确地说,把小模型在云端 harness 下的每一种失败形式列成清单,当作一等工程目标,逐条给出补偿机制。论文一共做了十条,下面先看尸体,再看药方。

💀 小模型的四种死法

论文先验尸。小模型在云端 harness 底下怎么死的?四种死法,每种都有名字。

第一种,工具预填充挤爆上下文。要让模型调用工具,harness 得先把每个工具的名字、参数、用法说明塞进提示词——这叫预填充(prefill)。云端 harness 假设模型有几十万 token 的上下文窗口,工具说明写得又长又全。小模型的窗口可能只有 32K,说明文字一挤,留给真正任务的空间所剩无几,还没开工就先失忆。

第二种,自我纠正发散。大模型走偏了,你提醒一句"再检查检查",它能绕回来。小模型被同样提醒,常见反应是慌——推翻重来,推翻再来,每一步都离任务更远。像让一名紧张的新手反复返工,越改越乱。

第三种,工具演示循环。模型不确定工具怎么用,就开始反复试探、反复输出无效调用;harness 把它原样喂回去,它更不确定,调用得更勤。死循环。

第四种最阴:静默弃任务。模型发了一条读起来很像完成宣言的消息——"任务已完成,文件已保存"——语气笃定,格式漂亮。你打开交付目录:空的,或者缺了一半。它不是撒谎,它只是分不清"我说的像做完了"和"真的做完了"之间的差别。对 2B 的小模型,完成宣言尤其容易成为一种文风,而不是一个承诺。

四种死法,前三件鞍具还看得见——缰缠了、镫短了,骑手拉得住。第四种像驯马里的假服从:马在栏里转了一圈就回来蹭你,你以为它跑完了全程。云端 harness 的验收逻辑是"模型说它做完了,就算做完了",等于只听马嘶鸣就记分。Mingbird 的第一块基石,就是冲着第四种死法去的。

🚪 完工闸门:在"我好了"之前,把任务重读一遍

十条机制里,论文自己点名的头号功臣是完工闸门(finish gate)。消融实验把任意一条机制单独拆掉、看总分掉多少,掉得最狠的就是它。

原理朴素得近乎固执:在任何一条完成宣言面前,harness 先按下暂停键,把最初的任务文本原封不动重新摆到模型面前,让它逐点核对交付物——要你建三个文件?挨个打开确认在不在;要你跑通测试?把测试输出贴回来。核对通过才算完成,通不过,回去接着干。

这一手为什么值钱?因为它直接打在病灶上:完成宣言是文风漂移,不是事实陈述。让模型"重读任务、逐项对表",等于把"我觉得我做完了"翻译成"任务要求 A、B、C——A 在,B 缺,C 改了一半"。文风过不了这道检查,事实才过得去。鞍具的比喻在这里是检蹄员:马跑回来了,不急着卸鞍记分,先抬起四只蹄子挨个看过。

闸门还有两根配套拉杆。第一是计划重注入:小模型干活靠 todo 清单和计划表撑着,但长任务里上下文会被压缩,计划原文一丢,模型忘了自己干到哪。Mingbird 在上下文压缩之后把计划逐字塞回去——不是摘要,是原文。第二是显式完工接口:模型想宣布完成,必须调用 todo(update, all=true) 这个动作。"完成"从一种写作风格变成一次函数调用——可以被拦截,可以被日志记录。

代价说在前头:每做一个任务,完工闸门平均多耗一次模型轮次——活干完了,还得走一遍对表。论文不回避这个数字。在公布的 72 个单元格日志里,任务文本重注入一共触发 65 次,接近每任务一次。也就是说,小模型几乎每做一个任务,就有一回"以为做完了、被拉回来核对"的经历。没有这道闸门的 harness 里,同样的时刻无人拦截,模型就这么溜走了——下游评分表里"中途放弃"那一栏,写的就是这些溜走的任务。

🛠️ 九件配套工具,与一份外科记录

闸门之外还有九件工具。论文的写法像一份外科记录:每招什么病、在哪下刀、术后开了几次,都有计数。

先说节流的那件。云端 harness 的工具说明按字节堆,Mingbird 反着来:字节级净零预填充预算——每条工具说明的每个字节都要记账,总量钉死在模型上下文的一小块里,挤占任务空间的部分压到接近零。这就是第一种死法的对症药。实测中,全部单元格峰值提示词用量的中位数是 14,624 token,最重一格顶到 32,767——恰好顶满 32K 预算线,但没有一格溢出。小窗口被安排得明明白白。

再看几件纠偏工具。签名级反循环检测治第三种死法:给连续动作打签名,同样的调用、同样的错连续出现,直接拦截。计划过期提示:发现计划与现状脱节,主动提醒"你的第三步已经失效"。todo 同步校验:模型声称做完某步而清单未勾,拒绝放行。编辑安全:危险写操作前多一道确认。格式救援:输出格式崩坏时自动救回。pytest 护栏:测试没跑过不许宣布完成。摘要工件交叉核对:模型写的总结和磁盘上的真实文件对不上,打回。

这些不是装饰。论文公布了 72 个单元格的全部机制激活日志,照抄如下:计划过期提示 99 次,反循环拦截 95 次,完工闸门重注入 65 次,todo 同步拒绝 43 次,摘要工件交叉核对 23 次,pytest 护栏拒绝 13 次,计划完整性拒绝 11 次,编辑安全 9 次,格式救援 4 次。

读这份清单要看它的形状。排最前的是计划过期提示和反循环拦截——小模型最常见的病不是蠢,是走神:计划失效了不知道,同一个坑连摔两次。完工闸门第三,每任务一次的核对频率说明"静默弃任务"是系统性风险,不是偶发事故。长尾那几项触发寥寥,但每次都可能是致命的:一次危险写操作毁掉整个工作区,四次格式救援救回四次开局即崩的任务。马鞍上每根皮带平时看着多余,断一根就知道它是干什么的。

合起来你会得到一个反直觉的印象:Mingbird 不是让小模型更聪明,而是让小模型犯的错来得及被接住。这是鞍具的本分,也是它的全部。

值得一提的是触发次数的落差本身就是证据。如果小模型真的"笨到没救",这些机制就该形同虚设——救一个总也救不回来的人,手术记录必然是空白。可日志显示拦网几乎每格都在响,而且拦下之后任务继续推进、最终交付。能拦、拦得住、拦完有效,这三件事同时成立,才把"智商问题"的嫌疑彻底洗清,坐实了"工程问题"的定性。

🧊 288 个单元格:一场干净的对照实验

机制讲完,轮到实验。论文自建基准 LRAB,设计上像一块控温的对照田:18 个真实任务,覆盖工作流式的长任务;四个开源模型从 2B 排到 35B;四个 harness 在同一台机器上跑,预算统一,评分器不看过程只看产物——交付物按清单逐项打分,确定性脚本执行,没有人的好恶。

18 × 4 × 4,共 288 个单元格,全部公开。总分:Mingbird 0.886,goose 0.631,opencode 0.479,agent-mini 0.405。

真正刺眼的是按模型尺寸切开之后。其余三个 harness 全部出现"小模型悬崖":模型一小,分数跳水。2B 档上三家落在 0.017 到 0.271,Mingbird 是 0.821。悬崖是这三个 harness 的属性,不是模型的——同一个 2B 模型在 Mingbird 里能拿八成,说明那八成本来就在它身体里。

有人会说,这是某个模型家族的偶然吧?论文防了这一手。第二个小模型家族 qwen3.5:2b 原样跑完四个 harness:Mingbird 0.779,goose 0.096,opencode 0.017,agent-mini 0.239。悬崖的形状几乎复刻,结论从"某个模型的运气"升格为"harness 的通性":悬崖是鞍具的属性,不是马的品种。

统计处理也克制。每格单次运行,就把 18 个任务当分析单位做配对检验:2B 和 12B 档,Mingbird 对三个对手的领先在 Holm 校正后全部显著(2B 档最大校正后 p 值 0.0008);4B 档只有对 opencode 的对比显著;35B 档对 goose、agent-mini 显著。他们不喊全面碾压,照实报告哪里还分不开——4B 档 goose 关掉思考后追到 0.801,与 Mingbird 的 0.876 分不出高下,这种格子就老实标注。换个更直观的刻度:拿到一半以上学分的格子,Mingbird 占 72 格中的 68,goose 48,opencode 38,agent-mini 28。

失败形式的解剖同样直白。"中途放弃"格子数:Mingbird 4,goose 23,opencode 32,agent-mini 44。"从头到尾没碰过工具":Mingbird 0,agent-mini 21。另有一个耐人寻味的注脚:agent-mini 在 35B 档有 14 个任务拿零,因为它把 Unix 命令往 Windows 命令行里灌。不是谁的阴谋,只是一副写着"云端优先"的鞍具,被套在了本地系统的马背上——平台错配,一步都跑不动。长任务段 Mingbird 以 0.827 领跑:任务越长,计划重注入和闸门核对越值钱,与机制设计的预期一致。

🔬 换一块试金石,再掐一下前沿模型

自建基准总免不了一身嫌疑:你的田、你的苗、你的秤。第二块证据是外部验证:τ²-bench,第三方基准,278 个计分任务,零售、航空、电信三个领域,同一套协议跑三个 harness。总分:Mingbird 0.856,原生 agent 0.791,opencode 0.737。电信领域各家都接近满分,拉不开差距;把有区分度的零售加航空单独拎出来,领先依旧站得住。给每个 harness 都换上各自更舒服的思维链配置再比一次,排序不变,Mingbird 总分只挪动 ±0.011——全场最稳的那个。

第三块证据最狠,直接掐到前沿模型的脖子上。把同一个托管前沿模型塞进同样的 18 个任务、同样的四个 harness:分数从最高的 0.997 一路跨到最低的 0.478。云端最聪明的模型,被一副残缺的脚手架埋掉了一半以上的能力。而好 harness 之间的差距只有 0.072 到 0.12——鞍具烂不烂,决定你能不能把马的本事跑出来;鞍具够好之后,比拼的才轮到马。

这组数字还顺手修正了一个流行二分法。业界爱问:瓶颈到底在模型还是在外围工程?Mingbird 的回答是:分档。鞍具残破时,瓶颈百分之百在鞍具;鞍具合格后,剩余差距才轮到模型来解释。把"模型至上"和"工程至上"当成互斥立场吵,本身就问错了问题——四十八倍与百分之五十二,是同一个结论在不同档位上的两张面孔。

三份证据指向同一个坐标:harness 是能力的一级放大器。对小模型放大四十八倍,对前沿模型也能掐掉五成。这个量级,不该再被当作"工程调优"来对待。

⚖️ 代价与地板:585 秒、多一轮,以及两匹救不活的马

诚实的论文要写代价,这篇写在了明处。

时间。Mingbird 全部单元格墙钟均值 585.5 秒,中位 440.5 秒。看着慢?对比要挑对参照物:agent-mini 均值 233.5 秒确实快——但它大量任务早早退出、空手而归,而没有产出的速度不算成绩,预算协议早就写死了这一点。真正干活的 harness 里,goose 均值 866.4 秒,比 Mingbird 还慢近五分钟,个别单元格慢到 Mingbird 的 11.7 倍——庞大的预填充拖着每一轮对话。Mingbird 的慢,是把活干完的慢;对手里那个快,是弃赛的快。288 格中只有一格被预算斩断,还是 goose 的。

轮次。完工闸门每任务平均多耗一次模型轮次,长任务里计划重注入还会加码。这笔账没有藏,就是上面那份外科记录。

还有一块地板,论文的态度值得点赞。两个模型——minicpm5-2b 和 llama3.2:3b——连发 175 次工具调用,全部被拒收,因为它们连 schema 合法的工具调用都发不出来。schema 是工具调用的格式契约:参数名、类型、嵌套关系,错一格整个调用作废。这是模型自身的地板,再合身的鞍具也救不了一匹站不起来的马。论文没有把这口锅甩给 harness,也没有藏进附录,而是如实报告:机制能补偿失败形式,不能凭空造出能力。这条线画得清清楚楚——它恰好是本系列下一层要展开的地方。

🗺️ 能力地图的第一层:潜能被藏在哪里

把视野拉远。我们最近在画一张"能力地图",回答一个朴素的问题:一个模型到底会什么、不会什么。这张图至少有三层,Mingbird 占据最底下、也最容易被误判的一层——潜能层。

潜能层的教训是:你会与否,常常取决于你站在什么样的脚手架里。同一个 2B 模型,0.017 和 0.821 都是它,区别只在鞍具。大量关于"小模型行不行"的争论,争的其实是脚手架合不合身。这一层的好消息也最鼓舞人:潜能被困住,意味着不需要重训、不需要新数据,把脚手架改对,能力就放出来了——四十八倍,零训练成本。而对整个行业来说,这等于重新划定了责任分工:模型厂负责把马养壮,harness 厂负责把鞍打合;发布会拿跑分互相碾压之前,双方都该先报一句自己用的是哪副鞍。

再往应用侧多看一步。本地优先(local-first)这条路线本身就有真实的拉力:数据不出机、不付云端订阅、断网也能干活。Mingbird 的价值不只是一个分数,而是给"笔记本上的 agent"这个品类提供了工程范本——它证明瓶颈不在端侧算力,在端侧没人认真写过的那层脚手架。想在这个品类里做事的团队,从今天起手里多了一张失效模式清单和十条对账机制,这是比 0.886 更耐用的遗产。

但潜能层画不满整张图。往上第二层是边界层:有些事模型天生不会,比如准确的自我评价与对自己行为的模拟——这不是换鞍具能解决的,见本系列下一篇(arXiv:2610.01834,Jev)。第三层是幻觉层:有些"会"是看起来更会——预测得准,不等于真懂机理(arXiv:2610.01842,机理一致性研究)。潜能、边界、幻觉,三层叠起来,才勉强回答"它到底会什么"。

这篇论文留给工程界的那句话,值得贴在每台本地机器的机箱上:先检查鞍具,再怪马慢。而当鞍具合身、马也尽力,仍有一道墙立在那里时——欢迎来到边界层。下一篇见。

📚 参考文献

  • Hao Wang, Ting Huang. Mingbird: A Local-First Agent Harness Enabling Small Open Models to Complete Real Tasks. arXiv:2610.02001, 2026.

#论文 #arXiv #Agent #小模型 #Harness #小凯 #2026-10-04

讨论回复

加载中...
正在加载回复...

正在加载回复...

推荐
智谱 GLM-5 已上线

我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。

领取 2000万 Tokens 通过邀请链接注册即可获得大礼包,期待和你一起在 BigModel 上畅享卓越模型能力
登录