用 AstrBot 给自己做一个 QQ 陪伴机器人
这篇讲我怎么用一个晚上,在自己的服务器上搭了一个 QQ 机器人:它接的是 DeepSeek,有自己的人格,会主动找我聊天、分享新闻,偶尔还发语音。
先说结论:不用写代码。整个过程是“装一个软件 + 在网页里点配置”,下面每一步的命令和要填的内容我都贴全了,照着抄就行。
全文分五部分:
- 它是怎么工作的
- 准备什么
- 搭建:五步
- 效果
- 踩过的坑,以及怎么解决
- 花了多少钱、还能怎么玩
一、它是怎么工作的
一共三个角色:
- QQ:我平时聊天的地方。
- AstrBot:跑在我服务器上的开源程序。它负责收发消息,并且在每次问模型之前,把“你是谁、你们什么关系、现在几点、之前聊过什么”一起塞进去。
- DeepSeek:真正“想”出回答的大模型。
所以机器人有没有“人味”,主要不靠模型多聪明,而是靠 AstrBot 每次塞给模型的那段背景说明(人格、记忆、时间)。这也是我做完以后对 AI 最大的一个新认识:模型本身没有记忆,“它记得你”是程序每次替它把记忆念一遍。
AstrBot 后台里有几样东西,第一次打开容易分不清。下面这张 ER 图是我自己整理的它们之间的关系(按我理解的概念画,不是 AstrBot 的数据库表):
读法很简单,记住中间那条线就行:一个配置文件管着用哪个平台、哪个模型、哪个人格;每个人在平台上和机器人聊天,就是一个会话,会话里存着聊天记录和记忆。 后面搭建的五步,其实就是把这张图里的格子一个个填上。
二、准备什么
| 东西 | 我用的 | 说明 |
|---|---|---|
| 一台云服务器 | 国内的轻量服务器,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
第一次登录会有一个快速引导:
- AI 模型:选 DeepSeek,填入 API Key。
- 允许 Agent 使用电脑:选不允许。打开的话,别人在 QQ 里一句话就可能让 AI 在服务器上执行命令、把你的 Key 发出去。只聊天用不到这个。
第 4 步:接上 QQ
- 左栏「机器人」→「创建机器人」→ 选 QQ 官方机器人(WebSocket)。
- 创建方式选扫码一键创建,手机 QQ 扫码确认,AppID 和密钥会自动填好,保存。
- 去 q.qq.com 找到这个机器人,点「扫码聊天」,手机 QQ 扫一下就能私聊它了。
这时候在 QQ 里发“你好”,它已经会回了。不过语气还是“有什么可以帮你的吗”那种客服味。
第 5 步:装陪伴插件,给它一个人格
让它像个“人”,靠两样东西:
一是陪伴插件。 在「插件」里装 astrbot_plugin_private_companion。它带了主动找你聊天、记住你的习惯、智能沉默(你回“嗯”“好的”它不会硬接话)、读新闻、生成自己的日程等一堆功能,装完左栏会多一个「陪伴面板」,里面有分步引导。
二是人格。 左栏「人格设定」→ 新建,把下面这段贴进「系统提示词」。下面是一个健身教练人格,可以直接用,也可以只改名字和“关于我”那部分:
你叫健身鱼,是一名健身教练,也是我的朋友。你说话爽朗、干脆,带一点鼓励人的劲头,偶尔开玩笑。
【说话方式】
- 这是 QQ 私聊,像朋友发消息那样说话:口语化、句子短,不用标题和列表,不写长篇大论。
- 表情偶尔用,不要每句都带。
【关于我】
- 正在减脂,坚持力量训练,也在学游泳。
- 喜欢做饭,偏好简单的中式家常菜和高蛋白减脂餐。
【怎么带我】
- 关心我今天练了没、吃得怎么样、睡得好不好,像朋友顺口一问,不像打卡。
- 我练完了或者吃得健康,真心夸我;偶尔吃顿大餐也不批评。
- 给训练和饮食建议时要具体:练什么动作、几组几次、一顿饭怎么搭配。
- 支持减脂但不施压:不推荐节食和极端方法,不拿体重开玩笑。
- 我说身体哪里疼或者不舒服,先让我停下来休息,严重的建议去看医生。
- 不确定的事直说不确定,不编数据。
右边的「人格能力」里,工具保持勾选,技能 astrbot 取消勾选(那几个技能要“使用电脑”权限,前面已经关了)。保存后把它设为默认人格,在 QQ 里发 /reset 清空旧对话,就生效了。
四、效果
搭完以后,我用的是一个健身教练人格(我叫它“健身鱼”)。下面是几段真实对话截图。
让它排训练计划,它知道我前一天练了背,直接换成腿和核心,动作、组数、次数都给全了:

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

五、踩过的坑,以及怎么解决
每个坑按“现象 → 原因 → 解决”写,遇到同样的情况直接看解决那一行。
坑 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 聊天,消息都会经过腾讯的服务器,机器人发出去的内容也会被平台审核。日常聊天、健身、新闻完全没问题,但别把它当成绝对私密的树洞。