一条消息的一生
有人在群里说了一句话。从这句话到达,到它回出第一条、再到它记住这件事,中间经过这几站。每一站在后面都有一篇细讲。
到达
消息从 Discord,或者经过本机的 NapCat 从 QQ 进来,先变成同一个样子:谁说的、在哪说的(哪个服务器、哪个群、还是私聊)、说了什么。不管从哪个平台来,后面走的都是同一条路,它在两边是同一个人(2.25)。
不在名单里的 QQ 群、被关掉的频道,到这里就停了:不存、不看、不学。
看到
它不一定马上看到。正聊着,零点几秒到三秒;刚看过手机,多数十几秒;没在看,大约四成要过半分钟到两分钟。睡着、出门的时候,消息先存着,回来再看(2.4)。
你连着发了几条,它会等一小会儿(默认 1.4 秒)合在一起看,不会一条一条地回。
在叫它吗
私聊、@ 它、回复它、叫它的名字、接着它的话说下去,都算冲着它来的(2.5)。
回不回
十六位「专家」各提一个做法,过几道护栏,挑分最高的那个:马上回、晚点回、只回表情、先看着、不理……大多数消息到这里就定了;牵扯到关系、两难、要查东西的,才先让模型规划一步(2.6、2.7)。
写出来
定了要回,模型照着人格设定写回复。交给它的有:最近的聊天、这一轮想起来的记忆、知识库里翻到的资料、对说话的人的印象、它此刻的状态(几点、累不累、心情),还有它自己最近的口头禅——别再用了(2.10)。
写好的草稿发出去之前先查一遍:说自己是模型、像客服、带标题列表、照抄了给它的说明,这几样一律不发,让它重写;太长、太工整、和自己最近的话重复,也让它重写一次。
分成几条、打出来
一段话分成几条短消息,每条按字数「打」一会儿再发,两条之间停一停;节奏跟着它此刻的状态变(2.8)。偶尔打错一个同音字,发出去才发现,再改(2.9)。
记下
聊完以后,值得记的事进记忆:谁说了什么、发生了什么,和以前记的对不上的标出来;它对这个人的印象、它自己的心情和精力,也跟着这几句话变一点(2.11、2.13、2.18)。群里每过一阵,它还会从大家的聊天里学说话的方式和新词。
对应的代码
- 一条消息进来:
bot.py的on_message;QQ 那边先经过platform_bridge.py、qq_bridge.py变成同样的形状。 - 看到:
cognition/notice.py;连着发的合并:[conversation].debounce_seconds(默认 1.4)。 - 回不回:
cognition/experts/、cognition/guards.py、cognition/arbitration.py、cognition/router.py。 - 写回复和草稿检查:
deepseek.py的回复生成,reply_quality.py的assess_reply_draft(不合格重写一次)。 - 分成几条、打多久:
splitting.py、cognition/conversation_behavior.py的build_human_send_plan;打错字:typos.py。 - 记下:
hmc/engine.py的encode。
没做到的
- 一条消息从头到尾经过哪几站、每站花了多久,后台「认知观测台」能看到大部分,但模型写回复那一段只有总时长,看不到它在里面卡在哪。
- 两次都没写出合格的草稿、而且是「一律不发」的那种毛病时,这一轮就不发了:对方看到的是它没回,不知道它其实想回。