这两年用大模型,最直观的感受就是token越来越不经花了。调一次远程的模型,看起来没多少,可智能体这种东西一天要跑几十上百次,每一次都在烧 token,攒起来是一笔不小的开销。而且远程模型要联网,网络一抖它就卡,服务一波动整个系统就跟着掉链子。更麻烦的是数据。很多企业的数据是命根子,工艺、设备、订单,全在里面。把数据交到云端去算,等于把身家交出去,谁敢?所以我想训个本地的小模型,让它接管那些"不需要重型推理"的活。比如判断一个任务该不该做、把一段日志压缩成要点、决定调用哪个工具、把输出整理成固定格式。这些事本地模型干得又快又稳,不用联网,数据也留在自己机器上。省token,稳定,数据不出厂,算清了这笔账,这条路值得走。可真正训起来,远没有我想的这么顺。五轮训练,每一轮都在撞墙。而每一堵墙,撞到最后,都指向同一个根源,数据。数据长什么样,模型就是什么样。这句话,是我一遍一遍撞出来的。 PART 01先从一坨阀门数据说起 在做智能体模型之前,我先做过一个阀门模型。这里说的阀门,是工业管道上那种控制流体通断的阀门,石油化工、水处理这些厂里到处都是。阀门这块的数据,网上几乎没有现成的,得自己造。我从工业语料里一点点筛,再清洗、整理,凑出了9227条。这个数量,够一个垂类模型学了吧?可一查质量,问题全在你看不见的地方。近重复占了17%,什么叫近重复?就是同一批内容,换个说法又出现一遍。比如"如何保养阀门"和"阀门怎么保养",意思一样,写法不同,模型会当成两条数据。这样的重复多了,等于模型在翻来覆去学同一张卷子。还有答案重复12.6%,考来考去答案就那几句。最要命的是一批振动诊断模板,1131条,同一句话只改个数字。比如"振动频率0.5Hz是正常""振动频率0.6Hz是正常",就是数值不一样,句子结构一模一样。模型一看,哦,原来答案是这样套出来的,它记住的就不是"怎么判断故障",而是"遇到这种句式就这么答"。换个问法,它就懵了。另外还有512条数据是离域污染,就是说供应链本体的问答混进了阀门集里,根本不搭界。模型把不相干的东西也学进去了。这几样加起来,就把"数据多"的体面撕得干干净净。数据看着多,其实真正有营养的没多少,还掺了一堆杂质。清洗是一场硬仗。我用 MinHash 这种算法把近重复的1148条去重干掉了,回答过短的1256条剔掉,1131条振动模板砍到150条,512条离域污染全删。别小看这一刀。清洗完,数据质量分从90.3爬到了96.8,多样性从58.9提到了67.1。什么叫多样性分?就是数据里有多少种不同的问法和答案。分越高,模型见过的花样越多,越不容易死记硬背。这一刀下去我彻底明白一件事,数据集不是越多越好,是越干净越均衡越好。一坨只有一套模板的九千条,不如一个干净均衡的八千条。这套教训,后来做智能体模型,每一轮都用上了。PART 02先摸清这个4B小模型能干什么 开始做智能体模型,我没急着训。第一步,是先搞清楚这个4B的小模型,到底天生会什么、不会什么。我建了一个能力评测集。什么叫评测集?就是一组测试题,专门用来检验模型干得好不好。我手写了这套题,覆盖七个维度,决策、压缩、代码审查、安全审查、测试、格式、工具调用。每个维度若干条。这里有个关键点,评测集要独立于训练集。训练集是教模型的课本,评测集是考它的试卷。如果试卷上的题课本里都有,那考出来的高分没意义,那是背题不是会做题。所以我一开始就让两者分开。用这套题测了一遍基座(也就是还没训练的原版模型),短板全暴露了。代码审查只有57%,安全审查52%,测试73%,都及格线附近晃。倒是压缩、格式、工具调用这三样先天就强,不用怎么操心。这让我心里有了底,该往哪儿使劲,往哪几个维度补数据,都清楚了。 PART 03第一轮:平均喂,喂废了 第一次训练,我想得挺简单。既然七个维度都要会,那我就不偏不倚,把这4800条数据平均喂进去,让模型每个维度都学一点。结果呢?代码审查还是57%,一点没涨。我一开始没想明白。数据也喂了,模型也训了,怎么不涨呢?后来才懂,平均喂是个坑。你想,一个模型同时学七件事,数据平均分配,等于每件事都只学到一点点。原来就弱的短板,比如代码审查,你分给它的数据比例没变,它还是弱;原来就强的强项,被七个维度分薄了,反而被拖弱。结果就是强的被拖弱,弱的没补强,全在中间晃。第一次撞墙,我记住一件事,数据不能平均喂,要按维度配比。模型想干好几件事,数据就得按每件事的重要程度分好分量,不能一锅烩。 PART 04第二轮:补了短板,又踩了二次微调的坑 第二轮,我改了打法。把数据拆开,按维度针对性补。决策是核心,复用原有的不稀释。压缩从255条扩到759条,关键是换了真实的要点提取,不再用那种截断回声的假样本。什么叫假样本?就是输入很长,输出直接把开头几句截断当"要点",模型学不到怎么提炼,只学会抄。换成真实日志的要点提取后,才算真的教它压缩。代码审查、安全审查也各补到90多条,用的都是真实的缺陷和漏洞,不是编的。这一轮,决策和压缩能用了。但我犯了一个更大的错。我在上一版模型的基础上做了二次微调。什么叫二次微调?就是已经训好的模型,再拿新数据继续训一遍,让它学更多。结果决策从60掉到了45,不升反降。这叫灾难性遗忘。模型学新东西的时候,把之前会的东西给覆盖掉了,就像新背了今天的单词,却把昨天的忘了。新数据和老数据分布不一样,学新的就会冲掉旧的。第二次撞墙,撞得最狠。我明白了一个铁律,二次微调必回退,要么从基座全量重训,把所有新老数据一起喂,要么就别动。PART 05第三轮:全量重训,但模板化又冒出来了 第三轮,我从基座重新训,把所有新老数据放一起,不再叠加。这轮先修了一堆数据缺陷,404处,五类。有的数据标错了类别,有的答案捏造了内容,有的是旧的格式没跟上,零零碎碎修了一大堆。再按维度配比,决策重配到40%。可一查质量,又发现一个更大的问题。6002条数据里,约66%是模板。模板化是什么意思?就是数据看着不一样,其实都是同一个骨架套出来的。比如一百条数据,都是"针对XX问题,请给出处理步骤",只是把XX换掉,答案结构一模一样。模型学到的不是理解任务,是背模板、抄格式。平时看着好像会,一换真实输入就露馅。这不行,于是我找了一批真实的存量数据,把模板样本一个一个换掉。1372条全部是真实跑出来的,不是造的。替换完,模板率从66.7%降到45.4%,代码相关的四个维度模板清零了。 PART 06第四轮:补量补到质量崩了 第四轮,我想着数据量不够,短板维度得多补点。压缩、测试、工具这三个维度,评测里表现不行,就针对性地补样本。补着补着,补到了12359条,数据量一下子翻倍。可一精简,发现大量重复。精确重复的行,去重就干掉了1949条,全是拷贝膨胀出来的。精简到9656条,后面一查质量,再次暴露两个严重问题。一个是模板化残留,全库还有38.3%,没清干净。更严重的是标签冲突,700条级别。什么叫标签冲突?同一段代码,有的样本标成"严重"(critical),有的标成"中等"(medium),还有的标成"高"(high),三种严重度互相打架,还配着互相矛盾的修复建议。模型学这个,等于同时学了三套自相矛盾的答案,你说它能不乱吗。这轮教会我一件事,数据质量审查必须反复做。不能以为凑够数量、跑通训练就算完事。模板化、标签冲突,这些全是藏在底下的坑,你不主动挖,它就在那儿,等你训完才发现模型不对劲。于是又接着修。标签冲突归一,模板化修复。模板化的根因也找到了,是一个变量声明了没用,导致同一批数据全落进同一个骨架。修好后,test的模板化从77.2%直接干到0%,全库从36.7%降到14.9%。最后落盘opt6,9057条,100%JSON合法,0泄漏。 PART 07第五轮:真实数据起决定性作用 第五轮,是最关键的一轮。这一轮,我不再用造的数据,而是采集真实数据。真实采集了本地1088条样本,是hermes和CodeAgent这两个智能体真实跑出来的工具调用。什么意思?就是它们真的去执行任务、真的调用了工具,把这些真实的操作记录下来。不是模板造的,不是编的,是真真正正干过的事。加上历史9057条保留,融合成10076条。从基座全量重训。结果,在这套口径一致的智能体评测集上,这个4B的小模型,整体语义正确率83%,反超了ornith这个9B模型的81%。决策85%对65%,工具调用100%对70%,大幅领先。4B打赢了9B。参数少一半还多,但在这个特定的任务上,它赢了。但我得诚实说清楚,这是垂直任务上的反超,不是全面超越。评测集口径一致,任务聚焦在智能体能力上,不是比谁什么都懂。在通用能力上,4B小模型还是不如9B大模型。可这个反差,恰恰说明数据的力量。只要数据对路,小模型也能在特定任务上打赢大模型。真实数据是决定性的一环,因为模板只教会模型格式,真实数据才教会模型判断。它见过真的该不该调工具、这个情况该怎么决策,才学会判断,而不是只会照着格式填。 PART 08唯一没补上的:测试维度,和一个最隐蔽的坑 五个维度都补起来了,唯独测试维度只有30%,ornith是50%,这是唯一明显落后的。我挖了半天,才发现不是能力弱,是命名格式没对齐。什么叫命名格式?就是给测试起的名字。模型选的是testUserServiceauthenticate,评测答案要的是test_authenticate。一个是带模块前缀的完整名,一个是不带前缀的简写。两个名字其实指的是同一个测试,但格式不一样,判分器一看对不上,就判错。模型其实会选测试,选得还挺准,就是命名格式对不上评测的口径,全被判成错的。这里我要说清楚一个立场。训练集和评测集输出格式不一致,让模型会但判错,这个坑我踩了。但它不是我最担心的。因为我要的不是在评测集上考高分,而是一个真正能替代本地模型的模型,在真实场景里扛住。评测只是手段,不是目的。一个模型哪怕评测满分,真上了生产环境一塌糊涂,那也没用。所以下一步,我不打算纠结评测分数。我要继续补真实数据,用真实数据替代过去那些蒸馏数据和模板数据,构建一个高质量的混合数据集,让模型在真实任务上越来越强。数据决定模型的结论,我会一直用下去。PART 09数据长什么样,模型就是什么样 五轮弯路,每一轮都在给这句话添一笔注脚。