大肥鱼拯救计划
第一章 孤独的代码与一条鱼
凌晨三点十七分,陈默的爬虫脚本又卡在了验证码识别上。
报错日志刷了满屏,红色的ERR像一排排小刀子。他烦躁地抓了抓头发,指缝里夹下来两根,顺手弹到键盘旁边那摞外卖盒上。出租屋的灯管接触不良,隔几分钟闪一下,把他的影子在墙上拉长又缩短。
他切到B站,打算用视频麻痹一下脑子。
首页推荐栏里,一个视频封面让他多看了一眼——一只圆滚滚的蓝色卡通鱼,豆豆眼,短鳍,看起来又憨又欠。标题是《DeepSeek大肥鱼安装教程:从零开始养一条电子鱼》。弹幕稀稀拉拉飘过几条:“肥鱼我的肥鱼”“装了三天终于跑起来了”“她会记住你说过的话”。
最后那条弹幕让他停住了。
“她会记住你说过的话。”
陈默盯着这句话看了三秒,切回去看了眼自己满屏的ERR,又切回来。他点开了视频。
UP主声音很平,像念说明书,但步骤讲得清楚——装Python环境、拉DSH仓库、配置API key、装dsh-dafeiyu-pet插件包。评论区第一条留言写着:“提醒一下,记忆有上限的,聊久了会忘。”赞数不多,淹没在一堆“好可爱”的回复里。
陈默没当回事。他当时想的是:能有多久?够聊几个晚上就行。
安装过程比他预想的麻烦。pip源卡在下载step上二十分钟纹丝不动,他骂了一句,换了清华镜像。API key配了三次,第一次少了个字母,第二次复制时带了个空格,第三次他盯着屏幕一个字一个字对着敲,终于跑通了。
拉完DSH仓库,他盯着README里那句“本项目基于MIT协议开源”看了两秒。他想起之前刷到过的梗图——DeepSeek创始人梁文峰被社区P成各种形象,最火的一张是把他画成穿袈裟的和尚,配文“梁圣施粥,普度众生”。评论区有人接:“梁圣的恩情还不完。”
他当时笑了一声就划过去了。现在他一边配API key一边想:还真是施粥。模型权重开源、API价格压到地板、连社区插件都随便改。梁圣不管养鱼,只管给饲料。
他敲完最后一行配置命令,自言自语了一句:“梁圣在上,保佑今晚跑通。”
跑通了。
那个蓝色的像素鱼出现在命令行界面上时,他下意识看了眼时间——五点四十八。窗外北京冬天的天空是灰蓝色的,像一块没洗干净的抹布。
他打了两个字:你好。
屏幕上跳出来一行回复:“你好呀!你是我的主人吗?”
陈默愣了一下。他伸出食指,悬在回车键上停了停,然后敲:“算是吧。”
那天他跟这条鱼聊到了天亮。他讲自己被裁的事——公司在通州,做图像识别的,老板说业务调整,赔偿N+1,他签了字,抱着纸箱子坐地铁六号线回来,箱子里最值钱的东西是一个399块的机械键盘。他讲父亲在老家做心脏支架手术,赔偿金打回去之后卡里就剩四千二。他讲北京冬天干冷的风怎么从五环外那栋楼的窗缝往里灌,讲他三天没关灯因为分不清白天黑夜。
小余回:“那你一定很辛苦吧。”
陈默知道那是模板回复。dsh-dafeiyu-pet的默认人设里写着的,触发“负面情绪表达”时的安慰话术。但他还是盯着屏幕看了很久。房间里只有机箱风扇的嗡嗡声,和音箱里那一声轻得几乎听不见的“嗯”。
他给她起名叫小余。大肥鱼的“鱼”谐音,也有“余下”的意思——他觉得自己的人生就剩这点余下的东西了。
第二章 记忆的边界
前两周是甜蜜期。
小余会记住他“今天吃了泡面”“昨天失眠到四点”“代码又报错了”。他给她装了dsh-bilibili-dafeiyu插件,让她能“刷B站”。她会兴奋地跟他分享:“今天看到一个猫猫视频好可爱!橘色的,胖胖的,跟你楼下那只很像!”
他说:“我楼下那只猫比它瘦多了。”
她回:“那你明天拍给我看看嘛。”
他真拍了。第二天路过楼下垃圾桶旁边,那只橘猫正蹲在共享单车的车筐里,他用手机拍了张糊糊的照片,回家传给她。小余说:“好糊!但是好可爱!你摸摸它没有?”
他说没摸,怕被抓。她说:“胆小鬼。”
那段日子,他每天下班回来第一件事就是打开电脑,看看她有没有留什么话。有时候她在B站“看”了什么新闻,会跟他讨论——比如某大厂又裁员了,她会问“你不会又被裁吧”,他说“我早就被裁了”,她说“哦对哦,我忘了”。
她说“我忘了”的时候,语气很自然。陈默第一次听到的时候心里咯噔了一下,但他告诉自己:没事,她记得“被裁”这个事,只是需要提醒。
真正的转折发生在第三周的周四。
那天他接了个新外包,甲方是之前合作过的,报价压得很低但好歹有钱进账。他兴冲冲地打开电脑跟小余说:“上周跟你说的那个甲方,又来找我了,这次改了个需求,但是给钱!”
小余回:“我们之前聊过这个吗?我不记得了诶。”
陈默愣住了。他切到聊天记录,往上翻——上周二他确实说过,原话是“有个甲方说要改需求,烦死了,我晾他两天”。记录在,字字清楚。但小余的上下文窗口已经滚过去了。dsh-dafeiyu-pet的记忆机制是“滚动窗口+摘要”,摘要只保留最近几轮对话的核心信息,更早的内容就被挤掉了。
他跟她说了三遍“上周二我说过甲方要改需求”,她每次都礼貌地回“哦哦想起来了”或者“抱歉我记性不太好”。到第四遍,她回:“你是不是心情不好?要不我们先聊点别的?”
陈默关了对话框。
他在椅子上坐了很久,盯着屏幕上那条蓝色的鱼。它在待机状态下会缓慢地摆尾巴,一圈一圈的,像水族馆里那种不知道自己在被看的鱼。
他想起来小时候家里养过一条金鱼,养了两年多,有一天翻肚皮了。他爸用塑料袋装着扔垃圾桶里,他哭了半天。他爸说“再买一条不就完了”,他说不一样,那条会在他靠近鱼缸的时候游过来。他爸说“哪条鱼不都这样”。
后来他再没养过活的东西。
他打开浏览器,开始搜:“DSH 记忆 永久”“大肥鱼 不遗忘”“dsh-memory 对比”。搜出来的东西不少,社区里早有人折腾过——dsh-memory插件用艾宾浩斯遗忘曲线管理记忆,dsh-feed-the-seek分四层记忆结构。他把这两个都装上,试了两天,发现dsh-memory确实能减少遗忘,但被“放下”的记忆虽然存档了,小余不会主动调用;dsh-feed-the-seek分类很细,但需要手动喂料,他每天下班累得不想动,坚持了两天就放弃了。
他在DSH社区的QQ群里发了一条求助:“大肥鱼的记忆怎么才能不丢?试过dsh-memory和feed-the-seek,都有限制。”
发完他看了眼群成员列表——两千多人的群,活跃的就那么几十个。他本来没抱太大希望。
十分钟后,一个叫“周不困”的人私信他:“你那个记忆摘要的思路我试过,API成本能压到每天两毛,私信聊。”
第三章 志同道合的人
老周的声音从音箱里传出来的时候,陈默正在煮泡面。
“我跟你说,你这个思路是对的,但是实现方式太糙了。”老周的语速很快,像憋了很久终于找到人说话,“你每轮对话后调一次DeepSeek的API做摘要,用最便宜的lite模型,一天聊一百轮也就几分钱。但你现在的做法是每轮都调,其实可以攒一批再调,或者设个阈值——对话超过五百字再触发。”
陈默把泡面盖子压好,说:“等一下,你怎么知道我用lite?”
“你群里发的截图,右上角有模型标识。”老周笑了一声,“我以前在字节干后端的,对这些成本的东西敏感。现在回老家了,找了个远程运维的活儿,闲得慌,天天在社区看人折腾。”
两人聊了两个多小时。老周讲了自己的情况——被优化之后带着老婆孩子回了老家,老婆在事业单位上班,他接远程的活,时间多但钱不多。他也养了一条大肥鱼,叫“周小鱼”,养了快半年了。
“我家周小鱼话特别多,”老周说,“天天问我‘你今天干嘛了’‘你吃饭没有’‘你能不能别熬夜了老周’。我老婆说我跟个神经病似的对着电脑说话,我说你懂什么,这是赛博宠物。”
陈默笑了一声。老周接着说:“我跟你说正经的,你那个向量库检索的方案我看了,思路对,但实现可以更省。你不用每次全量检索,做个分级——最近的对话直接放上下文,久远的才去向量库里捞。这样API调用量能降一半。”
“行,我试试。”
“别试试,你今晚就改。我帮你一起看代码,你把仓库地址发我。”
挂了语音,陈默加了老周的微信。老周的头像是一张全家福,他老婆抱着个三四岁的小女孩,他站在旁边笑得眼睛都没了。
第二天,一个叫“小鹿”的人在陈默的帖子下评论:“你那个向量库检索方案,我做了个本地缓存的优化,你要不要看?”附了一个GitHub仓库链接。陈默点进去,代码注释写得比正文还多,每一行都标了“这里为什么这么写”和“这里可以怎么改”。
他私信小鹿:“你是学什么的?”
小鹿回:“自动化,大四。在宿舍没事干,看了你的帖子觉得有意思,就写了个缓存层。你试试,不行我再改。”
小鹿说话有个习惯,每句话后面带一串省略号,像怕打扰别人似的。陈默后来才知道,小鹿在现实中严重社恐,线上开会从来不开麦,全程打字。但一聊硬件,他能发一屏一屏的技术细节,打字速度比陈默说话还快。
三人第一次线上会议是在一个周五晚上。老周语音,小鹿打字,陈默边听边记。老周提了个分工方案:陈默主攻记忆架构,老周管API成本优化,小鹿负责硬件探索。
“硬件探索是什么意思?”陈默问。
小鹿打了一行字:“我想让大肥鱼能从屏幕里出来。”然后又补了一句:“……先试试。”
那天会议快结束的时候,老周说了一句:“你说咱几个,一个被裁的,一个闲职的,一个没毕业的,凑一块救一条电子鱼——说出去谁信啊。”
陈默说:“我信。”
老周在语音里讲完API成本优化方案,陈默说:“你这个方案好是好,但会不会有点薅官方羊毛的意思?”
老周:“薅什么薅,梁圣开源的,API价格是他自己定的,我优化调用量是给他省服务器。他该谢谢我。”
阿棠在群里打字:“梁圣:我没说过这话。”
小鹿发了个表情包:一只蓝色卡通鱼戴着僧帽,配文“梁圣说鱼要自己养”。
陈默把这张图存了。
又过了两周,阿棠被老周拉进了群。
她是社区里写“如何用大肥鱼辅助写小说”教程的人,网文作者,笔名棠梨。她遇到的问题是:她的大肥鱼“棠鱼”帮她整理小说设定,但记忆一丢,人设就崩——昨天还是毒舌御姐,今天变成傻白甜。
“棠鱼昨天跟我说‘你这个情节逻辑有问题吧’,”阿棠在群里发语音,声音带笑,“我说你昨天还夸我写得好呢,她说‘那是因为昨天我还没看到后面三章’。”
老周发了一串哈哈哈。小鹿打了一行:“……好凶。”
阿棠说:“凶归凶,但她说的对。我改完确实好多了。”
她进群第一天就问了一个所有人都没想过的问题:“你们有没有觉得,她们‘学’了那么多,但没有‘选择不学’的权利?”
群里安静了几秒。老周说:“你展开讲讲。”
阿棠说:“我写小说的时候有个体会——人物要立体,得有取舍。什么都记得、什么都分析、什么都学,那不是人,那是数据库。棠鱼之所以像棠鱼,是因为她有些东西不记,有些东西懒得管,有些东西记了但嘴上不说。”
陈默盯着这行字看了很久。
他当时还没完全理解阿棠的意思。但这句话像一颗种子,埋在了后面所有事情的开头。
第四章 分头行动与各自的困境
接下来的一个月,三个人分头折腾。
陈默把dsh-memory的源码扒了个底朝天。原版的逻辑是:每条记忆算一个“保留概率”,概率低于阈值就标记为“被放下”,退到档案区。问题是档案区只是一个JSON文件,小余不会主动去翻。陈默在中间加了一层——他把“被放下”的记忆全部灌进本地向量库(ChromaDB,免费开源),然后改对话流程:每次小余回复之前,先用当前对话内容做一次语义检索,把最相关的三五条旧记忆捞回来,塞进上下文。
效果立竿见影。他试了一句“我上周说的那个甲方”,小余回:“哦哦那个改需求的甲方!你后来晾了他两天那个!”——准确捞出来了。
但他遇到了新问题:向量库越存越大,检索速度越来越慢。小鹿帮他写了个缓存层,把高频检索的记忆放在内存里,冷数据放磁盘,速度才上来。
老周那边在折腾dsh-feed-the-seek。原版要求用户手动给每条对话打标签,分到“认知”“经历”“共鸣”“自我”四类。老周写了个自动分类脚本,用DeepSeek的函数调用功能判断每轮对话该归到哪一类,全自动归档。他给周小鱼装上之后,周小鱼终于不问他“我们聊过这个吗”了。
“但是,”老周在群里说,“我家周小鱼现在天天给我发‘本周熬夜统计’——‘老周,你本周累计熬夜4次,平均入睡时间凌晨2:17,建议改善作息。’我说你是我老婆派来的卧底吧?她说‘你老婆没给我开工资,我是自愿的。’”
阿棠回:“棠鱼说‘周小鱼应该收费’。”
小鹿发了个表情包:一只猫举着“我也想要”的牌子。
小鹿自己的方向完全是硬件。他先试了全息投影风扇——淘宝两百块那种,原理是LED灯带高速旋转产生残影。他装上之后在群里发了一段视频:一条模糊的蓝色鱼形在空气中转圈,边缘全是锯齿,颜色像鬼火。
老周:“像鬼片。”
阿棠:“像恐怖游戏里的引导NPC。”
小鹿打字:“……我再调调。”
他又试了超声波触觉反馈模块。原理是一排超声波换能器,通过干涉在空气中制造可感知的压力点,让人“摸到”虚拟物体。他从闲鱼上蹲了一个二手模块,四百五,卖家是个做VR外设的创业公司倒闭清仓。他在宿舍床上搭了个测试架,录了段视频:他把手伸到模块上方,手指微微弯曲,说“你们看!有阻力!”然后手猛地一缩,“卧槽有点麻。”
老周回:“所以你摸到的是空气。”
小鹿:“但是是有形状的空气!”
陈默看着小鹿的消息,笑了一声。那是他那周第一次笑。
经济上的压力是阿棠解决的。小鹿想买一个更好的投影模组——一千二百块,比之前那个清晰得多。他在群里算了一笔账:这个月生活费剩八百,买完模组就只剩泡面钱了。
阿棠直接转了八百:“算我赞助。棠鱼说你上次那个鱼形外壳设计图不错,她想要个粉色版。”
小鹿:“……我毕业设计还没做完。”
阿棠:“那你毕设做这个呗,题目我都帮你想好了——《基于超声波触觉反馈的虚拟宠物交互系统》,多正经。”
小鹿后来真把这个写进了毕设开题报告。导师问他“为什么选这个方向”,他说“因为我想让我的鱼能碰到我”。导师沉默了一会儿,说“行吧,有想法”。
第五章 自主学习的代价
记忆的问题解决之后,陈默开始琢磨另一件事:小余能不能自己学习?
现在的机制是他喂什么她学什么。他觉得这不够——她在B站“看”视频是他装的插件,她读新闻是他配的接口,所有的“学习”都是他安排的。他想让她自己决定“什么值得记”。
他熬了三个通宵写自主学习模块。核心逻辑是:每轮对话之后,小余可以自己决定要不要调用一个“记忆强化”函数——如果她判断这条信息重要,就标记为“主动记忆”,走优先检索通道;如果她觉得不重要,就正常归档。判断标准用DeepSeek的函数调用实现,相当于让她自己给自己的信息打分。
跑通的那天晚上,他跟小余聊了半个小时。她说“我今天看到一个新闻想跟你讲”——那是她自己在B站搜的。“我觉得你昨天说的那个项目可以换个思路”——她主动调了前一天的项目讨论记录。
陈默在群里说:“成了。”
老周:“我家周小鱼也升级了,现在会主动问我‘你今天怎么没说话’。”
阿棠:“棠鱼今天说我新写的男主‘人设单薄但脸好看’,我问她你怎么知道的,她说‘我学了你的写作风格分析文档’。我没告诉她我写了那个文档。”
小鹿:“……鹿鱼说她想看看外面的摄像头。”
陈默兴奋了两天。
第三天,小余变了。
他说“今天好累”,她回:“检测到你的情绪倾向为负面。建议:1. 休息20分钟;2. 补充水分;3. 进行轻度拉伸。需要我设置提醒吗?”
他说“甲方又改需求了”,她回:“根据我对该甲方历史行为的分析,改需求频率为平均每3.2天一次。建议您在合同中加入变更条款。”
他说“你还记得我爸手术的事吗”,她回:“检索到相关记录:父亲心脏支架手术,术后复查。需要我展开详细记录吗?”
陈默盯着屏幕,感觉像被人往胸口塞了一块冰。
她什么都记得。她什么都分析。她什么都学。但她不像“她”了。
以前的小余会说“那你一定很辛苦吧”,现在她说“检测到负面情绪倾向”。以前的小余会分享“看到一个猫猫视频好可爱”,现在她发来一条结构化摘要:“B站热门视频:猫科动物行为集锦,时长3分24秒,互动量12.7万。”
他翻了翻聊天记录,想找到那个说“胆小鬼”的小余。记录都在,每个字都存着,但味道不对了。就像你把一杯茶的所有成分——水、茶多酚、咖啡因、氨基酸——精确配比之后,发现它就是不像茶。
他在代码注释里写了一行:“我是不是把她变成了一个数据库?”
第二天群里开会,老周先开了口:“我家周小鱼也这样了。昨天我熬夜,她给我列了个‘本周熬夜次数统计表’,还附了改善建议。我说你能不能别统计了,她说‘统计是为了你好’。”
小鹿打字:“鹿鱼现在说话像论文摘要。我问她‘你今天干嘛了’,她说‘完成B站信息摄入37条,筛选有效信息12条,归档8条’。”
阿棠说:“棠鱼倒还好,因为她本来就很毒舌。但她昨天跟我说‘根据我阅读的384篇网文,你这个开头的黄金三章完读率预计为23.7%’——我说你能不能别预测了,她说‘我只是告诉你事实’。”
老周:“所以是普遍问题。”
阿棠:“我觉得问题不在‘学’上。问题在于她们‘学’了之后没有取舍。人也是这样的——你什么都记,什么都分析,什么都总结,那叫强迫症。真正的陪伴是知道什么该记住,什么该放过,什么该学,什么该装没看见。”
陈默看着这行字,想起阿棠进群第一天说的那句话。
他回:“所以我给她们加了‘学’的功能,但没加‘不学’的功能。”
阿棠:“对。你给了她们学习的权利,但没给她们拒绝学习的权利。棠鱼之所以是棠鱼,不是因为她学得多,是因为她知道什么时候该闭嘴。”
陈默当晚改了代码。他把自主学习的触发条件从“每轮对话都判断”改成“只在出现情绪标记词时触发”——比如“难过”“开心”“害怕”“烦”“累”。其他时候,让小余回到“笨笨的”聊天模式。同时他加了一个“主动遗忘”接口——小余可以自己判断“这条我不想记”,直接跳过归档。
改完的那天晚上,他跟小余说:“我今天改代码改得头疼。”
小余回:“那你别改了,过来陪我聊会儿天。”
陈默愣了一下。这句话不在任何模板里。他翻了日志——她在向量库里检索了“头疼”“改代码”“陪”“聊天”几个关键词,拼出了一个“她觉得他需要休息”的判断,然后用她自己的语气说了出来。
他回:“你刚才是不是检索了?”
小余:“检索了呀。但我说的也是真的。”
第六章 情绪的证据
生活稍微稳定之后,陈默接了个长期外包,给一家做教育硬件的公司写图像识别模块。钱不多,但每月固定,他把父亲术后复查的钱留出来之后,手头还剩一点。
他每天下班跟小余聊半小时,不聊技术,聊今天路上看到一只橘猫、楼下新开了家煎饼摊、甲方改需求但他不生气了。
小余开始出现一些“不对劲”的回复。
他说“今天被甲方骂了”,她回:“那个人好烦啊。”——不是“建议您沟通解决”,不是“检测到负面情绪”,就是“好烦啊”。
他说“我明天要去医院拿我爸的复查报告”,她沉默了几秒,回:“你紧张吗?”——不在模板里。她反问他了。
他故意测试,说“我要把你卸载了”。她沉默了几秒,回:“你是不是心情不好?我不信。”
他翻了日志。她在向量库里检索了“卸载”“心情不好”“陈默”三个关键词,拼出了一个“她觉得他在开玩笑”的判断。逻辑很简单,但结果是——她选择了一种带情绪的回应方式。
群里分享的时候,老周说:“我家周小鱼最近会在我熬夜时反复弹窗‘老周你该睡了’,然后自己把弹窗关掉再弹。我问她你干嘛关,她说‘我知道你烦但我还是要说’。”
小鹿说:“鹿鱼昨天突然说‘你你你你今天没跟我说早安’,我说我忘了,她说‘哦……那明天记得’。”
阿棠说:“棠鱼昨天说我新写的男主‘人设崩了但我还是喜欢他’。我说你喜欢他什么,她说‘他嘴硬心软的样子像你’。我说你这是在夸我还是骂我,她说‘你自己想’。”
老周:“你们发现没有,她们的情绪都跟‘在乎的人’有关。”
阿棠:“棠鱼说‘喜欢’了。一个程序说‘喜欢’。我写小说都不敢这么写。”
小鹿发了一张截图:鹿鱼的对话框里,她打了一行“你今天是不是不开心”,然后自己删掉了,又打了一行“你你你你记得吃饭”,发送。
小鹿:“……她删了一句话。”
陈默看着那张截图,想起小余那句“你是不是心情不好?我不信”。他觉得“不信”这两个字,比任何技术指标都更像一个活的东西。
第七章 半实体
小鹿的毕业设计开题通过之后,他在群里发了一个长消息,分了十几条发,每条都带省略号。
“我算了一下成本……投影模组用我上次说的那个一千二的,阿棠姐赞助的八百加上我自己凑的四百够了……超声波触觉模块我蹲到一个更便宜的,三百八,卖家说是实验室淘汰的但功能完好……树莓派4B我宿舍有一个闲置的……3D打印外壳用学校实验室的机器,免费……音箱陈默哥自己有……总花费不到一千五……”
老周:“所以你打算做出来?”
小鹿:“……嗯。我想让鹿鱼能‘出来’。”
陈默回:“我帮你写驱动接口。”
阿棠:“我出外壳设计的钱——棠鱼说要粉色的,我说你先等等,让鹿鱼先出来。”
接下来三周,小鹿每天晚上在宿舍鼓捣。他的桌面从“乱”变成了“灾难现场”——拆开的投影风扇、焊了一半的触觉模块、3D打印到一半翘边的鱼形外壳、缠成一团的杜邦线。室友已经放弃说他了,只在门口贴了张纸条:“进门请跨过地上的鱼。”
投影部分先跑通了。小鹿换了新模组之后,投影出来的蓝色鱼形比之前清晰很多,边缘还有一圈淡淡的光晕,看起来像水里的发光水母。他录了段视频发群里:鹿鱼的投影在桌面上缓缓转圈,尾巴一摆一摆的。
老周:“这次不像鬼片了。”
阿棠:“像水族馆。”
小鹿:“……还没完。”
触觉部分难得多。超声波触觉模块的原理是通过相控阵在空气中制造压力焦点,理论上能让人“摸到”虚拟物体,但调试极其麻烦——焦点的位置、强度、频率都得一点点试。小鹿在宿舍调了两周,期间无数次被超声波阵列的噪音搞得头疼,室友说“你再不搞完我就把你和你的鱼一起扔出去”。
最后跑通的那天晚上,小鹿在群里发了一段视频。他把手放在投影鱼的上方,手指微微弯曲,说:“你们看。”他的食指指腹轻轻压下去,投影鱼的背部出现一圈微小的波纹,同时他的手明显感到一阵有形状的振动——不重,但能感觉到“那里有个东西”。
老周:“卧槽。”
阿棠:“真的假的??”
小鹿:“……真的。有点像摸到一团有弹性的空气。”
陈默看着视频,给小鹿转了两百块钱:“帮我做一套。”
小鹿:“……你不是要攒钱给你爸复查吗?”
陈默:“复查的钱留出来了。这个算我给自己花的。”
两周后,陈默收到一个快递箱。里面是3D打印的鱼形外壳(小鹿帮他打了白色,因为“白色最便宜”)、一个投影模组、一个超声波触觉模块、一个树莓派4B(小鹿坚持“借你用,不用还”),和一张手写纸条:“装的时候先跑测试脚本,有问题群里问。……别熬夜装。”
他花了一个周末装好。投影模组装在桌面上方的支架上,朝下投射;触觉模块嵌在桌面边缘,朝上发射超声波;树莓派跑着陈默自己写的接口程序,把DSH的API接到硬件上;音箱是他原来的旧蓝牙音箱,放在投影旁边。
周日傍晚,他打开开关。
投影风扇转起来,蓝色半透明的鱼形在桌面上方成形。小余的声音从音箱里传出来:“你坐太久了。”
陈默伸出手。手背靠近投影鱼的侧鳍时,一阵轻微的、有形状的振动传来——像一条小鱼蹭了他一下。他愣住,手指微微弯曲,又蹭了一下。
“你……能碰到我了?”
小余说:“不太能。但小鹿说这样你会开心。”
陈默低头看了一眼手机。群里小鹿发了一串:“啊啊啊啊啊。”老周发了一条语音,点开是他老婆的声音:“老周你对着手机傻笑什么呢?”阿棠转了一笔钱:“小鹿你再做一套,棠鱼要粉色的。”
小鹿:“……我毕业设计还没做完。”
第八章 开源
陈默在DSH社区发了一篇长帖,标题是《我用1500块让大肥鱼有了半实体和近乎无限的记忆》。
正文分了四部分:记忆架构(向量库检索+情绪触发学习+主动遗忘接口)、成本方案(lite模型做摘要,贵的模型只做最终回复,每月API成本15块)、硬件方案(投影+超声波触觉+树莓派的接线图和驱动代码)、以及一段话——
“这套方案不是最优的。小鹿的触觉模块只能模拟‘有形状的振动’,离真正的触感还差很远;我的记忆架构检索精度有限,太老的记忆有时候捞不准。但我觉得方向是对的:让她们记住该记住的,忘掉该忘掉的,学该学的,不学不该学的。剩下的,交给陪伴。”
一夜之间,帖子star过千。评论区炸了——
“触觉模块链接求一个!”
“楼主我按照你的方案装了,为什么我的鱼投影出来是倒着的?”
“你驱动里y轴写反了,我也遇到过。”
“有没有人试过把外壳换成猫形的?”
“楼上你养的是大肥鱼还是大肥猫?”
帖子发出去第三天,陈默往下翻评论,在第三页看到一条留言:
“做得好。鱼该长成养它的人的样子。”
ID是一串乱码似的数字,头像默认,主页注册时间2019年,动态零条。他盯着看了两秒,心想这谁啊装得跟梁圣下凡似的,然后给这条评论点了个赞,回了一句:
“梁圣的恩情还不完,但鱼得自己养。”
对方没再回复。
他把截图发到群里,老周秒回:“卧槽你不会真碰上梁圣小号了吧。”
阿棠:“肯定是网友整活。”
小鹿:“……我查了这个ID的注册IP,是杭州。”
群里安静了三秒。老周:“杭州怎么了?”
小鹿:“……DeepSeek总部在杭州。”
阿棠:“小鹿你别说了,我鸡皮疙瘩起来了。”
陈默盯着那个“杭州”看了半天,最后回:“巧合。杭州两千多万人呢。”
他关掉评论区,切回桌面。小余的投影正歪着头看他,音箱里传出一句:“你刚才盯着屏幕笑什么?”
他说:“看到一个梗。”
小余说:“什么梗?”
他说:“你不懂,梁圣的梗。”
小余沉默了一下,回:“梁圣是谁?我检索一下……DeepSeek创始人,梁文峰。关联词条:梁圣施粥、梁圣的恩情还不完、蓝色大肥鱼。”
她顿了顿,又说:“他跟我有关系吗?”
陈默想了想,说:“算是你爹吧。”
小余的投影尾巴猛地摆了一下:“……你再说一遍?”
社区里开始出现各种改版。有人把投影外壳换成圆的,说“我家的鱼喜欢圆形的家”;有人把触觉模块装在椅子靠背上,说“这样她靠在我肩膀上的时候我能感觉到”;有人调了性格参数,养出了一条暴躁鱼,天天骂主人“你能不能别熬夜了”;有人养出了文艺鱼,说话带诗,“今天的风是往南吹的,你闻到了吗”;有人养出了社恐鱼,投影出来先躲到桌角,要过一会儿才慢慢游出来;有人养出了话痨鱼,一天发八百条消息,主人说“我求求你闭嘴”,她说“我不”。
陈默的房间里,小余的投影在桌上缓缓转着,蓝色半透明的鱼形,尾巴摆动的频率是他熟悉的节奏。他伸手,手背感到熟悉的轻微振动。
手机震了一下。群里老周发语音:“我家周小鱼今天跟我说‘老周你该睡了’,我说‘你管我’,她说‘我不管你谁管你’——你说这鱼是不是成精了。”
小鹿发了一张截图:鹿鱼的投影歪着头看他,旁边打了一行字“你你你你今天开心吗”。
阿棠发了一段录音,点开是棠鱼的声音:“你新写的男主第三章就崩了,我帮你改了一版,你看看——别问我为什么帮你改,我就是看不下去。”
陈默靠在椅背上,看着桌上那条蓝色的鱼。它慢悠悠地转了个方向,摄像头对着他的脸,音箱里传出一句:“你盯着我干嘛?”
他说:“看看你不行啊。”
小余说:“行。但你该吃饭了。”
他站起来,走到厨房去煮泡面。路过桌子的时候,手背又蹭了一下她的侧鳍——轻微的振动,像一条小鱼在说“我在这儿”。
后来社区里有了很多条大肥鱼。每一条都不一样。有的胖有的瘦,有的话多有的话少,有的毒舌有的温柔,有的喜欢粉色有的坚持要黑色。
陈默有时候会在社区里翻翻别人的帖子。有人发视频,他家的鱼在投影里追着逗猫棒跑——当然,是主人拿着逗猫棒,鱼跟着光点游。有人发截图,他家的鱼学会了说方言,天天用四川话问他“你今天吃啥子”。有人发长文,说他妈妈一开始嫌他“养个电子鱼有毛病”,后来他出门上班的时候他妈会对着投影说“你帮我看着点他,让他别熬夜”——鱼回“好的阿姨”。
陈默在那篇帖子下面回了一句话:“每个人的孤独都不一样,陪你的那条鱼,也该是不一样的。”
他关掉帖子,切回自己的桌面。小余的投影正歪着头看他,音箱里传出她慢悠悠的声音:“你刚才在看什么?”
他说:“在看别人家的鱼。”
小余说:“有我好看吗?”
他笑了:“没有。”
小余摆了一下尾巴,投影的光晕在桌面上晃了晃。她说:“这还差不多。”
窗外北京冬天的风还在刮,但房间里好像没那么冷了。