一、那一个被改掉的默认值
很多年前,在库比蒂诺,我盯着一张曲线看了整整一个下午。
推荐系统的一项指标在缓慢往下滑。不是断崖,是渗水——每天掉一点点,小到任何单日的看板都不会报警。两周后它累计掉了一大截,才有人开始紧张。
我们查了三天。模型没动,特征没改,流量没变。
最后在一段几乎没人会去读的预处理代码里,找到了原因:有人把一个字段的默认填充值,从"空"改成了"零"。改动者的本意,是让数据"更干净"。在他改的那一刻,这个改动是无害的——单元测试全绿,code review 一行注释通过。
但那个"零",会被下游的一个归一化步骤当成真实信号。它先污染了一小批样本,那批样本进入下一轮训练,模型学到一点点偏差;带着偏差的模型再去给上亿用户打分,打出的分被记录成新日志,新日志又喂回训练——
一个字段的默认值,转了三圈,变成了一道看不见的洪水。
韩非子写过这道洪水。两千多年前,他借老子的话说:
千丈长的大堤,会因一个蚂蚁洞而垮掉;百尺高的房子,会因烟囱缝里漏出的一点火星而烧成灰烬。
我那天下午盯着的,就是一个蚁穴。
二、误差的两种命运
要看懂蚁穴为什么可怕,得先把"误差"这个词拆开。
世上有两种误差,命运完全不同。
第一种是加法式的。你抄一串数字,抄错一位,错误就停在那里,是多少就是多少,不会自己长大。一个收银员算错一笔账,损失就是那一笔。这种误差有边界,它老老实实待在出生的地方。
第二种是乘法式的。它不待在原地,它会被一层一层往下乘。第一层放大十倍,第二层再放大十倍,第三层再放大十倍。蚁穴属于这一种——水不是从蚁穴里"漏"出来的,是蚁穴先变成小洞,小洞被冲成大口,大口让整段堤失去支撑,然后千丈之堤一起垮。
我给这个东西起个名字,叫复利型错误。
它和复利型财富,是同一个数学,只是符号相反。
人类的全部直觉,都是为加法式误差准备的。我们天然假设:小错误造成小损失,大错误才造成大损失,损失和原因成正比。这套直觉在手工时代基本够用——一个铁匠打歪一根钉子,最多废一根钉子。
但 AI 系统不是手工时代的产物。
它是一台把一切都连起来、一切都自动化、一切都喂回自己的复利机器。在这台机器里,错误和损失早就不成正比了。
一个小 bug 影响一个人,那是上一个时代的事。
现在,一个小偏差,影响一亿人。
三、规模是中性的——这只对了一半
人们爱说一句话:技术是中性的,规模是中性的,放大器本身不分好坏,看你放大什么。
听上去很有道理。
但这只对了一半。
规模确实不挑食——它放大对的,也放大错的,对善恶一视同仁。从这个角度说,它是中性的。
可再深一层,你会撞上一件不对称的事:在一个复杂系统里,"对"是合取,"错"是析取。
一座堤坝,要千万处同时完好才叫"成",要一处溃决就叫"败"。完好是"每一处都得对",溃决是"有一处错就够了"。建堤是加法,一锹一锹堆上去;溃堤是乘法,一个洞瞬间连锁。"成"要满足所有条件,"败"只需满足一个——这两件事,从一开始就不在同一个量级上较量。
所以当你把一个系统放大一万倍,你不是把它的好和坏对称地放大了一万倍。
你是在用一万倍的水压,去测试它身上每一个你没堵的洞。
规模不是中性的放大器。规模是一台专门寻找你最薄弱那一点的探测器。它会精准找到那个你以为无所谓的蚁穴,然后把整条堤的重量,压在那一个洞上。
智能越廉价,系统越敢往大里建。堤越高,那个没堵的蚁穴就越致命。
四、白圭之眼
那么,真正的功夫在哪里?
韩非子接着写了一个人。白圭,战国时治水的高手。他给出的答案,冷得近乎反直觉:
白圭巡堤的时候,专门去堵那些蚂蚁洞。
请注意这句话里的轻重。一条千丈之堤,宏伟、壮观、值得立碑。白圭走在上面,眼睛却不看那些宏伟处。他低着头,找洞。找那些小到所有人都觉得"不至于"的洞,一个一个塞掉。
这是一种反英雄的功夫。
它不性感。堵住一个蚁穴,堤不会因此高一寸,没有人会鼓掌,没有看板会变绿,季度汇报里写不进这一行。白圭一辈子最大的成就,是一连串"没有发生的灾难"——而没有发生的事,是没有人会感谢你的。
韩非子真正狠的地方,是他点破了时机。同一篇里他借老子说:
事情还安稳的时候,最容易把住;祸患还没显出征兆的时候,最容易谋划。
等堤溃了再去救,那不叫本事,那叫救灾。救灾是悲壮的、是上新闻的、是英雄登场的时刻——也是最贵、最晚、最没用的时刻。
治水的最高境界,发生在没有水的时候。
治 AI 系统的最高境界,发生在没有事故的时候。
可恰恰是"没有事故的时候",所有人都觉得不需要你。
五、我们为什么偏偏看不见蚁穴
到这里,你可能会说:那好办,多招几个白圭,让大家都低头找洞不就行了。
这正是法家最不信的一句话。
韩非子从不相信"人会自觉做对的事"。他只相信一件事:人会朝着激励走。一群人看不看得见蚁穴,不取决于他们的眼睛,取决于堵洞这件事在制度里值多少钱。
把激励摆出来看,蚁穴的命运就清楚了。
堵一个蚁穴,没有奖励,没有人看见,做对了等于什么都没发生。
救一次溃堤,有奖金,有掌声,有"力挽狂澜"的故事,做错在前的人甚至能靠救火封神。
于是整个组织的激励是反着的——它奖励救火的人,惩罚防火的人;或者更准确地说,它让防火的人隐形。一个天天在堵蚁穴的工程师,在绩效系统里看起来像个什么都没产出的人;一个让系统着了大火又冲进去扑灭的人,看起来像英雄。
这就是为什么蚁穴永远堵不完。
不是因为没人看见它,是因为看见它、堵掉它的人,得不到任何东西。人性不会为"没有发生的灾难"买单。
韩非子的解法,从来不是劝人高尚。他不信这个。
他信的是:把堵蚁穴这件事,从个人的美德,变成制度的强制。
让巡堤不依赖白圭今天心情好不好;让填默认值这种改动,必须经过一道任何人都绕不过去的关;让"治于未乱"不是某个有良心的工程师的额外付出,而是系统本身不堵就跑不起来的硬约束。
法家两千年前就想明白了:靠人自觉去堵蚁穴,蚁穴必溃;靠制度逼着堵,才有千丈之堤。
六、把功夫下在乱之前
所以,一套成熟的 AI 系统,和一套危险的 AI 系统,差别不在模型多大、参数多少、跑分多高。
差别在于:它有没有一双白圭的眼睛——以及,这双眼睛是长在某个人身上,还是长在制度里。
危险的系统,把全部精力押在"建得更高"上。它的堤一天比一天宏伟,它的洞一天比一天多,它赌的是那些洞永远不被同时压上水压。它没有人去巡堤,因为巡堤不出业绩。它要等到溃堤那天,才第一次认真看自己的地基。
成熟的系统,把一部分精力,永久地、制度化地,押在"找洞"上。它假设自己一定有蚁穴——不是怀疑,是确信。它不问"会不会出错",它问"下一个洞在哪里,谁负责今天就把它塞上"。
天下的难事,一定从容易的时候做起;天下的大事,一定从细微处做起。
放大一切的时代,最该被放大的,恰恰是对"细"的敬畏。
因为你已经造不出小系统了。你造的每一样东西,一出生就连着千万人、连着自己的反馈回路、连着复利的乘号。在这样的体量里,你没有"小错误"这种东西可以犯。
每一个错误,出生时都是小的。
它只是还没长大而已。
七
千丈之堤,不溃于洪水,溃于你没去堵的那个洞。
建堤是加法,溃堤是乘法;可叹的是,人只记得加法的功劳,付的却永远是乘法的代价。
真正的高手,不在溃堤那天冲进洪水里;他在无风无浪的午后,低着头,沿着堤,一个一个,塞住那些谁都觉得不至于的小孔。
当智能免费,建堤的人遍地都是;肯弯下腰去找蚁穴的人,最贵。