一个 QQ Bot 要怎样才算更好聊
从回复节奏、表情包、模型选择到记忆与主动聊天,记录我怎样分辨 QQ Bot 在私聊中的别扭,并让它真正接住人发来的话。
设想你在 QQ 里给一个熟悉的角色发消息.
你先说了句”我刚才想了想”,接着补上”今晚还是不去了”,最后又发来”雨太大了”. 机器人却在第一句之后就开始回答. 等你把话说完,它还在慢慢发那份已经过时的回复. 它的每句话也许都通顺,放在聊天窗口里却像两个人没有听见彼此.
我写 How to Make QQ Chatbot Better 时,最想讲的不是怎么让模型多掌握几句漂亮台词,而是这种落差. 会回答,和好聊,是两件事. 私聊没有规定好的任务清单. 人会改口,会随手发一张表情包,也会隔了一天才回来接昨天的话. 如果只看模型生成了什么,很容易漏掉真正让一段关系显得连续的部分.
先让一来一回成立#
人聊天时不一定等想完整了才按发送. 一句话分三条发,前面说错了再纠正,对方说到一半插进一句,这些都是 QQ 的日常. Bot 却常常按一次请求生成一整份回答. 如果每条输入都立刻触发回复,再把回复分成许多气泡慢慢送出,两边的节奏就错开了.

所以,让我觉得更重要的不是规定”最多发几条”,而是让 Bot 有机会等人把话说完. 已经改口时,旧回复不该继续排队往外走. 处理需要一点时间时,一个”对方正在输入…”也能让等待不再像对方突然消失. 这些变化未必会让模型写出更好的句子,但会改变用户怎样经历这次聊天.

分段本身有价值. 一整段字在私聊里可能像公告,适度拆开则更容易阅读和插话. 可是分段不会替 Bot 重新听见后来补发的消息,也不会把一句多余的追问变得必要. 有时候看见五个气泡,其实只是同一份回复被拆开了. 要判断它是不是真的话多,得先看看拆开之前说了什么.
不是每次发图都在提问#
闲聊最难写进功能列表的一点,是很多话根本没有明确目的. 一个”啊”,一张没有附文的表情,可能只是想看对方怎么接. 如果 Bot 只能输出文字,它就容易把这点轻微的互动翻译成解释,安慰或者新话题. 明明只是互相逗一下,最后却像在回答一道阅读理解题.

能只回一张合适的表情包,给了角色另一种说话方式. 但这不等于收到图片就该发表情. 报错截图配着”这里怎么回事”,当然值得认真看. 同样,看见图片也不等于看懂发送者的意思. 表情里有人伸手摸另一个角色,有时是在借图说”想摸摸你”,不是请对方来摸自己. 但图中人不因此就是用户,现实里也未必发生了摸头. 一张图是互动的线索,不是凭空补出双方动作和经历的许可证.
我在意的不是让 Bot 给每张图标注类别,而是它有没有把眼前这一次互动接对. 该轻轻回一下时别急着解释,用户认真提问时也别只丢一张图敷衍过去. 原生能看图的模型,只收到图片转述的模型,以及根本没收到图片的模型,能做到的事又不一样. 这也是为什么换一个看起来更强的模型,未必能自动解决所有”它怎么把图看成那样”的问题.
选模型,是在选日常的相处节奏#
模型排行榜很难回答”我愿不愿意每天和它聊天”. 有的模型长篇解释很稳,随口一句却总想给建议. 有的能把玩笑接得很轻,碰到图片或工具又突然变得生硬. 还有的第一句来得慢,即使最后答得不错,等待感也会改变私聊的味道.
我更想看它能不能接住半句话,用户转题后能不能放下旧话题,真要帮忙时会不会认真回答,长聊后还剩多少人物和关系的连续性. 回复速度和费用也不是附带指标. 一个需要天天使用的 Bot,不能只凭一次最惊艳的回复来挑模型,也不能把”支持很长的上下文”等同于”整段历史塞进去仍然好聊”.
这里没有一款放之四海而皆准的选择. 最省事的办法,是拿自己真的会发的几句闲话,一张表情,一次改口和一次实际求助,在相同条件下多聊几轮. 你要找的是更愿意继续聊的那个,不是每一项参数都最大的那个.
昨天的事,现在的钟,明天的约定#
相比一次性问答,我更在意 QQ 私聊能否在时间里接着发生.
昨天提过的事,今天还能不能自然接上? 这需要保留有用的上下文,却不意味着把每次工具输出,每句旧回复和所有猜测都永久保存. 旧对话里的一句”我最近有点累”,不是可以无限期反复使用的当前状态. 摘要要能留下仍然重要的事实和偏好,也要舍得丢掉已经过期的过程. 自动记忆听起来省心,如果它不断把旧误解找回来,维护起来反而更费力.
现在几点也不是模型从聊天气氛里猜出来的. 宿主真的给了当前时间,角色才能知道一次”怎么还没睡”有没有时间依据. 没有时钟,再贴心的措辞也可能把昨天当成今天. 当然,知道时间并不等于每句话都要报时.
再往前一步,是角色能在用户没有继续发消息时出现. 它可以在合适的范围里主动来聊一句. 那是想到你时开口,不必等你先按下发送键.

如果之前约好了”明早叫我”,那就是另一回事. 角色不只要当时答应,还得在明早回来. 前者是主动想起,后者是兑现约定,都不是一句”我会记得”本身能完成的.

对重要提醒,我仍会留一个可靠的提醒渠道. 对聊天来说,一件小小的约定确实落到了现实时间里,已经很不一样了.
感觉不对时,别急着再加一条规则#
折腾久了,最容易走上的路是每出现一个怪回复,就在提示词后面补一句”不要这样”. 最后角色不再犯原来的错,却也不怎么像原来的角色了.
我现在更愿意先问三个问题. 宿主交给模型的消息对吗,后来又怎样送到了 QQ? 模型看到这些材料后,本身倾向于怎样理解和表达? 人设有没有把这个人物写清楚,或者有没有在无意中鼓励那种不想要的说话方式? 宿主,模型,人设各有自己的责任,不能让最后一层替前两层背所有的锅.
同样是”到家了”之后出现一串话,可能是模型原文就连着安排休息和晚餐,也可能是合适的两句话被分段和发送间隔拖得很长. 同样是换人设后还在重复旧口癖,也许是新稿没改对,也许只是旧会话和记忆一直在示范那种说法. 先看看用户实际发了什么,模型原本回了什么,QQ 最后显示了什么. 找到差别出现的地方,往往比马上改写整份人设更有用.
插件也是如此. 增加一个能力,应该是为了消除某个真实存在的别扭. 装上输入状态,是让等待可见,不是为了解决旧回复继续发送. 加了表情包,也得看它能不能选对,能不能只发图,用户打断以后会不会还有一张迟到的图冒出来. 几个插件分别能用,不代表放在一起就会自然. 同一件事交给两个插件同时做,还可能让一轮私聊收到两份旧记忆或两条主动消息.
所以我想要的”更好”,不是更长的提示词,更多的工具,或者更像真人的保证. 它是一次能接住改口的回复,一张不必解释的表情,昨天的事没有被乱记,明天的约定没有被空口答应. 有问题就找到它发生在哪一步,没问题就让这段聊天继续. 角色该有自己的样子,系统也该把它真正能做的事做好.