群消息自动回复做出来不难,难的是"回得像个人"——收到就秒回、见话就接、语气一成不变,用不了两天群成员就知道这是个机器人。这篇讲监听与回复的完整链路,重点放在"接话时机"这个最影响体验的细节上。

一、监听:群消息进来先分流

群消息通过回调推过来,第一步不是直接处理,是分流。按消息类型分——文本进语义处理,图片、链接、名片各自走专门通道或忽略。按发送者分——机器人自己发的跳过(防止自循环),白名单管理员的标记不处理,普通成员的进判定。

分流的代码要放在回调入口,分流完立即 ACK,后续判定和回复全走异步队列。消息回调的字段结构在 Eyun 开发文档 中有说明。

二、判定:这条消息该不该回

不是所有消息都该回。判定的优先级从高到低:@ 了机器人——必回;明确问题句式(带问号、带"怎么/如何/请问")——按群策略决定;闲聊、表情、灌水——不回。

判定用规则加轻量分类就够,不需要每条都调大模型。规则匹配不上再进模型兜底,既省钱又快。

三、接话时机:机器人最像人的地方

真人接话有节奏——看到消息、想几秒、打字几秒。机器人要模拟这个节奏:@ 机器人的消息延迟 2-5 秒再回(随机值),非 @ 的插话延迟更长(5-15 秒),同一个人连续发问时合并成一条回复。

还有一个细节:回复前检查"这期间有没有新消息进来",有的话把新消息也纳入上下文一起回,避免刚发完回复发现用户又补了一句。

四、回复出口:统一排队控速

多个群、多个成员的回复请求统一进一个出口队列,按 3 秒间隔逐条发。群里连续触发多条回复时,后发的带上"补充"衔接语,而不是干巴巴连发三条。

监听回复链路对照

环节

核心动作

关键参数

常见坑

监听

回调分流

按类型+发送者

回复自己的消息死循环

判定

该不该回

@必回/问题选择性回

见话就接刷屏

时机

拟人化延迟

2-5秒随机

秒回暴露机器人

出口

统一队列控速

≥3秒间隔

并发直发被限流

拟人化回复实现

import time, random, queue, threading

class GroupListener:
    def __init__(self, api, brain):
        self.api = api
        self.brain = brain                 # 回复内容生成
        self.outbox = queue.Queue()
        self.pending = {}                  # group_id -> 待回消息缓冲
        threading.Thread(target=self.sender_loop, daemon=True).start()

    def on_message(self, event):
        # 分流:自己的消息跳过
        if event["from"] == SELF_WXID: return
        if event["type"] != "text": return

        # 判定:该不该回
        at_me = SELF_WXID in event.get("at_list", [])
        is_question = any(k in event["content"]
                          for k in ["?", "?", "怎么", "如何", "请问"])
        if not (at_me or is_question): return

        # 时机:@ 我 2-5 秒,普通问题 5-15 秒
        delay = random.uniform(2, 5) if at_me else random.uniform(5, 15)
        gid = event["group_id"]
        self.pending[gid] = (event, time.time() + delay)

    def sender_loop(self):
        while True:
            now = time.time()
            for gid, (event, due) in list(self.pending.items()):
                if now < due: continue
                del self.pending[gid]
                # 回复前检查是否有补充消息,合并上下文
                reply = self.brain.generate(
                    gid, event["content"],
                    extras=self.recent(gid, since=event["ts"]))
                self.outbox.put((gid, reply[:500]))
            while not self.outbox.empty():
                gid, text = self.outbox.get()
                self.api.post("/send", {
                    "group_id": gid, "content": text})
                time.sleep(3)              # 出口统一控速
            time.sleep(0.5)

落地建议

监听入口先分流——机器人自己的消息必须跳过,否则回复触发回复死循环。判定分层——@ 必回、问题句式选择性回、闲聊不回,别见话就接。接话时机加随机延迟,@ 的 2-5 秒、插话的 5-15 秒,回复前检查有没有补充消息一起回。回复出口统一队列 3 秒间隔,别并发直发。微信侧的群消息回调和发送接口由 Eyun 这类个人微信API平台 提供,判定和时机控制在自建服务实现,具体字段以平台开发文档为准。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐