四十七天预言的第三天,消息开始在这栋灰色建筑之外流动。
上午九点,项目联合委员会的加密通讯频道同时亮起十二条未读消息。联络员们坐在二楼东侧的专用隔间里,电话声此起彼伏,每一通电话挂断之后都立刻有人拨出下一通。林序路过那间屋子的时候,透过半开的百叶窗看见一个戴眼镜的联络员把话筒夹在肩膀和耳朵之间,两只手同时在两块屏幕上打字。他的额头上有汗,衬衫领子湿了一圈。
走廊里有股速溶咖啡的味道。有人把一整壶咖啡打翻在茶水间的台面上,褐色的液体顺着柜门往下淌,滴在地板上,积成一小滩。没人来得及擦。路过的人只是绕开那滩液体,继续往前走。
十点过一刻,第一份外部评估请求到达。发件方是欧洲某国的国家风险分析中心,要求在二十四小时内获得南亚四号预测的完整方法论说明。十分钟后,第二份到达。然后是第三份。到午饭时间,累计十七份请求——来自六个国家的政府机构、三个国际组织的秘书处、以及两家林序没听说过的私人基金会。那些机构的名字列在联络员的汇总清单上,长长一串,像一份忽然被翻出来的旧账。
顾远没有回复任何一份。他把所有请求转发给联络员,附了一行字:暂不提供方法论细节,仅确认预测验证结果。
“他们想要的不只是方法,”顾远中午在主控室里对林序说。他一夜没睡,眼睛里布着血丝,声音倒还很稳。他说话的时候,右手一直摁在控制台的金属边缘上,指腹来回摩擦着那条已经磨得发亮的棱线。“他们想知道这个系统能做什么。但我们现在自己都还没弄清楚。”
林序没有说话。他注意到主屏幕上正在运行一个新的模拟任务,参数量和运算规模至少是南亚四号的三倍。十几个节点同时在跑,散热风扇的噪音比平时高了不止一个级别。那声音不是轰鸣,是一种持续的、细密的嗡嗡声,像是有什么东西正从机柜深处往外挤。
“你在跑什么?”他问。
“回溯验证。”顾远把一块辅助屏幕转向他,上面列着几十条已完成的历史事件。“我们换了思路。不往前预测,往后验证——把系统推到过去十年里那些确定性事件上,看它能不能反向重建因果链。”
屏幕上是一长串事件名称和时间戳。有些是林序记得的新闻头条,有些是他从未听说过的东西。旁边三列标注着不同颜色的标记——绿色、绿色、绿色,一直往下,全是绿色。
“结果呢。”
“已经跑完的十一件重大事件,”顾远顿了一下,“全部反向推演成功。”
他把手从控制台上移开,垂在身侧。灯光下,他的指节有点发白,指甲盖的弧线压着掌心,压出了几个浅浅的印子。
主控室里其他几个工程师都停下了手头的工作。坐在靠墙工位上的那个年轻工程师取下一只耳机,侧过头来。另一个人从代码界面里抬起头,嘴唇动了动,没出声。
“包括四年前那次区域金融危机。包括两年前那道台风的路径转向——气象局当时用了七十二个小时才做出准确判断,系统从数据输入到正确推演,用了四十分钟。”
顾远没有再往下说。他盯着屏幕上那些绿色标记,就好像在看某种他既熟悉又陌生的东西。那些标记排列得很整齐,像一根柱状图的柱子一根根戳在那里。没有一根歪斜,没有一根断裂。
那个年轻工程师问了一句:“回溯的因果链里,有没有出现过系统推演过程中途偏离、又被纠正回来的情况?”
顾远没有马上回答。他把辅助屏幕拉回自己面前,往下翻了几页数据摘要,停在其中一页上。他没有把它翻给任何人看。
“没有。一条都没有。”
下午两点,林序在机房里接到一条来自中东工作站的消息。机房的温度比外面低几度,空调的出风口正对着他的工位,冷气吹在左臂上,皮肤有点发紧。他盯着屏幕读完那条消息。
发信人是当地监测组的技术协调员,署名后面跟着一长串头衔。消息很短:你们昨天推送的管网评估报告已收到,我们调取了相关管段的压力监测记录,与系统标注的三个瓶颈节点比对,实际数据偏差在合理范围内。报告附录里的干预路径目前无法验证——该建议已被我方呈报当地政府能源部门,等待反馈。
林序把这条消息反复看了三遍。最后那两句话——建议已被呈报,等待反馈——让他后颈的皮肤紧了一下。系统昨天夜里才给出的建议,不到二十四小时,已经有人在现实世界里动手了。
他把消息转发给顾远,附了一个问号。
顾远回复得很快:“知道了。”
屏幕上的那两个字是黑色的,嵌在白色背景里,没有加粗,没有斜体,没有多余的标点。林序看着它们,意识到顾远可能已经预料到了这件事。或者他根本来不及惊讶。
傍晚的时候,联合委员会的一名高级联络员敲开顾远办公室的门。那扇门是厚实的木门,关上之后,走廊里听不到里面任何声音。联络员在里面待了四十分钟。四十分钟里,只有一次门开了一条缝——他探出头来跟自己的助理要了一份文件——然后门又合上。
门开之后,那位联络员径直穿过走廊进了电梯。他的皮鞋在走廊地板上敲出一串规则的声音,每一步间隔的时间几乎一致。脸上没有任何表情。不是刻意控制的没有表情,是一个人处理了太多信息之后,所有情绪都被暂时压到意识底层的状态。
顾远随后出来,走进主控室。他手里拿着一张纸,纸的边缘被捏着的地方起了细微的褶皱。他把那份文件放在控制台边上,放得很轻,像是不想让纸张碰到桌面发出声音。
“委员会要求提前评估V2的启动条件。”他说。
主控室里安静了几秒。
坐在靠墙工位上的那个年轻工程师摘下耳机,看着顾远。他的耳机挂在脖子上,里面还漏出一点细碎的音频,是某种系统运行的白噪音。另一个人从代码界面里抬起头,右手还抵着鼠标,指腹压在滚轮上,没有动。
“V1才完全命中了两次,”那个年轻工程师说,“现在推V2是不是太早了。”
“他们的逻辑是:如果V1已经能完整跑通因果链条,V2不需要等到V1被充分验证之后。他们不希望等。”
“不希望等。”年轻工程师重复了一遍。
林序从自己的位置上看着顾远。顾远的表情很平静,但林序注意到他放在文件边上的那只手,指尖压着纸面,压得有点用力。纸张边缘微微翘起来,又被他摁下去。
“谁提出的?”靠墙的那个工程师又问了一句。
顾远没有回答这个问题。他只是把文件翻过来,扣在控制台上。纸张合在台面上,发出一声轻响。
“开跑V2条件评估。今晚。”
晚上八点以后,整栋楼渐渐安静下来。大多数日班人员已经离开,走廊里的灯关了一半,每隔一盏亮着一盏,光晕在墙壁上投下一排间隔相等的亮斑。留下的只有技术组的核心成员和几个夜班运维。林序去茶水间倒水的时候,听见窗外的风重新起来了,擦过楼体侧面,发出一阵低低的声音。
伊琳坐在靠窗的位置。她面前摊着一块平板,上面全是表格和数据图。数据图的线条颜色不重,细密地挤在一起,有些区域被放大了,标注着红色的圈和黄色的箭头。她的咖啡杯旁边放着一只咬了一半的能量棒,已经干了,断口处变硬发白。
“还在看南亚的数据?”林序问。他把自己的杯子放在饮水机下面,看着水流进杯子里,热气升起来。
“我在找你们上次没有放进去的变量。”伊琳没抬头。她的手指在平板上滑动,翻过一页又一页。“南亚四号的模型输入清单我拉出来了,一共四百多个变量。我花了一个下午逐一比对当地实际社会指标。”
她把平板转过来给林序看。一张密密麻麻的对照表,红黄绿三种颜色标注,每一个单元格里都填着数字或者文字。有些栏位是空的,标着灰色底纹,旁边用红色小字注明了缺失原因。
“绿色是模型和现实匹配的,大约八成。黄色是有数据但模型权重明显偏低,十几项。红色是完全缺失——三十二项。”
“三十二项不是小数字。”
“对。”伊琳把平板拉回去,手指点开其中一行。那行数据旁边弹出一个注释窗口,里面写着几段文字,夹杂着当地地名的拼写。她指着其中一段,“比如这个。该国一个主要农业区的灌溉用水分配,过去三年间经历过两次重新划分。这两次划分的记录没有进入任何开放数据库,因为它们只在当地部落会议上口头确认过。没有书面记录。没有电子档案。没有任何可以被数据管道抓取的形式。系统完全不知道这件事。”
她靠在椅背上,揉了揉太阳穴。她的头发从耳后滑下来,遮住了半边脸。窗外的路灯光从百叶窗的缝隙里漏进来,在她肩上切成一条一条的明暗相间的横纹。
茶水间的咖啡机发出“嘀”的一声。林序的杯子里的热水还在冒热气。
“你们昨天跑出百分之百命中率的时候,”伊琳说,声音沉下去了半度,“运气帮了你们一把。这三十二项变量在这四十七天里恰好没有出现剧烈波动。土壤墒情稳定。灌溉矛盾没有升级。部落会议没有做出新的口头决定。但下一次呢。下下一次呢。”
她把平板扣在桌上。屏幕的背光透过平板背面,在她面前的桌面上投出一小片隐约的光晕。
“顾远说模型会越来越准,”她说,“我不否认。每次迭代都会把新数据纳入训练,缺失的变量会慢慢被识别,被补充。但它永远存在边界。问题不在边界之内,在边界之外。边界之外的东西,才是现实里真正能杀死你的。”
她的手指敲了敲那块平板的边缘。敲了两下。没有第三下。
“现实不会提前告诉你它藏了多少变量。”
走廊尽头,主控室的门开了又关。有人低声说了几句话,然后是关门声,锁舌扣进门框的金属撞击声。灯光在走廊地面上投下一个长方形的亮块,随即消失。
林序端着杯子站在茶水间门口。伊琳重新拿起那根干了的能量棒,咬了一口,嚼得很慢。她的下颚骨动着,太阳穴的肌肉微微牵动。她看着窗外的什么,眼睛的焦点并不在玻璃上,而是穿过玻璃,落在更远的地方。
凌晨一点左右,林序准备离开的时候,顾远还在办公室里。门虚掩着,灯光从门缝里切出一道窄窄的白线,落在走廊地板上,把地面分成明暗两半。林序犹豫了一下,鞋底在地面上磨了一下,发出轻微的摩擦声。然后他敲了敲门框。
“进来。”
顾远坐在椅子上,面前三块屏幕同时开着,不同的图表和数据窗口交叠在一起。其中一个窗口在跑实时模拟,数据以肉眼可见的速度一行一行刷新。另一个窗口显示着那十一项回溯验证的汇总表,所有的绿色标记仍然亮着。第三个窗口被拽到屏幕边缘,只露出一角,隐隐约约能看到是一份文档,标题栏里写着“V2启动条件评估——草案”。
顾远看着这些屏幕的样子让林序想到了某种东西——就像一个在看地图的人,明明已经找到了自己要走的路,却还在反复确认那条路上有没有标记任何警告。他的脊背没有靠在椅背上,身体前倾,手肘撑着桌面,肩膀微微耸起。
“周启明下周回来,”顾远忽然说。这个话题的切换快得像刀刃翻面,毫无过渡。“联合会那边通知的。”
“来得很快。”
“他本来就在等一个时机。”
顾远把椅子转过来,面对着林序。他的手里捏着一支笔,转了一圈。笔在他指间翻过去,又翻回来,塑料外壳擦过指腹,发出细微的声响。
“周启明认为系统不应该只是技术架构。他从一开始就主张在模型里嵌入政策权重参数。我们上一次争论是在半年前,他说了一句我到现在还记得——‘你建的不是运算系统,你建的是一个会说话的权力结构。’”
顾远把笔放回桌子上。笔在桌面滚了一小段,碰到键盘边缘,停下来。
“他没错。只是我们理解的‘权力’不一样。”
“你理解的是什么?”
“权力作用于模型之外。”顾远说。“模型负责输出结论,如何使用结论是人的事。技术基线必须独立。他认为权力必须写在模型内部,从一开始就决定模型如何定义‘最优解’——什么是好的预测,什么是坏的预测,由谁来定义。这不是一个技术问题,林序。这是两种完全不同的系统。”
这句话在林序心里钉了一下。他没有立刻回应,只是站在那里,把这两句话在脑子里反复放了两遍。顾远说“这是两种完全不同的系统”的时候,声音没有任何上扬或下沉,像在陈述一条物理定律。
“所以你打算怎么做?”他问。
“继续跑数据。”顾远转回屏幕前,右手重新搭上键盘。他的十根手指落在键位上,开始敲击,屏幕上的数据窗口切到了另外一个视图。“在他们把模型变成政策工具之前,我要先证明技术基线本身是成立的。完整地成立,不带任何外部修正参数。”
他的声音听起来和平时一样——稳定,冷静,带着工程师特有的那种盯住一个目标就不松口的固执。语速不快,每个字的间距都很均匀。但林序听出了一种东西。不是语气本身——是语速。顾远今天说话比平时快了一点点。只是一点点。一个人在赛跑的时候才会用这种语速说“我不急”。
林序离开的时候,在走廊里回头看了一眼。那扇门仍然虚掩着,灯光依然从门缝里漏出来,在走廊地板上切出一道不变的白线。
他在楼外的台阶上站了一小会儿。今晚没有伊琳,没有烟。风停了,停车场里只有他自己的影子,被路灯拉得很长,从脚尖一直伸到几米外的地面上,边界有些模糊。那盏之前坏掉的路灯已经被修好了,亮着稳定的白光。灯罩下面有几只小飞虫绕着灯泡打转,一圈一圈地飞,不知疲倦。
回到住处以后,他打开私人日志。光标在空白页面上闪了很久,他才打下两行字:
“顾远今晚对我说,权力作用于模型之外,而周启明认为权力必须写在模型内部。这是t线和I线冲突最精确的表述——不只是怎么做系统,是系统本身是什么。顾远在赛跑。他自己可能不愿意用这个词,但他在赛跑。
这个分歧一旦拉开,就不太可能合拢。”
他保存了文件,合上终端。窗外有车灯扫过,照亮了窗帘上的一角,然后暗下去。车轮碾过路面的声音由远及近,又由近及远,最终消失。房间里只剩下冰箱压缩机低沉的嗡鸣。
与此同时,在南亚四号预测中崩溃的那个国家,首都的部分城区在连续五十三小时的断电之后,首次恢复了供电。发电机组重新启动的声音在凌晨两点的街道上回荡,第一批亮起来的是主干道的路灯,然后是医院急诊楼的灯,然后是居民区里零星的窗户。电网恢复的速度比GcS模型预测的早了两天。
但这个事实要到七十二小时之后才会被监测节点捕捉到——那个节点是一台架设在首都变电站里的传感器,它每隔八小时向地方数据中心发送一次电网负载读数。这一轮的读数刚刚被存入本地缓存队列,排在例行日志和上一次电压波动报告后面。三天后它才会被汇总、压缩、上传、进入GcS的数据预处理管道。那时才会有人看到一串数字,然后把它整理成一条简短的更新。
那一刻还没有到来。
林序关了床头灯。黑暗压下来,是那种没有光的、完整的黑暗。窗帘严密地拉合着,门缝下面也没有光渗进来。他躺在那里,后脑勺陷在枕头里,睁着眼睛看着天花板的方向。天花板在那里,看不见而已。
他翻了两次身。床垫的弹簧在他体重移动时发出轻微的响声。
黎明还很远。