1. 从零搭一套 QQ 机器人,先想清楚你要的到底是什么
很多人一提到“QQ 机器人”,脑子里第一反应就是群里那种自动回复、自动欢迎、自动发公告的小工具。但真到自己动手搭一套,尤其是要接上 AI 知识库和人工后台的时候,事情就完全不是“装个插件”那么简单了。我前后折腾过好几套不同形态的机器人方案,从最早的纯关键词匹配,到后来接入大模型做知识问答,再到加上人工客服兜底,踩过的坑基本能写一本小册子。这篇就把整套东西拆开讲清楚:一套带 AI 知识库和人工后台的 QQ 官方机器人,到底由哪些部分组成,每一块为什么这么设计,以及实际落地时会遇到哪些文档里不会写的问题。
先把结论摆前面:一套完整的系统,核心就四块——QQ 官方机器人接入层、AI 知识库问答层、人工后台接管层、消息路由与状态管理层。这四块缺一不可,而且它们之间的边界怎么划,直接决定了你后面维护起来是轻松还是痛苦。很多人一开始只想着“让机器人能回答问题”,结果上线后发现答错了没人管、用户投诉找不到记录、知识库更新要重启服务,这些都是架构没设计好埋下的雷。
这篇文章适合谁看?如果你是完全没接触过 QQ 机器人开发的新手,建议先看第 2 章把接入流程跑通;如果你已经有一个能收发消息的机器人,但想加上 AI 问答和人工接管,那第 3、4、5 章是重点;如果你正在做技术选型,纠结用哪个框架、知识库怎么存、人工后台怎么设计,那通篇都值得过一遍。我会尽量把每个决策背后的“为什么”讲透,而不是只丢一堆配置让你抄。
需要提前说明的是,QQ 官方机器人走的是官方开放平台那一套,和早期那些第三方协议库完全不是一回事。官方渠道的优势是稳定、合规、不会被封,代价是审核流程、消息频率限制、接口能力边界都需要你提前摸清楚。下面所有内容都基于官方渠道展开,不涉及任何非官方手段。
2. QQ 官方机器人接入:从注册到收到第一条消息
2.1 官方开放平台的账号体系与机器人创建
QQ 官方机器人的入口在 QQ 开放平台,你需要用一个已实名的主体去注册开发者账号。个人开发者和企业开发者能拿到的能力不一样,个人号在消息频率、群数量、接口权限上都有明显限制。如果你只是自己玩或者小范围测试,个人主体够用;但如果要正式对外提供服务,建议直接走企业主体,省得后面迁移。
创建机器人的流程大致是:登录开放平台 → 创建应用 → 选择机器人类型 → 填写基本信息 → 提交审核。这里有个容易被忽略的点:机器人头像和名称一旦审核通过,修改是有次数限制的,所以第一次填的时候别随便糊弄。我见过有人用默认头像上线,后来想换发现要重新走审核,白白等了好几天。
审核通过后,你会拿到几个关键凭证:AppID、AppSecret、Token、EncodingAESKey。这四个东西是后面所有对接的基础,尤其是 Token 和 EncodingAESKey,用于消息体的签名校验和解密。很多人第一次对接失败,就是因为把这几项搞混了,或者复制的时候多了空格。
2.2 消息接收的两条路:Webhook 与 WebSocket
官方机器人接收消息有两种模式,这个选择会直接影响你后面的架构。
Webhook 模式是你提供一个公网可访问的 HTTPS 地址,平台把消息 POST 过来。优点是实现简单、语言无关,任何能起 HTTP 服务的框架都行。缺点是你必须有一个稳定的公网入口,而且平台对回调地址的可用性有要求,挂了会重试,重试失败可能影响机器人状态。
WebSocket 模式是机器人主动连到平台的网关,消息通过长连接推送。优点是不需要公网 IP,本地开发也能跑,适合内网部署。缺点是连接稳定性要自己维护,断线重连、心跳保活都得处理。
我的建议是:开发调试阶段用 WebSocket,生产环境用 Webhook。WebSocket 在本地就能跑通全流程,不用折腾内网穿透;上线后换成 Webhook,配合负载均衡和健康检查,稳定性更好。两者的消息体格式基本一致,切换成本不高。
不管你选哪种,消息进来后第一件事都是验签。平台会用 Token 和消息体算一个签名放在请求头里,你必须用同样的算法算一遍做比对,不一致的直接丢弃。这一步千万别省,否则任何人都能伪造消息打你的接口。
2.3 消息体结构:别被嵌套的 JSON 绕晕
官方机器人的消息体是一个多层嵌套的 JSON,第一次看确实容易懵。核心字段包括消息 ID、消息类型、发送者信息、频道/群信息、消息内容等。消息内容本身又是一个数组,里面每个元素有类型(文本、图片、富媒体等)和对应的数据。
这里有个实操经验:先把消息体完整打日志,再写解析逻辑。我一开始照着文档写解析,结果发现实际推送的字段和文档有细微出入,比如某些可选字段在特定场景下才出现。打日志跑几天,把各种消息类型都触发一遍,你就能摸清真实的数据结构。
另外,消息 ID 一定要存下来。后面做去重、做人工接管、做问题追溯,都靠它。平台在某些情况下会重复推送同一条消息,如果你不做幂等处理,用户就会收到重复回复。
2.4 被动回复与主动推送的边界
官方机器人回复消息分两种:被动回复是在收到消息后的一段时间内,通过指定的接口返回内容;主动推送是机器人主动往群里或私聊发消息。这两者的权限和限制完全不同。
被动回复有时效窗口,超时就不能再回复了,所以你的 AI 问答和人工接管逻辑必须在这个窗口内完成。如果 AI 处理慢,或者需要人工介入,就得先回一个“正在处理”的占位消息,等结果出来再主动推送。
主动推送有频率限制,而且部分场景需要用户先和机器人有交互才能推送。这个限制在做人工后台的时候特别关键——客服想主动联系用户,前提是用户之前发过消息。所以设计上要保证:用户每一条消息都留下记录,人工后台基于这些记录发起会话。
3. AI 知识库:让机器人答得准,而不是答得多
3.1 知识库的三种存法,选错了后面全是坑
接 AI 知识库,第一个要决定的就是知识存哪里。常见的有三种:向量数据库、全文检索、结构化数据库。它们不是互斥的,实际项目里往往是组合使用。
向量数据库适合语义检索,用户问“怎么退款”和“退款流程是什么”能匹配到同一段知识。全文检索适合精确匹配,比如产品型号、订单号这类。结构化数据库适合存有明确字段的信息,比如价格表、营业时间。
我的做法是:向量库做召回,结构化库做精确查询,全文检索做兜底。用户问题进来,先走向量召回拿一批候选,再用结构化查询补充精确信息,最后如果都没命中,走全文检索或者转人工。这套组合拳打下来,命中率比单一方案高不少。
选向量库的时候,别一上来就上重型方案。中小规模的知识库,用轻量级的本地向量库完全够用,部署简单、成本低。等数据量真的上来了再考虑分布式方案。我见过有人几百条知识就上了集群,纯属浪费。
3.2 文档切分:决定问答质量的关键一步
知识库的质量,一半取决于原始文档,一半取决于切分策略。很多人把一整篇文档直接丢进去,结果检索出来的片段要么太长(包含无关信息),要么太短(丢失上下文)。
切分的核心原则是按语义边界切,而不是按字数硬切。一篇操作手册,应该按步骤切;一份产品说明,应该按功能点切;一个 FAQ,就应该一问一答成对切。切完之后,每个片段最好带上来源标题和层级信息,这样召回时能保留上下文。
我常用的参数是:单片段 300 到 500 字,重叠 50 到 100 字。重叠是为了防止关键信息正好卡在切分点上被切断。这个数值不是固定的,要根据你的文档特点调。技术文档可以短一点,叙述性内容可以长一点。
还有个细节:给每个片段加元数据。比如来源文件、章节、更新时间、适用产品版本。这样检索时可以按元数据过滤,避免答非所问。用户问的是旧版本的问题,你召回新版本的答案,那就闹笑话了。
3.3 检索增强生成的实际链路
知识库问答的典型链路是:用户问题 → 问题改写 → 向量检索 → 重排序 → 拼接提示词 → 大模型生成 → 后处理 → 返回。
每一步都有优化空间。问题改写是为了解决用户口语化、指代不明的问题,比如“它怎么弄”这种,需要结合上下文补全。重排序是在向量召回的基础上,用更精细的模型重新打分,把最相关的排前面。提示词拼接要把检索到的片段、对话历史、系统指令组织好,这一步直接决定生成质量。
我踩过最大的坑是提示词里没限制回答范围。结果模型拿着检索到的片段,自己发挥了一堆知识库外的东西,用户信以为真。后来在系统指令里明确写了“只根据提供的资料回答,资料中没有的信息不要编造”,情况才好转。
另一个坑是多轮对话的上下文管理。用户可能连着问好几个相关问题,如果你每轮都重新检索,可能丢失之前的语境。我的做法是维护一个滑动窗口的对话历史,检索时把最近几轮的问题一起考虑进去。
3.4 知识库更新:别让机器人答过期答案
知识库不是建好就完事了,内容会变,产品会迭代。更新机制没设计好,机器人就会一直答旧答案。
我的方案是增量更新 + 版本标记。文档变更时,只重新处理变化的部分,而不是全量重建。每个片段带上版本号和生效时间,检索时优先返回最新版本。同时保留旧版本一段时间,方便回溯。
更新频率上,如果是产品文档这类变化不频繁的,可以定时批量更新;如果是价格、库存这类实时性强的,就得走接口实时查询,不能靠知识库缓存。
还有一点:更新后要做回归测试。准备一批典型问题,每次更新后跑一遍,看命中率和答案质量有没有下降。这个测试集不用很大,几十条就够,但要坚持维护。
4. 人工后台:AI 兜不住的时候,人得能接上
4.1 什么情况下必须转人工
AI 再强也有边界。以下这些情况,必须能顺畅转到人工:用户明确要求转人工、AI 连续多次答非所问、涉及投诉和纠纷、涉及账户和资金安全、知识库完全没有覆盖的问题。
转人工的触发条件要设计得合理。太敏感了,人工忙不过来;太迟钝了,用户体验差。我的经验是:AI 连续两轮置信度低于阈值,或者用户发送“转人工”类关键词,就触发转人工。同时给用户一个明确的反馈,比如“正在为您转接人工客服,请稍候”,而不是让用户干等。
这里有个细节:转人工不是把消息丢给客服就完了,要把上下文一起带过去。用户之前问了什么、AI 答了什么、检索到了哪些知识,这些信息对客服很重要。否则客服还得重新问一遍,用户体验极差。
4.2 人工接管的状态机设计
人工接管本质上是一个状态管理问题。一条会话可能处于这些状态:AI 服务中、等待转人工、人工服务中、已结束。状态之间的流转要有明确规则。
我见过最简单的实现是加一个布尔字段标记“是否人工接管”,结果问题一大堆:客服下班了状态没重置、用户又发消息了不知道该谁回、多个客服抢同一个会话。正确做法是用状态机,每个状态有进入条件、退出条件、超时处理。
具体来说:用户触发转人工后,会话进入“等待转人工”,同时通知客服系统。客服接起后进入“人工服务中”,此时 AI 停止自动回复。客服结束会话后,状态回到“AI 服务中”或者“已结束”。如果等待超过一定时间没人接,要么降级回 AI,要么给用户留言提示。
状态机还要考虑并发。同一个用户可能从多个入口发消息,同一个客服可能同时接多个会话。这些都要在状态设计时想清楚,否则会出现消息错乱。
4.3 客服工作台需要哪些核心功能
人工后台不是简单的一个聊天窗口。一个能用的客服工作台,至少要有:会话列表(按等待时长、优先级排序)、会话详情(完整对话历史 + AI 检索记录)、快捷回复(常用话术一键发送)、知识库检索(客服也能查)、会话转交(转给其他客服或转回 AI)、标签与备注(标记问题类型,方便后续分析)。
会话列表的排序逻辑很重要。我建议按等待时长 + 用户情绪综合排序。等待越久越靠前,用户情绪激动(通过关键词或情感分析判断)的也靠前。这样能保证最需要处理的会话优先被看到。
快捷回复要支持变量替换,比如“您好,您的订单 {订单号} 正在处理中”,客服点一下就能发送,不用手打。这个功能看着小,但能大幅提升效率。
4.4 人工与 AI 的协作模式
人工和 AI 不是替代关系,而是协作关系。几种常见的协作模式:
AI 先答,人工兜底:最常见,AI 处理大部分问题,搞不定的转人工。
AI 辅助人工:人工服务时,AI 在旁边实时推荐答案和知识片段,客服参考后决定怎么回。这种模式对客服要求低,新人也能快速上手。
人工训练 AI:客服处理完的问题,标记为优质问答后回流到知识库,让 AI 下次能自己答。这个闭环做好了,AI 的覆盖率会越来越高,人工压力越来越小。
我实际用下来,AI 辅助人工这个模式性价比最高。客服不用自己翻文档,AI 把相关片段推过来,客服判断一下就能回。既保证了准确性,又提升了效率。
5. 消息路由与状态管理:把四块拼成一个整体
5.1 一条消息的完整旅程
把前面几块串起来,一条用户消息进来后的完整流程是这样的:
- 接入层收到消息,验签、解密、解析
- 消息进入路由层,根据会话状态决定去向
- 如果会话是 AI 服务中,走知识库问答链路
- 如果会话是人工服务中,推送到客服工作台
- 如果触发转人工条件,更新会话状态并通知客服
- 回复内容生成后,通过接入层发回给用户
- 整个过程的消息、状态变更、检索记录都落库
这个流程里,路由层是核心。它要维护会话状态、做幂等判断、处理超时、协调 AI 和人工。路由层设计得好,后面加功能就轻松;设计得差,每加一个需求都要改一堆地方。
5.2 会话状态存哪里,怎么保证一致性
会话状态建议存在带过期时间的键值存储里,比如 Redis 这类。原因是会话状态读写频繁、需要快速访问、而且天然有生命周期。用户长时间不发言,会话自动过期,不用手动清理。
但要注意持久化。Redis 重启会丢数据,所以关键状态变更要同步落库。我的做法是:Redis 存热状态,数据库存全量历史。Redis 挂了可以从数据库恢复,数据库查询慢的时候走 Redis 加速。
一致性方面,同一会话的消息要串行处理。如果两条消息并发进来,可能都读到旧状态,导致状态覆盖。解决办法是用会话 ID 做分布式锁,或者把同一会话的消息路由到同一个处理队列。这个细节不做,线上一定会出诡异问题。
5.3 幂等与去重:别让用户收到重复回复
平台重试、网络抖动、代码 bug,都可能导致同一条消息被处理多次。如果不做幂等,用户就会收到重复回复,体验很差。
幂等的实现很简单:用消息 ID 做唯一键,处理前先查是否已处理过。处理过的直接跳过,没处理过的标记后继续。这个标记要有过期时间,不能永久存,否则存储会爆。
但要注意,幂等标记要在处理开始时就写入,而不是处理完再写。否则并发情况下,两条相同的消息可能同时通过检查。写入时用原子操作,保证只有一个能成功。
5.4 日志与可观测性:出问题时能查
线上系统出问题是必然的,关键是能不能快速定位。日志要覆盖:消息收发、状态变更、AI 检索结果、人工操作、异常堆栈。每条日志带上消息 ID 和会话 ID,方便串联。
除了日志,还要有指标监控:消息量、AI 命中率、转人工率、平均响应时间、客服接起时长。这些指标能帮你发现趋势性问题,比如 AI 命中率突然下降,可能是知识库更新出了问题。
告警要设置合理。消息积压、接口错误率飙升、客服长时间无响应,这些都要告警。但别什么都告警,否则告警疲劳,真出事了反而没人看。
6. 实际落地时那些文档不会告诉你的事
6.1 审核与合规:别等上线了才发现过不了
QQ 官方机器人对内容有审核要求。机器人回复的内容、知识库的内容、甚至机器人的名称和简介,都可能被审核。涉及敏感词、违规内容的,轻则驳回,重则封禁。
我的建议是:知识库上线前先做一轮敏感词扫描,把明显有问题的内容过滤掉。机器人回复的提示词里也要加约束,避免模型生成不合规内容。人工客服的回复同样要留记录,方便追溯。
另外,机器人的功能描述要和实际一致。你申请的时候说是客服机器人,结果实际做的是别的,审核可能不通过。功能变更要及时更新资料。
6.2 性能与成本:AI 调用不是免费的
大模型调用是有成本的,尤其是高频场景。如果每个用户消息都走一遍完整的大模型生成,成本会很高。优化思路有几个:
缓存:相同或相似的问题,缓存答案,直接返回。分级处理:简单问题走规则或小模型,复杂问题才走大模型。限流:对单个用户的请求频率做限制,防止刷。异步:非实时场景可以批量处理,降低成本。
向量检索也有成本,尤其是数据量大、查询频繁的时候。可以考虑预计算常用查询的向量,或者用更轻量的检索方案做初筛。
6.3 冷启动:知识库从哪来
新机器人最大的问题是知识库空,用户问什么都不知道。冷启动阶段可以这样做:
先收集真实问题:上线一个只记录不回答的版本,跑一两周,看看用户都在问什么。整理 FAQ:把高频问题整理成问答对,先覆盖头部问题。导入现有文档:产品手册、帮助文档、历史工单,都是知识库的素材。人工兜底:冷启动阶段转人工率高是正常的,随着知识库完善会降下来。
别指望一上线就完美。知识库是运营出来的,不是建出来的。持续收集 bad case,持续补充,才能越用越准。
6.4 多轮对话的坑:上下文不是越多越好
多轮对话能提升体验,但上下文太长会带来问题:成本增加、干扰增加、超出模型窗口。我的经验是:只保留最近 3 到 5 轮对话,更早的做摘要或者丢弃。同时,检索时把当前问题和最近一轮的问题合并,而不是把所有历史都塞进去。
还有一个坑是话题切换。用户从问产品切换到问订单,如果你还带着之前的上下文,可能答非所问。检测到话题切换时,要重置上下文。这个可以通过问题相似度判断,相似度低就认为是新话题。
6.5 人工客服的排班与负载
人工后台不是技术问题,是运营问题。客服什么时候在线、同时接多少会话、忙不过来怎么办,这些都要提前规划。
我的做法是:设置客服在线时段,非在线时段转人工直接提示留言,而不是让用户干等。设置并发上限,一个客服同时最多接 N 个会话,超了就排队。设置溢出规则,排队太长时自动降级回 AI 或者提示用户稍后再试。
客服的工作量要可量化。接了多少会话、平均处理时长、用户满意度,这些数据既能用来优化排班,也能用来考核。
7. 我踩过的几个典型坑,你可以直接避开
第一个坑是消息解密失败。官方消息体是加密的,解密需要 EncodingAESKey。我一开始把 AppSecret 当成 AESKey 用,怎么都解不开。后来仔细看文档才发现是两个不同的东西。这种低级错误,建议对接前把每个凭证的用途写在便签上贴屏幕边。
第二个坑是被动回复超时。AI 生成有时候要好几秒,如果超过平台的回复窗口,消息就发不出去了。解决办法是先回占位消息,再主动推送。占位消息可以是一句“正在为您查询,请稍候”,用户体验也比干等好。
第三个坑是知识库检索召回不准。一开始我用纯向量检索,发现专有名词、型号这类查询效果很差。后来加了关键词检索做混合召回,效果明显提升。纯向量不是万能的,混合检索才是正道。
第四个坑是人工接管状态没重置。客服结束会话后,状态没改回 AI,结果用户后续消息一直没人回。这个 bug 上线三天才发现,因为测试时都是手动结束的,没测到自动结束的场景。后来加了状态超时自动重置,才彻底解决。
第五个坑是日志打太多。为了排查问题,我把每条消息的完整内容都打了日志,结果日志量爆炸,存储成本飙升,查询也变慢。后来改成关键字段打日志,完整内容按需采样,才控制住。
8. 后续可以怎么扩展
这套架子搭好之后,能扩展的方向很多。多轮任务型对话,比如查订单、改地址、预约服务,可以在知识库问答基础上加意图识别和槽位填充。多渠道接入,同一套后台接 QQ、其他平台、网页客服,消息路由层做适配就行。数据分析,把用户问题聚类,发现产品改进点。主动服务,基于用户行为预测问题,提前推送解决方案。
但别一上来就贪多。先把单渠道、单场景跑通,再逐步扩展。我见过太多项目,一开始设计得无比宏大,结果每个模块都半成品,最后什么都用不了。小步快跑,持续迭代,才是正道。
这套东西我前后迭代了大半年,从最初的关键词机器人,到现在能处理大部分常见问题、人工只兜底一小部分,中间踩的坑基本都写在这了。如果你正准备动手,建议先从接入层和最简单的问答跑通,再逐步加知识库和人工后台。每一步都验证过再往下走,比一次性全搭好再调试要快得多。