第四十四章 61%的墙
陈一鸣把第七个开源模型跑完,屏幕上跳出的数字是62.3%。
比昨天的61.8%高了零点五个百分点。
他盯着这个数字看了三秒钟,然后把浏览器标签页一个一个关掉。Hugging Face、GitHub、arXiv论文库、模型排行榜。过去一周,他把市面上能找到的所有开源NLP模型都试了一遍。BERT、RoBERTa、DeBERTa、各种微调版本、各种prompt工程技巧。最好的结果是67%,用的是一个专门针对中文口语的模型,在测试集上跑出来的。
67%。
离他们设定的80%目标线,差了十三个百分点。
十三个百分点听起来不多,但在自然语言处理领域,这十三个百分点可能需要十倍的算力、百倍的数据、或者一个全新的算法突破。他们三个都没有。
林知行坐在对面,盯着自己的屏幕。他用排课系统的解释层架构写了一版方案,准确率54%。比陈一鸣的版本低了七个百分点。他知道自己不擅长NLP,但没想到差距这么大。
"要不,换方向?"方小满从上铺探头。
陈一鸣没回头:"换什么方向?"
"不做NLP了。做图像识别,做推荐系统,做别的。"
"那些方向更卷。"陈一鸣说,"而且我们没有数据积累。"
方小满缩回去了。
宿舍里安静下来,只有键盘敲击声和服务器风扇的嗡嗡声。陈一鸣的笔记本接了外接显示器,屏幕上是密密麻麻的代码和训练日志。他已经连续三天凌晨两点以后睡觉了。
林知行站起来,走到白板前。
白板上还写着"不是更聪明,是更可用"那七个字。他拿起马克笔,在下面画了一条线,左边写"老板说的话",右边写"AI能听懂的话"。
线的中间是空白的。
这个空白,就是他们卡住的地方。
第二天下午,陈一鸣在群里发了一条消息。
"我试了最新的Chinese-BERT-wwm-ext,加了数据增强,准确率到67.2%。"
方小满回:涨了?
陈一鸣:涨了零点二个百分点。
群里安静了。
林知行看着这条消息,心里算了一笔账。67.2%,离80%还有12.8%。按这个速度涨,他们需要六十四次迭代。每次迭代需要调参、训练、测试,至少一天。六十四天,两个月。
比赛提交截止还有三周。
数学不会骗人。
他打字:我试了一版,54%。
陈一鸣回:看到了。
林知行:我试了三种prompt设计,两种few-shot策略,都不行。
陈一鸣:你不是NLP方向的。
林知行:我知道。但我想看看瓶颈到底在哪。
陈一鸣没回复。
过了大概五分钟,他发了一段很长的技术分析:"瓶颈在语义理解。商户的口语表达太随意了,同一种意思有几十种说法。'天热了珍珠卖得好'和'最近珍珠销量上升'和'珍珠最近卖得不错',对人类来说意思一样,对AI来说是三个不同的句子。模型需要学习所有这些变体,但我们的训练数据只有几百条,覆盖不了。"
林知行看着这段话,心里沉了一下。
数据不够。这是最致命的问题。大厂可以用百万级数据训练模型,他们只有几百条商户原话。质量再高,数量不够,模型学不到足够的模式。
方小满的消息来了:那我们多找点数据?
陈一鸣:找多少?一千条?一万条?你知道训练一个像样的NLP模型需要多少数据吗?
方小满:多少?
陈一鸣:至少十万条标注数据,才有可能达到80%的准确率。我们现在有多少?
苏雨晴在群里回:四百二十七条。
陈一鸣:四百二十七条。十万条。差了两百多倍。
群里彻底安静了。
林知行看着屏幕,手指悬在键盘上,不知道该说什么。他知道陈一鸣说的是事实。数据量是硬伤,不是靠优化算法能弥补的。
他想起沈渡说的第三版架构:大模型前端理解+规则引擎后端约束+解释层串联。那个架构的前提是前端理解能达到80%以上的准确率。如果达不到,后面的所有设计都是空中楼阁。
他关掉电脑,走到阳台。
天快黑了,路灯还没亮。楼下有几个学生在打篮球,笑声传上来,听不清楚。
他点了一根烟。
第三天,林知行自己写了一版方案。
他没有用复杂的模型,而是用了一个笨办法:把商户的常见表达做成一个规则库,用关键词匹配加模糊匹配做第一层筛选,再用小模型做第二层修正。
准确率:58%。
比陈一鸣的版本低了九个百分点。
他盯着屏幕,把代码从头到尾看了一遍,找不到可以优化的地方。规则库已经覆盖了最常见的表达,模糊匹配的阈值调了十几遍,小模型的训练数据就是那四百二十七条。
他把代码删了。
不是因为不行,是因为他知道这条路走不通。规则库需要人工维护,每增加一种表达就要加一条规则。商户的语言是活的,规则库是死的。用死的东西追活的东西,复杂度是O(n²),永远追不上。
他站起来,走到陈一鸣旁边。
陈一鸣在跑第八个模型。屏幕上是训练日志,loss曲线在下降,但下降的速度越来越慢。
"怎么样?"林知行问。
"还在跑。"陈一鸣没回头,"这个模型用了对比学习,理论上应该比之前的好。"
"理论上。"
陈一鸣听出他语气里的东西,转过头:"你也试了?"
"58%。"
"比我低。"
"比你低。"
两人对视了一眼,都没说话。
这是他们第一次面对同一个问题都无解。以前都是陈一鸣卡住,林知行能找到方向;或者林知行卡住,陈一鸣能给技术建议。现在两个人都卡住了。
苏雨晴从门口进来,手里拎着一个塑料袋。
"给你们带了饭。"她把袋子放在桌上,"食堂的,将就吃。"
林知行看了一眼,是两份盒饭。他和陈一鸣都没动。
"怎么了?"苏雨晴问。
"没怎么。"林知行说,"卡住了。"
"卡在哪了?"
"准确率。"陈一鸣说,"67%。上不去了。"
苏雨晴走到白板前,看着那条线。左边是"老板说的话",右边是"AI能听懂的话",中间是空白。
她看了一会儿,忽然说:"为什么一定要让AI完全理解老板的话?"
林知行和陈一鸣同时转头。
苏雨晴指着白板:"老板说'天热了珍珠卖得好得多备点但别太多怕放坏了',这句话里有三层意思:1.珍珠库存要加;2.但不能加太多;3.要考虑保质期。我们之前想的是让AI把这句话完整地理解成三条结构化指令。但如果AI理解不了呢?"
她拿起马克笔,在线的中间画了一个框。
"如果老板不需要打字呢?如果他只需要选呢?"
陈一鸣皱眉:"选什么?"
"选意思。"苏雨晴说,"比如,系统问:'您是想调整库存吗?'老板点'是'。然后系统问:'您想增加还是减少?'老板点'增加'。然后系统问:'增加多少?'给出几个选项:10%、20%、30%、自定义。老板选30%。然后系统问:'有没有上限?'老板点'有',输入一个数字。然后系统问:'需要考虑保质期吗?'老板点'需要',选择保质期天数。"
她放下马克笔。
"这样,老板不需要说一句完整的话,只需要回答几个问题。每个问题都是用老板的语言写的,不是技术术语。但最终的结果,是结构化的指令。"
林知行愣住了。
陈一鸣也愣住了。
这个思路不是技术突破,是产品设计突破。它绕过了NLP的瓶颈,把问题从"让AI理解人话"变成"让人话变成AI能处理的半结构化输入"。
"等等。"陈一鸣站起来,走到白板前,"你是说,不做自然语言理解了?"
"不是不做。"苏雨晴说,"是换一种方式。AI不需要完全理解老板的话,只需要理解老板选了什么。选择是结构化的,AI处理结构化数据的能力比处理自然语言强得多。"
陈一鸣盯着白板,眼神变了。
林知行看出他在想什么。陈一鸣不是那种会被轻易说服的人,但苏雨晴的思路戳中了他最在意的那个点——可行性。半结构化输入不需要NLP模型达到80%准确率,只需要设计一套合理的选择逻辑。
"这个能做。"陈一鸣说。
林知行点头:"能做。"
"而且不难做。"陈一鸣继续说,"本质上就是一个问卷系统,但问卷的选项是用商户的语言写的。技术上,前端用React或者Vue做交互,后端用规则引擎处理选择结果,根本不需要训练模型。"
苏雨晴说:"我整理的那四百二十七条商户原话,可以用来设计问题和选项。"
林知行看着她,忽然明白了什么叫"用户视角"。
他和陈一鸣想的都是怎么让AI更聪明,苏雨晴想的是怎么让商户更省事。这两条路,终点不同。
"你什么时候想到这个的?"林知行问。
苏雨晴想了想:"昨天在水果店。"
"水果店?"
"我去帮王老板录数据。他说了一句话,我记下来了。他说:'你这个AI好是好,但我不会说那些文绉绉的话。你能不能直接问我?'"
她从口袋里掏出手机,翻出一条录音。
林知行和陈一鸣凑过去听。
录音里是一个中年男人的声音,有点沙哑:"小苏啊,你这个东西我看不懂。你就问我,你想进什么货,想进多少,我告诉你不就行了?干嘛要我说那么一大段?"
苏雨晴关掉录音:"我当时没想明白。昨天晚上躺在床上,忽然想明白了。"
"想明白什么?"
"他不想学习怎么跟AI说话。他只想用最简单的方式把事情办了。"
林知行和陈一鸣对视了一眼。
这句话,和姜意说的"不是更聪明,是更可用",是一回事。
晚上十一点,林知行在群里发了一条消息。
"各位,说个情况。准确率瓶颈突破不了,67%是天花板。我试了自己的方案,54%。陈一鸣试了八个模型,67%。数据量不够,短期内不可能提升。"
方小满回:那怎么办?
林知行:苏雨晴提了一个思路。不做NLP了,改做半结构化输入。商户不需要打字描述需求,只需要回答几个问题,每个问题用商户的语言写。技术上不需要训练模型,只需要设计一套选择逻辑。
陈一鸣回:我评估了一下,可行。而且开发周期短,一周内能出原型。
方小满:所以呢?你们决定了?
林知行:决定了。从明天开始,做半结构化输入。
方小满:行。那我能干嘛?
林知行想了想:你去问问那些商户,如果有一个工具,问他们几个问题就能帮他们管库存、算账、排班,他们愿不愿意用。
方小满:好。
苏雨晴在群里发了一条消息:我可以设计问题和选项。用我整理的那四百二十七条数据做基础。
林知行:好。
陈一鸣:我今晚就开始写代码。
林知行:别熬夜。
陈一鸣:你管我。
林知行没再说话。他关掉手机,躺在床上,盯着天花板。
方小满的呼噜声从上铺传来。林知行翻了个身,忽然觉得心里松了一块。
不是因为问题解决了,是因为方向变了。
他们之前一直在撞墙,撞的是NLP的墙。现在他们绕过去了,从旁边开了一扇门。
门后面是什么,他不知道。但至少,他们不用再撞了。
凌晨两点,林知行被手机震醒。
他迷迷糊糊摸到手机,看到群里有新消息。
陈一鸣发了一个链接,附了一句话:"原型,v0.1。"
林知行点开链接。
是一个简陋的网页,白色的背景,黑色的文字。顶部写着:"商户助手-测试版"。
下面是一个对话框,里面有一行字:"您好,我是您的AI助手。请问您想做什么?"
下面有四个按钮:库存管理、定价参考、排班建议、营销文案。
林知行点了"库存管理"。
页面跳转,出现一个新的对话框:"您想调整哪种商品的库存?"
下面有一个输入框,旁边写着:"请输入商品名称,或从常用列表中选择。"
常用列表里有:珍珠、椰果、布丁、仙草、芒果、西瓜。
林知行点了"珍珠"。
下一个问题:"您想增加还是减少库存?"
两个按钮:增加、减少。
林知行点了"增加"。
下一个问题:"您想增加多少?"
四个按钮:10%、20%、30%、自定义。
林知行点了"30%"。
下一个问题:"有没有上限?比如,不能超过当日销量的多少倍?"
两个按钮:没有上限、有上限。
林知行点了"有上限",输入"1.5"。
下一个问题:"需要考虑保质期吗?"
两个按钮:需要、不需要。
林知行点了"需要",输入"3天"。
页面跳转,出现一个总结:
"您已完成库存调整设置:
- 商品:珍珠
- 操作:增加30%
- 上限:不超过当日销量的1.5倍
- 保质期约束:3天
是否确认?"
下面两个按钮:确认、返回修改。
林知行点了"确认"。
页面跳转,出现一行字:"已生成指令。正在同步到系统……"
然后是一个loading动画。
林知行盯着屏幕,心跳加速。
这不是什么复杂的技术,只是一个问卷系统。但它做到了一件事:让一个不懂技术的商户,用最简单的方式,把需求转化成了结构化指令。
他想起苏雨晴放的那段录音:"你能不能直接问我?"
现在,系统直接问了。
他退出测试页面,回到群里。
陈一鸣发了一条消息:"跑通了。准确率100%。"
林知行看着这条消息,忽然笑了。
准确率100%。因为他们绕过了NLP,直接用选择代替理解。选择是结构化的,不存在歧义,不存在理解偏差。
这不是技术突破,是思路突破。
他打字:你没睡?
陈一鸣:睡什么?代码写完了再说。
林知行:……
陈一鸣:别省略号了。测试一下,有没有bug。
林知行又走了一遍流程,从库存管理到定价参考到排班建议,每个功能都跑了一遍。
没有bug。
他回:没bug。
陈一鸣:好。我去睡了。
然后他的头像暗了。
林知行看着屏幕,心里有一种奇怪的感觉。
不是兴奋,是一种平静的踏实感。就像走迷宫走了很久,忽然发现旁边有一条小路。小路通向哪里不知道,但至少不用再撞墙了。
他把测试页面的截图发到群里,附了一句话:"陈一鸣做的。半结构化输入原型,v0.1。"
方小满秒回:啥?这么快?
林知行:他没睡。
方小满:……
苏雨晴发了一条消息:我看了。问题和选项的设计需要优化,有些表述不够口语化。
林知行:你来改。
苏雨晴:好。
方小满:所以,这东西能用?
林知行:能用。
方小满:那比赛呢?
林知行想了想,打字:方向变了。我们不做NLP了,做半结构化输入。技术门槛低,但用户体验好。评委怎么看,不知道。但这是我们唯一能走通的路。
方小满:行。那我明天去问商户。
林知行:好。
他关掉手机,躺在床上,盯着天花板。
窗外有点亮了。天快亮了。
他想起42章陈一鸣发的那个61%的代码,想起43章看到赵鸣岐的帖子时的绝望,想起苏雨晴在水果店录的那段话。
这些东西串在一起,像一条线。
线的这头是技术瓶颈,线的那头是产品设计。
他们绕过去了。
不是因为技术更强了,是因为思路变了。
林知行闭上眼睛,这一次,他睡着了。
(本章完)