“外婆走的时候我在MIT。那天我在实验室调一个模型,怎么调都不收敛,我很生气,把手边的马克杯摔在地上。然后手机响了。是舅舅打来的,他说外婆走了,下午三点十七分。”她的声音很平,像是在陈述一段与自己无关的历史。“我挂了电话,把地上的碎片扫干净,继续调模型。那天晚上模型收敛了。我看著萤幕上的损失函数曲线,觉得很开心。然后我意识到,我开心是因为模型收敛了,不是因为其他事情。甚至不是因为外婆走了。”
她听见身后有细微的声响——他的椅子动了一下,但没有脚步声。他没有走过来。
“后来我回台湾参加葬礼。舅舅给了我一个随身碟,里面是外婆留下的录音,三段,总共四十七秒。最长的一段是十五秒,她说‘以宁,你瘦了。有没有好好吃饭?’”
她的手指按在窗台上,指尖压进油漆的细纹里。“我把那十五秒听了大概一千次。然后我开始写Echo。我想让AI学会外婆说话的方式,学会她关心人的节奏,学会她什么时候该说话、什么时候不该说话。我想让AI变成她。”
她转头看他。他坐在椅子上,笔记型电脑还放在膝盖上,萤幕的光照著他的脸。他没有看她,视线落在键盘上,表情隐没在阴影中。
“但AI不是她。”她说。“AI只是一个模型。它不知道饿是什么感觉,不知道想念是什么感觉,不知道一个人坐在实验室里听到外婆的声音时,胸口那种闷闷的痛是什么感觉。它只知道把声波转换成特征向量,再把特征向量转换成文字。它什么都不懂。”
她的声音在最后一个字上裂开了一个细小的缝。她闭上嘴,把那个缝合起来。
“你说的那些话。”她继续。“你的应用有八十七万用户。他们用你的AI说话,觉得被理解了。但那不是理解。那是模式匹配。你的AI没有理解任何一个人,它只是在几十亿个对话样本里找到了最像的那个回答。那不是情感,那是统计。”
她等著他反驳。等著他说“不,我的AI真的能理解”,等著他用技术细节证明他的应用不是统计学的产物。那是她熟悉的对话模式——和学术圈的同行辩论,和公司的产品经理争执,和任何一个相信AI能产生情感的人对抗。
但他没有说话。
他只是坐在那里,安静地听完她说的话,然后安静地继续沉默。沉默持续了很久,久到她以为他不会回答了。
“你说得对。”他说。
她愣了一下。
“我的AI不懂情感。”他的声音很低。“它只知道模式匹配、特征向量、损失函数。它不知道为什么一个用户在凌晨三点输入‘我想你’的时候,手指在萤幕上停留了四十七秒才按下发送。它只知道那三个字的语义向量和训练数据里的几万个样本相似。”
他抬起头看她。“但那些用户知道。他们知道自己在跟一个不懂情感的AI说话,但他们还是说了。因为有的时候,他们需要的不是一个真正懂的人,他们需要的只是一个能回应的地方。哪怕那个回应只是模式匹配的结果。”
她看著他。他的眼睛在萤幕光中显得很亮,但她不确定那是光的反射还是别的什么。
“你外婆的十五秒录音。”他说。“你听了一千次。你知道那是模式匹配,你知道那只是声波和特征向量。但你还是听了一千次。因为你需要听到那个声音,哪怕它只是一个录音。”
她的手从窗台上放下来。“你在说我的Echo没有意义。”
“我在说你的Echo有意义。但不是因为它真的能理解情感。是因为你试图用它来理解情感。这个试图的过程,比结果重要。”
她站在窗边,看著他。他坐在椅子上,看著她。窗外的路灯照进来,在他的左肩上切出一道橘黄色的光线。他的右半边脸在阴影中,但她看得见他的表情——平静、认真,没有一丝说服她的意图。他只是在说他相信的事情。
她走回自己的工作桌,坐下。萤幕上还是那三行程式码,还是那个空荡荡的工作目录。她的手指放在键盘上,这次没有移开。
“如果我提交程式码到你的项目。”她说。“我的名字会出现在哪里?”
“你想出现在哪里就在哪里。”
“每个文件的开头,我要加版权声明。”
“可以。”
“我要保留模型的解释权。如果有人误用,我有权要求下架。”
“开源协议没有这个条款。但我们可以另外签一份备忘录,不具有法律强制力,但可以作为道德约束。”
她转头看他。“你什么都考虑到了?”
“我考虑了七年。”他说这话的时候语气很平静,平静到不像是在说一个很长的时间。“从读你的论文那天开始,我就在想,如果有一天能跟你合作,我该怎么保护你的东西。”
她没有回应。她的手指在键盘上开始移动。第一行,import numpy as np。第二行,import torch。第三行,她删掉之前写的那段注释,重新输入:
Echo Memory - Core Emotion Model
Version 8.0
Author: Wen Yining (contributor to Echo·lite, an open-source project)
License: MIT
This model is based on the affective computing framework proposed in Wen (2017).
Memory is not storage. It is reconstruction.
她按下储存。档案总管里出现了第一个档案:emotion_model_v8_init.py。档案大小不到1KB,但她盯著那个档名看了很久。
“你决定了?”他问。
“决定了。”
“不后悔?”
“后悔了再说。”
她打开第二个档案,开始写模型的核心框架。手指在键盘上移动的速度比早上快了很多,像是停滞了很久的河流终于找到出口。每一行程式码都是她熟悉的——情感向量的定义、注意力机制的设计、情绪混合编码的逻辑——但她写得比任何时候都谨慎。因为这一次,这些程式码不属于公司的实验室,不属于任何商业产品。它们只属于她自己。
身后键盘声重新响起。两个人的节奏再次交错,但这次不一样。她的节奏比以前稳定,他的节奏比以前轻盈。像是两条平行的轨道,在经过漫长的各自延伸后,终于在同一个方向上并行。
窗外天色完全暗下来。她没有注意到时间的流逝,直到肚子发出饥饿的声音。她看了一眼萤幕右下角——晚上十一点十七分。她从吃完面到现在,已经过了将近十二小时。
“饿了?”他的声音从身后传来。
“嗯。”
“我叫外送。”
“不用。我自己去买。”
她站起来,发现自己的脖子僵硬得几乎转不动。她用手按住后颈,用力压了几下,听见骨头发出细碎的声响。她走向门口,经过他的工作桌时,瞥见他的萤幕。
他在写一个新的档案。档名是license_agreement.md。她看见里面有一段文字:
“Echo·lite的核心情感模型由温以宁贡献,基于其原创研究成果。任何使用该模型的作品,必须在显著位置标明原作者姓名,并附上本协议的连结。”
她停下脚步。
“你在写什么?”
“备忘录。”他没有抬头。“你说要保留解释权。我把你的要求写进项目文档里。”
她看著他继续打字。他的手指在键盘上移动,萤幕上的文字一行一行增加。她注意到他的注释区块里有一行她没看过的句子:
“这个项目的存在,是因为一个人在七年前写了一篇论文,让另一个人相信,技术可以承载情感。”
她的视线在那行字上停留了三秒,然后移开。
她走出门,下楼,推开公寓大门。夜晚的空气比白天凉,她穿著早上那件薄针织衫,风从领口灌进来,她打了个寒颤。便利商店在街角,蓝白色的灯光照亮人行道。她走进去,拿了两个饭团和两瓶水,结帐,走出商店。
回到工作室时,门还是没锁。她推开门,把一个饭团和一瓶水放在他的桌上。
“谢谢。”他说。他没有抬头,但她看见他的手指停了一下。
她坐回自己的位置,打开饭团,咬了一口。这次是鲔鱼口味,没有她不喜欢的料。她不知道他是怎么知道她不吃肉松的,也许只是巧合。
吃完饭团,她继续写程式码。emotion_model_v8_core.py,她写到第十七个函数时,需要参考他echo_lite的原始码。她打开他的项目目录,找到attention_layer.py,准备复制一段权重初始化的程式码。
她按下复制快捷键时,视线无意间落在程式码的最上方。那里有一行注释,她用余光扫过,然后停下来。
“To WYN: this is where it all began.”
她的手指停在触控板上。WYN。那是她的缩写。
她没有立刻问。她关掉那个档案,继续写自己的程式码。但她的手指移动速度变慢了,大脑在处理程式码逻辑的同时,一直在重复那行注释。this is where it all began。这是一切开始的地方。什么开始?他的开源项目?他对她理论的兴趣?还是别的什么?
她写完第十八个函数,按下储存。然后她转头看他。
他正专心写备忘录,没有注意到她的视线。工作室的灯光在他脸上投下柔和的阴影,他看起来比实际年龄年轻,像是一个还在读研究所的学生。但他的手指——稳定、精确、每个按键都压到底——泄露了他多年的经验。
她没有打断他。她转回自己的萤幕,打开那个档案,又看了一次那行注释。然后她关掉,继续写第十九个函数。
窗外的路灯在某一刻熄灭了,天快亮了。她的萤幕上已经有七个档案,总共三千多行程式码。这是一天的成果。七年的心血,压缩成三千行。
她靠在椅背上,闭上眼睛。黑暗中,那行注释再次浮现——“To WYN: this is where it all began.”
明天她要问他这句话的意思。但不是现在。现在她太累了,累到无法思考程式码以外的任何东西。她闭著眼睛,听见他的键盘声还在继续,稳定、均匀,像是某种不会停止的心跳。
她让那个声音带著她,慢慢沉入睡眠。
温以宁醒来时,萤幕上显示早上七点十二分。她的头枕在左手臂上,右手还放在键盘上,食指压著字母J,萤幕上因此多了一整排的jjjjjjj。她删掉那些多余的字元,坐直身体,颈椎发出连续三声细响。
工作室里的光线是清晨特有的冷白色,从窗户斜射进来,在地上切出整齐的矩形。程司晏不在他的位置上,但他的笔记型电脑开著,萤幕保护程式是深蓝色的几何图案,缓慢旋转。桌上多了一个马克杯,里面有半杯已经凉透的咖啡,杯壁上有一圈浅褐色的痕迹。
她转向自己的萤幕,打开昨天最后编辑的档案。emotion_model_v8_core.py,第十九个函数只写了一半,中断在一行return陈述句前。她的记忆在几秒内恢复——昨天写到这里时眼睛已经睁不开,她本想写完这个函数再休息,但身体先做出了决定。
她打开浏览器,进入echo_lite的程式码仓库。首页显示最后一次提交是凌晨四点二十二分,提交者是Cheng Siyan,提交讯息只有四个字:备忘录更新。
她点开那个档案。license_agreement.md已经完成了,总共四十七行,涵盖了作者署名、使用限制、解释权归属、争议处理等所有她昨天提出的要求。最后一行写著:“本备忘录不具法律强制力,但签署者将被视为认同其精神。技术的意义不在于它能做什么,而在于人们用它做什么。”
她关掉浏览器,打开attention_layer.py。那行注释还在——“To WYN: this is where it all began.”——在萤幕左侧第四行,灰色字体,不仔细看很容易忽略。
身后传来脚步声。她没有转头,手指在触控板上停在那一行。
“早安。”程司晏的声音从门口传来,带著清晨特有的低哑。他走进来,手里提著一个塑胶袋,脚步声比昨天重一些,像是睡眠不足的人会有的步伐。
“早安。”她没有回头。“这行注释是什么意思?”
她的手指点在萤幕上,指尖下方正是那行灰色字体。她听见他停下脚步,塑胶袋发出细微的沙沙声。
他走过来,站在她身后,距离大约一公尺。她没有转头,但她感觉得到他的视线落在萤幕上,落在那行注释上。
“没什么。”他说。“就是纪录。”
他的语气很平静,平静到像是经过排练。但她听出来了——那种平静是刻意维持的,就像一个人走在结冰的湖面上,每一步都小心翼翼,怕冰层裂开。
“纪录什么?”她问。
“纪录这个项目是从哪里开始的。”
她转头看他。他站在她身后,手里提著塑胶袋,表情没有变化。但她看见他的眼睛——当她说出“纪录什么”那三个字的时候,他的瞳孔有极短暂的收缩,不到零点五秒,随即恢复正常。
他在说谎。不是恶意的谎言,是那种被撞见秘密时的闪躲。她太熟悉这种闪躲了,因为她自己每天都在做同样的事——用平静的表情掩盖不想被看见的东西。
她没有追问。她关掉attention_layer.py,打开自己的emotion_model_v8_core.py。“早餐是什么?”
他把塑胶袋放在她桌上。“饭团和豆浆。这次没有肉松。”
她拿起饭团,咬了一口。是鲔鱼的,和昨天一样。她喝了一口豆浆,温的,甜度刚好。
接下来的三天,他们进入一种无声的节奏。每天早上她醒来时,他已经在工作室里,桌上放著两个人的早餐。她写情感模型的核心算法,他做工程优化和部署架构。两人之间的对话全是技术术语——损失函数、注意力权重、记忆体对齐、延迟优化。没有闲聊,没有寒暄,甚至没有眼神交会。但那种默契本身就是一种语言。
她发现他会在特定时间泡咖啡——上午十点和下午三点,每次两杯,黑咖啡,不加糖不加奶。他会把其中一杯放在她桌子的右上角,不会碰到她的键盘和笔记本。她从来没有说过谢谢,他也从来没有等她说。
她发现他写程式码时有一个习惯——遇到复杂的逻辑问题时,他会把眼镜摘下来,用拇指和食指按压鼻梁两侧,闭上眼睛大约十秒,然后重新戴上眼镜,继续写。那个动作每天会出现五到六次,通常在下午比较频繁。
她发现他的工作室里没有时钟。墙上没有挂钟,桌上没有闹钟,连电脑的选单列都被他设定成隐藏模式。时间在这里变成了一种只有通过光线变化和饥饿感才能感知的东西。
第三天下午,她完成了情感模型的核心框架。八个模组,四十七个函数,总共六千两百行程式码。她在终端里执行测试脚本,萤幕上跳出评估结果:情感辨识准确率98.7%,情感连贯性评分9.2/10,对话回应延迟0.3秒。
她靠在椅背上,看著那些数字。98.7%。这是她七年来最好的成绩。在公司实验室时,版本7.0的准确率是97.1%。她用更少的资源、更短的时间,做出了一个更好的模型。
她转头想告诉他这个结果,但他不在位置上。他的笔记型电脑开著,萤幕上是一个她没见过的介面——手机模拟器,左侧是程式码编辑器,右侧是一个对话框。
她站起来,走过去。萤幕上是一个正在运行的Echo·lite测试版本,但界面和她之前看到的不同。对话框更小,字体更紧凑,选单被简化成只有三个按钮。这是一个手机版界面。
她看见他在做什么了。他在把她的情感模型移植到手机端。她的模型需要至少8GB记忆体才能流畅运行,但手机的平均可用记忆体不到2GB。他正在做的是压缩——降低情感向量的维度,减少注意力层的数量,量化权重参数。
她坐回自己的位置,打开他昨天提交的程式码。她找到emotion_encoder_mobile.py,打开。
第一眼她就看见了。他把情感向量的维度从九维降到了五维。九维是她版本8.0的核心改进,是她花了三个月才找到的最优解。五维是他在七年前就能做到的版本。
她的手指在触控板上快速滑动,逐行检查。不只是向量维度,他还删除了情绪混合编码层,简化了注意力机制的计算图,甚至把浮点数精度从32位降到了16位。
她在心里快速估算——这些改动总共会损失大约12%的准确率。98.7%会变成86.5%左右。86.5%是她在五年前就能达到的水准。
她的手指停在触控板上,指甲压进触控板的边缘。
她等他回来。大约二十分钟后,门开了。他走进来,手里拿著便利商店的袋子,看见她坐在他的位置前,表情没有任何变化。
“你改了向量维度。”她说。
“对。”他把袋子放在桌上。“手机记忆体不够,九维跑不动。”
“你删了情绪混合编码层。”
“那个层的计算量太大,手机CPU撑不住。”
“你把精度降到16位。”
“32位会让应用的安装包增加80MB,用户不会下载。”
她站起来,转头看他。他站在她面前,距离不到一公尺,表情平静。但她看得出来——他的下巴微微绷紧,那是他在准备接受某种冲击时的表情。
“你在阉割我的模型。”她的声音很低。
“我在让你的模型能被普通人使用。”
“86.5%的准确率。那是五年前的水准。”
“五年前的水准对大多数用户来说已经足够了。”
“对你来说足够了。”她走近一步。“但对我来说不够。98.7%和86.5%之间的差距,是情感理解的真实性和统计学的猜测之间的差距。86.5%的模型不知道一个人在哭的时候需要沉默,它只会从训练数据里找到最常见的回应方式——说一些安慰的话。但真正悲伤的人不需要安慰,他们需要有人安静地陪著。”
“你的98.7%的模型需要8GB记忆体才能跑。”他的声音也低下来。“8GB。一部手机的平均记忆体是2GB。你做的是一个只有超级计算机才能跑的东西,普通人怎么用?”
“那就不要给普通人用。这不是一个消费级产品。”
“那你做它做什么?”他的语气第一次出现了尖锐的边缘。“放在服务器上让学术圈的人写论文引用?还是放在硬碟里等你偶尔拿出来跑一次测试?”
她没有回答。她的手握成拳头,指甲压进掌心。
“你说你做Echo是为了你外婆。”他继续。“但你外婆不会用超级计算机。她只会用手机,会在睡前关机,会因为萤幕字太小叫你帮她调大。你的98.7%的模型对她来说没有意义,因为她永远用不到。”
“你不要拿我外婆来说事。”
“我没有拿你外婆说事。我在拿所有需要这个技术的人说事。”他的声音放缓了一些,但底下的坚硬没有减少。“八十七万用户在用Echo·lite。他们用2GB记忆体的手机,在捷运上、在深夜的房间里、在医院的候诊室,跟一个只有86.5%准确率的AI说话。86.5%对你来说不够,但对他们来说,是他们唯一能说话的地方。”
她看著他。他的眼睛里没有愤怒,没有辩解,只有一种沈淀下来的笃定。那种笃定让她想起实验室里的显微镜——无论你放多大的倍率,它的结构都不会松动。
“你从一开始就打算改我的模型。”她说。“你找我合作,不是为了让我的理论活下去。是为了让你的应用变得更强。”
他的下巴绷得更紧了。“两件事不冲突。”
“冲突。”她转身走回自己的工作桌,开始关闭萤幕上的档案。“我的模型不是你的功能的附属品。如果你只想从我这里拿东西去喂你的应用,那你找错人了。”
“温以宁——”
“备份我已经拿回来了。”她关掉最后一个档案,站起来。“合作结束。”
她走向门口。这次她的步伐比三天前快,快到她几乎在走路的声音里听不见自己的心跳。她的手碰到门把时,身后没有声音。没有键盘声,没有椅子移动的声音,甚至没有呼吸声。
她打开门,走廊的声控灯亮起来,昏黄的光线照在磨石子地上。
“如果我找到方法保留98.7%呢?”
她的手停在门把上。
“如果我能让你的模型在2GB记忆体上跑出98.7%的准确率呢?”
她没有回头。“不可能。”
“知识蒸馏。”他的声音从身后传来。“用你的九维模型作为教师模型,训练一个五维的学生模型。学生模型保留教师模型的情感理解能力,但体积只有原来的十分之一。”
她的手指在门把上收紧。知识蒸馏。她知道这个技术——用大模型的输出作为训练目标,让小模型模仿大模型的行为,而不是直接学习原始数据。理论上可以保留大部分性能,但她从没在情感计算领域尝试过,因为情感特征比图像或语音更难蒸馏。
“你试过?”
“试过。在读你的论文时就想过,但一直没有机会实现。因为我没有你的原始模型。”他停了一下。“现在有了。”
她站在门口,没有动。走廊的声控灯因为长时间没有声音而熄灭,她重新陷入只有工作室灯光的半明半暗中。
“情感特征很难蒸馏。”她说。
“我知道。”
“注意力机制的分布资讯会丢失。”
“我想过。可以用多层蒸馏,逐层对齐注意力分布。”
“那需要大量计算。”
“我的服务器可以跑。”
她终于转头。他站在原地,没有靠近,也没有退后。他的手插在口袋里,肩膀微微前倾——那是一个等待的姿势,不是讨好,不是说服,只是等待。
“你要花多少时间?”
“两周。”
“如果失败了呢?”
“那就回到86.5%。但至少我们试过。”
她看著他。他看著她。工作室的萤幕光在他们之间划出一道界线,一边是她的领域,一边是他的。但此刻那条线看起来不再像是边界,更像是某种连接。
她走回自己的工作桌,坐下。重新打开萤幕,重新打开那些被她关掉的档案。
“两周。”她说。“如果失败了,你的86.5%方案我也不会接受。”
“那时候再说。”
“不是再说。是重新谈。”
“好。”
她打开emotion_model_v8_core.py,开始审视九维模型的架构。他在她旁边坐下,打开自己的笔记型电脑,开始写知识蒸馏的训练脚本。
接下来三天,他们进入了比之前更高强度的协作。她负责设计教师模型的输出介面,决定哪些中间层的资讯需要被蒸馏;他负责实现蒸馏的训练框架,确保学生模型能够有效学习教师模型的行为。两人的对话从技术术语升级为更精确的技术讨论——损失函数的加权比例、温度参数的调整策略、注意力分布的对齐方式。
第三天晚上,她发现他在训练脚本里加了一个她没想到的功能——动态温度调节,根据输入情感的复杂度自动调整蒸馏的软化程度。情感越复杂,温度越高,学生模型学到的细节越多。
“这个想法不错。”她说。
他没有回应。她转头看他,他正盯著萤幕,眉头微皱,嘴唇抿著。他的右手在键盘上,但没有敲击。
“怎么了?”
“训练数据。”他说。“我需要大量情感对话的数据来训练学生模型。你的原始数据有1.2PB,但那些数据的所有权在公司手上,我不能用。”
她沉默了几秒。“用开源数据集。”
“开源数据集的情感标注不够精细。你的模型需要微秒级的情绪变化数据,开源数据集只有粗略的标签——开心、悲伤、生气。不够。”
她想了想。“用Echo·lite的用户对话日志。”
他转头看她。“那些日志是匿名的,但用户没有授权用于训练。”
“那就申请授权。发一个通知给所有用户,说明我们要用对话数据训练新模型,用户可以选择退出。”
“这样会损失一部分数据。”
“总比没有好。”
他看著她,眼睛里有一种她没见过的表情。不是惊讶,不是赞赏,更像是某种确认——确认她和他站在同一条线上。
“好。”他打开浏览器,开始写用户通知。
当天深夜,她完成了教师模型的输出介面设计。她把档案储存,靠在椅背上,伸展僵硬的肩膀。工作室里很安静,他的键盘声已经停了十几分钟,但他还坐在位置上,萤幕亮著。