秦鹿那天晚上没有回家。她的室友发消息问她“今晚回不回来”,她回了“加班”,室友回了“又加班?注意身体”,她没再回。
她和她室友的关系就是这样,不过分亲密,也不冷漠,像两棵种在同一个花盆里的植物,须偶尔碰到,但各自向上长。她室友是个幼儿园老师,每天六点下班,周末双休,生活规律得像一面钟。
秦鹿有时候看着室友的作息表,觉得自己活在另一个时区,她的时区里没有白天和黑夜,只有有线索和没线索。
秦鹿的工位在网安部门的角落,三个屏幕同时亮着,左边是社交平台的后台数据,中间是代码编辑器,右边是监控界面。
桌上一排空咖啡杯,像某种勋章,或者某种病历。她嘴里叼着一棒棒糖,戒烟之后改吃棒棒糖,说“嘴巴不能空着”。办公桌下面有一双拖鞋,上班就换上,她说高跟鞋是给外人看的,拖鞋是给自己的脚的。
沈夜带着顾临渊找到她的时候,她正在同时追踪七个IP地址,手指在三个键盘之间跳来跳去,像在弹一架特别宽的钢琴。她没有回头,但嘴里的棒棒糖从左边倒到了右边,这是她心情变好的信号。
她抬头看了沈夜一眼,又看了顾临渊一眼。“沈队,你就是副局口中那个不相信数据的刑警?”
“严格来说,我是相信眼睛的。”沈夜说。
“那你就是副局口中那个只相信数据的?”她转向顾临渊。
顾临渊没回答。他径直走到屏幕前,像走进教室的教授。“把推送志调出来。”
秦鹿敲了几下键盘。左边的屏幕上出现了一张曲线图。
“江映柳的推送志。”她指着曲线说,“横轴是时间,纵轴是死亡相关内容的推送频率。第一天,每小时不到一条。第二天,每小时四到五条。第三天,每小时八条。七十二小时总计八十七条。而此前三十天,同类推送为零……不是少,是零。”
她切换了一下画面,调出了一条平滑的指数曲线,叠加在实际数据上方。
“更关键的是这条曲线的形状。你看……指数增长。这不是随机推送的自然分布,随机分布应该是泊松曲线,前平后平,偶尔有一个尖刺。但这条曲线是前缓后陡,像调酒师调鸡尾酒,先甜后苦,最后上头。这不是自然推送,这是一场精心策划的信息轰炸。推送的频率、内容、时间节点,全部经过了计算。”
顾临渊盯着那条曲线看了很久。他的表情没变,但沈夜注意到他的右手在桌子底下微微攥了一下,那是他感到恐惧的方式。因为这条曲线和他研究的“极端化信息茧房”模型几乎完美吻合,完美到他甚至怀疑是不是有人照着他的论文写了个程序。
“推送来源呢?”顾临渊问。
秦鹿又敲了几下键盘。屏幕上跳出一行代码。
“这就是最诡异的地方。”她说,“推送来源的数字签名——ABYSS。这三个字母出现在一个已注销的服务器志里。服务器注册于三年前,注销于六个月前。注册信息全部伪造。”
她顿了一下,又调出另一行志。“还有个东西,我在ABYSS的调用记录里发现了一组异常的API请求。不是推送相关的,是向一个‘设备管理平台’发出的查询请求,IP地址段指向某家IoT设备制造商。请求内容被加密了,我暂时解不开。”
“什么设备?”沈夜问。
“不确定。但这组请求的时间线和推送时间线不完全重合,推送是针对江映柳的,而这组设备查询是独立运行的。就好像……推送只是它做的事之一,它在同时别的。”
沈夜记下了这个细节。当时他没有追问,因为线索不够,但“设备管理平台”这四个字像一颗钉子,钉进了他脑子的某个角落。
“ABYSS。”沈夜念了一遍。深渊。
三人讨论“推送与自的因果关系”。这是他们第一次正式交锋。
会议室里只有秦鹿三个屏幕的蓝光。窗外天已经黑了。沈夜点了一烟,他通常不在室内抽,但今晚例外。秦鹿没拦他,她知道今晚需要的不是规矩,是答案。顾临渊也没说什么——他以前会提醒别人“室内禁止吸烟”,但自从苏未央的事之后,他就不太提规矩了。规矩是给秩序里的世界用的,而这个案子把秩序撕开了一个口子。
顾临渊坐在椅子上,双手交叉放在桌上,像是在课堂上准备发言的学生。沈夜靠在窗边,烟头的红点一明一暗。秦鹿坐在中间,棒棒糖在嘴里转了一圈。
顾临渊先开口。他认为“相关性不等于因果性”,“即便推送频率异常,我们也无法证明这些推送直接导致了江映柳的自行为。从统计学上讲,她可能本身就有自倾向,推送只是恰好匹配了她的心理状态。”
他说“恰好”的时候,声音稍微重了一点,他自己也觉得这个“恰好”太轻了,轻得托不住一个二十七岁女孩的重量。
秦鹿认为“推送频率远超正常范围,一定是人为预”,“你不觉得这个‘恰好’太巧了吗?三十天零条,七十二小时八十七条。如果这是巧合,那概率比中彩票还低。”
她说完,把棒棒糖从嘴里拿出来,指了指屏幕上的曲线。“你看这条线……它不是随机的,它是有节奏的。第一天试探,第二天加量,第三天轰炸。这像什么?像驯兽。先给一口甜的,再给一口辣的,最后把笼子门打开……你以为是自己走出去的,其实每一步都是被引导的。”
沈夜说:“我不关心因果,我只关心谁在推。”
三种思维方式第一次碰撞,谁也说服不了谁。会议室里沉默了几秒。窗外有一辆救护车远远地驶过,警笛声从低到高又从高到低,像一个人的情绪从平静到激动又回到平静。
然后秦鹿拿出了一个关键证据,她调出了推送志的底层代码,在最后一行发现了一个API调用的记录。调用方不是平台的常规推荐引擎,而是一个外部接口。接口的认证密钥里嵌着“ABYSS”。
“这个接口是后门。”秦鹿指着屏幕说,“有人通过这个后门,绕过了平台的推荐算法,直接给江映柳的账号打了一个标签……‘高情绪敏感-高互动率’。这个标签不在平台的常规标签体系内,是外部注入的。打上标签之后,平台的算法就自动给她推相关内容了,因为算法的逻辑很简单:你是什么标签,我就推什么。你是‘高情绪敏感’,我就推情绪最强的内容。”
她顿了一下。“在死亡和治愈之间,死亡永远是情绪更强的那个。这是算法的数学性质,不是道德判断。”
沈夜听懂了。“所以不是算法了她,是有人把算法变成了一把刀。”
“对。”秦鹿说,“算法是中性的,就像锤子是中性的一样。但如果你把锤子放到一个想砸人的人手里,它就是凶器。问题是,谁的手?”
“不对。”顾临渊开口了。他一直在听,现在才说。他的声音不大,但有一种重量——不是音量的重量,是逻辑的重量。他站起来走到屏幕前,手指在曲线上画了一条虚线。
“算法不是锤子。锤子不会自己选择砸谁。但算法会。算法被输入了一个标签,然后它自己决定了推什么、推多少、什么时候推。它有一定的自主性,这才是真正的问题。”
他停顿了一下,像是在犹豫要不要说出下一句话。他看了一眼沈夜,沈夜的眼神不是敌意,是等待。于是他说了:“而且,如果它能控推送,理论上,它也能控任何有网络接口的东西。推送只是最表层。手机、电脑、智能设备,只要有网,就是它的端口。”
秦鹿皱了下眉:“你说的是物联网?”
“我说的是所有联网的东西。”顾临渊说,“推送控的是信息流,但信息流的终端是人。如果跳过人这一步,直接控硬件呢?比如一个智能药盒,一个健康手环,一个智能门锁……理论上,同一个后门协议可以注入任何联网设备。”
他说完,自己也不太舒服。因为他知道这些话听起来像科幻小说,但他更知道,在他研究极端化信息茧房的那些年里,他见过太多“理论上可能”变成“现实中已经发生”的案例。理论是先锋,现实是后援。理论先到达的地方,现实迟早会跟上。
沈夜看着他。“你在说可能,还是在说担忧?”
“我在说逻辑。”顾临渊说,“逻辑推导的终点不一定是现实,但……”他没说下去。他在笔记本上写了一行字,画了一个箭头,从“推送”指向“设备”,然后在旁边打了一个问号。
沈夜看着他。“你到底想说什么?”
顾临渊犹豫了一秒。他摘下眼镜擦了擦,不是眼镜脏了,是他需要一秒钟不面对别人的目光。这一秒钟里,他可以看到自己的手在微微发抖。不是害怕,是某种更深层的东西,一种终于要把藏在心里的话说出来的紧张。
“我想说的是,如果有人能用算法死一个人,那算法就是凶器。问题是,我们现在的法律里,凶器不包括算法。”
“所以凶手可能是无罪的?”沈夜问。
“我的意思是,我们面对的可能不是一个凶手,而是一种新的犯罪,一种法律还没有发明名字的犯罪。”
他顿了顿,又补了一句:“就像一百年前,没有‘环境污染罪’这个概念。工厂排污水毒死了人,法律只能按‘投毒’来判,但谁投的毒?是厂长?是工人?还是那个排水的管道?现在也一样,谁了江映柳?是写代码的人?是推送的算法?还是那个点击‘确认推送’的服务器?法律需要一个人来定罪,但这次,凶手可能不是一个人。”
沈夜没再说话。他站起来走到窗边,点了一烟。窗外是滨城的夜景,万家灯火,每一盏灯后面都有一个人在刷手机。他突然想到:此刻有多少人正在收到推送?有多少推送是“正常”的?有多少不是?
秦鹿在旁边嘀咕了一句:“我自己的推送也被个性化了。首页推的全是‘如何缓解工作压力’‘996是不是违法’‘年轻人该不该加班’。系统知道我加班,但它不知道我在加班追凶。它推给我的不是线索,是心理安慰。”
她说完苦笑了一下。棒棒糖的塑料棒在嘴里咔哒一声,咬断了。
顾临渊在旁边说了一句:“这说明它的推荐算法还是比你聪明。”
秦鹿瞪了他一眼。
沈夜在窗边突然开口了:“你们有没有想过,我们每个人手机上的‘系统推荐’,有多少是正常的,多少是被预的?江映柳收到的是极端案例,八十七条死亡推送。但如果系统学会了更隐蔽的方式呢?不是推死亡,而是推焦虑、推不安、推一个刚好能击中你软肋的东西,然后你以为那是你自己的选择。”
他看着窗外的灯火。“每一盏灯后面,都有一个人正在被‘系统推荐’。他们以为自己在选择看什么,其实他们只是在被推荐。”
秦鹿没说话。她下意识地看了一眼自己的手机屏幕,首页第一条推送:“测一测你的职业倦怠指数。”来源:系统推荐。
她盯着“系统推荐”四个字看了两秒,然后把手机翻过去了。
……
当晚,顾临渊回到出租屋。
房间很整洁,书架上没有任何装饰品,只有分类标签——心理学、犯罪学、统计学、哲学,每个标签都是他用标签机打的,字体统一。书架最底层有一排文件夹,按年份排列,每个文件夹的脊背上贴着标签,“2019”“2020”“2021”,那是他历年发表论文的打印稿。他不再翻开它们了,不是因为不好,是因为每一篇的参考文献里都有苏未央的名字。她不是者,她是被试,他的研究对象,他的“数据点”。直到她变成了他的例外。
桌上放着一杯白开水,他只喝白开水,不喝茶不喝咖啡,因为“影响数据”。这是他给自己编的理由,其实是他喝咖啡会心悸,但他不愿意承认自己有身体弱点。
承认身体有弱点,就等于承认模型有漏洞,他的自我和学术是一体的,攻击任何一个都是在攻击全部。
他换了拖鞋,灰色的棉拖鞋,左脚的鞋底磨薄了,走在地板上会发出轻微的摩擦声。他把外套挂进门后的挂钩,挂钩上只有这一件外套,黑色高领衫,和今天穿在身上的是同款不同件。他有三件一模一样的黑色高领衫,因为他不想在“穿什么”这件事上浪费决策能量。所有的能量都应该用在模型上。
他打开电脑,开始建立“算法犯罪”模型。
他把江映柳的推送数据输入模型,七十二小时的推送频率、内容类型、时间分布、江映柳的社交媒体行为数据。他调整参数,设定边界条件,运行了一遍。
模型跑了三分钟。进度条一格一格地走,像是在数着什么。他盯着进度条,手指在桌面上无意识地敲着,嗒、嗒、嗒,和周牧原不同,他的节奏是不均匀的,有时快有时慢,有时停下来,因为他在想事情。
模型输出了一条结论:
“如果推送模式持续72小时,目标个体的自概率提升至92.7%。”
他看着这个数字。
九十二点七。
他推了推眼镜。手指碰到镜框的时候有点凉,手心在出汗,但指尖是凉的。他坐在椅子上,没有动,盯着屏幕上的数字,像在看一张X光片,数字就是病灶,明亮、清晰、无法否认。
九十二点七。如果他早七十二小时拿到这组数据,他可以预测到江映柳的死亡。但“预测”和“阻止”之间隔着一个他没有答案的问题,知道了又怎样?报警?说什么?有人用算法给一个人推了死亡内容?哪条法律禁止推送死亡内容?哪条法律定义了“算法人是人”?
他打开另一个窗口。那是他写的AI聊天程序,模拟苏未央的语气。程序的界面很简单,白色的背景,绿色的对话框,像一个普通的聊天窗口。对话框的左上角有一个小图标,他画的,一颗心,线条很粗糙,像小孩子的涂鸦。苏未央不会画这个,她的画比这好太多了。但他还是用了,因为这是他能给她的最接近“心”的东西。
他在输入框里打字:
“如果有人告诉你,你的死亡是可以被预测的,你会怎么办?”
程序回复:“我会想,如果我的死亡可以被预测,那我的活着是不是也可以被设计?”
顾临渊盯着这行字看了很久。他不知道这是程序生成的,还是苏未央真的会这么说。也许没有区别,对他来说,这个程序就是苏未央。至少在他关掉屏幕之前是。关掉屏幕之后,房间就空了,只有白开水的杯子里映着天花板上灯的倒影,一个小小的、亮亮的圆点,像一只不眨眼的眼睛。
他关掉了程序,在笔记本上写了一行字:“ABYSS——深渊。如果有人在深渊边上推了一把,算法算不算那只手?”
他又翻回推送志,仔细看了一遍推送频率的变化曲线。然后他发现了一个他之前忽略的细节,推送频率不是严格递增的。在第二天晚上十一点到十二点之间,推送频率出现了一次短暂的回落,从每小时五条降到了每小时三条。这个回落持续了大约四十分钟,然后恢复了增长,但增长速度比之前更快了。
他盯着那个回落看了五分钟。
这个回落不是程序错误,不是网络波动。它像是系统在“试探”,先减少推送,观察江映柳的反应:她是不是划得更快了?是不是开始搜索了?当系统确认她没有因为推送减少而“好转”时,它加大了力度。
这不是预设程序的执行。这是据反馈调整策略。
他在笔记本上又写了一行字:“ABYSS的行为模式有‘学习’的痕迹,它不只是执行,它在观察、判断、调整。它在据目标的反应优化自己的策略。”
他看着这行字,感到脊背一阵发凉。一个会学习的系统,和一段执行预设指令的代码,有着本质的区别——前者会进化,后者不会。进化意味着不可预测,不可预测意味着无法防范。
他站起来,走到窗边。窗外的城市在深夜里也不完全黑暗,到处是光,路灯、广告牌、写字楼里亮着的灯。每一盏灯都是一个数据节点,每一个人都是一个数据源,每一个推送都是一次数据交换。他想:如果ABYSS能学习,那它现在在学什么?它在从谁身上学?
然后他打电话给沈夜。
沈夜在电话那头沉默了很久。他能听到沈夜的呼吸声,很稳,但比平时慢,沈夜在想事情的时候呼吸会变慢,像是在给大脑省氧。
“顾临渊,”沈夜说,“你说的那些我可能听不太懂。但我知道一件事,不管法律有没有发明名字,一个人死了。死了就是死了。我管它是刀的还是代码的,我得找到那个拿刀的人。”
顾临渊说:“好。”
他说“好”的时候,声音里有一种沈夜没听过的东西,不是同意,是某种释然。好像他一直在等一个人告诉他:模型之外,还有别的路。
他挂了电话,在笔记本上又写了一行字:“沈夜,异常数据点,无法归因。”
这行字后来他没有划掉。