Discord 机器人开发历程

前言

这篇文章最早写的是我第一次折腾 Discord 机器人时的记录。那时候的目标很简单:做一个能陪我聊天、查资料、发提醒、玩小游戏的机器人。

但这个项目后来一路变得很复杂。它经历过 Discord 双机器人、企业微信尝试、微信个人号方案调研、QQ 接入、NapCat 桥接、Web 后台、自我进化、Mem0 长期记忆、TTS、ASR、Tavily 联网搜索等一堆阶段。现在回头看,最重要的变化不是功能变多,而是边界终于清楚了。

现在的真实版本是:

  • Discord 上只保留 shen-play,负责娱乐、轻互动、小游戏、抽卡和语音回复。
  • QQ 上运行原本的 shen-test 能力,现在叫刘新庚,负责 AI 对话、工具调用、提醒、Tavily 搜索、Mem0 记忆和自我进化。
  • Web Admin 后台统一管理配置、模型、API Key、日志、QQ 桥接状态和自我进化数据。
  • NapCat 负责 QQ 接入,后台通过 OneBot webhook 接收 QQ 私聊消息并回发。

所以这篇文章也按现在这个基本成型的版本重新整理一遍。

机器人开发时间线

一、从 Discord 双机器人到 QQ + Discord 分工

1. 最早的版本

最早我想做的是一套纯 Discord 机器人系统。

当时规划里有两个机器人:

  • shen-test:偏工作、信息查询、任务提醒、生活管理。
  • shen-play:偏娱乐、轻互动、小游戏和抽卡。

这个思路本身是对的,因为工作助理和娱乐机器人确实不应该混成一个人格。工作助理需要稳定、准确、可追踪;娱乐机器人需要轻松、快、有一点玩具感。

但问题也很现实:我平时不一定开着梯子,而 Discord 在国内使用体验不稳定。如果真正想把 AI 助理当成日常入口,只放在 Discord 里并不顺手。

2. 中间试过的方案

为了让机器人能在国内更方便地使用,我中间试过不少方案。

企业微信

企业微信的优点是官方、稳定、容易部署,适合做通知和企业内部工具。但它的体验更像“工作机器人”,不像一个自然聊天的个人 AI 朋友。它可以用,但不是我最想要的那种入口。

微信个人号方案

我也查过 OpenClaw 这类方案。理论上可以把 AI 接到微信个人号里,但限制比较多,比如 iOS 端、主动推送、账号绑定、服务资源等问题。最后我没有继续走这条线。

QQ + NapCat

最后真正落地的是 QQ。

QQ 的好处是:

  • 我不用开梯子就能聊。
  • NapCat 可以通过 OneBot 协议接入。
  • 私聊体验比企业微信更接近日常聊天。
  • 主动提醒、TTS、文件、图片等能力也更容易扩展。

所以现在的结构变成了:

  • QQ:承接原 shen-test 的严肃助理能力。
  • Discord:只保留 shen-play,继续做娱乐和轻互动。

当前机器人结构

二、当前架构

现在项目已经不是单纯的 Discord bot,而是一套小型机器人系统。

1. QQ 机器人:刘新庚

QQ 机器人是现在的主助理,也就是原来 shen-test 的继承者。

它现在负责:

  • 日常 AI 对话
  • Tavily 联网搜索
  • 模型切换
  • 图片理解
  • 文生图
  • ASR 语音转文字
  • TTS 语音回复
  • 定时提醒
  • 定时任务
  • 文件直发
  • Mem0 长期记忆
  • 本地画像
  • 自我进化
  • 主动问候逻辑

它只监听我的 QQ 私聊,不监听群聊,也不回复其他人的消息。这个限制是刻意做的,因为这套机器人目前主要是个人助理,不是公开客服或群机器人。

2. Discord 机器人:shen-play

Discord 上现在只保留 shen-play

它负责:

  • 娱乐聊天
  • 人设切换
  • 小游戏
  • 抽卡
  • 卡片生成
  • 俳句
  • 运势
  • 星座
  • TTS 开关
  • 轻量模型切换

shen-play 不再承担长期记忆和任务助理职责。它更像一个放松用的娱乐机器人,而不是一个严肃助理。

3. Web Admin 后台

后台是这次项目成熟以后最重要的一部分。

它现在负责:

  • 查看服务状态
  • 查看 QQ 桥接状态
  • 查看 NapCat 状态
  • 管理模型配置
  • 管理 API Key
  • 管理 TTS 配置
  • 管理视觉模型和生图模型
  • 查看 QQ 日志
  • 查看 shen-play 日志
  • 编辑人设和知识库
  • 查看自我进化日志
  • 查看 Mem0 记忆摘要
  • 查看和编辑本地用户画像

后台地址绑定到了单独域名,直接通过浏览器访问即可。

后台功能边界

三、QQ 机器人现在怎么工作

1. NapCat 接入

QQ 消息由 NapCat 接收,然后通过 OneBot webhook 发给 Web Admin。

大概流程是:

  1. 我在 QQ 私聊机器人。
  2. NapCat 收到消息。
  3. NapCat 把 OneBot 事件 POST 到后台。
  4. 后台判断是否是我的私聊。
  5. 后台加载 qq-bot runtime 处理消息。
  6. 生成文本、图片、语音或文件。
  7. 后台再通过 NapCat API 发回 QQ。

这样做以后,QQ 机器人不需要像 Discord bot 那样自己保持网关连接,后台就是整个 QQ 桥接的中枢。

2. 只监听我一个人

目前 QQ 机器人只处理 QQ_OWNER_ID 对应的私聊消息。

也就是说:

  • 不是我的 QQ,不回复。
  • 群聊,不回复。
  • 其他事件,不处理。

这个限制让系统更安全,也避免误触发。等以后真想加多人,再单独做授权列表,而不是一开始就开放。

3. 自然语言比命令更重要

QQ 入口最重要的是自然语言。

我不想每次都输入复杂命令,所以现在它会识别很多自然说法,例如:

  • “提醒我明天下午三点做某事”
  • “每天早上九点给我发简报”
  • “给阿嬷的情书评分多少,你看看”
  • “导演是谁,你查查”
  • “帮我生成一张图片”
  • “开启语音回复”

当然,自然语言也很容易误判,所以这块后来做了不少收紧:

  • 明确提醒才创建提醒。
  • 涉及实时信息时必须走 Tavily。
  • 不允许模型假装自己查过。
  • 文件、图片、语音输出统一交给后台发送。

四、Tavily 联网搜索

联网搜索是这次项目里很重要的一块。

之前有一个坑:模型有时会在没有真实联网的情况下说“刚给你查到了”。这很危险,因为它看起来像查了,其实是在编。

现在我做了更明确的规则:

  • 只要我说“上网查”“联网查”“查查看”“你看看”“搜一下”等,就强制走 Tavily。
  • 只要涉及“最新”“今天”“今年”“评分”“票房”“上映”“新闻”等实时信息,也优先走 Tavily。
  • Tavily 搜到结果以后,再交给模型总结。
  • 如果结果不足,必须说不确定,不能编造。

举个例子,我问:

给阿嬷的情书评分多少,你看看

现在流程不是直接让模型回答,而是:

  1. 提取搜索词。
  2. 调用 Tavily。
  3. 得到豆瓣、新闻、票房等搜索结果。
  4. 再让模型基于搜索结果回答。

这个改动让机器人从“看起来聪明”更接近“真的可靠”。

五、记忆和自我进化

这是我最在意的部分。

我希望它不是一个每次都从零开始的聊天机器人,而是一个会越来越懂我的长期助理。

现在它的记忆分成三层。

1. 短期上下文

短期上下文负责当前这段聊天的连贯性。

比如我刚问了一部电影,下一句问“导演是谁”,它能知道我还在说同一部电影。

2. Mem0 长期记忆

Mem0 负责外部长期记忆。

它会保存一些对话中有长期价值的信息,后续聊天时再检索回来。后台也能查看 Mem0 的记忆摘要,并把英文记忆转成更适合我看的中文摘要。

3. 本地结构化画像

本地画像是更稳定的一层。

它记录的不是所有聊天内容,而是更长期的东西,比如:

  • 我的身份和长期项目
  • 我的回答风格偏好
  • 我的工作流习惯
  • 我不喜欢什么
  • 我常用的提醒方式
  • 我最近的互动状态

这层画像会参与后续回复,让机器人慢慢贴合我的说话方式和使用习惯。

4. 自我进化现在真实怎么跑

现在自我进化已经不是只写在代码里的概念,而是在后台真实跑起来了。

当前逻辑是:

  • QQ 后台启动时,会启动一个 qq-evolution 后台线程。
  • 每 10 分钟检查一次。
  • 每 30 分钟从 Mem0 扫描一次可用长期记忆。
  • 只针对 QQ owner 运行,不再扫 Discord 用户。
  • 高价值、稳定、非敏感的信息会自动合并进本地画像。
  • 一次性搜索事实不会合并进画像。

这里踩过一个坑:一开始它会把电影评分、导演、票房这种临时搜索事实也写进画像,这明显不对。后来我加了过滤,只保留真正能代表“我是谁、我偏好什么、我长期在做什么”的内容。

现在更合理的判断是:

  • “用户喜欢某种回答风格”可以进画像。
  • “用户长期在做某个研究项目”可以进画像。
  • “用户要求实时信息必须联网确认”可以进画像。
  • “某部电影豆瓣 9.1 分”不应该进画像。

这一层过滤很关键,因为自我进化不是记得越多越好,而是要记得对。

六、TTS、ASR 和多模态能力

1. ASR

QQ 机器人支持语音转文字。

如果我直接发语音,它会先走 ASR,把语音转成文本,再按普通文本消息继续处理。这样我在手机上不用打字,也能直接和它说话。

2. TTS

TTS 现在统一由后台配置和机器人命令配合控制。

目前主要支持:

  • Edge TTS
  • SiliconFlow TTS

TTS 是否开启,主要在对话里决定,不再只靠后台开关。这样更符合实际使用:有些场景我想听语音,有些场景只想看文字。

3. 图片理解和生图

图片理解和生图现在也做成了可配置项。

后台可以指定:

  • 视觉理解提供商
  • 视觉理解模型
  • 生图提供商
  • 生图模型

这样后面换模型不需要改代码,直接在后台配置即可。

七、提醒和主动消息

QQ 相比 Discord 最大的优势之一,就是更适合作为日常入口。

现在 QQ 机器人支持:

  • 一次性提醒
  • 每日任务
  • 定时主动发送
  • 晨间简报
  • 主动问候逻辑

提醒和任务由后台 scheduler 负责扫描,到时间后通过 NapCat 主动发 QQ 私聊。

这点很重要,因为原来 Discord 上就算机器人发了,我不开梯子也收不到。现在迁到 QQ 后,这个问题基本解决了。

八、Web Admin 后台

后台现在是整个项目的控制台。

它不是一个装饰页面,而是实际运维入口。

1. 首页状态

首页能看到:

  • QQ 桥接状态
  • NapCat 状态
  • shen-play 状态
  • 后台服务状态
  • 最近日志

2. 配置管理

配置分成几类:

  • 机器人 token
  • 模型配置
  • API Key
  • TTS 配置
  • 图像与视觉模型配置

其中模型部分已经按 provider 拆分,方便后面增删模型。

3. 日志

后台有 QQ 机器人日志和 shen-play 日志。

日志区域固定高度,内部滚动,不会把页面撑得很长。

4. 自我进化页

自我进化页现在能看到:

  • 用户画像
  • 自我进化日志
  • Mem0 记忆摘要
  • 运行数据
  • 主动问候设置

这页目前已经比最早直观很多,但后面还可以继续优化,比如把“最近学到了什么”“哪些被过滤掉”“下次扫描时间”做得更清楚。

九、shen-play 的定位

Discord 上现在只保留 shen-play

它的定位很明确:娱乐和轻互动。

保留的方向包括:

  • 人设
  • 轻聊天
  • 抽卡
  • 小游戏
  • 俳句
  • 运势
  • 星座
  • TTS
  • 模型切换

shen-play 不再和 QQ 助理抢功能。它不负责长期画像,也不负责我的日常提醒。这样反而更轻、更纯粹。

对我来说,这个拆分很重要:

  • QQ 里的刘新庚是日常助理。
  • Discord 里的 shen-play 是娱乐搭子。

一个负责把事情做稳,一个负责玩得开心。

十、部署和稳定性

这个项目现在已经不靠手动运行脚本了,而是服务器上的 systemd 服务。

当前主要服务是:

  • discord-bot-admin.service
  • shen-play-bot.service

QQ 的核心逻辑跑在 discord-bot-admin 里,因为 QQ 消息是由后台通过 NapCat webhook 处理的。

部署脚本现在会:

  1. 上传代码。
  2. 远端编译检查。
  3. 保留线上运行时数据。
  4. 重启后台和 shen-play。
  5. 查看服务状态和日志。

这里也踩过一个坑:早期部署脚本会把本地 qq-bot/data 上传到服务器,差点覆盖线上画像、记忆、日志。后来我把运行时数据全部排除掉,只同步代码和静态资源。

这件事让我意识到,机器人项目后期最重要的不是“再加一个功能”,而是:

  • 不要丢数据
  • 不要误覆盖配置
  • 不要让后台线程悄悄死掉
  • 日志一定要能查到

十一、现在的真实状态

现在这套系统已经基本成型。

真实状态是:

  • Discord 上只有 shen-play
  • QQ 上运行刘新庚,也就是原 shen-test 的能力迁移版。
  • QQ 只监听我的私聊。
  • NapCat 已经接入并能收发消息。
  • Tavily 能正常联网搜索。
  • Mem0 已接通。
  • 自我进化后台线程已启动。
  • QQ 画像会自动更新。
  • 后台能查看日志和配置。
  • 服务部署在服务器上,systemd 常驻运行。

它还不是最终形态,但已经从“能跑”走到了“能长期用”。

以后我可能继续做的方向:

  • 更清晰的自我进化可视化
  • 更稳定的语音情绪 TTS
  • 更细的记忆纠错机制
  • 更好的任务复盘
  • QQ 文件和图片能力继续增强
  • shen-play 的娱乐体验继续打磨

十二、总结

这个项目最有意思的地方,是它不是一次性写完的。

它从一个 Discord 聊天机器人,慢慢变成了一套跨平台的小型 AI 助理系统。中间做过很多尝试,也删掉过很多东西。最后留下来的不是最花哨的版本,而是最符合我真实使用习惯的版本:

  • 工作和生活入口放到 QQ。
  • 娱乐和陪玩留在 Discord。
  • 配置、日志、模型、记忆、自我进化交给后台。
  • 长期记忆和本地画像一起工作。
  • 工具调用尽量真实,不让模型假装查过。

对我来说,这才是这个项目真正成型的地方。

不是做了一个机器人,而是慢慢做出了一个能进入日常生活的 AI 入口。

项目和后台地址

项目仓库:

https://github.com/yys806/discord-bot

Web Admin 后台:

https://robot.yly113.de5.net


Discord 机器人开发历程
http://example.com/2026/05/18/discord机器人开发历程/
作者
Leo shen
发布于
2026年5月18日
许可协议