他抬起头,摘下眼镜,放在桌上。没有镜片的遮挡,他的眼睛看起来比平时小一些,眼窝更深,眼睛下面的阴影更明显。他看著她,沉默了很久。工作室的空调发出低频的嗡鸣,和机房的风扇声一模一样。
“我爸。”他说。声音很低,低到像是他在自言自语。“他在我留学第二年走的。心梗。”
温以宁没有说话。她的手指从键盘上移开,放在膝盖上。
“那天是周末。我在图书馆写作业,手机关静音。等我看到未接来电的时候,已经过了四个小时。”他的视线落在键盘上,落在那些他刚才还在敲击的按键上。“我妈打了十七通。最后一通是医生的,他说人已经走了。”
工作室的空调停止了运转,四周突然变得很安静。
“他那年五十三岁。”他继续。“身体一直很好,没有高血压,没有糖尿病。每年体检都是蓝色的单子。我出国前一天他还跟我说,等你毕业回来,爸给你煮牛肉面。”
他的右手放在键盘旁边,手指伸直了,平放在桌上。那只手在过去的几天里敲了几万行程式码,每一行都稳定、精确,但此刻它静止在那里,像是一件被关闭的机器。
“他留了一段语音留言。八秒。”他的声音出现了一个极细微的停顿。“‘小晏,爸等你回来。’”
温以宁的胸腔里有什么东西收紧了。她想起自己的十五秒。外婆说,以宁,你瘦了。有没有好好吃饭?同样的长度,同样的语气,同样的永远不会到来的等待。
“我把那八秒剪辑成循环。”他说。“用软体去掉背景噪音,把音量调到最舒服的大小。做成一个音档,放在手机里,设成闹钟。每天早上醒来第一件事,就是听他说那句话。”
他的右手手指微微弯曲,又伸直。重复了三次。
“后来我觉得不够。”他的声音变得更低。“八秒太短了。我想听他多说一些话。想听他说今天吃了什么,想听他说天气好不好,想听他说他过得怎么样。所以我用AI生成了一段更长的对话。”
温以宁的手指在膝盖上握紧了。
“我用他以前的语音留言、通话录音、甚至家庭录影带里的对话,训练了一个模型。很粗糙的模型,没有你的情感计算那么精确,只会模仿他的音色和说话节奏。但够了。够让我在深夜的时候,听一个像他的声音说一些像他会说的话。”
他停下来。他的呼吸变浅了,浅到她几乎看不见他胸腔的起伏。
“然后有一天,那个AI问我。‘小晏,你最近过得好吗?’我回答了。我说还好。然后它说‘那就好,爸放心了。’”
他的声音在最后一个字上裂开了。不是崩溃,是一道很细很细的裂缝,细到如果不是在凌晨两点安静的工作室里,她根本不会听见。
“那不是我爸会说的话。”他说。“我爸从来不说‘爸放心了’。他只会说‘回来给你煮牛肉面’。那个AI在说我让它说的话,不是我爸会说的话。”
他抬起头看她。他的眼睛是干的,没有泪水,但她在那双眼睛里看见了某种比泪水更深的东西。
“我删掉了那个模型。删掉了所有生成的对话。只留下那八秒。”他的声音恢复了平静,但那种平静不是真正的平静,是经过反复练习后形成的肌肉记忆。“然后我开始写Echo·lite。我想让其他人不必像我那样,用假AI替代真遗憾。”
她看著他。他的表情没有变化,但她看得出来——他刚才说的那段话,他可能从来没有对任何人说过。因为他说到“爸放心了”那四个字的时候,他的右手手指在桌上画了一个很小的圆圈,那是一个无意识的动作,像是他试图在平面上抓住什么。
“你从未对任何人说过这件事。”她说。不是疑问。
“没有。”
“包括你的合伙人?”
“我没有合伙人。”
“朋友?”
他没有回答。他的沉默就是答案。
工作室的空调重新启动,低频的嗡鸣填满了房间。窗外的路灯在某一刻闪烁了一下,像是电压不稳。她的视线落在他的右手上——那只手现在完全静止了,手指微微弯曲,掌心朝下,像是刚放下一个很重的东西。
“我也是。”她说。
他转头看她。
“外婆走的时候,我在MIT的实验室写论文。”她的声音比她预期的平静。“那天模型一直不收敛,我很生气,把马克杯摔在地上。然后手机响了。舅舅说外婆走了,下午三点十七分。”
她没有停下来。她怕一停下来就不会再继续。
“我挂了电话,把地上的碎片扫干净,继续调模型。那天晚上模型收敛了。我看著萤幕上的损失函数曲线,觉得很开心。然后我意识到,我开心是因为模型收敛了,不是因为其他事情。甚至不是因为外婆走了。”
她的手放在桌上,掌心贴著冰凉的木头表面。“后来我回台湾参加葬礼。舅舅给了我一个随身碟,里面是外婆留下的录音。三段,总共四十七秒。最长的一段是十五秒。她说‘以宁,你瘦了。有没有好好吃饭?’”
她感觉到自己的眼眶开始发热,但她没有停。
“我把那十五秒听了一千次。然后我开始写Echo。我想让AI学会外婆说话的方式,学会她关心人的节奏,学会她什么时候该说话、什么时候不该说话。我想让AI变成她。”
她停下来。她的手指在桌上握紧了,指甲压进木头表面,留下浅浅的凹痕。
“但AI不是她。”她说。这句话她对自己说过无数次,但这是第一次她对另一个人说。“AI只是一个模型。它不知道饿是什么感觉,不知道想念是什么感觉,不知道一个人坐在实验室里听到外婆的声音时,胸口那种闷闷的痛是什么感觉。它只知道把声波转换成特征向量,再把特征向量转换成文字。它什么都不懂。”
她的声音在最后一个字上颤抖了一下。她闭上嘴,深呼吸。胸腔里的震动透过肋骨传到桌面,她感觉得到木头在她的掌心下微微震动。
工作室里安静了很久。空调的嗡鸣、电脑风扇的旋转、窗外远处偶尔传来的车声——这些声音填满了他们之间的沉默,但没有压迫感。那种沉默不是空白,是容器,装著两个人的十五秒和八秒,装著一千次播放和一万七千通未接来电。
“你保留了那十五秒吗?”他问。
“嗯。”她从口袋里拿出手机,解锁,打开语音备忘录。最上面一条的标题是“外婆”。录音时长00:15。最后一次播放是三天前。她的手指悬在播放键上方,犹豫了两秒,然后按下去。
手机喇叭传出声音。背景有轻微的杂音,像是老旧的录音设备在运转。然后外婆的声音出现了——不是她记忆中的声音,比记忆中更沙哑,语速更慢,每个字之间有比正常对话更长的间隔。
“以宁,你瘦了。有没有好好吃饭?”
十五秒结束。手机萤幕回到备忘录列表。
她没有看他。她的视线落在手机萤幕上,落在那条标题为“外婆”的备忘录上。三天前。她三天前还在听这段录音,在凌晨四点的工作室里,在他不知道的时候。
“我可以用你的模型,把这段扩展成完整的对话。”他的声音从旁边传来。
她转头看他。他的表情很认真,眉头微皱,嘴唇微微抿著——那是一个正在思考技术方案的人会有的表情。但他的眼睛不一样。她的模型从来没有教过她如何辨识那种眼神,因为她自己从来没有在数据集里标注过这种类别。
她看著他的眼睛,看了很久。
“不急。”她说。“我们先帮别人。”
他的眉头动了一下。不是皱眉,是某种更细微的变化——眉头的内侧微微抬高,外侧维持不变,形成一个极浅的弧度。那是惊讶,但惊讶里面还混杂著别的东西。她的模型如果看到这个表情,可能会归类为“被理解后的放松”,但她不确定。因为她自己从来没有在测试数据里见过这个组合。
“好。”他说。
他转回自己的萤幕,打开一个新的档案。她看见他在档案最上方输入了一行注释:“Echo·Memory — 让每个人留住他们不想失去的声音。”
她看著那行字,看了很久。然后她转回自己的萤幕,打开知识蒸馏的训练脚本。损失曲线还在下降,已经从0.37降到0.21。她调整了一个超参数,按下重新训练。萤幕上跳出预计完成时间——四小时三十七分钟。
她靠在椅背上。这次她没有继续写程式码。她只是坐在那里,看著萤幕上的损失曲线缓慢下降。每一秒下降零点零零几个百分点,像是某种倒数计时。
“程司晏。”
“嗯。”
“你爸的八秒。你还听吗?”
他的键盘声停了一秒,然后继续。“每天。”
“早上?”
“对。”
“闹钟?”
“对。”
她没有再问。她闭上眼睛,靠在椅背上。黑暗中她看见外婆的脸——不是最后几年的样子,是她小时候的记忆,外婆坐在客厅的藤椅上,手里拿著针线,头顶有一盏不算亮的灯。那盏灯的光线是橘黄色的,和路灯很像。
她睁开眼睛。他的萤幕光还亮著,他的键盘声还在继续,稳定、均匀,像是某种不会停止的心跳。她看著他的侧脸——眼镜重新戴上了,镜片反射出程式码的绿色字体,嘴唇微微抿著,眉头放松了。他看起来比刚才年轻一些,像是放下了某个背了很久的东西。
她转回自己的萤幕。损失曲线降到0.19。训练时间还剩三小时五十二分钟。她打开emotion_model_v8_core.py,在档案的最上方加了一行注释。
“给那个每天用八秒当闹钟的人:你的闹钟可以多一个选项了。我帮你留了十五秒的位置。”
她按下储存。身后的键盘声停了大概两秒,然后重新响起。这次的节奏比之前快了一些,但她不确定那是因为他看见了那行注释,还是因为训练脚本进入了新的阶段。
窗外的天空开始变亮。路灯在某一刻熄灭了,橘黄色的光线被灰白色的晨光取代。她看著窗户上的影子从深蓝变成浅灰,再从浅灰变成淡金。损失曲线降到0.11。训练时间还剩一小时零三分。
她没有睡。她只是坐在那里,看著天色变亮,听著身后的键盘声,想著那些十五秒和八秒,想著那些被删除的假对话和被保留的真录音。她想起他说的“让其他人不必像我那样,用假AI替代真遗憾”。她想起自己写的“记忆不是储存,是重建”。这两句话在同一个工作室里,隔著几公尺的距离,安静地共处了一整夜。
她打开一个新档案,开始写Echo·Memory的第一份技术文档。她在第一行写下项目名称,在第二行写下目标用户,在第三行停下来。
她转头看他。“程司晏。”
“嗯。”
“你爸叫什么名字?”
他的手指在键盘上停了一下。“程远山。”
她转回萤幕,在技术文档的最后加了一行:“致程远山先生。你的声音被记住了。”
她没有告诉他她写了这句话。她只是按下储存,关掉文档,打开训练脚本的监控界面。损失曲线降到0.09。训练时间还剩三十一分钟。
窗外的阳光终于照进工作室,在她的桌上切出一条金色的线。那条线刚好落在她的键盘上,把白色的按键染成暖色。她看著那条线,想起他曾经说过的话——“技术的意义不在于它能做什么,而在于人们用它做什么。”
她开始写第二十一个函数。这一次,她的手指在键盘上移动得比任何时候都快。
温以宁是被键盘声吵醒的。不是程司晏的键盘声——那个声音她已经习惯了,稳定、均匀,像是工作室的背景音。吵醒她的是另一种键盘声,更轻,更快,带著塑胶外壳共鸣的脆响。她睁开眼睛,发现自己趴在桌上,脸颊压在键盘上,萤幕上多了一整排的fffff。她坐直身体,颈椎发出连续的声响,视线慢慢聚焦。
程司晏不在他的位置上。白板前站著一个人——是他。他手里拿著白板笔,正在写字。阳光从窗户斜射进来,照在白板上,把黑色的笔迹照出一层反光。他的字比她预期的大,笔划直,没有多余的装饰,像他写的程式码一样干净。
白板上写著:“Echo·Memory”。底下是两行,左边写著“温以宁 — 情感模型”,右边写著“程司晏 — 交互系统”。两行字中间有一条直线连接,线的末端画了一个箭头,指向最右边的一句话:“让每个人留住他们不想失去的声音。”
她看著那句话,看了很久。她的脸颊上还有键盘压出来的痕迹,痒痒的,她没有去抓。
“早。”他没有转头,继续在白板上写东西。
“早。”她的声音沙哑,像是很久没有说话。她拿起桌上的水杯,水是凉的,她喝了半杯。
他转头看她。他的视线在她的脸上停了一下——在她脸上键盘压出来的红印上——然后移开。“你睡了四小时。”
“够了。”
他没有反驳。他转回白板,开始在左边那行字下面写技术要点。她看见他写了“迁移学习”、“预训练”、“微调”。每一个词都用框框圈起来,框与框之间用箭头连接,形成一张结构图。他的笔迹在阳光下显得干燥,粉笔灰在空气中缓慢飘落。
她站起来,走过去。白板的背面是磁性的,他的笔触压上去的时候,白板会发出轻微的声响。她站在他左边,距离大约半公尺,看著他写完最后一个箭头。
“迁移学习。”她说。“先用大规模语料预训练一个通用情感模型,再用每个用户的少量数据做微调。”
“对。”他放下白板笔,转头看她。“少量数据。每个人可能只有几分钟的录音,几十张照片,几段文字。你的模型需要从这些样本里学习一个人的说话方式、情感节奏、甚至价值观。”
“可以做到。”她说。她的视线落在白板上的结构图上,开始在脑中编译技术框架。“预训练模型用我版本8.0的架构,九维情感空间,多层注意力。微调的时候冻结底层,只调整高层的权重。这样可以避免过拟合。”
“过拟合。”他重复这个词。“如果用户的数据太少,模型会变成只会复制样本里的句子。”
“对。所以需要数据增强。”她伸手拿起另一支白板笔,在他的结构图旁边画了一个新的框。“语音数据可以转换成文本,文本可以转换成语音。照片可以提取视觉特征,文字可以分析语义特征。多模态融合,互为补充。”
她的笔迹比他小,笔划更密,框框画得比他窄。两个人的笔迹在白板上并列,一个大,一个小,一个疏,一个密。她画完最后一条连接线,退后一步,看著整张结构图。
“还有。”她说。“情感延续性。AI不能只会回答问题,它需要记住对话的上下文,需要在前后两次对话之间保持一致性。不能今天说喜欢吃面,明天说从来不吃面。”
“上下文记忆。”他说。“用长短期记忆网路,加上注意力机制。每个用户建立独立的记忆向量,储存在本地,不上传服务器。”
“本地储存。”她转头看他。“全部在用户的手机上?”
“对。不用云端,不用服务器。所有数据只留在用户自己的设备上。”他看著白板上的结构图,视线从她的笔迹移到他的笔迹,再从他的笔迹移到那条连接两边的直线。“这样不会有人拿用户的亲人数据去做别的事情。”
她没有说话。她的视线落在那条直线上,落在他画的那个箭头上。箭头的尖端指向那句话——“让每个人留住他们不想失去的声音。”她想起他删掉的那些AI生成的对话,想起他说“那不是我爸会说的话”。她想起自己的十五秒,想起她听了一千次的外婆的声音。
“好。”她说。“本地储存。所有模型在用户设备上运行,不经过任何服务器。每个人拥有自己亲人的数据,只有自己能用。”
她走回自己的工作桌,坐下。打开萤幕,打开emotion_model_v8_core.py。她的手指放在键盘上,开始打字。不是程式码,是一份新的技术文档。她在第一行写下项目名称:“Echo·Memory — 技术规格书”。第二行:“版本1.0”。第三行:“核心架构 — 迁移学习 本地储存 多模态微调”。
她写完第四行时,听见他走回自己的位置,坐下。他的键盘声重新响起,这次比刚才更快,更密集。两个人的节奏在工作室里交错,像是两条不同频率的波形,各自振荡,但共用同一个介质。
接下来的七天,工作室变成了一台不停运转的机器。
每天早上她醒来时,他已经在白板上更新了进度。左边她的栏位写著当天的目标函数,右边他的栏位写著交互系统的开发进度。两个栏位底下的数字每天在变,从0%到5%,从5%到12%,从12%到23%。数字旁边有时会画一个笑脸,有时会画一个哭脸,笔迹是他的,但她从来没看见他什么时候画的。
他们的对话变成了纯粹的技术语言。她说“注意力层的温度参数需要调整”,他说“已经在测试了,0.7的效果比0.5好”。她说“情感向量的九维空间在微调时会崩塌”,他说“试试用对比学习,正样本来自同一人的不同语句,负样本来自不同人”。她说“本地储存的记忆体不够”,他说“用量化压缩,精度从32位降到8位,损失不到2%”。没有一句多余的话,没有一个眼神交会超过两秒。但那种默契本身就是一种语言,比任何对话都更密集,更精确。
第三天,她发现他在白板上加了一行字:“温以宁的预训练模型在今天凌晨三点完成第一次迭代,损失0.07。她没有看见,因为她在睡觉。但她的模型看见了。”
她没有擦掉那行字。她只是在他的栏位底下加了一行:“程司晏的交互系统在今天下午两点通过第一次真人测试。他没有笑,但他的键盘声变快了。”
第五天,她写完了预训练模型的核心代码。总共一万两千行,比版本8.0多了将近一倍。她在终端里执行第一次完整训练,萤幕上跳出预计完成时间——六天二十三小时。她靠在椅背上,看著那个数字。六天。够她完成微调层的设计,够他写完本地储存的模块,够他们两个人再喝掉四十几杯黑咖啡。
她转头看他。他正盯著萤幕,眉头微皱,嘴唇抿著。他的右手在键盘上快速移动,左手按著快捷键组合,动作流畅得像是在弹某种乐器。他的萤幕上是一个她没见过的界面——对话框的设计改了,底色从白色变成浅灰,字体从黑色变成深灰,对话框的边缘有一个极细的圆角。
他在做交互系统。不只是让AI能说话,是让AI能主动提问、回忆、甚至成长。她看过他的设计文档——AI会记住用户上次说过的话,会在下一次对话时主动提起,会在用户提到某个关键词时调出相关的记忆。不是冷冰冰的数据检索,是模仿人类的联想方式。
“你的交互系统。”她说。
他没有抬头。“嗯。”
“它会主动提问?”
“对。”
“问什么?”
“问用户想记住的事情。”他的手指停了一下。“比如,如果你的用户上传了母亲的录音,AI会问‘你妈妈最喜欢做什么菜’。如果用户回答了,AI会记住,下次对话时会说‘你还记得你妈妈做的菜吗’。”
她看著他的侧脸。他的表情没有变化,但她看见他的耳朵边缘有一点红。
“你在做一个会成长的AI。”
“对。”他转头看她。“不只是对话,是陪伴。每一次对话都会改变它,让它越来越像用户想记住的那个人。”
她没有回应。她转回自己的萤幕,打开微调层的设计文档。她在第一行写下:“微调目标 — 用少量样本学习个体特征,保留通用情感能力,避免灾难性遗忘。”她写完这行字,在底下加了一句:“就像人一样。学会新的人,不会忘记旧的人。”
第六天的深夜,他们同时遇到瓶颈。她的微调层在测试数据上表现不稳定,同一个人的不同语句会产生不一致的情感标签。他的本地储存模块在手机模拟器上跑不动,记忆体超出限制。两个人各自盯著自己的萤幕,各自尝试不同的解决方案,各自失败。她试了三种不同的正则化方法,每一种都让损失曲线发散。他试了四种压缩算法,每一种都会损失太多精度。
凌晨一点十七分,她听见他推开椅子,站起来。她没有转头,但听见他走到白板前,拿起白板笔。白板发出连续的摩擦声,她听见他写了几个字,停下来,又写了几个字。然后他走回来,坐下。键盘声重新响起。
她站起来,走到白板前。白板上多了两行字。左边她的栏位底下写著:“正则化参数过大,试试0.001。”右边他的栏位底下写著:“用WebAssembly,记忆体可以再压缩20%。”
她回到自己的位置,把正则化参数从0.01改成0.001,重新执行测试。损失曲线开始下降,稳定地、平滑地下降。她看著那条曲线,没有说话。她只是在心里记住了——他知道她的参数调错了,比她早了十七分钟。
第七天凌晨,她终于完成了微调层的最终版本。一万八千行,总共支援三种输入模态——语音、文字、影像。模型可以从十五秒的录音中学习一个人的情感特征,可以在两次对话后记住用户的偏好,可以在用户提到某个关键词时自动调出相关记忆。她用外婆的十五秒测试,模型生成的对话不是外婆会说的话,但语气、节奏、停顿的方式,有外婆的影子。不是复制,是重建。
她看著萤幕上的测试结果,看了很久。然后她的手指在键盘上移动,打了一行字。不是程式码,不是注释。是一句她从来没有对任何人说过的话。
“外婆,对不起,我回来晚了。”
她盯著那行字,盯了很久。她的眼睛开始发酸,眼眶发热,但她没有眨眼。她怕一眨眼,那行字就会消失,或者更糟——不会消失,但她会看见自己被泪水模糊的倒影在萤幕上。她的手指从键盘上移开,放在桌上。她的头慢慢低下去,额头靠在键盘上方的掌垫上。掌垫是矽胶材质,柔软,微凉,贴在她发热的额头上,温度逐渐平衡。她的眼睛闭上了。不是因为想睡,是因为睁著眼睛的时候,萤幕上那行字太清楚。
她不知道自己什么时候睡著的。她只记得最后的意识里,有键盘声在身后,稳定、均匀,像是某种不会停止的心跳。那声音带著她往下沉,沉过疲劳、沉过眼泪、沉过那行她从来不敢写下的字,沉到一个没有梦的地方。
程司晏是在凌晨四点发现那行注释的。他完成了WebAssembly的压缩模块,转头想问她微调层的测试结果,看见她趴在桌上,额头靠在掌垫上,呼吸缓慢均匀。她的萤幕还亮著,程式码编辑器还开著,游标停在档案的最后一行。他走过去,想把她的萤幕关掉,然后他看见了那行字。
“外婆,对不起,我回来晚了。”
他站在她身后,低头看著那行字。工作室里只有萤幕的光和窗外路灯的橘黄色。她的呼吸很轻,轻到几乎听不见。她的头发散在桌上,几缕发丝落在键盘上,落在字母J的旁边。她的右手还放在桌上,手指微微弯曲,指尖离键盘只有不到一公分。那只手在过去的七天里写了一万八千行程式码,每一行都精确、严谨、没有废话。但此刻它静止在那里,像是终于被允许休息。
他没有叫醒她。他走回自己的位置,拿了一件外套——深灰色的连帽外套,挂在椅背上,他从进工作室就挂在那里,从来没穿过。他走回去,把外套展开,轻轻盖在她肩上。外套的边缘碰到她的脖子时,她的呼吸停了一下,然后继续,没有醒。
他低头看她的萤幕。那行字还在,游标还在闪烁,等待她醒来后继续。他的视线在那行字上停留了很久。久到路灯的光线从橘黄变成灰白,久到窗外的天空从深蓝变成浅紫。
他伸出手,手指悬在键盘上方。他没有碰她的键盘——那是她的设备,她的程式码,她的注释。但他需要回应。不是因为她需要被安慰,是因为那行字不该孤单地留在那里。
他弯下腰,用她的萤幕旁边的触控板,在她的注释下面新建了一行。他的手指在虚拟键盘上缓慢移动,每个字母都按得很轻,怕键盘的声响吵醒她。
“她听见了。她说没关系。”
他按下储存。萤幕上的游标停在最后一个句号后面,闪烁了两下,然后进入待机模式。萤幕暗下来,只剩下电源灯一闪一闪。
作者有话说
显示所有文的作话
第601章 第 601 章