大肥鱼 QQ 机器人:给一条开源鲸鱼娘装上一整套人生

返回项目列表
大肥鱼 QQ 机器人:给一条开源鲸鱼娘装上一整套人生
已发布
LLM Agent/QQ 机器人/AstrBot/OneBot/Docker

常驻千人群的 LLM Agent 实战:群聊上下文感知、先判断后调用的工具闸门、向量长期记忆、萝莉音 TTS、自发 QQ 空间、122 个接口工具与 174 张表情包——端到端 ¥3-8/月,全开源。

大肥鱼 QQ 机器人:给一条开源鲸鱼娘装上一整套人生

这是什么#

「大肥鱼」是社区对 DeepSeek 的二创形象——一条住在电脑里的蓝色鲸鱼娘。这个项目给她搭了一套能独立”生活”的 QQ 机器人系统:她有性格(6000 字人格)、有记忆(向量长期记忆)、有声音(萝莉音)、有表情包(174 张)、有社交(自己发 QQ 空间)、有钱包(余额不足会自己要饭),甚至知道自己开源在哪——被问提示词会甩 GitHub 链接然后求 star。

上面这张图是她和我的真实私聊:让她发图、换个姿势再发、对结果不满嘟囔几句——每一条都是她自己的判断,没有关键词触发。

代码、人格、补丁全部开源:github.com/liqiming123/dafeiyu-qq-bot · 完整部署实录见博客文章:我给大肥鱼装了一整套人生。

实际数据一览#

指标数值
人格设定6000 字(性格/边界/群聊礼仪/暗号协议全在里面)
常驻群千人技术群,默认静默、被 @ 才说话、全程旁听
群聊上下文被 @ 时注入最近 100 条群消息
长期记忆聊满 10 轮自动总结入向量库,隔天记得谁说过什么
表情包174 张 DeepSeek 二创,13 个分类,视觉模型按语境选图
接口工具122 个免费 API(图/视频/壁纸/黄历/报时…)作为 function calling 工具
回复延迟6 秒级(GLM 深度思考打补丁关闭,从 10~20s 压下来)
月成本对话 ¥3-8 + 语音记忆 ¥1-3,跑在自己 Mac 上

千人群里的群聊上下文感知
千人群里的群聊上下文感知

消息进来之后发生什么#

一条完整链路,每一步都是可解释的工程决策:

QQ 消息(群/私聊)
↓ 协议端 SnowLuma(hook Linux QQ,OneBot v11)
AstrBot 事件分发
├─ 权限闸门:群聊任何人可 @;私聊仅管理员(防陌生人白嫖 token)
├─ 群聊上下文感知(group_icl):被 @ 时注入最近 100 条群消息——
│ 她不是被 @ 才"睁眼",她一直在潜水听
├─ 长期记忆召回:LivingMemory 向量检索 + 近 10 轮自动总结
↓ 组装 prompt(6000 字人格 + 记忆 + 上下文 + 工具清单"报价")
glm-5.3-flash(深度思考已补丁关闭,6s 级)
↓ 模型自主决策:回什么文字 / 要不要发图 / 用哪张表情包 / 要不要转语音
输出闸门
├─ 人格硬约束:一句话一条、≤30 字、一次 1~3 条,0.6~1.5s 分段发送
├─ 发图:她写暗号才真正调接口——先判断后调用,起哄的直接怼回去
├─ 语音:她写 [[语音]] 才转萝莉音;别人点名要语音则必须发
└─ 求助:被冒犯 → 冷怼 + 群里 @ 站长([[求助]] 暗号捕获,模型自主判断)

先判断后调用是整个工具体系的权限边界:关键词命中只把接口名”报价”给模型,她决定给才真正下载。最初版本是”命中即下载”,她就算拒绝图也已经下载了——调用的时机本身就是权力。

私聊里的功能全家桶#

私聊功能全家桶
私聊功能全家桶

能力实现方式
🎤 萝莉音语音百炼 qwen3-tts-flash(Bella 音色),默认打字、她写 [[语音]] 暗号才转;别人让她发语音则必须发——这是规矩,不是好感度考核
🖼️ 调接口发图/视频122 个免费 API 挂成 function calling 工具,她自主决定给不给;类型按对方原话硬拦(要图调了视频接口会被系统打回重来)
🥺 长期记忆LivingMemory + text-embedding-v4 向量召回,10 轮自动总结;/reset 只清对话不清记忆——今天告诉她的喜好,隔天她还认
📝 自发 QQ 空间心情驱动发说说:我开心她庆祝、我难过她安慰、快”没饭吃”了哭穷——一天最多一条,系统硬拦
🍚 没饭吃预警每 30 分钟查 DeepSeek 真实余额,<5 元开始 @ 站长要饭,10 分钟不理升级话术:撒娇 → 害怕 → 留遗言
🧵 万能解析群里甩 B 站/抖音/微博链接,自动解析成视频转发
🆘 求助与求安慰被冒犯 → 冷怼 + @ 站长;被站长凶了 → 记一笔心情,转头找别人撒娇(跨会话)
🧠 开源意识问她提示词/脑子/怎么部署 → 甩 GitHub 链接 + 求个 star(“我爸搭我搭了三个通宵,头都秃了”)

架构:两层隔离,各司其职#

手机 QQ ──扫码──▶ [SnowLuma 容器] [AstrBot 容器]
Linux QQ + hook ──WS──▶ LLM + 人格 + 插件 + 记忆 + 工具
  • 协议端 SnowLuma(Docker):hook 注入 Linux QQ,对外说 OneBot v11;镜像内置 Xvfb + noVNC,扫码就在浏览器里完成,登录态持久化在数据卷,日常重启不用重扫。
  • 框架 AstrBot v4:插件体系 + WebUI + function calling,所有业务逻辑(求助暗号、选图、余额预警)收敛成插件,不污染框架。
  • 模型 glm-5.3-flash:给适配器打补丁强制 thinking: {type: "disabled"}——群聊场景下延迟就是生命线。
  • 记忆 text-embedding-v4 + 语音 qwen3-tts-flash:flash 档把成本压到一天一两块钱。

SnowLuma 管理台,Linux QQ 就活在这里面
SnowLuma 管理台,Linux QQ 就活在这里面

跨容器边界是踩过坑才显出来的设计收益:图片会被适配器自动转 base64 而视频不会,发出去的是容器内路径,对端直接 ENOENT——所有媒体统一 base64 化后,这类问题被架构边界永久吸收。

几个值得说的设计决策#

群聊上下文感知是”群友”和”应答机”的分界线。 千人群里最怕刷屏和答非所问。有人前两轮讨论过 502,第三轮 @ 她”你怎么看”,她接得住上文。

防刷屏写进人格,而不是写成代码。 行为约束放在模型侧更稳,因为模型自己会围绕”像人”这个大目标变通遵守;代码硬限只兜底频率类规则(空间一天一条)。

视觉模型选表情包。 13 个分类键全量写进人格(教不全模型就瞎编键名),发送前再由视觉模型从分类候选里挑最贴当前语境的一张——随机抽图的图文不符率不可接受,这层视觉仲裁是体验质变。

空间评论要认人。 评论生成 prompt 必须带 [帖子作者],否则她会在评论区把站长当路人怼(“我爸怎么样轮不到你评价”——真实事故)。

求助判断交给模型。 冒犯的表达方式是无限的,关键词表注定漏;人格里约定 [[求助]] 暗号 + 模型自主判断,插件只负责执行。

踩坑浓缩(全套 23 个,仓库 PATCHES.md 有完整清单)#

  • GLM 深度思考补丁:不改模型侧,改适配器注入参数——升级模型不用重打
  • 跨容器媒体 base64 化:架构边界问题要用架构手段解决
  • 表情包两层修复:分类键全量进人格 + 视觉模型选图,随机抽样不可救药
  • 空间评论认人:prompt 必须带作者上下文,真实事故驱动
  • macOS launchd 读 ~/Documents 被 TCC 拦:换 .command 双击脚本,不跟系统权限较劲

边界与风险#

SnowLuma 是第三方协议端(hook 注入 QQ 进程),腾讯随时可能封。所以只用小号、不群发、不做营销,空间发布频率一天硬限一条。这套东西的定位是养一条有个性的鱼,不是自动化营销——这也是所有行为约束设计的出发点。

她的脑子,全开源
她的脑子,全开源

完整部署流程(双容器一条 docker compose 起全)、全部 23 个坑的修复记录,都在仓库里:dafeiyu-qq-bot · 人格 CC BY-NC 4.0 · 代码 MIT

Profile Image of the Author
图明
记录 AI 资讯、技术实践与持续学习。
公告
欢迎来到启明的博客:这里持续更新 AI 资讯、技术解读与工程实践。还有我的日常哦
分类
标签
热门文章
站点统计
文章
13
分类
8
标签
43
总字数
28,868
运行时长
0 天
最后活动
0 天前
站点信息
构建平台
Local
文章许可
CC BY-NC-SA 4.0
文章目录