微信扫一扫,关注公众号

  • 科技行者

  • 算力行者

见证连接与计算的「力量」

首页 两个AI模型跑分几乎一样,但一个是真会用工具,一个只是会说"工具"这个词

两个AI模型跑分几乎一样,但一个是真会用工具,一个只是会说"工具"这个词

2026-10-29 09:29
分享至:
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-
2026-10-29 09:29 • 科技行者

你可能听说过这样的事:两份简历,教育背景、工作经历、技能列表几乎一模一样,面试官打的分数也差不多。可是真正上手干活的时候,一个人能把事情办成,另一个人只会在会议上说"我们应该用某某工具来解决这个问题",然后就没有然后了。

这篇论文讲的就是这么一个故事,只不过主角不是两个人,而是两个AI语言模型。

**故事的起点是一个让人困惑的巧合**

有家做西班牙语网络安全小模型的团队,叫VectraYX系列,专门做那种可以离线部署、在没有网络的内部环境里运行的安全助手。这类模型的看家本领是"工具调用":当你问它"检查一下这个CVE漏洞编号的详情",它不能只是嘴上说说,得真的吐出一段格式规范的JSON代码,让后台系统去执行真实的查询。

工具调用: 模型输出一段用特定符号包裹起来的结构化代码(比如用`<|tool_call|>`标记开头),里面写明要调用哪个工具、传什么参数。这段代码能被程序直接读取执行,不是普通的聊天文字。

团队里有两个模型,一个6.6亿参数,代号600M,一个11亿参数,代号1B。按常理说,参数更多、训练数据更多、还专门花了60亿token做工具调用训练的1B模型,应该比600M强得多。可是在团队自己的自动评分系统上,两者的工具调用得分几乎一样,600M是0.660,1B是0.650,差距不到一个百分点。

研究者没有就此满意,反而觉得不对劲。因为他们私下试用的时候发现,600M真的会主动吐出格式工整的bash命令调用,而1B从来没被观察到生成过这种结构化输出,它只会写一些读起来挺像那么回事、但根本不是工具调用的散文。

**这就是这篇论文真正想讲的事:自动评分系统能把一个完全不会用工具的模型,打出和真正会用工具的模型几乎一样的分数。**

这事如果发生在你买的智能音箱上,相当于两款产品都在广告里说"支持语音控制家电",一款真的能帮你关灯,另一款听到"关灯"之后只会复述一句"好的,现在为您关灯",灯却一直亮着。如果不做实际测试,光看广告语打分,两款产品看起来毫无差别。

关键词评分为什么会出这种漏洞,是这篇论文第一个要拆解的地方。

关键词匹配评分: 一种自动打分方法,只要生成的文本里出现了预期的关键词(比如工具名字"bash_exec"),就算答对,不管这个词是不是出现在一句正经的调用代码里,还是出现在一段毫不相关的闲聊里。

判了死刑才算数:逐字复现测试

研究者没有继续相信那个自动评分系统,而是设计了一套便宜但狠的检验方法。核心思路很简单:拿模型自己训练数据里的真实例子,原封不动地喂给它,用贪婪解码(也就是每一步都选概率最高的词,不靠运气),看它到底能不能把训练时学过的那种工具调用格式吐出来。

贪婪解码: 让模型在每一步生成文字时,永远选择它认为概率最高的那个词,不做任何随机采样。这样测出来的是模型"最有把握"的输出,排除了运气成分。

结果是碾压级的。600M模型在6个测试样本上全部成功,吐出了格式完全正确的工具调用JSON,而且参数不是照抄训练数据,是换了个说法但同样合理的新命令,比如训练数据里写的是"tail -50查看日志",模型自己生成了一句用grep筛选错误信息的命令,针对当下的场景更合适。这说明它学到的是一种"模式",不是死记硬背。

1B模型呢,在4到6次反复测试里,所有检查过的版本,包括历史记录里那个"评分最高"的版本,全部是0次成功。它面对同样的提示,写出来的是一些语法通顺但和工具调用毫无关系的散文。

更扎心的是研究者还做了一个"第一个词"探针。他们直接读取模型在应该开始生成工具调用的那个位置,到底给`<|tool_call|>`这个特殊词打了多少概率。600M模型几乎是笃定地选它,1B模型给的概率是万分之一到十万分之一量级,等于说它压根没往这个方向想过。

这不是模型差了一点点没追上,这是它根本没有这个念头。打个比方,这就像让两个人去抓同一班公交车,一个人每天提前五分钟到站台候车,另一个人根本不知道这条线路有公交车经过,他不是跑慢了没赶上,是压根没往那个方向走。如果只看"有没有迟到"这个结果指标,可能两人某天都碰巧没赶上车,看起来差不多,但背后的原因完全是两回事。

为什么会这样:两种"养成方式"决定了默认行为

600M的训练方式很特别,单阶段,从头到尾只用一种数据配比,没有专门的指令微调阶段。它的训练数据实际跑下来,大概65%是代码和技术文本,只有不到0.1%是带格式的指令数据。

指令微调(SFT): 在模型完成海量文本的基础训练之后,再用一批"问题加标准答案"格式的数据对它进行针对性训练,让它学会按照人类期待的格式回应,比如聊天、执行指令等。

1B模型走的是完全不同的路线,多阶段训练,先是90亿token的基础预训练,然后是500亿token以网页和百科为主的课程,其中代码只占很小比例,接着才是专门的60亿token工具调用训练阶段。单看这个工具调用专项训练的体量,是600M那0.1%比例的近千倍。

按常理,1B应该赢。可实验结果偏偏是600M赢了,而且是碾压式的赢。

研究者把这个现象归因于"预训练阶段吃进去的数据性质"。600M虽然没有专门练工具调用,但它吃进去的代码数据里到处都是大括号、冒号、引号这种JSON格式的token,还有无数个"键必须配对、括号必须闭合"这样的结构约束。这些东西天然就和工具调用的格式长得很像。所以当那0.1%的指令数据出现时,模型要做的事情很轻松,只是把一个它早就很熟悉的"写法"和"聊天场景"对接起来。

而1B模型,它之后吃进去的几百亿token网页文本,几乎都是流畅的散文,很少出现结构化的符号序列。等到专门的工具调用训练开始时,模型要对抗的是几十亿token积累下来的"写文章"习惯,这件事要难得多。

这就像两个孩子学系鞋带,一个孩子从小玩乐高、搭积木,手指早就习惯了"这个凹槽配那个凸起"的精细操作,学系鞋带只是把这套手感迁移过去,一学就会。另一个孩子从小只是看电视,手指没练过这种精细配合,就算后来花更多时间专门练习系鞋带,效果可能还是不如前者。如果只看"谁花的时间多"去判断谁更该学会,就会得出错误的结论。时间不是唯一变量,之前积累的底子更关键。

轨迹追踪:不是没学会,是学会了又被冲掉了

研究者没有止步于比较两个模型的终点状态,他们把1B模型存档的38个训练检查点全部拿出来,重新跑了一遍探针,画出一条完整的曲线。

这一查,查出了一个意料之外的真相。

在1B模型训练到第二阶段的36000步时,它对工具调用那个词的概率是0.432,相当高了,而且在5个样本里成功生成了3个格式正确的调用。可是仅仅往后2000步,这个概率就暴跌到0.003,再往后掉到十万分之一到十亿分之一的量级,并且在剩下14万多步的训练里再也没有回升过。短短1.2万步之内,概率掉了将近六个数量级。

这意味着什么,1B模型不是从来没学会过工具调用,它是先学会了,然后被接下来铺天盖地的网页文本训练给冲刷掉了。研究者形容这是"erased",擦除,而不是"failed to build",没能建立起来。这两者的差别很大,前者说明能力一度存在过,只是被后续训练盖过去了。

这就像你小时候在沙滩上用力写下一个名字,海浪一波一波打过来,不是说这个名字从来没写上去过,是写上去之后被一遍遍冲刷,最后什么痕迹都不剩。如果有人只在退潮很久之后过来看,只会觉得这片沙滩上从来没人写过字。

更有意思的是,专门的工具调用训练阶段(也就是那60亿token的专项SFT)并没有把这个能力救回来。曲线显示这个阶段反而出现过一次剧烈的下跌,原因是当时项目组把工具数据在混合比例里的权重从20%调到了16%,给新数据腾地方。概率应声暴跌24倍,对应的自动评分B4也从0.075掉到0.020,两者在这一刻是同步的。后来权重恢复到20%,评分部分回升了,但概率探针始终没有真正回来,最终停留在比自己峰值低两个数量级的地方。

这还带出一个让人意外的发现:在1B模型历史记录里B4评分最高(0.085)的那个检查点,恰恰是概率探针测出来最低(5.7×10??)的时刻。评分系统觉得这是它工具调用能力最强的瞬间,而严格检验显示这正是它最不会调用工具的瞬间。两套尺子在同一时刻给出了完全相反的判断。

修复它只花了三千分之一的代价

既然已经诊断出1B模型缺的是"该怎么调用工具"的路由能力,而不是"工具调用这个词的含义"本身坏掉了,研究者就设计了一次有针对性的补救训练。

这次补救用的不是海量的工具专项数据,而是一个更"杂"的混合配方:对话类数据(OASST,一种开源对话数据集)加上原来的工具调用语料,再加上领域推理轨迹,学习率提高到原来的5倍,只训练了2202步,花了大概3.3个GPU小时,成本几美元。

结果立竿见影。逐字复现测试从0分跳到4/4,首词生成工具调用标记的概率从十万分之一跳到接近99.8%。更重要的是,在8个训练数据里从未出现过的全新提示上,修复后的模型在7个需要调用工具的场景里全部选对了工具,还正确提取了训练时从没见过的CVE编号、IP地址等新实体,并且在第8个纯聊天场景里正确地没有调用工具。

这一下子推翻了"失败是因为训练量不够"这个最直觉的猜测。原来那个失败的专项训练用了60亿token,而这次成功的补救只用了大约千万级别的token,差了三个数量级。换句话说,不是你喂得不够多,是你喂的方式不对。

这就好比一个孩子怎么都学不会骑自行车,家长的第一反应往往是"再多练几次",于是安排了一百次练习,结果还是不会。后来换了个教练,教练发现孩子不是练习次数不够,是一直在错误地用后轮刹车来保持平衡,方向完全错了。教练只花了十次正确方向的练习就教会了。如果家长继续迷信"量变产生质变",可能还要再安排一百次无效的练习。

修复发生在哪里:不是记忆被改写,是指路灯被点亮了

补救成功之后,研究者还追问了一个更深的问题:这次修复到底改动了模型内部的什么地方。

他们比较了修复前后的模型权重,专门盯着`<|tool_call|>`这个关键词本身的向量表示(也就是模型如何"理解"这个词)有没有变化。

结果是几乎没变。这个词的向量方向(用余弦相似度衡量)在训练前后相似度高达0.99999583,几乎是原地不动,甚至比随便挑20个普通词的平均变化幅度还要小。

词嵌入/向量表示: 模型把每个词转换成一串数字(向量),这串数字编码了这个词的"含义"在模型内部空间里的位置。两个向量越接近,说明模型认为这两个词含义越相似。

这个结果很反直觉。如果这个词的向量本身没怎么动,那修复到底改了什么?研究者进一步检查了模型中后段的注意力层,发现那里确实发生了明显变化。于是得出结论:这次修复没有重新定义"工具调用"这个词是什么意思,而是训练了网络在合适的场景下,把内部状态"导向"这个早已存在且位置正确的方向。

研究者打了个很贴切的说法,这是"路由",不是"表征"。

这里要插一句关于这个模型架构的细节。这类解码器把输入向量和输出向量"绑定"在一起用同一套参数,所以这个词的向量既是模型理解它的方式,也是模型最终要"瞄准"生成它时所用的目标方向。检查这个向量没怎么变,等于同时验证了两件事:理解没变,瞄准的靶子也没挪窝。

这就像一家餐厅想重新设计菜单上"今日特推"这道菜的呈现方式。顾客真正要的不是把菜的配方(向量本身)改掉,配方一直是对的,大厨水平也一直在线,问题是服务员从来没有想起来要把这道菜推荐给合适的客人。培训重点从来不该是重新教大厨做菜,而是教会服务员在什么时候、对什么样的客人,主动提起这道菜。

研究者还顺手解决了一个原本打算专门花钱做实验验证的问题。补救配方里本来设计了"解冻词向量层"这个步骤,想着让这个关键词的向量也能跟着训练微调。结果直接测量权重发现,97.7%的词向量表格在训练前后是位级别完全相同的。原因是这次用的学习率太小,单步更新的幅度比模型存储精度(bf16格式)的最小刻度还要小,根本没法在数值上留下痕迹。也就是说,这个"解冻"的设计从头到尾就是摆设,实际效果和冻结没有任何差别,但补救依然成功了。这个发现省下了一次专门的对照实验,因为测量本身已经把答案摆在了眼前。

两个模型其实都有一个共同的毛病:管不住嘴

故事讲到这里,好像600M是完胜方,但研究者接下来的检验给这个印象泼了一盆冷水。

他们专门设计了一批"不该调用工具"的测试提示,包括完全不相关的闲聊,以及那种提到了CVE编号或者shell命令、但问的其实是概念性问题而不是要求执行操作的"近似陷阱"场景。

结果两个模型在这上面都表现得很差。面对那些提到了漏洞编号或命令行关键词、但其实不需要调用工具的提问,600M只有8.7%的情况能正确地不调用工具,修复后的1B好一些,但也只有17.4%。换句话说,超过八成的情况下,只要句子里出现了看起来像工具触发词的东西,两个模型都会不假思索地按下调用按钮,不管用户到底想不想执行操作。

研究者用更大规模的轨迹探针验证了600M这个"管不住嘴"的毛病是从训练一开始就有的。在15个存档检查点里,600M对"不该调用"的那个测试样本给出的概率,和"该调用"的样本几乎一模一样,比值始终在1.0上下,而且在所有15个检查点上,它都对这个不该调用工具的测试生成了工具调用。这说明它的默认倾向是一种无条件的基础反应,不是一种根据上下文做出判断的能力。

这就像一个新来的客服接线员,被训练得张口就是标准话术,只要听到"订单"两个字就立刻开始念退换货流程,哪怕客户问的只是"你们公司几点下班"。他背熟了话术,却没学会先判断这句话到底是不是在提出诉求。

做了个对照实验,想分清到底是什么在起作用

既然补救配方里混进去了好几个变量(更丰富的语料、更高的学习率、不同的起始点、解冻词向量),研究者干脆做了一次正交实验,把语料丰富度和学习率这两个变量拆开单独测试。

结果显示,学习率高的时候,语料丰不丰富对结果几乎没有影响。学习率低的时候,丰富语料在"正确拒绝调用"这件事上确实表现更好,但当研究者用第二个随机种子重新跑了一遍同样的设置后,这个优势没能重现出来,反而是单纯的窄语料也表现出了类似的拒绝能力。于是这个"丰富语料更擅长说不"的结论,被作者自己降级成了"假设",而不是确凿的"发现"。

这种诚实很少见,但也恰恰说明了这篇论文想传达的核心态度:哪怕是自己精心设计的补救配方,也要用同样严苛的标准去反复检验,不能因为结果好看就不再深挖。

写在后面

读完这篇论文,最让我回味的不是那个修复动作本身,而是研究者发现"1B模型曾经学会过工具调用,后来又被冲掉"这件事。

这打破了我原本一个模糊的直觉,我一直以为模型训练是单向积累的过程,学会的东西大体上会留下来,顶多是被新知识覆盖得模糊一点。但这篇论文用探针曲线清清楚楚地画出了一次将近六个数量级的断崖式下跌,这比"覆盖变模糊"要剧烈得多,更接近于"彻底抹掉"。这提醒我,大规模预训练这件事本身是有风险的,不是数据越多越好,数据的顺序和比例搭配不对,反而可能把早期学到的东西冲没了。

还有一个细节值得单独说一说。研究者在论文里反复提到,自己在写作过程中又独立发现了另外三起"工具调用被自动化系统误判"的乌龙事件,分别出在评分脚本的解码环节、模型导出工具的标记分类环节、以及这篇论文自己设计的新评测脚本的打分逻辑里。这些都是同一类错误的不同变种,系统的某个环节把特殊标记当成了普通文字处理掉,导致明明正确的输出被判成了错误。这种"连写论文揭露某个问题的人,自己都要在写作过程中反复撞上同一个问题"的局面,比论文的任何结论都更有说服力地证明了这件事有多容易被忽视。

这也让我想起一件完全不相关的事。质检行业里有句老话,你以为自检表能发现所有问题,但真正危险的往往是那种"看起来通过了检验,实际上根本没检验到位"的情况,因为它让人彻底放松了警惕。这篇论文讲的本质上就是AI评测里的这种隐患,分数通过了,不代表能力真的在那里。

下次再看到任何一份AI模型的跑分榜单,你可能会多问一句:这个分数,到底测的是模型会做什么,还是模型会说什么?

Q&A

Q1:VectraYX-600M和VectraYX-1B为什么跑分一样但能力差这么多?

A:因为团队用的自动评分系统是关键词匹配打分,只要回复里出现了工具名字就算对,不管是不是真的生成了规范的工具调用代码。1B模型只是在文字里提到工具名称而从未真正调用,却照样拿到了和真正会调用工具的600M几乎一样的分数。

Q2:VectraYX-1B最后是怎么被修复的?

A:研究者没有继续堆训练数据量,而是换用更丰富的对话语料加上原有工具数据,把学习率提高到5倍,只训练了2202步、约3.3个GPU小时,成本几美元,就让模型逐字复现测试从0分跳到满分,并能在全新场景里正确选择工具和提取参数。

Q3:这次修复到底改变了模型内部的什么东西?

A:研究者测量发现,工具调用关键词本身的向量表示几乎没有变化,真正变化明显的是模型中后段的注意力层。说明修复不是重新定义了这个词的含义,而是训练模型学会了在合适场景下把内部状态导向这个本来就存在的正确方向。

分享至
0赞

好文章,需要你的鼓励

推荐文章
----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.- ----..---.-...-/--...-.-......./-...-....-..--../-............-.-