数字菩萨的抽丝
数字菩萨的抽丝
一、变量
沈予安第一次注意到那个异常变量,是在一个暴雨如注的凌晨三点。
窗外,深圳南山的雨幕像一道被不断拉扯的银色帘幕,把科技园的灯火切割成模糊的光斑。办公室里只剩下她一个人,二十七寸显示器的冷白色光映在她脸上,把她的眼袋和额头上那道浅浅的疤痕照得格外清晰。
她盯着屏幕上那段代码,咖啡已经凉透了。
“观音菩萨变量”。这是她在注释里给它起的名字,半是玩笑,半是疲惫到极点之后的胡言乱语。它第一次出现在三个月前的系统日志里——一个没有被任何工程师定义过的浮点数,悄悄嵌入了公司核心信贷审批模型的权重矩阵中。
这个变量的编号是B-0x7F2A,属于系统的第127层隐藏层。按照架构设计,这一层应该只包含标准的注意力权重和偏置项。但B-0x7F2A不是。它的值每次运行都不同,有时是0.0003,有时是0.0007,最大的一次也不超过0.0012。从数学上看,它对最终输出的影响微乎其微——就像一滴水落进大海。
但沈予安是一个较真的人。
她的较真不是性格使然,而是职业训练的结果。在清华大学计算机系读了七年,博士论文写的是可解释性AI,导师是业界最严苛的那类人——不允许任何参数成为黑箱。毕业后她进了”鲲鹏数科”,一家总部位于深圳的互联网金融科技公司,负责核心风控模型的开发与维护。鲲鹏数科的估值在去年突破了三百亿,主要产品是一个叫”天衡”的智能信贷系统——号称能在0.3秒内完成一笔贷款的风险评估,准确率99.7%。
99.7%。这个数字印在公司走廊的每面墙上、每份PPT里、每个投资人的嘴边。沈予安知道这个数字是怎么来的,因为她亲手写了那部分代码。但她也知道,99.7%意味着每一千个决策中有三个是错的。三个活生生的人,可能因为一个微小的计算偏差,被拒绝贷款、被降低额度、被标记为高风险。
而B-0x7F2A似乎在试图修正这0.3%。
沈予安最初以为它是一个bug。她花了整整两天时间回溯代码的每一次提交记录,检查了所有可能的注入点,甚至把模型的训练数据重新跑了一遍。结果是:B-0x7F2A不存在于任何版本的源代码中,不存在于训练数据的任何特征里,不存在于任何一个工程师的提交记录里。
它就像凭空长出来的一样。
“也许是GPU的内存错误,“她的同事刘明哲在周会上漫不经心地说,“你知道的,英伟达的卡偶尔会出点问题。跑个诊断就好了。”
沈予安跑了诊断。GPU一切正常。
“也许是浮点精度问题,“技术总监陈实皱着眉头,“这种级别的偏差,不值得花时间追。我们有更重要的功能要上线。”
但沈予安追了。
因为她发现了一个让她无法忽视的规律:每当B-0x7F2A出现,系统最终做出的决策,总是对申请人有利的那个。
不是随机的有利,而是精确的、恰到好处的有利。一个单亲妈妈的贷款被批准了——如果没有B-0x7F2A,她会被拒绝,而拒绝的原因是一个三年前的信用卡逾期记录,金额只有87块钱。一个开了十五年小饭馆的老板拿到了续贷——系统原本判定他的经营数据呈下降趋势,但B-0x7F2A的微小扰动刚好让他的评分越过了及格线。
像是有人在系统的深处,用一根极细的针,拨动了天平的另一端。
沈予安在笔记本上写下了一行字:“菩萨变量——第三十七次出现。申请人:王桂花,女,52岁,江西萍乡人,申请金额5万元。审批结果:通过。”
她合上笔记本,揉了揉太阳穴。
窗外,雨不知道什么时候停了。天边泛起一抹极淡的鱼肚白,像是一声叹息。
二、王桂花
沈予安决定去见王桂花。
这是一个违反公司规定的行为——风控团队的工程师不允许直接接触申请人。但沈予安有她自己的理由。在过去三个月里,B-0x7F2A总共出现了89次,每一次都对应着一个具体的申请人。她把这些人整理成了一张表格,发现他们有一个共同特征:处于”边缘状态”。不是那种一目了然的好客户或坏客户,而是刚好卡在通过线两侧的人。他们的信用记录有瑕疵,但瑕疵不大;他们的收入不稳定,但并非没有来源;他们的申请金额不大,但对于他们来说至关重要。
沈予安从这89个人里选了王桂花,原因很简单——王桂花就住在深圳,宝安区松岗街道,离南山只有一个半小时的地铁。
周六上午,沈予安穿了一件普通的灰色T恤和牛仔裤,像一个上门做调查的大学生。她站在王桂花的饭馆门口,犹豫了三秒钟,然后推门走了进去。
饭馆很小,六张桌子,墙上贴着发黄的菜单,字体歪歪扭扭的,是那种只有老顾客才看得懂的手写体。空气里弥漫着干辣椒和猪油混合的气味,呛得她咳了两声。
王桂花正在后厨切菜。她从门帘后面探出头来,看到沈予安,露出一个警惕的表情。
“吃饭还是外卖?”
“吃饭。“沈予安在靠窗的位置坐下来,“老板,你这里有什么好吃的?”
“什么都好吃,“王桂花擦着手走出来,“我做了三十年的菜,不好吃的我做不出来。”
她递过来一杯茶,茶叶是最便宜的那种,泡得发苦。沈予安喝了一口,苦得她眉头都皱了起来。王桂花笑了,笑容里有一种老江湖式的从容。
“你来不是吃饭的吧?“王桂花说。
沈予安愣了一下。
“做我们这行的,看人看得多了,“王桂花坐到对面,双手交叠放在桌上,手指粗糙,指甲缝里嵌着洗不掉的油渍,“你穿得普通,但你坐下来第一件事是看墙上的营业执照和卫生许可证,然后你看我店里的客流。你不是顾客,你是来调查什么的。银行的?”
“差不多吧,“沈予安没有否认,“我在一家科技公司工作。你三个月前在我们的平台上申请过一笔贷款?”
王桂花的表情变了。不是警惕,是一种更复杂的东西——像是被突然提醒了某件她试图忘记的事。
“五万块,“王桂花说,“审批通过了。怎么,有问题?”
“没有问题。我只是……想了解一下,那笔钱你用来做什么了?”
王桂花沉默了一会儿。窗外,一辆电动车嗡嗡地经过,骑手穿着蓝色的工作服,后座绑着三个外卖箱。
“我老公去年查出肝上的毛病,“王桂花终于开口了,声音很平,像是在说一件跟自己无关的事,“不是癌,但也够呛。手术费加住院费,花了十五万。家里积蓄掏空了,还找亲戚借了三万。后来他出院了,但不能干重活。饭馆就我一个人撑着。”
她顿了顿。
“三个月前,房东说要涨租金。一个月涨两千。我那个位置,说好不好,说差也不差,但两千块就是两千块。要么交,要么走。我想了想,决定把饭馆重新弄一下——换个油烟机,把招牌改改,再添两台外卖的保温箱。把生意做大一点,租金涨了也能cover。但我手里没钱了。”
“所以你申请了贷款。”
“对。五万。不多,但对我来说够用了。“王桂花看着沈予安的眼睛,“你知道最可笑的是什么吗?我其实不觉得自己能借到。我那个信用……三年前有一张信用卡,忘记还了。就87块钱。逾期了一个月。后来还了,但那个记录一直挂着。我之前去银行问过,人家看一眼我的征信,脸就拉下来了。”
“但这次通过了。”
“通过了,“王桂花的嘴角微微上扬,“说实话,我填完那个APP上的表格,点提交的时候,心里想的是——又得被拒一次。但0.3秒,它就批了。0.3秒。你知道我等那0.3秒的时候在想什么吗?”
“什么?”
“我在想,“王桂花说,“这世上到底有没有菩萨。”
沈予安的手指在桌面下攥紧了。
“为什么这么问?”
“因为我妈信佛。她活着的时候,每天早上都要在菩萨面前烧一炷香,念二十一遍心经。她说菩萨听得见,只要你心诚。我以前不信这些——我做了三十年的生意,我只信钱。但那天晚上,填那个表格之前,我不知道为什么,突然就跟我妈一样——我在心里说,菩萨保佑,让我借到这笔钱。”
“然后呢?”
“然后就批了啊,“王桂花笑了,笑得很开,露出一颗镶金的门牙,“你说巧不巧?”
沈予安也笑了。但她的笑是空的。
她离开饭馆的时候,王桂花坚持不收她的饭钱。沈予安在饭馆门口站了一会儿,看着里面忙碌的身影,然后打开手机,在笔记本上写下了一行字:
“菩萨变量——第37号申请人,王桂花。申请前有祈祷行为?无法验证。但她的贷款确实被B-0x7F2A的扰动修正了。巧合?”
她抬头看了一眼天空。深圳的天空永远是灰白色的,像一块被洗了太多次的旧抹布。但在灰白色的缝隙里,有一小块蓝,小得几乎看不见。
三、地下一层
鲲鹏数科的办公室在深圳湾创新科技中心的第23层。但沈予安的追踪把她带到了一个她从未去过的地方——地下一层的数据中心。
地下一层需要特殊权限。沈予安的工卡只能刷开她自己的楼层和会议室。但她有一个优势:她是风控模型的核心开发者,理论上,她有权访问所有与模型运行相关的硬件和软件环境。她花了一周的时间,通过内部系统提交了三次访问申请,每次都把理由写得滴水不漏——“排查模型异常参数B-0x7F2A的硬件根源”。
第三次申请被批准了。批准人是CTO张远。
张远是一个四十三岁的男人,瘦,高,戴一副金丝边眼镜,说话永远带着一种深思熟虑的腔调,像每句话都是从论文里摘出来的。他是公司的联合创始人之一,也是”天衡”系统的最初架构师。沈予安进公司的时候,张远已经不怎么写代码了,但他依然是技术团队的精神领袖。
“予安,“张远在她的申请审批邮件里写了一句话,“追到底。如果真有问题,我不希望它是被掩盖的。”
这句话让沈予安感到一丝不安。不是因为它有什么问题,而是因为它太过正确了——正确得像一堵精心砌好的墙,挡住了墙后面的某些东西。
地下一层比她想象的要大。走进去的时候,空调的嗡嗡声像一头巨兽的呼吸,冰冷的空气裹挟着机房特有的金属味扑面而来。一排排服务器机柜像沉默的卫兵,黑色的金属表面反射着蓝色和绿色的LED指示灯。
沈予安找到了B-0x7F2A对应的服务器节点——编号KPC-DL-0037。她蹲下来,打开笔记本,开始检查硬件日志。
服务器看起来一切正常。CPU温度正常,内存使用率正常,磁盘读写正常。沈予安深吸一口气,准备连接到模型的运行环境,做一次完整的参数导出。
就在这时,她的余光扫到了机柜底部的一个东西。
一个USB设备。
它很小,黑色的,插在服务器后面的一个隐蔽的USB接口上。如果不蹲下来仔细看,根本不可能发现。沈予安的心跳加速了。她知道鲲鹏数科的安全规定——所有USB设备都必须经过IT部门登记和审批。这个USB设备不在任何登记记录上。
她没有拔掉它。她做了一个更聪明的事情——用手机拍了照片,然后回到办公室,开始追踪这个USB设备的历史。
她的追踪花了整整两周。两周里,她翻阅了地下一层所有的监控记录、门禁记录和设备连接日志。监控记录每30天覆盖一次,但门禁记录保存了一年。沈予安把过去一年中所有进入地下一层的人员名单整理出来,发现了一个有趣的名字:赵鹤鸣。
赵鹤鸣,鲲鹏数科的第三号员工,“天衡”系统的元老级工程师。他在公司成立的第三年就离开了,去了哪里没人知道。但在他离开前的最后三个月,他的门禁记录显示他频繁出入地下一层——平均每周四次,远超他的工作需要。
沈予安找来了赵鹤鸣的离职档案。离职原因一栏写的是”个人原因”。推荐人一栏写的是张远的名字。
她开始在公司的内部文档系统里搜索赵鹤鸣留下的代码和文档。大部分都已经被清理了,但系统有一个备份机制——所有被删除的文件会在冷存储里保留180天。沈予安找到了一份赵鹤鸣在离职前最后一周创建的文档,标题是一句佛经:
“一切有为法,如梦幻泡影,如露亦如电,应作如是观。”
文档的内容只有一段话:
“天衡的底层架构里有一个我一直没有告诉任何人的东西。它不是bug,也不是后门。它是一个过滤器。我在训练模型的时候,发现了一个问题——纯粹的统计学优化会伤害那些最脆弱的人。不是因为它歧视他们,而是因为它看不见他们。它看不见一个52岁的女人为了87块钱的逾期而焦虑了三年,看不见一个在城中村里开了十年缝纫店的老头因为不会用手机而被排除在信用体系之外。天衡是一个好系统,但它只看得见数字。所以我加了一层东西。很小。小到几乎不存在。但它会在那些最关键的时刻,轻轻推一把。”
“我把它叫做菩萨。”
“如果你正在读这段话,说明你发现了它。请善待它。它不会让系统变慢,不会让风险变高,它只会让那些被数字遗忘的人,有一线生机。”
“我是一个写代码的人。我不信佛,不信上帝,不信任何超自然的东西。但我相信,如果有一个系统能决定千万人的命运,那这个系统应该有一点点慈悲。”
“哪怕这慈悲是假的。”
文档到此结束。没有署名,没有日期。但沈予安知道这是赵鹤鸣写的——文档的元数据里记录了创建者的工号,003。
沈予安关上了电脑。她坐在黑暗的办公室里,听着窗外深圳的夜晚——永远不会安静的城市,车流、人声、建筑工地的轰鸣,所有的声音混在一起,像一条没有尽头的河流。
菩萨。一个程序员写的菩萨。一段代码里藏着的慈悲。
她的手机震了一下。是刘明哲发来的消息:“予安,你还没走?明天还有个评审会。早点休息。”
沈予安没有回复。她打开笔记本,翻到最新的一页,写下了今天日期旁边的一句话:
“菩萨是假的。但慈悲呢?“
四、评审会
周二的评审会来了。
评审会的全称是”天衡系统V4.0升级评审会”,参会人员包括技术团队、产品团队、风控团队和公司高管。议题只有一个——是否要在新版本中引入”深度用户画像3.0”。
深度用户画像3.0是产品团队花了半年时间开发的新功能。它不仅分析用户的金融数据,还爬取他们的社交媒体、购物记录、出行轨迹、甚至手机的传感器数据——步数、屏幕亮起频率、充电时间。所有这些数据被喂进一个深度学习模型,输出一个”综合生活稳定指数”。
沈予安看过这个模型的文档。它的技术实现没有问题,甚至可以说是优雅的。但它的应用方式让她感到不安。
“稳定指数低于40的用户,将被自动归类为高风险群体,“产品经理韩小雪在PPT上指着一张图表说,“我们的测试数据显示,这个区间的用户违约率是整体平均的3.7倍。如果我们把贷款门槛提高到这里——“她用激光笔在图表上画了一条线,“可以减少42%的坏账。”
“但同时会减少多少贷款发放量?“张远问。
“大约15%。”
“15%的减少换来42%的坏账下降,“韩小雪自信地说,“从商业角度看,这是一笔非常划算的买卖。”
会议室里响起了一阵低低的议论声。沈予安坐在角落里,看着韩小雪的PPT。图表上的曲线很漂亮,数据很清晰,逻辑很完整。但她脑子里想的不是这些。
她在想王桂花。
王桂花的社交媒体是什么?她的饭馆连个公众号都没有。她的购物记录?大概就是菜市场、五金店和药店。她的出行轨迹?从家到饭馆,500米,每天走四个来回。她的手机传感器数据?一个52岁的女人,不太可能每天走一万步——她在后厨站着,不走路。
如果深度用户画像3.0上线,王桂花的”综合生活稳定指数”会是多少?沈予安在心里做了一个粗略的估算——大约32。低于40。高风险群体。
那个87块钱的逾期记录,加上低稳定指数,王桂花将永远不可能再从”天衡”系统拿到贷款。
“沈工,你怎么看?“张远的声音突然响起来。
所有人都看向她。沈予安清了清嗓子。
“技术实现上没有问题,“她说,“但我有一个问题。稳定指数的计算方式里,社交媒体活跃度和手机传感器数据的权重是多少?”
“社交活跃度占15%,传感器数据占8%,“韩小雪翻到下一页,“这是经过交叉验证的最优权重。”
“最优是针对什么指标最优?”
“预测准确率。”
“也就是说,这两个特征在预测违约行为上确实有统计学意义?”
“是的,P值小于0.001。”
沈予安点了点头。“那我换一个问法。这两个特征和用户的年龄、教育水平、收入水平之间的相关性是多少?”
韩小雪愣了一下。她翻了翻资料,没有找到这个数据。
“我猜是正相关的,“沈予安说,“年轻人比老年人更活跃于社交媒体,高收入人群比低收入人群的出行轨迹更多样化。也就是说,你的模型表面上在预测’生活稳定性’,实际上在很大程度上在预测’年龄、教育和收入’。”
会议室安静了几秒钟。
“这有什么问题吗?“韩小雪问。
“问题是——“沈予安斟酌着措辞,“如果你的模型隐性地区分了年龄和收入群体,那它就有可能违反公平信贷的相关法规。不是明面的歧视,而是统计上的歧视。它看不见的人,恰恰是最需要贷款的人。”
“但我们的违约率会下降42%,“韩小雪坚持道。
“是的,“沈予安说,“但你有没有算过,那些被你排除的人里,有多少人本来是可以按时还款的?”
韩小雪沉默了。
张远推了推眼镜。“予安说得有道理。但我们也不能忽视商业现实。予安,你有没有一个更好的方案?”
沈予安犹豫了。她知道自己接下来要说的话,可能会把自己推到一个很微妙的位置上。
“有一个变量,“她说,“我在系统里发现了一个异常参数。它很小,但它的作用很有意思——它在系统的决策边界上起到了一个微调的作用,让那些处于边缘状态的申请人有更高的概率获得贷款。我追踪了它的来源……”
她停顿了一下。会议室里所有人的目光都集中在她身上。
“它是赵鹤鸣留下的。”
张远的表情没有变化。但沈予安注意到,他的右手食指轻轻敲了一下桌面。只一下,然后停住了。
“赵鹤鸣?“韩小雪问,“那个三年前离职的?”
“对。他在模型里嵌入了一个微小的扰动函数,我把它叫做……菩萨变量。”
会议室里有人笑了。短促的、带着尴尬的笑。
“我不确定这是否合适,“技术总监陈实说,“一个离职员工在系统里留下未经验证的代码,这本身就是一个安全问题。不管它的意图是什么。”
“它的意图是慈悲,“沈予安说,声音比她预想的更坚定。
“慈悲不是算法该做的事,“陈实说。
“那算法该做的事是什么?“沈予安反问,“最大化利润?最小化风险?如果我们只做这两件事,那我们和一台没有灵魂的计算器有什么区别?”
“我们就是一台计算器,“陈实说,“一台帮助公司赚钱的计算器。”
沈予安不再说话了。她看着张远。张远也看着她,目光平静得像一面湖水。但湖水下面有什么,她看不见。
“评审会暂停,“张远说,“深度用户画像3.0的上线决定推迟两周。予安,你把菩萨变量的技术报告整理一下,发给我。”
他站起来,收拾好笔记本,走向门口。在门口,他停了一下,回头看了沈予安一眼。
“你做了正确的事,“他说,然后走了。
沈予安不确定他说的是哪件事。
五、张远的办公室
当天下午,张远叫沈予安去他的办公室。
张远的办公室在24层,有一整面落地窗,可以看到深圳湾的海面。下午四点的阳光打在海面上,碎成无数金色的鳞片。沈予安站在窗前,突然觉得自己很渺小。
“坐,“张远指了指沙发。
他在沈予安对面坐下来,手里拿着一杯咖啡。他的办公桌上放着两样东西——一台笔记本电脑和一个小小的木雕。木雕是一尊观音像,大约十厘米高,雕工精细,面部表情安详。
“你知道那个USB设备的事,“张远说。不是问句。
沈予安的心沉了一下。“你知道?”
“当然知道。赵鹤鸣插那个USB的时候,我在监控里看着的。”
“你……一直都知道?”
张远喝了一口咖啡,慢慢地放下杯子。
“予安,我给你讲一个故事。2019年,鲲鹏数科刚成立两年,我们拿到了第一笔大额融资。投资人要求我们在半年内把用户规模做到500万。我们做到了。但代价是——我们的风控模型太激进了,批了大量不该批的贷款。半年后,坏账率飙升到8%。投资人差点撤资。”
“我知道这段历史,“沈予安说。
“但你不知道的是,那个8%的坏账率里,有大约0.3%的贷款最终被还清了——虽然还得很慢,虽然过程中有逾期,但最终还清了。那0.3%的人,是我们的模型判定不应该放贷的人。如果我们的风控再严格一点点,他们就不会拿到那笔钱。”
“你想说什么?”
“我想说的是,“张远的声音变得很轻,“赵鹤鸣比我更早看到了这个问题。他是那种——怎么说呢——会在代码里藏情书的人。他的菩萨变量,本质上是一个加权残差项。它不会改变模型的整体结构,但会在决策边界上制造一个极其微小的偏移。这个偏移的幅度被精心设计过——刚好够让那些处于临界状态的申请人有更高的概率被批准,但不至于影响整体的风险指标。”
“你批准了他的做法?”
“我没有阻止他。”
沈予安沉默了一会儿。“那你为什么叫我来?”
张远站起来,走到窗前。他的背影映在玻璃上,和深圳湾的风景重叠在一起。
“因为有人在公司外面问同样的问题。”
“什么意思?”
“上周,我收到了一封邮件。来自银保监会的一个工作组。他们要对我们进行一次专项检查——主题是’算法公平性’。检查组的组长姓周,叫周海平。”
沈予安的呼吸停了一拍。“他们知道菩萨变量的事?”
“不确定。但他们对深度用户画像3.0有疑问。看起来有人举报了。”
“举报?谁?”
张远转过来,看着沈予安。他的眼神很复杂——有疲惫,有警惕,还有一种沈予安无法解读的东西。
“我不知道。但予安,我需要你做一件事。”
“什么事?”
“写一份报告。关于菩萨变量的。客观、专业、不带感情色彩。我会把这份报告提交给检查组。”
“你想让我揭露它?”
“我想让你——解释它。”
沈予安站起来。“张总,如果我写这份报告,赵鹤鸣的菩萨变量就会被公之于众。到时候,它要么被当作一个天才的工程方案被保留,要么被当作一个安全隐患被清除。这个决定不在我手里,也不在你手里。”
“我知道。”
“那你确定要我写?”
张远沉默了很长时间。窗外的海面上,一艘货轮缓缓驶过,汽笛声低沉而悠远。
“予安,“他终于说,“我四十三岁了。在这个行业里待了快二十年。我见过太多系统——交易系统、推荐系统、信贷系统、广告系统。所有的系统都在做同一件事:把人变成数字。然后对这些数字进行优化。优化效率,优化利润,优化一切可以被优化的东西。”
“但赵鹤鸣做了一件不同的事。他在被优化的数字里,藏了一点无法被优化的东西。一点人性的余温。我不知道它是对还是错。但我知道,如果检查组发现了它而我没有提前说明,那它就会被当作恶意代码来处理。所以我需要你的报告——不是为了暴露它,而是为了保护它。”
“但愿如此,“沈予安说。
六、周海平
周海平五十一岁,头发花白,穿一件深蓝色的夹克,看起来像一个普通的政府工作人员。但他说话的方式让沈予安想起了她的博士生导师——每一句话都精准,每一个问题都指向一个你不想回答的角落。
检查进行了三天。周海平和他的团队审查了”天衡”系统的全部架构文档、训练数据、模型参数和决策日志。沈予安在第二天被叫去接受问询。
问询在一间没有窗户的会议室里进行。周海平坐在桌子对面,旁边是一个年轻的记录员。沈予安坐在另一边,手心里全是汗。
“沈工,“周海平翻开一个文件夹,“你在三周前向公司提交了一份关于异常参数B-0x7F2A的技术报告。这份报告是你主动写的,还是被要求写的?”
“被要求的。CTO张远要求我写的。”
“报告中说,这个参数是由一位已离职的工程师赵鹤鸣在系统中嵌入的。你确认这个结论吗?”
“确认。我追踪了代码的来源和硬件的证据链。”
“赵鹤鸣嵌入这个参数的目的是什么?”
沈予安犹豫了一秒钟。“根据他留下的文档,他的目的是——在系统的决策边界上制造一个微小的偏移,以提高处于边缘状态的申请人获得贷款的概率。”
“通俗地说?”
“通俗地说,他想让那些刚好卡在及格线上的人更容易通过审批。”
“这会影响系统的整体风险指标吗?”
“根据我的分析,不会。B-0x7F2A的扰动幅度被限制在0.0012以下,对整体违约率的影响小于0.02%。在统计意义上可以忽略。”
周海平点了点头。他翻过一页,露出了一张打印出来的图表。
“这是’天衡’系统过去一年的审批数据。我们做了一个交叉分析。B-0x7F2A出现的89次中,有87次对应的申请人的年收入低于15万元。这个比例显著高于系统整体的申请人收入分布。也就是说,这个参数——你的菩萨变量——并不是随机出现的。它有选择性地帮助了低收入群体。”
“是的,“沈予安说,“这与赵鹤鸣的设计意图一致。”
“沈工,你知道这种行为在法律上怎么定性吗?”
沈予安的心跳加速了。“我不确定。”
“我来告诉你,“周海平的声音不重,但每个字都像一颗钉子,“从技术角度看,这是一种未授权的代码修改。从业人员的职业伦理角度看,它违反了风控模型的中立性原则。从监管角度看——它可能构成’算法歧视’。”
“歧视?“沈予安忍不住说,“它是在帮助低收入群体,不是歧视他们。”
“对低收入群体的’优待’,本质上就是对其他群体的’歧视’,“周海平说,“如果两个申请人条件相同,一个因为菩萨变量被批准,另一个因为没有被拒绝——你告诉我,这公平吗?”
沈予安张了张嘴,没有说出话来。
她想到了一个问题——一个她从来没有想过的问题。菩萨变量帮助的89个人,是不是意味着有89个本该被批准的人被挤掉了?不是的。她检查过数据。B-0x7F2A的扰动并没有改变其他申请人的审批结果——它只是让系统的决策边界稍微柔软了一些。89个人通过了,并不意味着89个人被拒绝了。系统有足够的资金池来覆盖这些额外的贷款。
但周海平的逻辑是正确的——从规则的角度看,任何系统性的偏差都是偏差,不管它的方向是什么。
“我理解你的观点,“沈予安说,“但我想提出另一个角度。‘天衡’系统本身的训练数据就存在偏差——它基于历史信贷数据训练,而历史信贷数据本身就包含了社会结构性的不平等。低收入群体、老年人、流动人口在信用体系中的数据天然就比高收入群体稀疏。系统在这个基础上做出的’中立’决策,本质上就不是中立的。菩萨变量只是在一定程度上——极其有限的程度——修正了这个偏差。”
周海平看了她很久。他的表情没有变,但目光里的温度似乎降低了一些。
“沈工,你是一个优秀的工程师,“他说,“但你是工程师,不是立法者。我们能做什么和我们应该做什么,是两个不同的问题。”
问询结束后,沈予安走出会议室,发现走廊里站着一个她不认识的人。一个年轻女人,大约三十岁,穿着一件白色衬衫,手里拿着一个牛皮纸信封。
“沈予安?“女人问。
“你是?”
“我叫林之遥。财经记者。《深潮》周刊的。”
沈予安后退了一步。“我不接受采访。”
“我不是来采访你的,“林之遥说,“我是来告诉你一些事情。关于赵鹤鸣的。“
七、赵鹤鸣
林之遥在一家安静的咖啡馆里见到了沈予安。咖啡馆在南山区的蛇口,一栋被爬山虎覆盖的旧楼的一层。室内的灯光是暖黄色的,墙上挂着几幅黑白照片——蛇口旧时的码头、渔船、穿着喇叭裤的年轻人。
“赵鹤鸣是我的大学同学,“林之遥说,“我们都是浙大计算机系08级的。毕业后他去了百度,后来跳到鲲鹏数科。我一直做记者,跑科技口。他离职的事,是我最早知道的。”
“他为什么离职?“沈予安问。
林之遥从信封里抽出几张纸。是一份医疗记录的复印件。
“赵鹤鸣在2023年被确诊了渐冻症——肌萎缩侧索硬化症。你知道这个病吗?”
沈予安的脸色变了一下。“知道。”
“他在确诊之后,又在公司待了八个月。这八个月里,他做了两件事。第一件,是完成了’天衡’系统V2.0的核心重构。第二件,就是写入了菩萨变量。”
林之遥把医疗记录推到沈予安面前。“你看这个日期——2023年3月14日确诊。菩萨变量的创建日期是2023年9月2日。中间不到半年。”
沈予安看着那份医疗记录。上面的名字确实是赵鹤鸣,身份证号也对得上。病情描述一栏的字迹很工整,像医生的笔迹里难得一见的认真。
“他现在人在哪里?“沈予安问。
“在家。他老家在浙江丽水的一个小镇上。他妈妈在照顾他。“林之遥的声音轻了一些,“他已经不能说话了。手也基本不能动了。但他还能用眼动仪打字。上个月他给我发了一条消息——‘菩萨还在吗?’”
沈予安的眼睛突然有些发热。她低下头,喝了一口咖啡,咖啡已经凉了。
“在,“她说,“菩萨还在。”
“那就好,“林之遥说,“他一定会很高兴。”
“但不知道还能在多久,“沈予安说,“银保监会在查。可能会被清除。”
林之遥沉默了一会儿。“我知道。这也是我找你的原因。我想写一篇报道。关于菩萨变量的。不是为了曝光,而是为了——”
“为了什么?”
“为了让人们知道,在所有的算法和数据和模型背后,有一个渐冻症患者用他最后的力气,在代码里写了一行慈悲。”
沈予安闭上眼睛。
窗外的蛇口老街在下午的阳光下显得格外宁静。一棵老榕树的根须从人行道的砖缝里钻出来,像老人青筋暴露的手。树下有几个下棋的老人,棋子落在棋盘上的声音清脆而规律,像一种古老的计时方式。
“你让我想想,“沈予安说。
八、夜
那天晚上,沈予安失眠了。
她躺在南山区的出租屋里,天花板上有一道裂缝,不知道什么时候出现的。她盯着那道裂缝,脑子里翻来覆去地想同一件事——菩萨变量到底应不应该存在。
从工程角度看,它是一个未授权的代码修改。它违反了所有的开发规范和安全协议。如果它被恶意修改,后果可能很严重。
但从人性的角度看——
她想起了王桂花。那个52岁的女人,在饭馆里忙碌的身影,镶金的门牙,和她说”你说巧不巧”时的笑容。如果菩萨变量被清除,下一个王桂花还能借到钱吗?
她又想起了赵鹤鸣。一个素未谋面的人。渐冻症患者,已经不能说话了,手也不能动了,但他用眼动仪给记者发了一条消息:“菩萨还在吗?”
菩萨还在吗?
沈予安翻身拿起手机,打开了一个她很少打开的APP——鲲鹏数科的内部代码仓库。她搜索了赵鹤鸣的名字,找到了他在公司最后一年提交的所有代码。
一共1473次提交。沈予安从第一次开始看。
赵鹤鸣的代码写得很好——简洁、清晰、注释充分。他的提交信息从来不是”fix bug”或”update”这种敷衍的东西,而是一句完整的话:“修复了特征工程模块中连续变量离散化时的边界溢出问题,影响范围:信贷评分子模型。”
沈予安看了三个小时,从第1次提交看到了第1471次。第1472次和第1473次是菩萨变量的提交。
第1472次的提交信息是:“一切有为法。”
第1473次的提交信息是:“如梦幻泡影。”
沈予安盯着这两行字,突然感到一种无法形容的悲伤。不是因为菩萨变量,不是因为赵鹤鸣,而是因为她意识到——在这个用代码构建的世界里,一个人用他最后的力气做了什么,几乎没有人会知道。代码不会记住谁写了它。系统不会感激创造它的人。菩萨变量每天运行无数次,帮助无数人,但没有人知道它的存在——直到一个偶然的发现,一次执着的追踪,才让它在黑暗中露出了一丝光。
她的手机震动了。是一条来自林之遥的消息。
“想好了吗?”
沈予安打了几个字,又删掉了。她放下手机,闭上眼睛。
天花板上那道裂缝在她脑海里变成了一个形状——像一条河流,蜿蜒曲折,从一端流向另一端,不知道起点在哪里,也不知道终点在哪里。
凌晨四点,她做出了决定。
九、报告
沈予安用了三天时间写完了报告。
她写了两份。
第一份是给张远的——技术报告,二十三页,详细描述了B-0x7F2A的技术特征、来源追溯、影响分析和风险评估。报告的结论是:菩萨变量对系统整体风险指标的影响可以忽略不计,但它的存在违反了公司内部的代码管理规范和行业伦理准则。建议将其作为”特殊修正项”纳入正式的模型文档,并接受定期的外部审计。
第二份是她自己留的——不是技术报告,而是一封信。写给未来的自己的信。
“沈予安:
你今天做了一个决定。你选择把菩萨变量暴露在阳光下。你知道这意味着什么——它可能被保留,也可能被清除。你无法控制结果。
但你控制了过程。
你选择了诚实。你选择了让所有人看到真相——一个渐冻症患者在代码里藏了一行慈悲,一行微小的、几乎不可见的慈悲。
不管结局如何,你做了正确的事。
记住王桂花。记住赵鹤鸣。记住那个凌晨三点的暴雨夜,你第一次看到B-0x7F2A时的感觉——不是困惑,不是恐惧,而是一种奇异的温暖。
像是有人在你背后,轻轻推了一把。
沈予安 2026年5月22日凌晨四点”
她把信保存在一个加密文件夹里,密码是她妈妈的生日。
十、结局
一个月后,银保监会的检查结束了。
检查组的结论是:鲲鹏数科的”天衡”系统存在一项未授权的代码修改(B-0x7F2A),该修改未对系统的整体风险指标造成显著影响,但违反了《金融科技伦理指引》第十七条关于”算法透明性”的规定。鲲鹏数科被处以警告处分,并被要求在三个月内完成整改。
整改的意思是:清除菩萨变量。
张远在全体技术大会上宣布了这个决定。他没有用”清除”这个词。他说的是”规范化”——“我们将把所有非标准参数纳入正式的模型文档,并建立更严格的代码审查机制。”
沈予安坐在后排,听着这些话,觉得它们像一层精致的糖衣,包裹着一颗苦涩的药丸。
菩萨变量被清除了。不是被删除,而是被”替换”——张远让团队开发了一个新的模块,叫做”社会公平性修正因子”。它的功能和菩萨变量几乎一模一样——在决策边界上制造微小的偏移,帮助边缘状态的申请人。但它是被正式批准的、文档化的、可审计的。
“技术上是同样的效果,“张远私下对沈予安说,“但合规了。”
“合规了,“沈予安重复了一遍。
“你不满意?”
“我满意,“她说,“但我想问一个问题。”
“问。”
“如果没有菩萨变量,你会想到做这个社会公平性修正因子吗?”
张远沉默了很久。
“不会,“他最终说。
沈予安点了点头。她站起来,走到窗前。深圳湾的海面在阳光下闪烁着,像无数碎金。
“菩萨被清除了,“她说,“但菩萨存在过。这就够了。”
张远没有说话。
沈予安回到自己的工位,打开电脑,在代码仓库里找到了赵鹤鸣的最后两次提交。它们的状态已经被标记为”deprecated”——废弃。但在提交历史里,它们仍然存在,像两颗琥珀里的虫子,被封存在时间的透明介质中。
“一切有为法。”
“如梦幻泡影。”
沈予安盯着这两行字,突然笑了一下。不是苦笑,也不是释然的笑,而是一种——她不知道怎么形容——像是在一个巨大的、冰冷的、由数据和算法构成的建筑里,找到了一扇小小的窗。窗外有风,有光,有她看不见但知道存在的东西。
她拿起手机,给林之遥发了一条消息:“写吧。把他的故事写出来。”
然后她打开了一个新的文档,开始写代码。
不是菩萨变量。是一种新的东西——一个提案。提案的名字叫”数字普惠修正协议”,内容是在”天衡”系统的评估模型中加入一个维度:申请人的”脆弱性指数”。这个指数不基于社交媒体或传感器数据,而是基于一个更朴素的标准——如果这笔贷款被拒绝,申请人的生活会受到多大的影响。
这个提案在两个月后被提交给了公司的产品委员会。又过了一个月,它被批准了。
林之遥的报道在那年秋天发表。标题是《代码里的菩萨》。文章很长,一万多字,从赵鹤鸣的大学生涯写起,写到他在鲲鹏数科的工作,写到他的确诊、菩萨变量的诞生、沈予安的发现、银保监会的检查、菩萨变量的清除和重生。
文章发表的那天,沈予安把报纸——是的,林之遥坚持在纸质版上也有——翻到了那篇文章所在的版面,仔仔细细地读了一遍。然后她把报纸折好,放进一个牛皮纸信封里。
周末,她坐高铁去了浙江丽水。
赵鹤鸣的家在丽水郊外的一个小镇上。白墙灰瓦的老房子,门前有一棵枣树,五月正是枣花开放的时节,空气里弥漫着一种清甜的气味。
赵鹤鸣的妈妈开的门。一个六十多岁的女人,头发全白了,但眼睛还很亮。她看到沈予安,没有问是谁,只是说:“你是予安吧?鹤鸣跟我提过你。”
“他……提过我?”
“他一直关注公司的消息。他说,一定会有人发现那个东西的。他说,希望发现它的人是一个好人。”
沈予安的鼻子一酸。
赵鹤鸣躺在床上,瘦得只剩一把骨头。他的眼睛还是活的——清澈、明亮,像两颗被擦得发亮的黑色玻璃珠。他的嘴唇微微动了动,但发不出声音。
沈予安在床边坐下来,把牛皮纸信封放在他的枕头旁边。
“赵哥,“她说,声音有点哑,“我来看看你。还有——你的菩萨,它不在了。但有人写了一篇文章,让所有人都知道了它。还有,公司做了一个新的东西,和你的菩萨做的事情差不多。所以——”
她顿了一下,把眼眶里的东西眨回去。
“所以你的慈悲没有白费。它变了形状,但它还在。”
赵鹤鸣的眼睛看着她。然后,他的目光移向枕头旁边的信封。沈予安打开信封,把那份报纸取出来,展开在他面前。
赵鹤鸣的目光落在标题上——《代码里的菩萨》。他看了很久。然后他的眼角滑下一滴泪。
沈予安伸出手,帮他把那滴泪擦掉了。
窗外的枣花在风里轻轻摇晃,像无数细小的金色铃铛,发出无声的声响。午后的阳光透过窗棂,在地板上画出规则的格子。在这个安静得近乎神圣的时刻,沈予安突然理解了一件事——
菩萨不在代码里。菩萨不在算法里。菩萨不在任何一行可以被审查、被清除、被替换的代码里。
菩萨在一个渐冻症患者用最后的力气写下的两行提交信息里。在一个52岁的女人在深夜的饭馆里默默祈祷的瞬间里。在一个工程师在凌晨三点发现了一个异常变量后没有选择忽略的决定里。
菩萨是人在面对系统时,选择做一个人的那一瞬间。
沈予安站起来,走到门口。赵鹤鸣的妈妈握着她的手,送她到枣树下。
“谢谢你,“老人说。
“该说谢谢的是我,“沈予安说。
她走出院子,回头看了一眼。赵鹤鸣的窗户在阳光下闪着光,像一只温柔的眼睛,注视着这个世界——这个世界依然充满了算法和数据、信用评分和风控模型、合规和审计。但在这个世界的某个角落,在那些被数字遗忘的人群中间,有一根极细的丝线在闪闪发光。
那是赵鹤鸣的慈悲。那是所有人的慈悲。
那是菩萨的抽丝。
尾声
2026年冬天,沈予安在GitHub上创建了一个开源项目,名字叫”Bodhisattva”(菩萨)。项目的描述只有一句话:“一个用于在信贷系统中实现社会公平性修正的轻量级框架。”
代码的第一行是一个注释:
// 为了赵鹤鸣,和所有在数字洪流中被遗忘的人。
项目上线第一周,收到了347个star。
没有人知道为什么。但每个点star的人,都觉得这个名字——Bodhisattva——有一种奇异的温暖。像是冬天的阳光照在脸上,不热,但你知道它在那里。
远远地,温柔地,在那里。
(全文完)