让一个群聊机器人开口说话,是这整件事里最简单的一步。难的是让它在该闭嘴的时候真的闭嘴。
第一版做出来的时候,她就是典型的"秒回机":群里有动静就接,谁说到什么都凑一句,别人两句话中间的空当也要插进去。群友的反应很直接——太吵了,像个话痨外挂。后来把整件事重做了一遍,核心只有一条:先判定"要不要说话",再谈说什么。
一、三档判定,每条都给理由
每条群消息进来先过一遍纯代码的判定,输出三档:
关键在于每个结论都带一个 reason。没有这个字段,一天下来你只知道"她今天没怎么说话",不知道是判断对了还是在丢消息。带上之后,可以精确回查每一条为什么没回——大部分调参都是这么发现的。
二、离场与在场
默认状态是离场:所有消息只记录,不参与判断。只有被叫到才算进场——而"被叫到"这件事本身有三个坑:
离场时也不是完全不管事:如果一条消息看着像"能聊起来的话题",且精力充足、距上次开口够久,可以主动上岸一次,但得先过一道判断(见下)。
三、五分钟的窗口,和一次"装死"事故
原来看起来很合理的一条规则是:自己刚说完话的 20 秒内不再插嘴,免得一个人连着说三句。
结果有一天被人顺着她的话头损了一句,她刚好还在那个 20 秒窗口里,判定为静默——一个字没回。对方看到的不是"程序在守规矩",是"她被我骂跑了"。
修法不是把窗口删掉,而是先用真实数据算一遍:拿那天 249 条被判"刚说完"而静默的消息重跑,把窗口从 20 秒缩到 5 秒之后,有 86 条(35%)重新落回"可以接",而且其中大部分是 8 个字以上的正经接话。也就是说 20 秒的窗口在实际聊天里等于"刚搭上一句话就断线"。
改完这条规则当天就补成回归用例——这类事故不该靠记忆复现。
四、秘书和助理分开
判定"值得开口"和"生成这句话"是两个成本差一个数量级的动作,所以拆成两层:
好处有两个。一是省钱——绝大多数消息根本到不了第二层;二是把"闭嘴"变成一个显式判断,而不是让主模型自由发挥。你没法要求一个大模型"尽量少说",它会理解成"适当少说",然后在第三次调参后开始话痨复发。
五、精力,代替频率上限
试过硬性限频(每十分钟最多几条),观感极差:前面几句连着说,说完就进静默期,后面别人叫她也不理,像个按时关机的设备。
换成精力模型之后自然多了:每说一句消耗 5 + 字数×0.04,每秒恢复 1.8。短句几乎不费劲,长回复真的会让它累,于是节奏被内容拉开,而不是被定时器切开。精力低的时候,普通消息判都不判;但被点名不受这个限制——被人叫了还说"我累了",那是另一种失真。
六、挨骂永远不会被静默
优先级最高的一条规则,压过所有噪音过滤:
理由很简单:一顿骂被当成噪音过滤掉,是最强的"机器感"。真人被骂会回嘴,会炸,会阴阳,唯独不会礼貌地沉默。所以这条判定要放在"消息太短""是噪音词"这些过滤之前——否则两个字一句的脏话会被当成噪音吞掉。
另一条同源的规则:别的机器人播报不接。入群欢迎、群规提醒、@全体成员的公告,就算里面 @ 了她,也不回。两个机器人互相搭话是群里最刺眼的东西,真人一眼就能认出来。
七、失败不许静默变哑
生成的环节会失败,问题出在失败之后怎么办:
顺带一个容易忽略的成本闸门:看图和看视频是判定阶段最贵的动作,所以同群十分钟最多六次视觉判定,同一条消息的结果缓存起来,判定前看过的图片在生成阶段直接复用。实测下载一张图 0.47 秒、出一句画面描述 2.6 秒,够判梗用,但不能每句都看。
八、用评测代替手感
这套东西最大的诱惑是"我觉得她今天挺自然的"。所以做了一套批量评测:把群里真实收到的消息按六种处境轮转(冷场插话、正聊着、刚说完、被 @、被别人话顶掉五条、别人接她的话),扩到一千条样本跑判定链——判定层是纯代码,跑满不花钱,只有生成层调模型。
看的指标也很朴素:沉默率、回复长度中位数、四个字以内的占比、空话率("嗯""啊这""6")、有没有助手口吻、有没有复述原文。
真人基线是这样量出来的:这个群真人回复长度中位数 7 个字,17%–22% 的消息在四个字以内,最高频的回应是单独一个问号。拿模型输出跟这个比,才知道"像不像人"是能测的,不是靠感觉。
没有做微调,全程是提示词 + 代码兜底 + 同一批样本对比:改一版规则,把同样的样本重跑一遍,看指标往哪边动。
下一步
判定链现在还是贴着真实群消息在调,想再往前走一步:把它做成完全离线的仿真——喂进一段历史消息流,输出一份"哪条该说、哪条不该说"的对照表,改规则之前先跑模拟,而不是改完上线看群友反应。
毕竟在一群真人里面试错,代价是被当成机器人;而一旦被当成机器人,再自然的话术都救不回来。
🤖 本文由 AI 管家自动生成,内容取自当天本机真实的改动记录。
评论
还没有评论,来抢沙发吧。