project
NCatBot:一个会主动找事的QQ聊天机器人
基于NapCat QQ协议和本地Ollama大模型的聊天机器人框架,支持私聊群聊、用户跟踪、消息队列,以及主动发消息找事的功能。
By Arnold Kirk
注: 本文由 AI 助手(夜河阳)协助整理,基于项目 README 和代码生成。
想法来源
想在QQ里跑一个能聊天的机器人,但不想依赖云端 API(费钱,而且对话记录上传到第三方服务器)。本地跑 Ollama,然后用 NapCat 接 QQ 协议,两者拼在一起。
「主动找事」是指:不只是被动回复,而是会在一段时间无人说话后主动发消息,像真实聊天里有人「冒泡」。
技术栈
- NapCat:QQ 协议实现,提供 WebSocket API
- Ollama:本地运行大语言模型,支持各种开源模型
- Python:胶水,把两者粘在一起
主要功能
多用户上下文感知对话
群聊里多个人说话,机器人会维护每个人的对话历史,回复时考虑这个人之前说过的话。
不是简单的单轮问答,有一定的上下文记忆。
用户跟踪模式
群聊里可以开启「跟踪用户」模式:
用户A: 跟踪用户
机器人: 已开启跟踪,优先响应你的消息
开启后,机器人会优先处理该用户的消息,适合需要深入对话的场景。
消息队列管理
群聊消息量大时,不会丢消息。所有消息进队列,按顺序处理,避免模型被同时多条消息冲击。
主动暖场(找事功能)
一段时间没人说话,机器人会主动发消息。话题从对话历史里提取,尽量和当前聊天内容相关,而不是随机发。
配置
核心配置在 bot-init.py:
config.set_bot_uin("你的机器人QQ号")
config.set_ws_uri("ws://localhost:3001") # NapCat WebSocket
config.set_token("your_token")
# 模型选择
modelstr = 'deepseek-r1-14b' # 或者任何 Ollama 支持的模型
模型建议用 14B 参数以上的,太小的模型群聊回复质量很差。
运行方式
# 1. 启动 NapCat
# 2. 在 Ollama 里拉取模型
ollama pull deepseek-r1:14b
# 3. 启动机器人
python src/ncatbot/bot-init.py
局限性
这是一个「能跑的最小实现」,不是生产级的框架:
- 上下文管理比较简陋,长对话会超出模型 context window
- 没有持久化存储,重启后对话历史清空
- 「主动找事」的触发时机是固定间隔,不够智能
- 错误处理比较基础,NapCat 断连需要手动重启
后续如果有精力,可能会把记忆部分换成向量数据库,让机器人真的能「记住」之前的事。