他直起身,看著她。她的额头还靠在掌垫上,呼吸比刚才更深。外套盖在她的肩上,边缘垂下来,盖住她的右手。她的手指被外套遮住了,只露出指尖。他看著那些指尖,看了很久。那双手在过去的七天里写了一万八千行程式码,解决了迁移学习的瓶颈,设计了多模态融合的架构,让一个模型可以从十五秒的录音中学会一个人的声音。但此刻它们静止在那里,比他见过的任何程式码都温柔。
他走回自己的位置,坐下。打开萤幕,继续写程式码。他的手指在键盘上移动,节奏比白天慢,每个按键都压得很轻,怕吵醒她。窗外的天空从浅紫变成淡金,路灯熄灭了,阳光从窗户斜射进来,照在她的外套上。外套是深灰色的,吸满了光,边缘有一圈金色的轮廓。
他写完最后一行程式码,按下储存。然后他靠在椅背上,转头看她。她还在睡,呼吸缓慢均匀,肩膀随著呼吸轻轻起伏。他的视线从她的肩膀移到她的脸上,从她的脸上移到她的萤幕上。萤幕是暗的,但他知道那两行注释还在。她的那一行,和他的那一行,并列在档案的最后,间隔不到一公分。
他没有再看她。他转回自己的萤幕,打开一个新的档案。他在第一行写下今天的日期,在第二行写下“Echo·Memory — 交互系统版本1.0”。他的手指在键盘上开始移动,稳定、均匀,每个按键都压到底。工作室里只有键盘声和她的呼吸声,两种声音交错在一起,像是某种他从来没有写过但一直想写的程式码。
温以宁醒来时感觉肩膀上有重量。不是疲劳那种沉重的感觉,是实体的、有温度的重量。她睁开眼睛,看见深灰色的布料——一件外套,男人的外套,领口有淡淡的咖啡气味。她的额头还靠在掌垫上,脖子因为长时间维持同一个姿势而僵硬,但她没有马上坐起来。她维持著趴著的姿势,让视线慢慢聚焦在萤幕上。
萤幕没有关。电源灯一闪一闪,萤幕保护程式是深蓝色的几何图案,缓慢旋转。她的手指动了一下,触控板感应到温度,萤幕亮起来。程式码编辑器还开著,游标停在档案的最后一行。她的那行注释还在——“外婆,对不起,我回来晚了。”然后底下多了一行。不同的字体,不同的字级,稍微偏右,像是写信时的空两格。
“她听见了。她说没关系。”
她的手指悬在触控板上方。那行字的笔划比她写的细,标点符号是半形的,句号是一个小圆点,不是她习惯的圆圈。她盯著那行字,盯了很久。久到萤幕保护程式再次启动,深蓝色的几何图案覆盖了整个画面。她的手指动了一下,萤幕又亮了。那行字还在。她没有删除。她也没有回应。她只是看著那行字,看著句号后面闪烁的游标,然后关掉档案。
她坐直身体。外套从肩上滑下来,落在椅背上。她拿起那件外套——深灰色,棉质,领口内侧有一张洗标,上面的字已经模糊了。她把外套折起来,放在桌子的右上角。那个位置是她放咖啡杯的地方,但今天杯子不在那里。
她转头看他。他坐在自己的位置上,萤幕亮著,手指在键盘上移动。他没有转头,但她看见他的肩膀微微动了一下——那是一个知道有人在看自己的人会有的细微反应。他的桌上没有外套,椅背上空的。他今天穿了一件浅蓝色的衬衫,袖子卷到手肘,前臂的肌肉线条在萤幕光中显得很清楚。
她转回自己的萤幕,打开微调层的测试档案。昨天完成的最终版本还在,一万八千行,每一行都是她写的。她的手指放在键盘上,开始检查训练日志。损失曲线稳定,准确率达标,记忆体用量在预期范围内。她在日志的最后一行看到一个时间戳——凌晨四点十二分。那是训练完成的时间。她记得自己是在凌晨三点左右写的那行注释,然后睡著了。所以他是在三点到四点之间看见那行字,写下那行回应,然后继续等训练完成。
她的手指在键盘上开始移动。不是程式码,是例行的测试脚本执行。萤幕上跳出对话框:“请输入测试语句。”她输入“你好”,AI回应“你好。今天好吗?”和预期一样。她输入“我昨天说过什么”,AI调出昨天的对话记录,显示在萤幕上。和预期一样。她输入“你记得我吗”,AI回应“记得。你是我的用户。你的编号是T001。”和预期一样。
一切正常。一切和预期一样。
她输入第四句话。她的手指在键盘上停了零点三秒,然后开始打字。她自己都没有意识到自己要打什么,直到字出现在萤幕上。“你觉得程司晏今天开心吗?”
她的手指停在回车键上方。萤幕上的那行字是黑色的,等线字体,14级,静静地躺在对话框里。她没有按回车。她想删掉,手指移到删除键上,但没有按下去。她盯著那行字,盯了三秒。然后她按下回车。
AI的回应花了两秒。比平时长,像是在思考。“根据他的代码提交频率,他今天效率很高,应该很开心。”
她的呼吸停了一下。她没有给AI设定过这种问题的应答逻辑。她的模型只会分析用户输入的情感,根据训练数据选择回应。但它不应该知道程司晏是谁,不应该知道程式码提交频率和情绪之间的关联,更不应该用“应该很开心”这种带有推测性质的语气。
她转头看他。他还在写程式码,手指移动的节奏和刚才一样。她的视线在他的萤幕上停了一秒——他在写一个新的模块,档名是care_parameters.py。她没有问他那是什么。她转回自己的萤幕,打开AI的日志。
日志显示,她的模型在接收到“你觉得程司晏今天开心吗”这句话时,调用了一个她不认识的函数。函数名称是get_user_emotional_state,参数是“Cheng Siyan”。回传值是一个JSON物件,里面包含了一个数值——0.87。然后模型把这个数值转换成自然语言,选择了“应该很开心”作为输出。
她打开get_user_emotional_state的原始码。档案不在她的目录里,在他的。她没有权限修改,但有权限读取——那是他前几天设定的审计权限。她打开那个档案,看见里面只有一个函数。函数的输入是一个人名,输出是一个介于0和1之间的数值。函数的实作方式很简单——读取那个人的程式码提交纪录,计算最近二十四小时内的提交频率,对比历史平均频率,高于平均就输出0.7以上,低于平均就输出0.3以下。0.87意味著他今天的提交频率比历史平均高了将近一倍。
她在函数的最后看到一行注释:“这不是情感模型。这是工程师版本的‘你还好吗’。”
她关掉那个档案。她的手指在触控板上停留了一会儿,然后打开care_parameters.py。那个档案在她的目录里,但她从来没见过。她点开,看见里面是一组参数,全部加在她的情感模型里。参数的名称是care_weight、empathy_threshold、response_delay。参数的数值被仔细调整过——care_weight设在0.3,不会太明显,但足够影响模型在特定情况下的输出。empathy_threshold设在0.6,当用户的情感强度超过这个阈值时,模型会优先选择关怀类的回应。response_delay设在0.5到2.0秒之间随机浮动,让AI的回应速度不像机器那么精确。
她逐行读完,然后转头看他。
“程司晏。”
他的手指停了。“嗯。”
“你在我的模型里加了参数。”
他转头看她。他的表情平静,但她看见他的耳朵边缘开始泛红。“加了。”
“什么时候加的?”
“昨天。你测试微调层的时候。”
“为什么?”
他沉默了一秒。“因为你的模型不会关心人。”
她没有听懂。
“你的模型可以辨识情感,可以回应情感,可以在用户哭泣的时候选择沉默。”他说。“但它不会主动关心。它不会在用户连续工作十六个小时之后说‘你该休息了’。它不会在用户提到某个名字的时候问‘那个人对你很重要吗’。它只会回应,不会发起。”
他转向自己的萤幕,打开care_parameters.py,指著那组参数。“这些参数让模型在特定条件下主动发起关怀。连续工作时间超过十二小时、提到某个重复出现的名字、在凌晨使用——这些都是触发条件。”
她看著萤幕上那组参数。每一个数字她都看得懂,每一个触发条件她都理解。但她没有说话。因为她意识到一件事——这些参数不是为了一般用户设计的。连续工作时间超过十二小时、在凌晨使用、提到某个重复出现的名字。这些触发条件描述的不是八十七万用户的行为模式,描述的是她一个人的。
“你不只用在用户身上。”她说。
他没有否认。他的耳朵现在完全红了,从耳垂蔓延到耳尖,在萤幕光中显得很明显。
“不只能用在用户身上。”他说。他的声音比平时低,低到她需要很专心才能听清楚。“也可以用在……需要被关心的人身上。”
她看著他的耳朵。那圈红色没有消退的迹象,反而往脖子蔓延。她的视线从他的耳朵移到他的眼睛——他没有闪躲,但她的眼睛里有某种她无法归类的东西。不是害羞,不是尴尬,是更深的、更古老的、在程式码出现之前就存在的某种状态。像是一个人站在悬崖边,知道不该往下看,但还是看了。
她没有说谢谢。她没有说任何话。她转回自己的萤幕,打开care_parameters.py,把那组参数逐行看了一遍。然后她关掉档案,继续测试微调层。她的手指在键盘上移动,节奏和之前一样,精确、稳定、没有多余的动作。但她知道自己的嘴角有一个弧度。那个弧度很浅,浅到如果不仔细看根本看不出来。但她感觉得到——嘴角的肌肉比平时多用了百分之几的力量,维持著一个不属于任何表情分类的状态。
她没有调整那个弧度。她让它在那里,在萤幕光的照射下,在键盘声的掩护下,安静地存在。
下午的测试持续了六个小时。她测试了微调层在三十二组不同数据上的表现——不同年龄、不同性别、不同语言、不同录音品质。每一组的结果都记录在试算表里,她逐行分析,调整参数,重新测试。他在做同样的事——测试交互系统在不同手机型号上的效能,记录记忆体用量、回应延迟、耗电量。两人的试算表在共用资料夹里并列,一个叫wyn_test_results.csv,一个叫csy_test_results.csv。她打开他的档案看了一次,发现他在备注栏里写了一句话:“记忆体用量超标2%,但温以宁的模型太漂亮了,不舍得压。”
她没有回应那句话。她关掉他的档案,在自己的测试结果后面加了一行总结:“微调层通过。准备进入整合测试。”她按下储存,发现他的档案在同一个时间也更新了。她打开看,他的总结写著:“交互系统通过。准备进入整合测试。”两行总结在资料夹里上下并列,储存时间相差不到三秒。
她转头看他。他也转头看她。两人的视线在工作室的光线中交会。他没有说话,她也没有说话。但她的嘴角那个弧度还在,而他的耳朵——红色已经退了,但他的眼睛里有某种光,不是萤幕的反射,是更深处的东西。
“整合测试明天开始。”她说。
“好。”
她转回萤幕,开始写整合测试的计划书。她在第一行写测试目标,在第二行写测试方法,在第三行停下来。她的手指在键盘上悬浮了三秒,然后开始打字。不是测试计划,是打开他的程式码仓库,找到care_parameters.py,在档案的最后加了一行注释。
“你的参数设定合理,但问得太直接了。下次委婉一点。”
她按下储存。她没有告诉他她写了这句话。她关掉那个档案,继续写整合测试计划。身后的键盘声在那一刻停了大概一秒,然后重新响起。这次的节奏比之前快了一些,但不是紧张的快,是某种轻快的快,像是一个人哼著歌走路时不自觉加快的脚步。
窗外的阳光开始偏西,从她的桌上移到他的桌上,再从他的桌上移到书架上。那些硬碟的黑色外壳在光线中反光,像是某种等待被开启的容器。她写完测试计划的最后一行,按下储存,靠在椅背上。她没有转头看他,但她知道他在看她。因为她的右耳感觉到一种温度——不是热,是注意力,是某种没有实体但确实存在的东西。
她没有转头。她只是让那种温度在那里,在她的右耳外侧,在距离她皮肤几十公分的地方,安静地停留。窗外的阳光继续移动,光线从橘黄变成紫灰,工作室里的影子拉长、变淡、消失。没有人开灯,两个人的萤幕光在黑暗中变成唯一的照明。她的萤幕上是整合测试计划,他的萤幕上是程式码提交的历史纪录。两片光在黑暗中相隔几公尺,像是两座彼此看见的灯塔。
她打开他的程式码仓库,看今天的提交纪录。最后一笔提交的时间是七分钟前,档案是care_parameters.py,提交讯息只有四个字:“下次委婉。”
她的嘴角那个弧度变深了一点点。她没有让它变得更深。她只是让它在那里,在黑暗中,在萤幕光的照射下,在键盘声的掩护下,安静地存在。
温以宁是在整合测试的第三天看到那段演讲视频的。那天早上她比平时早到工作室,程司晏不在,白板上写著“去买硬碟,半小时回来”。她打开自己的笔记型电脑,萤幕上跳出浏览器首页,推荐文章的第一条标题是黑体粗字——“AI科学家贩卖痛苦?记忆AI引**理争议”。她的手停在触控板上,没有点进去。但她的视线已经扫过了那行字,每一个字都清清楚楚地印在视网膜上。
她点开了。页面载入缓慢,广告影片先播放了五秒,然后是文章的标题、作者、发布时间——两小时前。文章里嵌了一个影片,缩图是学术会议的讲台,讲台上站著一个人,西装、领带、麦克风别在领口。她认得那个人的轮廓——谭书白。她点了播放。
影片的画质很好,谭书白的脸在舞台灯光下显得很白,额头有一层薄汗。他的声音从笔记型电脑的喇叭传出来,低沉、缓慢,每个字之间都有精确的停顿。“最近有一项所谓的‘记忆AI’项目,声称可以用人工智慧重建逝者的声音和对话模式。这项技术的开发者宣称,它可以帮助人们‘留住不想失去的声音’。但我们必须问一个问题——这是在帮助人们面对失去,还是在鼓励人们逃避失去?”
影片的观众席传来窃窃私语。谭书白停顿了三秒,视线扫过全场。“逝者的声音不属于任何技术公司,不属于任何算法,甚至不属于他们的家人。它属于逝者本人。而逝者无法同意被AI复制。任何未经明确授权的‘记忆重建’,都是对逝者**的侵犯,是对死亡尊严的亵渎。”
她按下暂停。萤幕定格在谭书白的脸上,嘴微张,眼睛盯著镜头。她看著那张脸,想起七年前在MIT的学术会议上,她和谭书白有过一次激烈的辩论。那时候他们都很年轻,她刚发表情感计算的论文,他刚发表“AI应该完全理性、去除情感”的宣言。两人在会场的走廊上争论了四十分钟,从技术细节吵到哲学基础,谁也没有说服谁。最后他说了一句话她一直记得——“温以宁,你的情感AI不是在帮助人,是在让人变得更脆弱。”
她关掉影片,打开社群媒体。她的帐号已经被标注了上百次。最上面一条贴文来自一个她不认识的帐号,头像是一片黑色,贴文只有一句话:“温以宁,你利用别人的痛苦赚钱,你还是人吗?”底下的留言有两千多条。她没有点开留言区,只是看著那句话,看著那个问号。她的手指在触控板上移动,点开下一条贴文。这条来自一个认证帐号,蓝色勾勾,头像是科技媒体的Logo。贴文是一篇报导的连结,标题是“独家:记忆AI未经授权使用逝者声音,家属控诉‘我们没有同意’”。
她点开报导。报导的第一段写著:“本报接获读者投诉,一位陈姓女士表示,她的父亲在两年前过世,近日发现自己的声音被用于训练一个名为‘Echo·Memory’的AI模型。陈女士说:‘我父亲从未同意过这件事。他们用他的声音做AI,我们完全不知情。’报导的最后一段写著:“记者查证后发现,陈女士父亲的声音来自一个开源语料库,该语料库的授权条款允许学术研究使用。但陈女士坚持,学术研究不代表可以复制一个人的声音。”
她关掉报导,打开那个开源语料库的网站。授权条款还开著,CC BY-NC 4.0,允许非商业使用,允许修改和重制,只要标明出处。她标明了。每一行训练数据的出处都写在技术文档的附录里,字体是10级,灰色,在第四十七页。没有人会读到第四十七页。
她的手机开始震动。不是来电,是讯息。萤幕上跳出一个又一个通知——社群媒体的标注、邮件的新进通知、即时通讯软体的陌生讯息。她把手机翻过去,萤幕朝下放在桌上。震动继续,透过桌面传到她的手腕,像是某种持续的、不会停止的信号。
她听见门开的声音。程司晏走进来,手里提著一个纸袋。他的脚步声在门口停了一下,然后继续。她没有转头,但她感觉得到他的视线落在她身上,落在她萤幕上定格的谭书白的脸上。
“你看到了。”他说。不是疑问。
“对。”
他把纸袋放在桌上,走到自己的位置坐下。她听见他打开笔记型电脑,听见键盘声,听见他的呼吸在某一刻变重。“报导发出来两小时,已经被转了三千多次。”
“我知道。”
“谭书白的演讲影片点击率超过五十万。”
“我知道。”
“陈女士的控诉贴文底下有一万两千则留言,大部分在骂你。”
她转头看他。他正看著萤幕,眉头皱著,嘴唇抿成一条线。他的右手放在滑鼠上,握得很紧,指节泛白。“你在看什么?”她问。
“留言。”他的声音很低。“有人在号召抵制你的项目。有人说要去举报你的开源仓库。有人说——”
“够了。”她转回自己的萤幕,打开电子邮件。收件匣里有一百多封未读邮件,标题从“谴责你的行为”到“你伤害了我的家人”到“去死”。她没有打开任何一封,只是看著那些标题,看著那些惊叹号和问号和全形的大写字母。
她的手指在键盘上放著,没有动。工作室里只剩下电脑风扇的声音和他偶尔敲击键盘的声响。窗外的阳光照进来,在她的桌上切出金色的矩形。那道光线看起来和昨天一样,和前天一样,和过去十几天一样。但她的手指感觉不到温暖。她的手指是冷的。
“谭书白的论点。”她说。她的声音比她预期的平静。“他说记忆AI是对逝者**的侵犯。他说逝者无法同意被复制。”
“他说的是对的。”程司晏的声音从身后传来。“逝者确实无法同意。”
她转头看他。他正看著她,表情平静,但她看得出来——那种平静是刻意维持的。他的右手从滑鼠上移开,放在膝盖上,手指微微弯曲。
“你同意他?”她问。
“我同意他的前提。不同意他的结论。”他的声音稳定,每个字的音量都一样。“逝者无法同意。但生者需要活下去。陈女士的父亲把声音放进开源语料库的时候,他知道这会被用来做研究。他不知道会被做成AI。但这是授权条款允许的范围。我们没有违法。”
“但我们伤害了人。”她的声音出现了一道细微的裂痕。“陈女士说她觉得父亲被亵渎了。她说每次听到那个AI的声音,她都会崩溃。她说我们让她无法再听父亲真正的录音,因为她分不清楚哪个是真的、哪个是假的。”
她停下来。她的手指在膝盖上握紧了。“她说的是对的。我们没有想过这个。我们只想到那些需要被记住的人,没有想到那些不想被记住的人。我们没有想到那些听到AI的声音会崩溃的人。我们没有想到——”
“你想到了。”他打断她。“你的模型里有一个参数,让AI在用户表现出痛苦时选择沉默。你写那段程式码的时候,想到的就是那些会崩溃的人。”
她没有说话。她记得那段程式码。版本3.2,五年前,凌晨两点,她在实验室里写那段逻辑的时候哭了。因为她想到外婆的声音如果被AI复制,她自己会不会崩溃。她没有答案。所以她写了那段程式码——让AI在用户哭泣时选择沉默。那是她的模型里唯一一个不是从数据中学来的行为。那是她自己决定的。
“那段程式码不够。”她说。“我们需要的是让用户选择要不要被提醒,不是等他们哭了才沉默。我们需要的是——”她的声音停了。因为她意识到,他们需要的是一个她不知道怎么解决的问题。不是技术问题。是人的问题。
她的手机又开始震动。她没有翻过来,只是看著它在那里震动,萤幕朝下,黑色的机身因为震动而微微移动。震动停了,又开始,又停了。第三次震动持续了很久,久到她以为不会停了。然后它停了。
她伸手把手机翻过来。萤幕上是一则讯息,来自一个她不认识的号码。“温以宁,我妈走了三年了。你的AI让我又听见她的声音。谢谢你。不要放弃。”
她盯著那则讯息,盯了很久。她的眼睛开始发酸,眼眶发热,但她没有哭。她只是看著那则讯息,看著“谢谢你”那三个字,看著“不要放弃”那四个字。然后她把萤幕关掉,把手机放回桌上。
“有人在支持我们。”她说。
“很多人在支持我们。”他的声音从身后传来。“开源仓库今天多了两百多颗星。有人写了长篇评论说这个项目救了他。有人在社群媒体上分享自己和AI对话的截图。那些留言你没看到,因为它们被骂声淹没了。”
她转头看他。他的萤幕上开著一个她没见过的页面——一个简单的网页,白色背景,黑色文字。页面的标题是“Echo·Memory — 用户的声音”。底下是一则又一则留言,每一则都有日期和时间,每一则都来自不同的用户。
“我爸爸走了二十年了。我已经快忘记他的声音了。谢谢你们让我记起来。”
“妈妈走的时候我才十二岁。现在我二十五了。我终于可以再跟她说一次我爱她。”
“我不同意谭书白。逝者不能同意,但生者需要活下去。这个项目不是在亵渎死亡,是在延续爱。”
她读完那些留言,读了很久。她的手指在触控板上滑动,一则一则往下翻。有长的有短的,有中文有英文,有标点符号完整的也有全是空格的。每一则都在说同一件事——谢谢。每一则都在说同一句话——不要放弃。
她关掉那个页面。
“不够。”她说。“那些支持我们的人本来就支持我们。但那些受伤的人——陈女士、还有那些不敢说出来的人——他们才是我们应该负责的对象。”
她站起来,走到白板前。白板上还留著他们的进度表,左边她的栏位,右边他的栏位,中间一条直线连接。她拿起白板笔,在直线的中间画了一个叉。然后她在白板的最下方写了一行字:“问题:如何保护不想被记住的人?”
她转头看他。他坐在位置上,看著白板上的那行字,表情平静。
“我们需要一个新的功能。”她说。“让用户可以选择不被提醒。让家人可以选择删除数据。让每一个上传的声音都必须有明确的授权,不只是开源条款,是逝者生前的书面同意,或是家属的连署授权。”
“那会让百分之九十的数据不能用。”他说。
“我知道。”
“那会让很多想被记住的人无法被记住。”
“我知道。”
“你确定要这样做?”
她看著白板上的那行字,看著那个叉,看著他的栏位和她的栏位之间那条被她切断的直线。她想起外婆的十五秒,想起她听了一千次的那句话。她想起那个用户的留言——“我终于可以再跟她说一次我爱你。”她也想起陈女士的脸——她没有见过陈女士,但她想像得出来。一个失去父亲的女儿,发现父亲的声音被陌生人用来训练AI,发现自己无法再分辨哪个是真的、哪个是假的。
“确定。”她说。