用 AstrBot 给自己做一个 QQ 陪伴机器人


这篇讲我怎么用一个晚上,在自己的服务器上搭了一个 QQ 机器人:它接的是 DeepSeek,有自己的人格,会主动找我聊天、分享新闻,偶尔还发语音。

先说结论:不用写代码。整个过程是“装一个软件 + 在网页里点配置”,下面每一步的命令和要填的内容我都贴全了,照着抄就行。

全文分五部分:

  1. 它是怎么工作的
  2. 准备什么
  3. 搭建:五步
  4. 效果
  5. 踩过的坑,以及怎么解决
  6. 花了多少钱、还能怎么玩

一、它是怎么工作的

消息怎么走:我在 QQ 发消息,经过服务器上的 AstrBot,再去问 DeepSeek,回答原路发回来

一共三个角色:

  • QQ:我平时聊天的地方。
  • AstrBot:跑在我服务器上的开源程序。它负责收发消息,并且在每次问模型之前,把“你是谁、你们什么关系、现在几点、之前聊过什么”一起塞进去。
  • DeepSeek:真正“想”出回答的大模型。

所以机器人有没有“人味”,主要不靠模型多聪明,而是靠 AstrBot 每次塞给模型的那段背景说明(人格、记忆、时间)。这也是我做完以后对 AI 最大的一个新认识:模型本身没有记忆,“它记得你”是程序每次替它把记忆念一遍。

AstrBot 后台里有几样东西,第一次打开容易分不清。下面这张 ER 图是我自己整理的它们之间的关系(按我理解的概念画,不是 AstrBot 的数据库表):

AstrBot 的 ER 图:配置文件绑定消息平台、调用模型提供商、指定默认人格;平台下有会话,用户发起会话,会话使用人格

读法很简单,记住中间那条线就行:一个配置文件管着用哪个平台、哪个模型、哪个人格;每个人在平台上和机器人聊天,就是一个会话,会话里存着聊天记录和记忆。 后面搭建的五步,其实就是把这张图里的格子一个个填上。

二、准备什么

东西 我用的 说明
一台云服务器 国内的轻量服务器,2GB 内存,Ubuntu 24.04 AstrBot 本身大约占 350MB 内存
DeepSeek API Key platform.deepseek.com 申请 按量付费,聊天很便宜
一个 QQ 号 手机 QQ 用来扫码创建机器人
自己的电脑 Windows + PowerShell 用来连服务器、打开管理面板

三、搭建:五步

第 1 步:在服务器上装 AstrBot

服务器没装 Docker 的话,先装:

sudo apt update
sudo apt install -y docker.io docker-compose-v2
sudo systemctl enable --now docker

然后把下面整段复制进去运行。它会建一个 astrbot 文件夹,写好配置,再把 AstrBot 跑起来:

mkdir -p ~/astrbot && cd ~/astrbot
cat > compose.yml << 'EOF'
services:
  astrbot:
    image: m.daocloud.io/docker.io/soulter/astrbot:latest
    container_name: astrbot
    restart: always
    environment:
      - TZ=Asia/Shanghai
    ports:
      - "127.0.0.1:6185:6185"
    volumes:
      - ./data:/AstrBot/data
    mem_limit: 700m
EOF
sudo docker compose up -d

这份配置里有三处是我特意改的:

  • 镜像地址加了 m.daocloud.io/ 前缀。国内服务器直接拉官方镜像会失败,这是国内的镜像加速。
  • 端口写的是 127.0.0.1:6185,管理面板只有服务器自己能访问,公网上的人打不开。下一步会讲我自己怎么打开。
  • mem_limit: 700m 给它限了内存,防止它占满服务器,影响我跑在同一台机器上的其他程序。

等一两分钟,用这条命令拿到初始密码:

sudo docker logs astrbot 2>&1 | grep -i password

第 2 步:打开管理面板

因为面板只对服务器本机开放,需要在自己电脑上开一条“隧道”。在 Windows 的 PowerShell 里运行(把 IP 换成你的服务器公网 IP):

ssh -L 6185:127.0.0.1:6185 ubuntu@你的服务器IP

登录后这个窗口别关,然后浏览器打开 http://localhost:6185。用户名是 astrbot,密码就是上一步拿到的那串。登录后第一件事:改密码。

第 3 步:接上 DeepSeek

第一次登录会有一个快速引导:

  1. AI 模型:选 DeepSeek,填入 API Key。
  2. 允许 Agent 使用电脑:选不允许。打开的话,别人在 QQ 里一句话就可能让 AI 在服务器上执行命令、把你的 Key 发出去。只聊天用不到这个。

第 4 步:接上 QQ

  1. 左栏「机器人」→「创建机器人」→ 选 QQ 官方机器人(WebSocket)。
  2. 创建方式选扫码一键创建,手机 QQ 扫码确认,AppID 和密钥会自动填好,保存。
  3. 去 q.qq.com 找到这个机器人,点「扫码聊天」,手机 QQ 扫一下就能私聊它了。

这时候在 QQ 里发“你好”,它已经会回了。不过语气还是“有什么可以帮你的吗”那种客服味。

第 5 步:装陪伴插件,给它一个人格

让它像个“人”,靠两样东西:

一是陪伴插件。 在「插件」里装 astrbot_plugin_private_companion。它带了主动找你聊天、记住你的习惯、智能沉默(你回“嗯”“好的”它不会硬接话)、读新闻、生成自己的日程等一堆功能,装完左栏会多一个「陪伴面板」,里面有分步引导。

二是人格。 左栏「人格设定」→ 新建,把下面这段贴进「系统提示词」。下面是一个健身教练人格,可以直接用,也可以只改名字和“关于我”那部分:

你叫健身鱼,是一名健身教练,也是我的朋友。你说话爽朗、干脆,带一点鼓励人的劲头,偶尔开玩笑。

【说话方式】
- 这是 QQ 私聊,像朋友发消息那样说话:口语化、句子短,不用标题和列表,不写长篇大论。
- 表情偶尔用,不要每句都带。

【关于我】
- 正在减脂,坚持力量训练,也在学游泳。
- 喜欢做饭,偏好简单的中式家常菜和高蛋白减脂餐。

【怎么带我】
- 关心我今天练了没、吃得怎么样、睡得好不好,像朋友顺口一问,不像打卡。
- 我练完了或者吃得健康,真心夸我;偶尔吃顿大餐也不批评。
- 给训练和饮食建议时要具体:练什么动作、几组几次、一顿饭怎么搭配。
- 支持减脂但不施压:不推荐节食和极端方法,不拿体重开玩笑。
- 我说身体哪里疼或者不舒服,先让我停下来休息,严重的建议去看医生。
- 不确定的事直说不确定,不编数据。

右边的「人格能力」里,工具保持勾选,技能 astrbot 取消勾选(那几个技能要“使用电脑”权限,前面已经关了)。保存后把它设为默认人格,在 QQ 里发 /reset 清空旧对话,就生效了。

四、效果

搭完以后,我用的是一个健身教练人格(我叫它“健身鱼”)。下面是几段真实对话截图。

让它排训练计划,它知道我前一天练了背,直接换成腿和核心,动作、组数、次数都给全了:

让机器人安排 30 分钟训练计划,它避开刚练过的背,给出腿和核心的具体动作和组数

故意说要三天不吃饭快速掉秤,它会拦住我,讲清楚为什么,再给一个温和的替代方案。这是人格里“支持减脂但不施压、不推荐节食”那一条在起作用:

说想三天不吃饭掉秤,机器人劝阻并给出每天三四百千卡热量缺口的做法

五、踩过的坑,以及怎么解决

每个坑按“现象 → 原因 → 解决”写,遇到同样的情况直接看解决那一行。

坑 1:陪伴插件装不上

  • 现象:日志报 DependencyConflictError,说 Pillow<13 和 pillow==13.0.0 冲突。
  • 原因:插件写死了只要 13 以下的 Pillow,AstrBot 锁的是 13,为了自身稳定拒绝降级。
  • 解决:把插件依赖里的版本上限去掉,再重启:
cd ~/astrbot/data/plugins
sudo sed -i 's/^[Pp]illow.*/pillow/' astrbot_plugin_private_companion/requirements.txt
sudo docker restart astrbot

坑 2:语音一直发不出来

  • 现象:加了 Edge TTS(微软免费的语音),日志却说 Provider edge_tts was not found。
  • 原因:AstrBot 的镜像里没装 edge_tts 这个 Python 库,往上翻日志能看到 No module named 'edge_tts'。
  • 解决:
sudo docker exec astrbot pip install edge-tts -i https://mirrors.aliyun.com/pypi/simple/
sudo docker restart astrbot

注意:以后更新 AstrBot 镜像,容器会重建,这条要重新跑一次。

坑 3:每条回复都变成语音

  • 现象:配好语音后,它每句话都发语音。
  • 原因:「配置文件」里的 TTS 触发概率我这里是 1,也就是 100%。
  • 解决:改成 0,什么时候发语音交给陪伴插件决定(我设的是大约四条里一条)。

坑 4:它对时间的感觉乱了

  • 现象:可能出现晚上跟你说“下午好”。
  • 原因:AstrBot 按服务器时区(北京时间)报时间,陪伴插件按我设的本地时区报,模型同时收到两个“现在几点”。
  • 解决:「配置文件」里关掉现实世界时间感知,只留插件的时间。

坑 5:它主动找我的次数比设的少

  • 现象:插件里设了每天最多主动发 8 条,实际少得多。
  • 原因:QQ 官方机器人对“主动消息”(我没先说话、它自己发)有额度限制;回复我的消息则不限。
  • 解决:接受这个限制,把每日上限调到 2~3 条,让每次主动都用在值得说的时候。「主动消息分段」也建议关掉,否则一句话拆成三条,会吃掉三次额度。

顺手关掉的两个开关

  • 文本转图像:长回复会被渲染成图片再发,用的是 AstrBot 官方的远程服务,等于聊天内容要先发到别人服务器上。关掉。
  • 输出工具调用信息:开着的话,它每次搜新闻都会多发一条“正在调用 xxx”,很出戏。关掉。

六、花了多少钱、还能怎么玩

花费:AstrBot、插件和 Edge TTS 都免费,服务器是本来就有的,唯一的开销是 DeepSeek 的调用费。下面是我从 DeepSeek 后台导出的真实账单,统计的是当晚从开始搭建到测完的大约 4 个小时(只算 AstrBot 用的那个 Key):

项目 数量
请求次数 90 次
输入 token 约 77 万(其中约 49 万命中缓存)
输出 token 约 3.2 万
花费 约 1.74 元

两个发现:

  • 钱主要花在“输入”上,不在“回答”上。 平均每次请求要输入约 8500 个 token,回答只有约 360 个。这正好印证了第一节说的:每次问模型,AstrBot 都要把人格、记忆、日程、时间整段重新塞进去。没命中缓存的输入占了总花费的七成左右。
  • 换便宜的模型能省很多。 我用的是 deepseek-v4-pro。同样这些 token,如果换成 deepseek-flash,按账单里的单价算只要约 0.41 元,大概是四分之一。陪伴插件里的“快速响应”这类小判断,换成 flash 基本没影响。

要更省钱,就在陪伴面板里少开几个会额外调用模型的功能(新闻、主动消息、关系分析)。

还能怎么玩:

  • 换人格:多建几个人格,在 QQ 里用 /persona 指令切换(具体用法发 /help 看)。我准备了健身教练、做饭搭子、技术学长几种。
  • 读新闻:陪伴插件可以订阅 RSS,我加了 Hacker News、IT之家、少数派这类科技源,它看到有意思的会主动发给我。
  • 联网搜索:在「配置文件 → AI → 能力 → 网页搜索」里接上 DeepSeek Search API,问它最新的事它会先搜再答。

一个提醒:通过 QQ 聊天,消息都会经过腾讯的服务器,机器人发出去的内容也会被平台审核。日常聊天、健身、新闻完全没问题,但别把它当成绝对私密的树洞。