第 21 章

算法伦理

投影仪的风扇声比空调还响。

林砚坐在长桌靠窗的位置,右手边那杯咖啡是九点二十倒的,现在十点零六,表面结了一层油膜,颜色从栗色沉成铁锈。他端起来试了一口,酸味挂在舌根,像含着一枚生锈的硬币。他放下杯子,杯底和桌面接触时发出一声轻响,在会议室里弹了一下,但没人抬头。

项目经理姓廖,三十出头,穿一件深灰polo衫,领子立着,袖口有公司logo的刺绣。他站在投影幕布前,手里捏着翻页笔,正讲到第三十七页。屏幕上是一张变量权重表,Excel截图的样式,蓝色表头、白色单元格、红色标注。

“各位,这是我们初版模型跑出来的结果,变量权重经过三轮迭代,已经收敛。”廖经理用翻页笔点了点屏幕,“第一梯队变量一共六个,占整体预测力的百分之七十八。”

林砚的目光从第一行往下扫。年龄差、收入比、教育匹配度、原生家庭结构、地域流动性——这些他都在论文里见过。第五行是“共同社交网络密度”,第六行是“冲突解决模式评分”。都正常。他的视线停在第七行。

付费意愿。

权重:0.30。

林砚盯着那个数字看了很久。百分之三十。在六个第一梯队变量里排第二,仅次于“冲突解决模式评分”的0.34。比年龄差、比收入比、比教育匹配度都高。换句话说,在这套算法里,一个人愿不愿意为婚恋服务付费,比他跟伴侣的收入差距、教育差距、年龄差距,更能预测这段婚姻能不能撑下去。

投影仪的光打在白墙上,把那些数字照得发亮。林砚觉得那些数字像是活的,在屏幕上微微跳动。

“廖经理。”他开口了。

会议室里七八个人同时转过头来。廖经理的翻页笔停在半空,眉毛抬了一下,随即露出一个标准的笑:“林教授,您说。”

“付费意愿这个变量,是怎么进来的?”

“数据挖掘的结果。”廖经理把翻页笔往桌上一搁,双手撑住桌沿,身体微微前倾,“我们跑了三百万条用户行为数据,付费意愿和婚姻存续时长的相关系数是0.41,显著性p值小于0.001,统计上非常显著。”

“统计显著不代表因果显著。”林砚说,“付费意愿高的人可能本身收入更高,或者对婚姻更认真,你控制这些变量了吗?”

“控制了。”廖经理点了一下翻页笔,屏幕切到下一页,一张回归分析表,“在控制收入、教育、年龄之后,付费意愿的偏相关系数仍然有0.28。林教授,数据不会说谎。”

最后四个字他说得很轻,但会议室太安静了,每个字都落得很清楚。

林砚把咖啡杯推到一边,手指在桌面上无意识地敲了两下。他想起自己那篇关于婚姻稳定性的论文,里面用的变量全是结构性的——经济、制度、社会网络。没有一个变量是“付费意愿”。因为他从来没想过,一个人愿不愿意花钱,可以成为婚姻能不能存续的预测指标。

“这个变量的业务逻辑是什么?”他问。

“很简单。”廖经理直起身,走到白板前,拿起马克笔,画了一个三角形,“婚姻稳定性的本质是什么?是投入。经济学里讲沉没成本,一个人在一段关系里投入得越多,越不容易退出。付费意愿就是这个投入的代理变量。愿意为婚恋服务付费的人,说明他重视婚姻,愿意为婚姻投入资源。这样的人,婚姻当然更稳定。”

“那不愿意付费的人呢?”

“不愿意付费的人,说明他对婚姻的投入意愿低,稳定性自然差。”廖经理把马克笔帽盖上,咔嗒一声,“这不是道德判断,林教授,这是统计事实。”

林砚看着白板上那个三角形。三条边分别写着“投入”“承诺”“稳定”。一个完美的闭环。逻辑自洽,数据支持,商业上无懈可击。但他胃里有什么东西在翻搅,像那杯冷掉的咖啡。

“廖经理,”他说,“你刚才说付费意愿是投入的代理变量。那我想问,一个人愿意为婚姻投入多少,跟他有没有钱,是两回事。一个月收入三千的人,花五百块买婚恋服务,占收入六分之一,他的付费意愿很高。一个月收入三万的人,花五百块,占收入六十分之一,他的付费意愿很低。但你能说前者比后者更重视婚姻吗?”

会议室里有人轻轻咳了一声。廖经理的笑容没变,但嘴角的弧度收紧了半寸。

“林教授,这个问题我们在模型里已经处理了。付费意愿是标准化之后的变量,不是绝对金额。我们看的是相对付费意愿,不是绝对付费金额。”

“标准化解决的是量纲问题,不是逻辑问题。”林砚的声音不高,但每一个字都咬得很清楚,“一个穷人愿意花六分之一的收入买服务,和一个富人愿意花六十分之一,你把他们标准化到同一个尺度上,然后说他们‘付费意愿’相同。这本身就是在用收入水平偷换投入意愿。”

廖经理沉默了两秒。投影仪的风扇声在沉默里变得格外响。

“林教授,”他终于开口,语气里多了一层薄薄的东西,像冬天窗户上结的霜,“我理解您的学术关切。但我想提醒您,这个项目的目标不是写论文。我们的目标是为用户提供婚姻稳定性预测服务。用户付费,我们提供服务,这是一个商业契约。付费意愿作为变量,反映的是用户对服务的真实需求强度。这跟道德无关。”

“那你们怎么跟用户解释?”林砚问,“如果一个用户被算法判定为‘低稳定性’,原因是他不愿意花钱买你们的服务——你们怎么解释这个逻辑?”

“我们不需要解释。”廖经理说,“算法是黑箱。”

这四个字落在桌面上,像一块石头沉进水里。没有人接话。

林砚转头看了一眼窗外。上海的十月,梧桐叶子黄了一半,在风里翻来翻去。楼下有个外卖员正在锁电动车,动作很快,锁完就跑进写字楼。他想起陈禾那天在电话里说的话,声音很平静,但每个字都像用指甲刻在桌面上:“你算的是概率,我数的是人。”

“我不同意把付费意愿放在核心变量里。”林砚说。

廖经理看着他,笑容终于淡了。他走到会议桌的另一端,拿起一份文件,翻到某一页,走回来放在林砚面前。

“林教授,这是您签的顾问协议,第十二条第三款。”他的手指点在纸面上,“您作为首席学术顾问,对算法变量选择有建议权,但最终决定权归项目组。协议里写得很清楚。”

林砚低头看那行字。五号宋体,行间距一点五倍,他签名的那个位置还留着蓝色圆珠笔的压痕。那天他签的时候,刚拿到项目启动经费的通知,脑子里想的是“终于可以做点实际的东西了”。他没仔细看第十二条第三款。

“如果我不认可这个变量呢?”他问。

“您可以书面提出异议,项目组会记录在案。”廖经理把文件收回去,“但算法会按原计划上线。林教授,您是学者,您应该明白,数据有它自己的逻辑。您可以用理论去解释数据,但不能用理论去否定数据。”

林砚靠回椅背。椅背是网面的,硌着他的肩胛骨。他想起很多年前,在禾坪村做田野调查,一个老农跟他说:“你们读书人总想搞清楚为什么,我们种地的只想知道怎么办。”他当时觉得老农的话太实用主义。现在他坐在这间会议室里,忽然觉得那个老农比他清醒。

“我保留意见。”他说。

“当然。”廖经理点头,翻页笔一按,屏幕切到下一页,“我们继续。”

会议又开了四十分钟。后面讲了什么,林砚几乎没听进去。他只记得廖经理说了三次“数据不会说谎”,两次“这是商业决策”,一次“林教授您放心”。他的咖啡彻底凉透了,表面那层油膜裂成几块,像干涸的湖底。

散会的时候,其他人陆续往外走,有人跟他点头,有人没看他。廖经理走到门口,回头说:“林教授,下周算法封版,您要是有什么书面意见,周四之前发我邮箱。”

门关上了。

林砚一个人坐在会议室里。投影仪已经关了,幕布卷回去,露出后面白墙上一块长方形的浅色印子,像一块褪色的伤疤。空调还在吹,冷风从头顶灌下来,吹得他后颈发紧。他把那杯冷咖啡端起来,走到角落的饮水机旁倒掉。褐色的液体打着旋流进下水口,留下一圈渍。

他站在饮水机前,手撑着台面,低着头。饮水机发出咕噜一声,像什么东西在打嗝。

他想给陈禾打电话。手机掏出来,翻到通讯录,她的名字排在很前面。拇指悬在拨号键上,停了五秒,又锁了屏。他能说什么?说他在一个商业项目里发现了一个变量,这个变量让他不舒服,但他签了合同所以他走不了?陈禾会说什么?她大概会说:“你早就该知道。”

他走出会议室,沿着走廊往电梯间走。走廊很长,两边是玻璃隔断的办公室,里面的人对着屏幕敲键盘,没人抬头。他经过一间会议室,玻璃墙上贴着白纸,上面打印着“用户增长周会”。再经过一间,白板上画着漏斗图,最上面写着“注册→付费→留存→推荐”。他走得很快,皮鞋跟敲在灰色地砖上,发出规律的嗒嗒声。

电梯来了。他走进去,按了一楼。电梯门合上,不锈钢门板映出他的影子,领带歪了,衬衫第三颗扣子没扣。他伸手把扣子扣上,手指碰到喉结,喉结动了一下。

电梯下到一楼,门打开,大厅里人来人往。前台后面的墙上挂着一块巨大的LED屏,正在循环播放公司宣传片。画面里一对年轻男女在咖啡馆相遇,笑容灿烂,然后屏幕出现一行字:“缘算——用数据找到对的人。”再切到一对中年夫妻在厨房做饭,字幕:“缘算——用科学守护你的婚姻。”

林砚站在屏幕前看了十秒。宣传片里的每一个人都在笑。他忽然想起陈禾发来的那张截图。凌晨三点,民政局门口,排队离婚的人裹着羽绒服,有人蹲在地上,有人靠在墙上,没有一个人在笑。那张截图他只看了一眼就关掉了,但此刻它又浮上来,和眼前这些笑脸叠在一起。

他走出大楼。十月的风灌进领口,带着一点桂花将谢未谢的甜腻。他站在台阶上,掏出手机,翻到陈禾的微信对话框。最后一条消息是三天前,她发来的那张截图,下面跟着一行字:“报告交了。等。”

他打了几个字:“算法封版前,我想跟你聊聊。”想了想,又删了。重新打:“付费意愿被列为核心变量了。”又删了。最后他锁了屏,把手机揣进口袋,走下台阶,汇入南京西路的人流。

回到社科院办公室已经是下午两点。他关上门,拉上窗帘,只留了台灯。电脑屏幕亮着,他打开项目共享盘,找到算法变量表。付费意愿,权重0.30,排在第二。他盯着那个数字,然后打开自己的论文文件夹,翻到那篇关于婚姻稳定性的论文。表三里列了十七个变量,没有一个跟付费有关。

他把两个表格并排放在屏幕上。左边是他的论文变量表,右边是缘算的算法变量表。左边全是结构性的——收入、教育、地域、家庭结构、社会网络。右边除了这些,还有付费意愿、APP使用时长、消息回复速度、朋友圈互动频率。右边多出来的那些,全是行为数据。

他往后靠在椅背上,椅子发出嘎吱一声。他想起方若谷说过的话。去年秋天,在上海交大旁边那家咖啡馆,方若谷用她一贯轻快的语气说:“林教授,你的灰度思维可以量化。欲望、结构、资源——三个维度,十二个指标,我都能给你做出来。”他当时笑了笑,没接话。现在他想,如果方若谷来做这个算法,她会把付费意愿放在哪个维度?欲望?资源?还是单独开一个维度叫“商业价值”?

他打开邮箱,开始写邮件。收件人是廖经理,主题是“关于付费意愿变量的书面意见”。他写了三行,删了。又写了五行,又删了。最后他写了一段话:“建议将付费意愿从核心变量降为辅助变量,理由如下:一、该变量与收入水平存在内生性;二、该变量反映的是用户对商业服务的需求强度,而非对婚姻的投入意愿;三、该变量可能产生逆向选择,即算法可能系统性歧视低收入群体。”

他盯着这段话看了很久,然后点了保存草稿。没有发送。

他关掉邮箱,打开手机。陈禾的对话框还停在三天前。他打了一行字:“我今天在算法里看到一个变量,付费意愿,权重百分之三十。”发出去之后,他把手机扣在桌上,屏幕朝下。

过了大概十分钟,手机震了一下。他翻过来看,陈禾回了四个字:“你签了。”

不是问句。

林砚看着那三个字,拇指在屏幕上停着。他想回“是”,又想回“我当时没注意”,还想回“现在说这些有什么用”。最后他打了一行:“报告交上去之后,有回音吗?”

陈禾回得很快:“没有。”

两个字。像一扇门关上的声音。

他放下手机,走到窗边,把窗帘拉开一条缝。外面天色暗了,梧桐叶子在路灯下泛着黄。楼下的便利店亮着灯,有人进去又出来,手里拎着塑料袋。他想起很多年前在禾坪村,晚上跟陈禾坐在村口的石头上,她跟他说:“你看这些人家,灯亮着,说明有人。灯灭着,说明没人。但灯亮着的人家里,有多少是真的有人,有多少只是留了一盏灯?”

他当时没回答。现在他站在办公室窗前,看着对面居民楼亮起的灯,一格一格的,像Excel表格里的单元格。他不知道那些亮着灯的窗户后面,有多少是“事实离婚”的夫妻,有多少是“付费意愿”高的用户,有多少是算法判定为“稳定”的婚姻。

他拉上窗帘,回到桌前,把台灯关了。办公室暗下来,只有电脑屏幕亮着,上面是两个并排的表格。左边是他的论文,右边是缘算的算法。他看了最后一眼,按下电源键。屏幕黑了。

黑暗中,他坐在椅子上,手放在键盘上,键盘是凉的。窗外有车驶过,车灯在天花板上划了一道弧线,然后消失。他想起陈禾那句“你算的是概率,我数的是人”,想起廖经理那句“数据不会说谎”,想起方若谷那句“我都能给你做出来”。三句话在脑子里转,像三个齿轮,咬合不上,各转各的。

他站起来,摸黑走到门口,手碰到门把手,金属的凉意从掌心传上来。他没有开门,只是站在那里,额头抵着门板。门板是木头的,有油漆味,混着走廊里飘进来的消毒水味。

合同已签。代码已写。

他还能回头吗?

手机在桌上又震了一下。他没有转身去拿。震动停了,办公室彻底安静下来,只剩下空调出风口的嗡鸣,像一台老式冰箱在厨房角落里独自运转。

他推开会议室玻璃门的时候,投影仪已经亮了。长条会议桌两侧坐了七个人,缘算那边来了四个,除了市场总监方琳,还有两个工程师和一个产品经理,剩下三个是社科院这边参与项目的同事。空气里弥漫着空调冷气混杂着速溶咖啡的气味,投影仪风扇发出细密的嗡鸣,像一只困在盒子里的大号苍蝇。

“林老师,坐。”方琳抬手示意了一下,没抬头,正用翻页笔在投影屏上圈出一行数字,“我们继续。”

林砚在长桌末端坐下。他面前的桌面上放着一杯没开封的矿泉水,瓶壁上凝着一层薄薄的水雾。他拧开瓶盖,喝了一口,水是常温的,塑料味很重。旁边同事的咖啡杯已经空了,杯底残留着一圈深褐色的渍痕,冷却后的酸涩味若有若无地飘过来。

投影屏上是一张变量权重表。

第一列是变量名称,第二列是权重系数,第三列是数据来源。表格顶端用加粗黑体写着“婚姻稳定性预测模型 V3.2 变量清单”。林砚的目光从第一行往下扫,扫到第七行时,手指无意识地捏紧了矿泉水瓶。

“用户付费意愿”——权重0.31。

排第三。仅次于“共同居住时长”(0.38)和“冲突频次”(0.35),高于“教育背景匹配度”(0.12)和“家庭收入比值”(0.09)。

林砚盯着这个数字看了很久。0.31,意味着在算法判断一对夫妻婚姻是否稳定时,“用户付费意愿”的贡献度将近三分之一。一个商业指标,和“共同居住时长”坐在同一张桌子上,比“教育背景匹配度”重要两倍多。

“廖经理。”林砚开口了。

廖明远正在讲模型在测试集上的AUC值,听到声音停下来,转过头看他。廖明远四十出头,戴一副细框眼镜,衬衫袖口挽到小臂中段,露出银色表带,整个人收拾得干净利落。他笑了一下:“林老师有什么问题?”

“付费意愿这个变量。”林砚指了指投影屏,“权重0.31,依据是什么?”

会议室安静了一瞬。投影仪的风扇声忽然变得很响。

廖明远把翻页笔放在桌上,双手交叉搁在桌面,身体微微前倾:“这是基于历史数据的特征筛选结果。我们在缘算平台过去三年的用户行为数据上跑了LASSO回归,付费意愿——准确说是‘主动续费意愿’——对婚姻稳定性的预测贡献度确实排在前三。”

“你用的是付费用户的续费行为。”林砚说。

“对,付费用户。”

“那非付费用户呢?”

方琳顿了一下。产品经理在旁边插话:“非付费用户我们没有足够的数据,他们的行为轨迹不完整——”

“所以这个变量本质上只对已经付费的人有效。”林砚转向产品经理,“换句话说,算法在预测‘付费用户’的婚姻稳定性时,付费意愿当然是一个显著变量。因为他们已经付费了。这是一个选择偏差。”

廖明远笑了一下,那种笑让林砚想起学术答辩时遇到的评委——礼貌,但带着“你还没完全理解游戏规则”的意味。他把翻页笔重新拿起来,在屏幕上点了一下,切换到另一张幻灯片。

“林老师,你的担心我理解。但你看这里。”他用笔尖在投影上画了个圈,那里是一组对比数据,“在付费用户群体内部,付费意愿高的用户,婚姻稳定率确实高于付费意愿低的用户。这个差异是统计显著的。数据不会说谎。”

“数据不会说谎,但数据会选择性呈现。”林砚把矿泉水瓶放在桌上,瓶底磕在桌面,发出清脆的一声,“你只看了付费用户,非付费用户从这个变量里消失了。而恰恰是那些婚姻最不稳定、最需要干预的人,根本不会付费。”

会议室里的空气凝住了。空调出风口正对着林砚的后颈吹,冷气顺着衣领灌进去,他打了个寒颤。

廖明远没有接话。他沉默了大约五秒,这五秒里他的目光从林砚脸上移到投影屏,又移回来。然后他把翻页笔放下,拉了把椅子坐下,姿态从演示者变成了谈判者。

“林老师,合同里写得很清楚。”他的声音平稳,“我们委托社科院团队做的是‘算法伦理框架下的变量有效性评估’,不是‘变量选择决策’。变量清单是我们基于商业逻辑和数据可得性确定的,你们的工作是评估这些变量的伦理风险,不是替换它们。”

他从公文包里抽出一份文件,翻到第三页,推过来。林砚低头看,那是合同的附件二,服务范围界定。第三条第二款:“乙方(社科院团队)负责对甲方(缘算)提供的变量体系进行伦理风险识别与评估,不参与变量选择与权重设计。”

林砚的签名在最后一页。

他记得签这份合同的那天。缘算的办公室在CBD一栋写字楼的二十七层,落地窗外能看到整个城市的轮廓线。廖明远给他倒了一杯手冲咖啡,咖啡豆是埃塞俄比亚的耶加雪菲,有柑橘和茉莉的香气。他喝了一口,觉得好喝,然后翻了翻合同,在最后一页签了名。他当时想的是,算法需要伦理框架,这是他的学术使命。至于变量选择,那是技术问题,他不该越界。

现在他坐在这间会议室里,看着投影屏上“用户付费意愿”那几个字,忽然意识到,“不参与变量选择”这个条款,本质上等于“不参与价值选择”。而任何算法,说到底都是在做价值选择。

“廖经理,我理解合同条款。”林砚说,声音比他预想的要低,“但我想指出一点。付费意愿作为婚姻稳定性的预测变量,存在一个根本性的逻辑倒置。婚姻是否稳定,和用户是否愿意为算法付费,这是两件事。把它们放在同一个模型里,会让算法产生一个危险的倾向——”

“什么倾向?”

“算法会倾向于认为,付费意愿高的人婚姻更稳定。但真相可能是,婚姻更稳定的人更愿意付费,因为他们更愿意为‘维持婚姻’这件事投入资源。这是反向因果。如果把这个变量放进模型,算法在实际应用中会系统性地高估付费用户的婚姻稳定性,低估非付费用户的婚姻稳定性。最终结果就是,算法会优先服务那些本来就稳定的人,而忽略那些真正需要帮助的人。”

廖明远没有立刻回答。他看了林砚一会儿,然后转头对两个工程师说:“先记录一下林老师的意见,会后我们内部讨论。”

工程师点了点头,在笔记本电脑上敲了几个字。

“但今天的会议议程是确认变量体系通过伦理初筛。”廖明远站起来,重新拿起翻页笔,“林老师提出的问题我们会认真考虑,但需要走内部评估流程。目前,按照合同约定,变量清单维持现状。我们继续下一项。”

他切换了幻灯片。投影屏上出现新的表格,但林砚已经没在看了。

他的目光落在桌面上那瓶矿泉水上。瓶身上的水雾已经凝成了水珠,沿着瓶壁缓缓滚落,在桌面上洇出一小圈水渍。水渍的形状不规则,边缘正在慢慢向外扩散。他盯着那圈水渍,觉得它像什么——像一份签了名的合同上,慢慢洇开的墨迹。

会议又持续了四十分钟。林砚没有再发言。他坐在长桌末端,听着廖明远用平稳的语调讲完模型架构、测试指标、上线时间表,听着产品经理讲用户增长目标,听着工程师讲数据接口规范。空调的冷气一直吹着他的后颈,他把衬衫领子竖起来,但冷气还是往里钻。咖啡的酸涩味已经散尽了,会议室里只剩下投影仪风扇的嗡鸣和键盘敲击声。

散会的时候,廖明远走过来,拍了拍他的肩膀:“林老师,今天的意见很中肯。我们会认真研究。下周三之前给你反馈。”

他的手掌温热,拍在肩膀上很有力。林砚点了点头,没说话。廖明远转身走了,皮鞋踩在走廊地砖上,发出均匀的声响。林砚站在会议室门口,看着走廊尽头电梯间的指示灯从1跳到2,又跳到3。

他掏出手机看了一眼。陈禾在上午九点四十三分给他发了一条微信,只有一句话:“报告已经提交省民政厅了。等回复。”

消息下面是一张截图。截图上是一个政务App的预约界面,显示“离婚登记预约”栏目下,凌晨三点的号源已经排到了下个月。预约列表里密密麻麻的时间戳,从凌晨零点到五点,每隔十五分钟一个号,全部标红。截图右上角有一行小字:“当前排队人数:247人。”

林砚盯着这张截图看了很久。电梯间的指示灯又从3跳回1。他把手机锁屏,装进口袋,转身走回办公室。

办公室的门关着,走廊里很安静。他推开门,走到桌前坐下。电脑屏幕亮着,上面是他昨晚没关的论文文档。光标停在最后一行,那行字是:“婚姻稳定性的预测,本质上是对人类关系可计算性的一次极限测试。”

他盯着这行字,觉得它很陌生。

他打开缘算的项目共享盘,找到变量清单文件的在线版本。文件是共享编辑状态,他可以看到编辑历史。他点开版本记录,看到变量清单在过去两周更新了七次。他逐个版本点开对比,看到“用户付费意愿”这个变量是在第六版被加进去的,权重从最初试算的0.18调整到了0.31。编辑者是廖明远。编辑时间是三天前的凌晨一点零七分。

林砚靠在椅背上。椅背发出吱呀一声,在安静的办公室里格外清晰。窗外的阳光照进来,在桌面上投下一块长方形的光斑。光斑边缘正好切过他的键盘,把键盘分成明暗两半。他伸手在光斑里摸了一下,键盘表面被晒得温热,而暗处的那一半,还是凉的。

他拿起手机,翻到和陈禾的对话框。光标在输入框里闪烁。他打了几个字:“我看到变量清单了。”然后删掉。又打:“付费意愿被加了进去。”又删掉。最后他打了一行:“你说得对。”

发出去之后,他把手机扣在桌面上。屏幕朝下,看不到回复。

他重新面对电脑屏幕,打开变量清单文件。光标停在“用户付费意愿”那一行。他在备注栏里打了一行字:“建议移除。存在反向因果与选择偏差。”然后保存。文件右上角弹出一个提示:“已同步至云端。”他盯着那个提示看了几秒,然后关掉了文件。

但这行备注,廖明远会看到吗?看到了会改吗?

合同附件二第三条第二款像一堵墙,横在他和变量清单之间。他可以写备注,可以提意见,可以“评估伦理风险”,但他不能改。他签了字。签字的那个下午,CBD二十七楼的落地窗映着整个城市的轮廓,咖啡有柑橘和茉莉的香气,他觉得他签的是一份学术合作协议。

现在他知道了,他签的是一份授权书。授权别人用他的学术身份,为一个他无法控制的算法背书。

他打开抽屉,把合同翻出来。纸质合同一共二十四页,附件二在第十一页。他翻到那一页,看着第三条第二款那几行字。宋体,小四号,行距1.5倍。他拿起笔,在“不参与变量选择与权重设计”这几个字下面画了一道线。笔尖划过纸面,发出沙沙的声响。墨水渗进纸纤维,线条微微洇开。

他把合同合上,放回抽屉。抽屉关上的时候,金属滑轨发出沉闷的一声。

下午两点,他去食堂吃饭。食堂人不多,他打了一份西红柿炒鸡蛋和一份米饭,找了个靠窗的位置坐下。窗户外面是一棵银杏树,叶子还是绿的,但边缘已经泛起了一点黄。他吃了两口饭,觉得没什么味道,放下筷子,掏出手机。

陈禾回了一条消息:“你终于看到了。”

只有五个字。没有问号,没有感叹号。陈述句。像在说“天亮了”或者“下雨了”一样平静。

林砚盯着这五个字,打了很长一段话:“我提了反对意见,但被驳回了。合同里写了我不参与变量选择。我现在能做的只有写备注,走内部评估流程。这个流程可能要很久,也可能什么都不会改变。”

他还没发出去,陈禾又发来一条:“那张截图你看了吗?凌晨三点的号,排到两百四十七位。我提交的报告里附了这张图。民政厅那边说会‘研究’。”

林砚把打好的那段话删了。他重新打了一行:“你报告里的事实离婚数据,和算法要用的变量,本质上在说同一件事。”

“什么事?”

“制度在失效。但算法想用付费意愿来替代制度失效留下的空缺。用商业逻辑填补制度逻辑的漏洞。”

陈禾过了三分钟才回复:“你说得对。但填补的方式是把漏洞变成利润。”

林砚没有回复。他把手机放在餐盘旁边,继续吃饭。西红柿炒鸡蛋的汤汁渗进米饭里,把白色的米粒染成浅橙色。他用筷子把染色的米粒拨到一边,吃了几口白饭,又放下筷子。

食堂的电视开着,正在播午间新闻。声音不大,他听不太清,只看到画面里闪过一组数字,好像是关于什么统计数据的。他盯着屏幕看了一会儿,没看明白,低下头继续吃饭。

下午他回到办公室,打开论文文档。光标还在最后一行。他把那行字删了,重新打了一行:“可计算性是一个陷阱。有些东西不能被计算,不是因为它们太复杂,而是因为它们太重要。”

他盯着这行字,觉得也不对。又删了。最后他什么都没打,把文档关了。

他靠在椅背上,看着天花板。裂纹很细,像一根头发丝。他想起小时候在禾坪村老家,老屋的墙上也有这样一道裂纹。他父亲林守田每年春天都会用白水泥把裂纹补上,到了冬天,裂纹又裂开了。年年补,年年裂。他父亲说,房子老了,补不住的。

手机震了一下。他拿起来看,是廖明远在项目群里发了一条消息:“变量清单已通过伦理初筛。下周开始模型训练。请各位老师关注训练日志。”

下面有几个人回复了“收到”。

林砚看着这条消息,手指悬在键盘上方。他应该回复“收到”吗?他打了“收到”两个字,没有发出去。他把手机放下,站起来走到窗前。对面居民楼的窗户亮着,还是那些格子。下午的阳光照在玻璃上,反射出一片白晃晃的光。

他拉上窗帘,回到桌前,打开电脑。这次他打开了缘算的代码库,找到变量处理模块的源文件。文件很长,几千行。他一行一行往下翻,翻到“用户付费意愿”的处理逻辑。代码很简洁:

if user_payment_willingness > threshold: stability_score += weight * payment_willingness

一行if语句。付费意愿高于阈值,稳定性得分就加上一个权重乘以付费意愿值。简单,直接,有效。代码不会说谎。代码也不会告诉你,那个阈值是谁定的,那个权重是谁调的。

林砚把光标停在那一行代码上。他可以删掉它。他有代码库的编辑权限,合同里没有禁止他修改代码——合同只禁止他修改变量清单。但变量清单和代码是两回事。变量清单是“应该用什么”,代码是“实际上怎么用”。合同管住了前者,没管住后者。

他盯着光标。光标在那一行代码末尾闪烁,一下,一下,一下。像心跳。

他按下了删除键。

那一行代码消失了。屏幕上出现一个红色的减号标记,提示他做出了修改。他继续往下翻,找到权重配置文件,把“用户付费意愿”的权重从0.31改成0.00。保存。系统弹出提示:“是否提交本次修改?”他点了“是”。

三秒钟后,项目群里弹出一条机器人消息:“变量处理模块已更新。提交者:林砚。变更摘要:移除user_payment_willingness变量处理逻辑。”

群里安静了大约两分钟。

然后廖明远的消息弹出来:“@林砚 林老师,这个修改需要走变更流程。请撤回。”

林砚看着这条消息。光标在输入框里闪烁。他打了一行字:“合同没有禁止我修改代码。”

廖明远回复得很快:“合同附件二第三条第二款,不参与变量选择与权重设计。”

“我没有修改变量清单。我修改的是代码实现。”

“代码实现反映变量设计。请撤回,否则我们走合同违约流程。”

林砚的手指停在键盘上。走合同违约流程——这五个字像五颗钉子,一颗一颗钉进他的脊柱。违约意味着什么?意味着项目终止,意味着社科院和缘算的合作破裂,意味着他的实验室经费断档,意味着他带的几个研究生可能要换导师。

他把那行代码恢复了。

红色减号变成绿色加号。权重从0.00改回0.31。保存。提交。机器人又发了一条消息:“变量处理模块已恢复。提交者:林砚。”

群里没有人说话。

林砚关掉代码库,关掉项目群,关掉电脑。屏幕黑下去的那一刻,他看到自己的脸映在屏幕玻璃上——模糊的轮廓,看不清表情。他拿起手机,给陈禾发了一条消息:“我试了。失败了。”

陈禾过了很久才回:“我知道。”

“你知道?”

“你刚才在群里发的消息,我看到截图了。廖明远转给了方若谷。方若谷又转给了我。”

手机屏幕暗下去又亮起来。陈禾又发了一条:“方若谷让我转告你一句话——‘合同不是橡皮筋,拉过头会断。’”

林砚盯着这行字,拇指悬在键盘上方,迟迟没有落下。他能想象方若谷说这句话时的语气,不急不缓,像在课堂上点评一份不合格的开题报告。合同不是橡皮筋。那么他是什么?他是那个试图拉伸橡皮筋的人,还是橡皮筋本身?

他退出对话框,点开手机里那份合同的PDF。附件二,第三条,第二款。白纸黑字,他签过名,按过手印。当时他看这一条时觉得合理——不参与变量选择与权重设计,意味着他不为模型的伦理缺陷负责。但现在他明白了,这条款是一道单向阀门:他不能选择变量,却要为变量的后果背书。他的名字挂在项目成员列表里,他的实验室经费从项目里出,他的研究生在项目里做数据标注。他以为自己在做技术,其实他签的是一份沉默协议。

他翻到合同的最后一页,看自己签名旁边的日期。三个月前。三个月,足够一个人从合作者变成共谋。

他关掉PDF,打开通讯录,翻到“陈禾”。他想打电话,但忍住了。方若谷能通过方琳把截图转给陈禾,说明陈禾和方若谷之间有一条他不知道的通道。陈禾到底站在哪一边?她反对这个项目,从一开始就反对,但她又在方若谷的圈子里。林砚忽然意识到,他可能从来没有真正理解过陈禾的位置。

他给陈禾发了一条:“方若谷还说了什么?”

陈禾回:“他说,你如果想改代码,应该先改合同。但合同改不了。所以你应该想清楚,你到底要什么。”

林砚盯着“你到底要什么”这五个字。他关掉手机,靠在椅背上。办公室里只剩他一个人,空调嗡嗡地响。他想起下午会议上市场总监方琳代表公司提出的观点——“数据不会说谎,付费意愿就是稳定性的现实映射。”当时他没有反驳,因为他找不到反驳的逻辑。但现在他知道了:数据不会说谎,但说谎的人可以选择不说哪些数据。那个阈值是谁定的?那个权重是谁调的?合同管住了他改代码的手,但管不住他问这个问题。

他重新打开电脑。屏幕亮起来,代码库的登录页面还停留在浏览器标签里。他没有登录,而是打开了一个空白文档,开始写一份备忘录。标题是:“关于变量设计逻辑的若干疑问”。他不打算提交给项目组。他打算发给一个人——社科院学术伦理委员会的邮箱。他记得那个邮箱地址,因为入职培训时讲过,但从来没有人用过。

写到第三段时,他的手机又响了。是陈禾。

“林砚,方若谷刚才给我打了电话。他说如果你坚持要动代码,项目组会启动违约程序。但他也说了一句话——‘如果林砚愿意把问题写成学术讨论,而不是代码修改,我可以安排一次闭门研讨。’”

林砚沉默了几秒。

“闭门研讨?”

“对。不对外,不记录,不形成决议。只是讨论。方若谷说,这是他能给的最大空间。”

林砚看着屏幕上那份写了一半的备忘录。学术讨论。不记录,不形成决议。这意味着没有痕迹,没有后果,也没有改变的可能。但至少,他能把那个问题说出来——那个阈值是谁定的,那个权重是谁调的。

他把备忘录保存为草稿,没有发送。然后他给陈禾回了一条:“告诉他,我参加。”

发完这条消息,他关掉电脑。屏幕黑下去的那一刻,他忽然觉得,自己刚才做的选择,和按下删除键是同一件事——都是在合同允许的缝隙里,找一个能呼吸的姿势。区别只在于,这一次他知道自己在呼吸什么。