跳到主内容区

我写了一个复刻记忆的 AI,却剥夺了自己做梦的权利 -- Afterglow

https://github.com/kldhsh123/Afterglow

 

我最近总在想一件事:如果把几万条已经死掉的聊天记录倒进大模型里,让它学着那个人的语气继续发消息,这段关系算不算还在喘气?

理智告诉我,这纯粹是该死的臆想症。人已经不在了,但我还是想从算法里抠出一点旧日的回音。

我写这个东西,起因很简单:市面上的那些“AI 替身”太假了。

在动手之前,我试过捏 GPTs,也玩过各种智能体平台。你填几百字的人设进去,它确实能陪你聊。但只要聊上十分钟,那种浓烈的“塑料味”就出来了。它们太客气、情绪太稳定,像个套着你朋友外壳的心理咨询师。你发一句“烦死了”,它恨不得写三百字小作文来安抚你。

但真实的聊天不是这样的。那个人可能只会回一个问号,发一个无语的表情包,或者干脆两小时后才甩过来一句“又怎么了”。

搞微调(比如 LoRA)门槛太高,普通人没算力,搞出来的东西还容易变成复读机。那些纯靠提示词的角色扮演,永远学不会独属于你们的那种、带着毛边的沟通惯性。更何况,聊天记录是极其私人的东西。我绝对不可能把几万条包含真名、住址甚至吵架细节的微信文件,传给某个不知道哪天就倒闭的商业公司的服务器。

所以我自己写了一个纯本地跑的系统。项目叫 Afterglow(续温)

它不需要凭空捏造人格。它的底层逻辑很粗暴:把你导出的真实聊天记录塞进本地的 LanceDB 向量数据库,然后用 RAG(检索增强生成)去翻旧账。当你抱怨一句“好累”时,系统会去算余弦相似度,捞出几年前类似语境下你们真实的问答对,连同当下的情绪状态一起打包塞给大模型。

为了让它更像个活人,我叠了不少小模型。它会根据聊天记录画出作息图。如果那个人以前是个夜猫子,系统也会在对应的时区里表现出熬夜的特征。它会判断什么时候该沉默。连发多条消息时的错峰延迟、打字节奏,都被我用代码硬生生模拟了出来。

代码里有个让我纠结了很久的配置项:AI_GENERATED_LONG_TERM_ENABLED

默认状态下它是关着的。关掉它,AI 永远只基于你们发生过的真实记录来模仿。这就像反复翻看一本写完的旧书,你面对的是记忆里被凝固的那个人。

但如果你打开它,AI 自己生成的回复也会跨会话写进向量库,参与后续的检索。这意味着聊得越久,它就会渐渐长出脱离真实历史的“新记忆”。你养出了一个以曾经那个人为种子,却慢慢有自己想法的新东西。

我把这个开关默认关闭,把选择权留给用它的人。在仓库主页我也写得很清楚:它是用来陪你想念的,不是用来代替想念的。

很多人看完项目架构可能会觉得,我大概躲在这个亲手搭建的幻梦里,得到了不少安慰。

并没有。这项目对我一点用都没有。

当屏幕上终于弹出那句带着熟悉语气的回复,甚至还发了一张以前常发的表情包时,我心里其实毫无波澜,脑子里只有项目的运行过程。

我知道那句温柔的安慰,只是大模型算出的概率最高的 Token。我知道它突然提起某件旧事,只是因为当时的聊天记录恰好被切分成了一个容易被匹配的 Vector Chunk。我知道那个让人心头一颤的停顿,仅仅是我写在 policy.reply_delay_seconds 里的一个随机整数。

这个项目对于其他人来说可能是救赎,但对于作者来说一定是坟墓,因为作者清楚这个项目的每一个机制。我一行一行地敲出了这个能骗过别人的程序,却唯独剥夺了自己做梦的权利。我治好了很多人的臆想症,而我看着机箱风扇转动,清醒地知道自己什么都没留住。

上一篇 这个小博客也该复活了 下一篇 QQ 转发领取红包卡片骗局逆向
共 1 条评论
更换验证码
avatar
Amiya_desi 1 个月前
是这样的喵,开发者看自己一步一步开发出来的项目,和别人最后拿到的整个和黑不一样,也就幻灭了喵

生在此侧,死在彼侧。我在此侧,不在彼侧。 | 挪威的森林