修正值
一、悬浮的数字
苏晚第一次看见数字,是在七岁那年。
那年冬天她发了三天高烧,烧到四十一度,母亲抱着她跑过三条街才拦到出租车。医院的走廊很长,日光灯管嗡嗡作响,她迷迷糊糊地看见每个护士头顶都飘着一串数字——有的鲜红,有的淡蓝,有的像烟一样快要消散。
“妈妈,那些人头上为什么有数字?”
母亲以为她在说胡话,用湿毛巾擦了擦她的额头。
退烧之后,数字没有消失。
它们变得像呼吸一样自然。每个人身边都漂浮着数字,有的紧贴皮肤,有的飘在头顶三十厘米的位置。小时候她以为所有人都看得见,直到有一天在课堂上,她指着一个新来的数学老师说”老师你头上有个872”,被罚站了一整节课。
她很快学会了闭嘴。
到三十岁的时候,苏晚已经完全习惯了这个能力,就像有些人能闻出雨前的臭氧,有些人能看见紫外线下的荧光——一种无用的、安静的、只属于她自己的感官。她从不跟任何人提起,也从没利用它做过任何事。
因为她发现了一个规律:那些数字不是信用评分,不是智商,不是寿命。它们和任何她能想到的指标都不相关。有些看起来很健康的人头顶的数字很低,有些明显在挣扎的人数字反而很高。它们不按常理出牌,像一种她永远无法破译的语言。
所以她忽略它们。
就像忽略一个反复出现的梦——承认它的存在,但不赋予它意义。
直到2026年3月,她入职天衡金科风险模型部的第三年,那个数字——那个修正值——出现在她的屏幕上。
二、天衡
天衡金科全称”天衡数字金融科技有限公司”,注册在杭州,运营中心在深圳南山区,是过去三年中国增长最快的互联网银行之一。它不设线下网点,没有柜员,甚至没有传统意义上的客户经理。一切都通过App完成——开户、贷款、投资、保险、甚至遗产规划。
苏晚的部门叫”风险引擎组”,负责维护天衡的核心风控模型,代号”天平”。
天平模型是一个多层神经网络,输入超过一千二百个特征变量,从用户的交易记录、社交行为、地理位置、消费习惯到手机型号、充电频率、甚至是打字速度——所有能采集到的数据都会被送进天平,最终输出一个零到一之间的风险概率。
这个概率决定了一切:你能贷多少钱,利率多少,能不能分期,要不要提前催收。天平每个月处理超过三亿次请求,每个请求的响应时间不超过五十毫秒。
它是天衡的心脏。
苏晚的工作是天平的”医生”——当模型表现出现漂移,她需要找到原因并修正。大多数时候原因很简单:某个数据源出了问题,或者季节性变化没有被捕捉到,又或者竞争对手搞了个促销导致用户行为短期波动。
但这一次不一样。
三月初的一次例行模型监控中,苏晚发现天平的预测准确率在过去六周里持续下降了零点三个百分点。零点三个百分点听起来不多,但放在三亿次请求的基数上,意味着每天多出大约九万次错误判断——其中一部分可能是把好人判成了坏人,拒掉了本该获批的贷款;另一部分可能是把坏人放过了,让本该被拦截的高风险用户拿到了钱。
她拉了一张详细的分析表,逐层拆解模型的输出,发现了一个异常:模型在”低信用、低收入”人群中的表现几乎没有变化,在”高信用、高收入”人群中也正常,但在一个特定的中间区间——月收入八千到一万五、信用评分六百到七百分的城市工薪阶层——出现了明显的预测偏差。
这些人的实际违约率比模型预测的要低。
不是高,是低。
这意味着天平在系统性地高估这个群体的风险,导致他们中的很多人被拒贷或被给了更高的利率。从商业角度说,这意味着天衡正在流失一批其实相当优质的客户。
苏晚写了一份报告,提交给了她的直属上司陆衡。
陆衡四十五岁,北大数学系本科,MIT统计学博士,在华尔街做了十年量化,2019年回国加入天衡。他是那种看起来永远冷静的人——说话慢,走路慢,甚至连眨眼的频率都比正常人低。苏晚有时候觉得他就像一个人类版的统计模型,把所有的情绪波动都平滑掉了。
“修正值?“陆衡看着报告里的数据,抬起眉毛。
“对。模型在这个区间的系统性偏差,从六周前开始,每天恶化大约零点零一个百分点。我排查了所有数据源和特征工程流程,没有发现异常。”
“那你怀疑什么?”
苏晚犹豫了一下。“我怀疑是模型架构本身的问题。天平在训练的时候用了一个全局修正参数——epsilon值——来校准预测概率和实际概率之间的偏差。这个值在过去两年里一直很稳定,但现在它好像不够用了。”
“不够用是什么意思?”
“意思是,实际数据的分布正在偏离模型的假设,而epsilon值没有跟上。”
陆衡沉默了一会儿,把报告放到桌上。“调整epsilon值。”
“调多少?”
“你来算。”
苏晚回到工位,开始重新计算最优的epsilon值。这是标准的统计校准操作——用历史数据拟合一个修正参数,让模型的预测概率和实际概率重新对齐。
但她算出来的结果让她愣住了。
最优epsilon值应该是零点零二三七。但天平当前使用的epsilon值是零点零二五一。
差异是零点零零一四。
这个差异小到几乎可以忽略,但它恰好能解释那零点三个百分点的准确率下降。更奇怪的是,天平使用的这个epsilon值不是最近的——它来自模型上一次全量训练,那是在十四个月前。
换句话说,十四个月来,这个修正值一直有效,直到六周前突然开始失效。
是什么在六周前发生了变化?
苏晚决定深挖epsilon值的来源。
三、零号
天平模型的训练数据来自天衡的用户行为数据库,包含超过八千万活跃用户的脱敏数据。epsilon值是在训练最后阶段通过贝叶斯优化自动确定的——理论上,它反映了训练数据集的某种全局特性。
但苏晚在代码中发现了一段被注释掉的文档,来自最初编写天平架构的首席数据科学家。文档里有一句话:
“训练数据中存在一个锚点用户(anchor user),其行为模式在所有特征维度上都高度接近群体均值。该用户的数据被赋予了一个隐式权重,对全局校准有显著影响。如果移除该用户,模型需要重新训练。”
锚点用户。
苏晚从来没听说过这个概念。她去问陆衡,陆衡也摇头。
“可能是初代架构的一个trick,“陆衡说,“早期数据不够的时候,用一个代表性强的样本做锚点来稳定训练,不算罕见。”
“但这个用户现在可能出了问题,“苏晚说,“如果他的行为模式变了,锚点就失效了,epsilon值就不再准确。”
陆衡看了她一眼。“你能找到这个用户是谁吗?”
“我在试。”
找到”锚点用户”并不容易。训练数据经过了严格的脱敏处理,用户ID被替换成了不可逆的哈希值。但苏晚发现,在特征工程的一个中间层里,有一组特殊的标记——每个用户的特征向量在计算时都会和一个”参考向量”做比较,用来标准化不同特征的量纲。
那个参考向量,就是锚点用户的特征向量。
它没有被哈希,因为它不是一个ID,而是一组具体的数据:年龄、收入区间、消费频次、信用历史长度、手机更换周期……一共一千二百个特征的数值。
苏晚把这组数据导了出来,在用户数据库里做交叉比对。
符合条件的用户只有一个。
用户编号:U-00000000。
系统里叫”零号用户”。
注册时间:2019年3月15日,天衡App上线的第一天。
所在地:湖北省武汉市。
性别:女。
年龄:五十八岁。
职业:系统记录为”个体经营者”。
月收入:不稳定,过去十二个月平均约一万一千元。
信用评分:六百七十三分。
苏晚看着这组数据,心里泛起一种奇怪的感觉。这些数字——每个特征维度上的值——都像是从八千万用户中精心挑选出来的”中位数”。不是任何一个维度的精确中位数,而是所有维度联合分布的最优近似。
就好像这个人是用统计学构造出来的——一个完美到不真实的普通人。
但她的的确确是真实的。她有真实的交易记录,每天早上六点在天衡的商户端有一笔二十七元的早餐消费——热干面加蛋,固定的摊位。每个月有三笔定期转账,金额分别是三千二百、一千五百和八百元——可能是房租、水电和一个什么保险。她的信用记录完美得无聊:从未逾期,从未超额,从未有过任何争议。
一个教科书般的”标准用户”。
苏晚决定去武汉看看她。
她没有告诉陆衡。
四、热干面
三月下旬的武汉,阴冷潮湿,还没到樱花季,东湖边的树枝光秃秃的。
苏晚按照用户数据里的地址找到了一个地方——武昌区粮道街附近的一条小巷子。巷子很窄,两边是上世纪八九十年代的老居民楼,墙皮剥落,电线像蛛网一样纠缠在一起。巷口有一家早餐摊,支着一把褪色的大伞,下面的蒸笼冒着白气。
一个五十多岁的女人站在蒸笼后面,正在拌热干面。她穿着一件洗得发白的蓝色围裙,头发花白但扎得利落,手腕上戴着一根红绳。
苏晚在她旁边的小桌前坐下,点了一碗热干面加蛋。
面端上来的时候,苏晚下意识地抬头看了她一眼——然后整个人僵住了。
她头顶没有数字。
不,不对。不是没有数字。是数字太亮了,亮得像正午的太阳,苏晚几乎无法直视。她从来没有见过这样的数字——不是那种普通的红或蓝,而是一种她无法描述的颜色,像是把所有的颜色叠加在一起,又像是完全没有颜色。
那个数字在不停地变化,每一秒都在跳动,像一个活物。
苏晚低下头,假装在吃面,心跳加速。
“姑娘,面好不好吃?“女人问她,声音带着武汉话的尾音,很温和。
“好吃。“苏晚说。这是实话。面条筋道,芝麻酱香浓,萝卜丁脆爽,辣油恰到好处。
“那就好。吃了再来。”
苏晚吃完了面,在巷子里转了一圈。女人收摊的时候大概十点半,她推着一辆手推车往巷子深处走,进了一栋老居民楼的三楼。
苏晚跟了上去。
“你找谁?“女人在三楼的楼道里回过头,看见了苏晚,愣了一下,“哦,你是早上吃面的姑娘。有什么事?”
“阿姨,我叫苏晚。我是……”苏晚犹豫了一下,决定说一部分实话,“我在一家互联网公司工作,我们有一些用户回访的调研,想跟您聊几句。”
“调研?“女人打量了她一下,“我没用过什么互联网。”
“您用过天衡金科吗?就是一个手机上的存钱借钱的App。”
女人想了想。“哦,那个啊。是我儿子帮我弄的,说是存钱方便。我也不太会用,就是每个月往里面存点钱。”
“您儿子呢?”
“在深圳打工,做……什么来着,送外卖。“女人说这话的时候笑了一下,但笑容里有一点苦,“一年回来一次。”
苏晚跟着她进了家门。房子很小,两室一厅,但收拾得很干净。客厅里有一张老式沙发,上面铺着钩针沙发垫,茶几上放着一个搪瓷杯,杯子里泡着茶叶。窗台上有一盆吊兰,长得很好,绿得发亮。
墙上挂着两张照片。一张是一个年轻男人的证件照——大概就是她儿子。另一张是一张全家福,照片已经泛黄了,里面的女人还很年轻,旁边站着一个男人,中间抱着一个小男孩。
“您先生呢?“苏晚问。
“走了。五年了,肺癌。“女人倒了一杯水递给她,“你喝水。”
苏晚接过来,看着杯子里的水,忽然注意到一件奇怪的事。
杯子里的水面在微微振动。
不是手在抖,是水本身在以一种非常规律的频率振动,像是有什么看不见的力量在拨动它。她抬起头,看见那个超亮的数字——现在漂浮在林秀芝(女人告诉她自己叫林秀芝)的头顶正上方,稳定地脉动着。
那个频率,和水面的振动频率一致。
苏晚突然明白了。那些数字——她从小就看见的、别人看不见的数字——不是某种超自然的玩意儿。它们是……振动。是某种信息在物理世界中的共振。就像音叉会带动周围的空气振动一样,这些数字是信息本身的物理表现。
林秀芝身上的”信息密度”太大了——八千万人的行为数据在她的数据画像上交汇,她成了整个系统的共振节点。
她是一个活生生的人,但同时也是一个统计学的奇点。
而她的”普通”,不是偶然——是因为她的生活恰好处于所有维度交汇的中心。她的收入是中位数,她的消费习惯是中位数,她的年龄、健康、社交、一切一切都是中位数。不是刻意为之,只是巧合。
一个八千万分之一的巧合。
五、共振
回到深圳之后,苏晚没有立刻向陆衡汇报。她花了一个星期分析零号用户的数据,得出了一个令人不安的结论。
天平模型对零号用户的依赖比她想象的深得多。
epsilon值——那个全局修正参数——本质上就是零号用户的”投影”。模型在训练时,会用零号用户的数据作为一个隐含的参照系:其他所有用户的风险评估,都是相对于这个参照系的偏差。这就好比把一个人的身高作为”一米”的标准,然后所有人的身高都用”相对于这个人的比值”来表示。
这个做法在工程上有一个好处:它让模型对数据分布的变化非常鲁棒。因为不管外部环境怎么变,参照系不变,相对关系就不会乱。
但它有一个致命的缺陷。
如果参照系本身变了,整个模型都会失准。
而林秀芝——零号用户——正在发生变化。
苏晚调出了她过去六个月的详细数据。变化很小,小到任何一个正常人都会忽略:她的早餐消费从每天二十七元变成了二十六元——可能是少加了一个蛋。她的月收入从一万一千降到了九千八百——可能是生意差了一点。她的手机充电频率从每天一次变成了两天一次——可能是出门少了。
微小的变化。但对一个”锚点”来说,任何偏移都会被放大八千万倍。
苏晚做了一个实验:在沙箱环境里移除零号用户的数据,重新训练模型。
结果:模型的准确率下降了四个百分点。
四个百分点。那意味着每天三千六百万次错误判断。天衡会直接被监管机构叫停。
她又在沙箱里尝试了另一种方案:用零号用户六个月前的数据(偏移之前)替换当前数据。
准确率恢复了。
这证实了她的猜想。天平模型对零号用户的当前状态高度敏感——她的微小偏移导致了全局性的预测漂移。
苏晚关掉电脑,靠在椅背上,盯着天花板。
她面前有几条路:
第一,修正epsilon值来补偿偏移。这是最简单的方案,但只是暂时的——如果林秀芝继续偏移,修正值就要不断调整,最终模型会变成一个补丁摞补丁的怪物。
第二,找到一个新的锚点用户来替换林秀芝。但苏晚查过了,八千万用户中没有第二个人具备她那样完美的”中位数”特性。这个人是不可替代的。
第三,重新训练模型,去掉对锚点用户的依赖。这需要大量的算力和时间——至少三个月——而且无法保证新模型的性能能达到现在的水平。
第四,想办法让林秀芝”回到”原来的状态。
第四条路让苏晚感到一阵恶心。
那意味着她需要去干预一个真实的人的生活——让她恢复每天加蛋的热干面,让她继续出摊,让她维持那个”完美中位数”的生活状态。
为了一个算法。
为了一个她从来没有同意过、甚至不知道自己被编入的系统。
苏晚站起来,走到窗边。南山区的高楼密密麻麻,远处的深圳湾在阳光下闪着灰蓝色的光。每栋楼里都有数以万计的人在工作、生活、消费、借贷。他们的命运在某种程度上被一个他们从未听说过的人——一个武汉街头卖热干面的大姐——所影响着。
荒谬。但又无比真实。
她看见了陆衡走进办公室。他的头顶飘着一个深蓝色的数字——一直很稳定,一直很低。她从来没问过那个数字意味着什么。
“苏晚,“陆衡站在她面前,“零号用户的事,查到什么了?”
苏晚把她的发现全部告诉了他。除了她能看见数字这件事。
陆衡听完后沉默了很长时间。
“你知道这意味着什么,“他终于说,“如果我们不解决这个问题,模型会在两个月内彻底失准。到那时候——”
“到那时候天衡就完了,“苏晚替他说完,“我知道。”
“你有方案吗?”
苏晚犹豫了一秒。“有。但我想先问你一个问题。”
“问。”
“当初设计天平的人,知不知道锚点用户的这个问题?”
陆衡的表情没有变化,但他眨了一下眼——对于他来说,这算是剧烈的情绪波动了。
“首架架构师是周翔,“他说,“他两年前离开了天衡,去了美国。走之前留下了一份技术文档,里面提到了锚点用户,但没有详细说明。我怀疑他自己也没有完全意识到这个依赖有多深。”
“或者他知道,但他觉得不需要处理,“苏晚说,“因为锚点用户一直很稳定。”
“直到现在。”
两人对视了一会儿。
“汇报给CTO吧,“陆衡说,“让上面决定怎么处理。”
苏晚点了点头,但心里知道,上面会做出什么样的决定。
六、手术
CTO叫郑远,三十八岁,清华计算机系出身,说话快,走路更快,是那种典型的”效率至上”型技术管理者。他听完汇报后的第一反应是:
“能不能用合成数据替换?”
“什么意思?“苏晚问。
“就是用AI生成一个虚拟用户,行为模式和零号用户一致,但不受真实世界的影响。把它作为新的锚点。”
苏晚想了一会儿。“技术上可行。用GAN或者扩散模型生成一个符合中位数特征的虚拟画像,然后在训练数据中用它替换零号用户。但这有两个问题。”
“说。”
“第一,合成数据无法完全模拟真实用户的动态变化。零号用户之所以能做锚点,不仅仅因为她的静态特征是中位数,更因为她的行为变化模式也是’平均’的——她随时间偏移的方向和速度恰好代表了群体趋势。这个动态特性很难用合成数据精确复现。”
“第二呢?”
苏晚停顿了一下。“第二,这样做意味着我们把一个真实的人从一个她不知道自己参与的系统里抹掉了。取而代之的是一个虚构的数字人格。”
郑远皱了皱眉。“她从来不知道自己是锚点用户。对她没有任何影响。”
“对。但她是一个真实的人。她的真实数据支撑了八千万人的风险评估。现在我们要用一个AI生成的假人来替代她——不是因为她不够好,而是因为她’变了’,不符合我们的需要了。这和……”
她没说完。但她在心里补上了:这和把一个活人变成一个可替换的零件有什么区别?
郑远看了一眼陆衡。陆衡面无表情。
“先做技术验证,“郑远说,“苏晚,你负责合成数据的生成方案。给你两周时间。”
苏晚回到工位,打开了代码编辑器。
她的手指悬在键盘上方,迟迟没有落下。
七、第二次武汉
那个周末,苏晚又去了武汉。
这次她没有骗自己说是”调研”。她就是想去看看林秀芝。
三月末的武汉终于有了春天的气息,长江边上的柳树冒出了嫩芽。苏晚在粮道街的小巷里找到了林秀芝的早餐摊,这次她没有坐下,而是站在一旁看。
林秀芝的动作和上次一模一样:抓面、抖散、浇芝麻酱、撒萝卜丁、舀辣油、装碗、递出去。一套动作行云流水,快得像是肌肉记忆。每个顾客拿到面之后都心满意足地走开,有人打招呼,有人付钱,有人赊账——林秀芝都记得,在一个小本子上划拉一下。
苏晚看着她头顶那个过于明亮的数字。它还在跳动,频率比上次更快了一点。
她注意到一个细节:林秀芝的左手腕上,那根红绳的旁边,多了一根医院的腕带。
“林姐,“苏晚走过去,“你的手怎么了?”
林秀芝低头看了一眼自己的手腕,笑了一下。“没什么,就是体检查出来一点小问题,医生让我过几天去做个检查。”
“什么问题?”
“血糖有点高。也没什么大事,年纪大了都这样。”
苏晚心里一紧。血糖升高——这意味着饮食习惯可能要改变。少吃碳水,少吃过甜过油的食物。热干面是高碳水食物,如果林秀芝自己也减少了摄入……
不。不能往那个方向想。
苏晚强迫自己把注意力从模型上移开,回到眼前这个人身上。
“林姐,你一个人在这儿摆摊多少年了?”
“二十三年了。“林秀芝一边拌面一边说,“从我儿子三岁那年就开始了。那时候这条巷子还是泥巴路。”
“二十三年,不容易。”
“有什么不容易的。日子不就是这么过的。“林秀芝把一碗面递给一个穿校服的中学生,揉了揉自己的腰,“就是腰不太好了。站一天下来,晚上睡觉翻身都疼。”
苏晚看着她。五十多岁,头发花白,腰不好,丈夫去世五年,儿子在深圳送外卖。每天早上五点起来摆摊,下午收摊后去菜场买菜,晚上一个人看电视。月收入一万出头,刚好够生活。
一个完美到令人心碎的”中位数”。
她的痛苦是中位数的,她的快乐是中位数的,她的孤独也是中位数的。
八千万人的平均生活。
“林姐,“苏晚说,“你有没有觉得,你的生活被什么东西……注视着?”
林秀芝看了她一眼,笑了。“小姑娘,你说话好奇怪。谁注视我?我就是一个卖面的。”
苏晚也笑了。对。谁注视她呢。她只是一个卖面的。只不过八千万人的命运和她的早餐绑在一起而已。
那天晚上苏晚在武汉住了一夜,住在户部巷附近的一家快捷酒店。她躺在床上,看着天花板,想着一件事。
天平模型需要林秀芝保持”中位数”的状态。但林秀芝不是为了让天平正常运转而活着的。她有自己的人生——丈夫的去世、儿子的远行、身体的老化、城市的变迁。这些变化是真实的、合理的、不可逆的。
模型没有权利要求她不变。
但模型也没有恶意——它甚至不知道自己依赖了林秀芝。它只是一个数学结构,一个对数据的拟合。它不是在”利用”她,它只是在”反映”她。
问题不在于模型,也不在于林秀芝。问题在于——一个系统把一个真实的人变成了一个隐含的参数,而这个人对这一切毫不知情。
苏晚翻了个身,拿起床头的手机,给陆衡发了一条消息:
“合成数据方案我有了初步思路,周一讨论。但我需要先解决一个更基本的问题——未来的模型架构中,不能存在任何单一锚点用户的依赖。即使这次用合成数据解决了,下一次还会出现同样的问题。”
陆衡的回复很快:
“同意。但现在是止血阶段。先解决眼前的问题。”
苏晚把手机放到一边,闭上眼睛。
黑暗中,那些数字在她眼前浮现——不是任何人的,而是她自己的。她从来不知道自己头顶的数字是什么颜色,什么大小。就像眼睛看不见自己一样。
她忽然很想问林秀芝一个问题,但已经来不及了。
八、合成
周一,苏晚向郑远和陆衡展示了她的合成数据方案。
思路并不复杂:用林秀芝过去三年的行为数据训练一个时序生成模型,让模型学会她的”变化模式”——不是静态的特征值,而是特征随时间的演化轨迹。然后用这个生成模型来外推未来六个月的行为数据,作为新的锚点输入。
“本质上,我们是在模拟一个’不变的林秀芝’,“苏晚解释道,“一个不受健康问题、经济波动、个人情绪影响的虚拟版本。她的数据会永远停留在’完美中位数’的状态。”
“听起来不错,“郑远说,“需要多久?”
“如果只用天衡内部的数据,一周就能完成。但生成质量取决于训练数据的量和多样性。林秀芝的行为数据只有三年,对于时序模型来说偏少。”
“有什么办法补充?”
苏晚深吸一口气。“有两个选择。第一,用公域数据增强——她的微信支付、支付宝、社保记录等外部数据。但这需要合规审批,周期至少一个月。第二……”
她停顿了一下。
“第二,让林秀芝在接下来的几周里保持现有的行为模式,我们实时采集她的数据来校准生成模型。她不需要做任何不同寻常的事——只需要继续她正常的生活。”
“你的意思是,监控她?“陆衡问。
“不是监控。是被动采集。她已经在用我们的App了,我们只是在利用已有的数据通道。”
郑远点了点头。“第二个方案更快。就用第二个。”
苏晚张了张嘴,想说什么,但最终只是点了点头。
接下来的两周,苏晚埋头在代码里。她用了一个基于Transformer的时序生成模型,以林秀芝的行为数据为输入,生成了一个”虚拟零号用户”的完整特征画像。然后用这个虚拟用户替换了训练数据中的真实林秀芝,重新训练了天平模型。
沙箱测试的结果令人满意:新模型的准确率不仅恢复了,甚至比原来的模型高出了零点一个百分点。
因为虚拟林秀芝比真实林秀芝更”完美”。她不会生病,不会偷懒,不会偶尔想换一家早餐店。她永远稳定,永远中位数,永远是那个理想的锚点。
郑远非常高兴。他在周会上表扬了苏晚,说她”解决了公司成立以来最大的技术隐患”。
苏晚坐在会议室的角落里,听着掌声,感到一阵眩晕。
九、雨
四月中旬的一个周六,深圳下了大雨。
苏晚坐在家里的阳台上,看着雨水从二十三楼的窗玻璃上流下来。她的手机在茶几上震动了一下——是一条来自天衡风控系统的自动告警。
虚拟零号用户的生成模型出现了一个微小的偏差:在过去三天里,模型预测林秀芝应该有三笔早餐消费,但实际数据只有两笔。
苏晚盯着这条告警。
真实林秀芝少出了一次摊。
她打开后台,查看了林秀芝的最新数据。过去一周,她的行为模式出现了一些异常:早餐消费从每天变成了隔天,月收入从一万出头降到了七千多,手机使用时长从每天四小时变成了两小时。
苏晚的心沉了下去。
她拨了林秀芝的电话。响了很久才接通。
“喂?“林秀芝的声音听起来有些虚弱。
“林姐,我是苏晚。上次去过你那儿调研的那个。”
“哦,小苏啊。你好你好。”
“林姐,你还好吗?我……上次看到你手腕上有医院的腕带。”
电话那头沉默了一会儿。“哦,那个啊。没什么大事。就是……医生说血糖太高了,让我住院观察几天。”
“住院了?”
“就住两天。小问题。”
苏晚咬了咬嘴唇。“林姐,你现在在医院吗?”
“嗯。武汉大学人民医院。”
“我去看你。”
“不用不用,太远了——”
“我有事去武汉出差,顺便看看你。周一就到。”
挂了电话,苏晚订了周一一早的机票。
武汉大学人民医院内分泌科的病房在七楼,走廊里弥漫着消毒水的味道。苏晚找到林秀芝的病床时,她正靠在床头看手机——看的是短视频,手机外放着声音,是一首老歌。
“林姐。”
林秀芝抬头,笑了。“小苏,你还真来了。快坐快坐。”
苏晚在床边坐下。病房是双人间,另一张床是空的。林秀芝穿着病号服,床头柜上放着几个橘子和一盒牛奶。
苏晚抬头看她头顶的数字。
它变了。
不再是那种过于明亮的、让人无法直视的光。它变暗了,变慢了,脉动的频率明显降低。像一颗正在降温的星星。
“医生怎么说?“苏晚问。
“说是二型糖尿病,“林秀芝说得很平静,“让我控制饮食,少吃面食。以后热干面怕是不能天天吃了。”
苏晚心里涌起一种说不清的复杂情绪。林秀芝因为健康原因需要减少碳水摄入,这是一件再正常不过的事。但这件事——这件完全属于她个人的、关于她自己身体的选择——会在天衡的风控模型里产生连锁反应。
因为真实林秀芝正在偏离”中位数”。她不再是那个完美的锚点了。
而虚拟林秀芝——那个天衡现在依赖的合成数据——是基于”旧版林秀芝”生成的。它假设她会一直吃热干面,一直每天出摊,一直维持那个一万出头的月收入。
虚拟林秀芝是一个凝固的时间切片。真实林秀芝是一个正在流逝的生命。
它们之间的距离只会越来越大。
“林姐,你儿子知道你住院了吗?”
林秀芝的笑容淡了一点。“知道了。他说要请假回来,我没让。他在深圳挺忙的,请假扣钱。”
苏晚看着她。这个五十八岁的女人,她的生活——她的每一天、每一顿早餐、每一笔转账——都在支撑着一个价值数百亿的系统,而她连一个能请假来看她的儿子都舍不得叫。
“林姐,“苏晚忽然说,“如果有一种方式,能让你的生活变得更轻松一点——比如有一笔钱,可以让你不用每天出摊,可以好好养身体——你愿意吗?”
林秀芝看着她,眼睛里有疑惑。“什么意思?”
苏晚意识到自己说多了。她摇摇头。“没什么。就是……觉得你太辛苦了。”
林秀芝笑了笑,拿起一个橘子递给她。“不辛苦。你吃橘子。”
苏晚接过橘子,慢慢地剥开。橘子的汁水渗进指甲缝里,酸酸甜甜的。
她做了一个决定。
十、拆解
回到深圳之后,苏晚找到陆衡,关上门。
“虚拟零号用户的方案不能长久,“她说,“林秀芝的真实行为正在偏离生成模型的假设。再过两三个月,合成数据和真实数据之间的gap会大到模型无法自我修正。届时我们面临的问题会比现在更严重——因为我们已经用合成数据重新训练了模型,回滚到旧版本的代价极大。”
陆衡靠在椅背上,双手交叉放在胸前。“你有什么方案?”
“重新设计模型架构。从根本上消除对单一锚点用户的依赖。”
“需要多久?”
“三个月。如果全力投入的话。”
“你说的’全力’是什么意思?”
“意思是,我现在就停下来做这件事。不再修修补补,不再用合成数据糊弄。把天平模型从底层重写。”
陆衡沉默了很长时间。
“郑远不会同意的,“他说,“模型重写意味着至少一个月的并行运行期,这段时间里两套模型的维护成本翻倍。而且重写过程中可能出现新的bug,影响线上业务。”
“但如果现在不重写,三个月后模型会自然崩塌。到时候连修补的余地都没有。”
陆衡看着她。“你对这个时间点有多确定?”
“很确定。”
又是沉默。窗外的深圳湾在下午的阳光下闪着光。
“我去跟郑远谈,“陆衡说,“你准备一个详细的技术方案。”
苏晚点了点头,转身要走。
“苏晚。”
她回头。
“你去武汉见了那个用户。“陆衡的语气是陈述,不是疑问。
苏晚没有否认。
“为什么?”
苏晚想了一会儿。“因为她是真实的。我想看看她是什么样的。”
陆衡的眼神里有什么东西闪了一下——不是情绪,更像是一种遥远的理解。
“做方案吧。“
十一、新天平
接下来的两个月是苏晚职业生涯中最艰难也最充实的日子。
她主导了天平模型的全面重构。新架构的核心思想是”分布式锚点”——不再依赖单一用户,而是用一个由数千个用户组成的”锚点集群”来提供校准基准。每个用户在集群中的权重是动态的,会随着他们的行为模式与群体均值的相关性自动调整。
这意味着即使某个用户的行为发生了重大变化——生病了、搬家了、换工作了——集群的整体稳定性不会受到显著影响。就像一个生态系统,失去一个物种不会导致崩溃,因为其他物种可以填补空缺。
这个方案的好处是显而易见的:鲁棒性大幅提升,不再存在单一故障点。坏处是:计算复杂度增加了一个数量级。原本只需要和一个参考向量做比较,现在需要和数千个向量做加权比较。
但苏晚用了一种巧妙的方法来解决这个问题:她把锚点集群压缩成了一个低维的”流形表示”——可以理解为一组主成分。每次预测只需要在这个低维空间里做一次投影,计算量增加不到百分之五。
陆衡审查了她的方案,只说了一个字:“行。”
郑远的反应更直接:“多久上线?”
“六月十五日。”
“提前到五月二十日。”
“做不到。至少需要六周的并行运行来验证。”
“四周。”
“五周。六月一日。”
郑远看了她一眼,大概是察觉到她不会让步了。“六月一日。不能再晚。”
苏晚点了点头。
五月的日子像流水一样过去。白天她写代码、跑实验、做代码审查、和团队讨论边界情况。晚上她一个人坐在电脑前,盯着数据看——不是模型的数据,而是林秀芝的数据。
林秀芝出院了。她的早餐摊重新开张了,但不是每天了——一周出摊五天,周末休息。热干面的价格从六块涨到了七块(“面粉涨了嘛”)。她开始卖豆浆了,因为医生建议她减少碳水摄入。
她的月收入稳定在九千五左右。比以前少了一些,但她的消费也降了——她开始在家里做饭,不再每天在外面吃。
她正在偏离”中位数”。
但在苏晚看来,她只是在做一个正常人在正常年龄会做的正常选择。照顾身体,调整生活,慢慢地变老。
虚拟林秀芝不知道这些。它还在生成着”完美”的数据——每天二十七元的早餐,每月一万一千元的收入,六百七十三分的信用评分。
两个林秀芝之间的距离正在拉大。一个在真实世界里缓慢地变化着,一个在数据世界里永远年轻。
苏晚有时候会想,这是不是也是一种死亡——被数据定格在某个瞬间,然后真实的那个人继续往前走,直到两个人再也没有关系。
五月的最后一个周末,苏晚第三次去了武汉。
十二、告别
这次她没有提前打电话。
武汉已经入夏了,空气湿热得像毛巾一样裹在身上。苏晚穿过粮道街,找到了那条巷子。
林秀芝的摊位在。大伞换了新的,蓝色的,很鲜亮。蒸笼冒着白气。
但站在蒸笼后面的不是林秀芝。
是一个年轻女人,二十多岁的样子,动作生疏但认真,舀芝麻酱的时候手在抖。
苏晚走过去。“你好,请问林姐呢?”
年轻女人抬起头。“你是说林秀芝林阿姨?她今天休息。她让我帮她看摊子。”
“你是?”
“我是她隔壁的,小陈。林阿姨教了我一周了,说我学会了可以帮她在周末出摊。”
苏晚愣了一下,然后笑了。“那……一碗热干面加蛋。”
小陈手忙脚乱地拌了一碗面端过来。味道还可以,但和林秀芝做的差了一个层次——面条不够筋道,芝麻酱不够均匀,辣油放多了。
苏晚吃完了面,问到了林秀芝的楼号,上楼敲了门。
林秀芝开了门,穿着一件宽松的家居服,正在看电视。看到苏晚,她笑了。
“小苏!又来了?快进来。”
苏晚进了屋。一切和上次一样,干净、整洁、小。吊兰还是那么绿,搪瓷杯还在茶几上。
但有一个变化:茶几上多了一台笔记本电脑,屏幕开着,上面是一个视频通话界面。
“我儿子给我买的,“林秀芝指着电脑说,“教我视频通话。现在我们每周打一次电话,看得见人。上个月他还寄了一箱荔枝过来,说是深圳的。”
“那很好。”
“是啊。以前他一年回来一次,现在每周都能看见。虽然不能吃一顿饭,但能看见脸也挺好。”
苏晚看着她。她头顶的数字还在,但比上次更暗了。不再是那种过于明亮的光,变成了一种柔和的、像月光一样的白色。
它还在脉动,但频率变慢了,变得温柔了。像一个人的心跳从奔跑状态慢慢回到了平静。
“林姐,“苏晚说,“你的身体怎么样了?”
“好多了。血糖控制住了。医生说只要注意饮食,按时吃药,就没什么大问题。”
“那你的摊子——”
“还在做。就是不做那么多了。让小陈周末帮我看着,我自己周一到周五做。攒点钱,等儿子在深圳站稳了,我去深圳看看他。”
苏晚看着她,忽然觉得鼻子有点酸。
“林姐,“她说,“有一件事我一直想告诉你,但不知道怎么说。”
“什么事?”
“你的天衡账户——就是你儿子帮你弄的那个——它对……对我们公司来说挺重要的。你的数据帮助我们做了很多事情。”
林秀芝眨了眨眼。“我的数据?我就存点钱,有什么数据?”
“就是……你的消费习惯、你的生活模式。它们很……很稳定,很有代表性。我们的系统用这些数据来帮助其他人做出更好的金融决策。”
林秀芝想了想。“就是帮别人算命?用我的命算?”
苏晚笑了。“差不多是这个意思。”
林秀芝也笑了。“那行。反正我每天就是过日子,能用我的日子帮到别人,也挺好的。”
她停顿了一下,认真地看着苏晚。“但我不想只活在那个……你们说的什么’系统’里面。我还是想过我自己的日子。”
苏晚点了点头。“我知道。”
“我以前每天出摊,是因为要赚钱养家。现在我少出一点摊,是因为身体不允许了。这不是因为我变了,是因为时间在往前走。”
苏晚说不出话来。
“小苏,你是做那个什么算法的,对吧?“林秀芝忽然问。
“对。”
“那你就做一个能跟着人走的算法嘛。人会变的,算法也得跟着变。你不能指望一个人永远不变——那不现实。”
苏晚看着她,觉得这个五十八岁的卖热干面的大姐,说出了她花三个月才想明白的道理。
“林姐,“她说,“谢谢你。”
“谢什么?来,吃橘子。“
十三、上线
六月一日凌晨三点,新天平模型上线了。
苏晚坐在监控室里,面前的屏幕上跳动着实时数据。旁边坐着陆衡、郑远,和四个工程师。
新模型运行了十分钟,没有报错。
一个小时,准确率在预期范围内。
四个小时,一切正常。
早上七点,太阳从深圳湾的方向升起来,金色的光透过玻璃墙洒进监控室。苏晚揉了揉眼睛,站起来走到窗前。
新天平模型不再依赖任何单一用户。它的”锚点”是一个由三千七百二十一个用户组成的动态集群,每个用户的权重每二十四小时更新一次。如果某个用户的行为发生了重大变化——生病、搬家、结婚、离婚、生子、去世——集群会在一秒之内自动调整权重分配,确保全局校准的稳定性。
林秀芝仍然是集群中的一个节点,但她的权重已经从”百分之百”降到了”百分之零点零三”——和所有其他节点在同一个数量级上。
她不再是”零号用户”了。她只是三千七百二十一分之一。
和所有人一样。
苏晚看着窗外的日出,想起林秀芝说过的那句话:“人会变的,算法也得跟着变。”
新模型正是这样做的。它不再试图把任何人固定在某个状态里,而是接受变化、拥抱变化、从变化中学习。
它的鲁棒性不来自于某一个人的”完美”,而来自于所有人的”真实”。
陆衡走到她旁边。“模型表现比预期好百分之十五。”
苏晚点了点头。
“你去武汉三次了,“陆衡忽然说,“就为了一个锚点用户。”
苏晚没有否认。
“你想过没有,“陆衡的声音很轻,“为什么是你发现了这个问题?模型偏差那么小,大部分人根本不会注意到。”
苏晚想了想。“可能因为我……比较敏感。”
陆衡看了她一眼。他的头顶飘着那个深蓝色的数字,一如既往地稳定。
“敏感是好事,“他说,“但别让它成为负担。”
苏晚看着他走回监控台,心里忽然想:他知不知道?知不知道她能看见那些数字?
大概不知道。
又或者,知道。但从来没问过。
就像她自己一样——看得见,但从不解释。
十四、后来的事
新天平模型上线后运行稳定。七月份的月度报告中,预测准确率比旧模型提高了零点七个百分点——这是天衡金科成立以来最大的一次模型性能提升。
郑远在季度大会上把功劳归给了”团队协作”,没有特别提到苏晚。陆衡为苏晚争取了一次职级晋升和一笔可观的奖金。
苏晚用那笔奖金做了两件事:给父母买了一张去云南旅游的机票,以及给林秀芝寄了一箱深圳当季的荔枝。
林秀芝收到荔枝后给苏晚发了一条语音消息,说:“小苏,荔枝很甜。谢谢。你下次来武汉,我给你加两个蛋。”
苏晚听完笑了,把消息保存了下来。
九月份,苏晚在天衡内部发表了一篇技术论文,题目叫《分布式锚点:消除风控模型对单一样本的隐式依赖》。论文没有提到任何具体的用户信息,也没有提到她能看见数字这件事。但它详细分析了旧架构的风险,和新架构的设计理念。
论文的最后一句话是:“任何依赖于单一数据点的系统都是脆弱的。真正的鲁棒性来自于对多样性的拥抱,而非对’完美’的追求。”
十月份,苏晚在公司的年度技术峰会上做了一个演讲。演讲结束后,一个年轻的工程师跑来找她。
“苏姐,我读了你的论文。有一个问题。”
“说。”
“你说分布式锚点比单一锚点更鲁棒,这在统计上完全正确。但从信息论的角度来看,单一锚点的信息密度更高——它用最少的资源提供了最大的校准能力。如果我们追求极致的效率,单一锚点不一定是坏选择,对吧?”
苏晚看着这个年轻人。他大概二十五六岁,眼睛里全是聪明和好奇心。
“你说得对,“苏晚说,“从效率的角度来看,单一锚点确实更优。但效率不是唯一的目标。”
“那还有什么?”
苏晚想了想,想起林秀芝站在蒸笼后面的样子,想起那个过于明亮的数字,想起那句”我不想只活在系统里面”。
“还有真实,“她说,“真实的人会变化。一个不允许变化的系统,效率再高,最终也会被变化摧毁。我们能做的,不是阻止变化,而是学会在变化中保持稳定。”
年轻人想了想,点了点头。“明白了。谢谢苏姐。”
他走了之后,苏晚站在会议室的窗前,看着窗外的深圳。
天空很蓝,蓝得有点不真实。远处的地平线上,有一些她看不清的东西在闪烁——也许是高楼的玻璃反光,也许是别的什么。
她抬头看了看自己的头顶。
当然什么也看不见。她从来不觉得遗憾。
但有时候她会想,如果有一天,有人能看见她头顶的数字,那会是什么颜色?什么频率?
它会和林秀芝的数字产生共振吗?
它会是中位数吗?
它会是什么?
苏晚笑了笑,转身走回办公室。桌上还有一堆模型监控报告等着她看。
新的天平模型运行得很好。三千七百二十一个锚点用户,每天在变化,每天在调整,每天在以他们真实的、不完美的生活,共同支撑着一个系统。
没有人是完美的。但所有人加在一起,刚好够了。
尾声
十二月的某个清晨,苏晚打开了天衡App的个人页面。
她的信用评分是七百一十二分。
她盯着这个数字看了一会儿,然后关掉App,穿好外套出门。
楼下有一家早餐店,卖小笼包和豆浆。她走进去,点了一份小笼包和一碗咸豆浆。
老板娘是一个四十多岁的中年女人,手脚麻利,嗓门大。苏晚坐在角落里,抬头看了她一眼。
她头顶有一个数字。红色的,不太亮,跳动得很规律。
苏晚低下头,开始吃小笼包。
皮薄馅多,汤汁滚烫,一口下去满嘴鲜香。豆浆是热的,咸的,里面加了虾皮和紫菜。
她吃得很慢。
窗外,深圳的冬天不冷不热,阳光刚好。
日子就是这样过的。
一碗一碗地过。
一笔一笔地过。
一天一天地过。
直到数字变成颜色,颜色变成光,光变成什么都不是,或者什么都是。
苏晚吃完早餐,付了钱——扫的是天衡的支付码。
她走出早餐店,汇入了早晨的人群里。
无数的人,无数的数字,在这座城市的上空漂浮着、碰撞着、共振着。
没有人看见。
但它们在。
就像引力。就像风。就像所有那些支撑着世界运转、却永远不会被注意到的东西。
它们在。
(完)