Skip to main content
logo

✨ AI-group-friend ✨

群聊特化 LLM 聊天机器人,具有 LLM 驱动的记忆系统和表情包功能。

license python

📖 介绍

基于 shadow3aaa/nonebot-plugin-nyaturingtest 重构,移除了 HippoRAG 和情绪系统,改为 LLM 自主管理记忆,并添加表情包存储和发送功能。

  • 本项目对原项目代码的修改及重构均有AI高度参与,若有做得不够好的地方,请手下留情。

特点:

  • 🧠 LLM 驱动的记忆系统:短期记忆、长期记忆、群友信息,LLM 自主增删改
  • 🖼️ 表情包功能:AI 自主决定发表情包;自动从群聊中收藏表情包(缓存机制)
  • 🔍 图片理解:支持 VLM 模式和 LLM 直接看图模式
  • 💬 对话理解:通过 reply 标记和 @ 理解群聊中的对话关系,自主决定是否发言
  • 📝 预设系统:支持角色预设,含可编辑的默认预设
  • ⚡ 轻量高效:单次 LLM 调用完成对话 + 记忆管理,节约token

💿 安装

[!IMPORTANT] 要使用本插件, 你至少需要

  • 一个有效的 openai 规范接口 api key (根据你的 base_url,可以不是 openai 的),你需要在 .env 文件中配置对应的 api 地址
使用 nb-cli 安装 在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装(暂时不行,还未上架)
nb plugin install nonebot-plugin-aigf --upgrade
使用包管理器安装
pip install nonebot-plugin-aigf

在 pyproject.toml 中添加:

[tool.nonebot]
plugins = ["nonebot-plugin-aigf"]

配置

在 .env.prod 中添加:

# === 必填 ===
AIGF_CHAT_OPENAI_API_KEY="***"         # LLM API Key
AIGF_CHAT_OPENAI_BASE_URL="***"        # LLM API 地址
AIGF_CHAT_OPENAI_MODEL="***"           # LLM 模型名称
AIGF_ENABLED_GROUPS=[123456, 789012]   # 启用的群号列表

# === 可选 ===
AIGF_MEME_ENABLED=true                 # 是否启用表情包功能(默认 true)
AIGF_MEME_MAX_COUNT=200                # 自动收集的表情包最大数量(默认 200)
AIGF_DEFAULT_PRESET=default            # 默认预设名称(默认 "default")

# === VLM 配置(图片理解) ===
AIGF_IMAGE_MODE="vlm"                             # 图片模式: vlm=独立VLM分析, llm=LLM直接看图
AIGF_VLM_ENABLED=true                             # 是否启用VLM(仅 vlm 模式有效,默认 true)
AIGF_VLM_MODEL="Pro/Qwen/Qwen2.5-VL-7B-Instruct"  # VLM 模型名称
AIGF_VLM_BASE_URL="https://api.siliconflow.cn/v1" # VLM API 地址
AIGF_VLM_API_KEY="***"                            # VLM API Key(为空时使用 chat 的 key)

命令

命令 说明 权限
help / 帮助 显示帮助信息 SUPERUSER
status / 状态 查看机器人状态(角色、最近消息) SUPERUSER
set_role <名字> <设定> 设置机器人角色 SUPERUSER
reset / 重置 重置会话(清空所有记忆) SUPERUSER
presets 查看可用的角色预设 SUPERUSER
set_preset <预设名> 加载指定的角色预设 SUPERUSER
reload_meme / 重载表情包 热重载表情包配置 SUPERUSER

触发机制

  • 攒够 5 条新消息,或最后一条消息后 5 秒内无新消息,触发一次处理
  • 每次处理时,LLM 收到最近 15 条聊天记录 + 三层记忆 + 预设 + 表情包列表
  • LLM 一次调用同时完成:回复决策 + 记忆管理 + 表情包选择

对话理解

机器人通过以下方式理解群聊中的对话关系:

  • reply 标记:消息中包含 [回复 xxx 的消息: "yyy"],表示在回复某人
  • @ 提及:@某人 表示消息是发给那个人的
  • 时间推断:时间接近的消息通常在互相回复

回复决策规则:

  • 有人 @ 了机器人 → 回复
  • 有人回复了机器人之前的消息 → 回复
  • 消息明显是对所有人说的,且有值得补充的内容 → 回复
  • 不确定是否在和自己说话 → 不回复

记忆系统

机器人拥有三层记忆,由 LLM 在每次回复时自主管理:

短期记忆

存储在 <插件数据目录>/memory/<群号>/short_term.json,内容为 LLM 维护的信息列表,包括对话摘要、临时上下文、有趣的梗等。LLM 可以添加、修改、删除条目。

长期记忆

存储在 <插件数据目录>/memory/<群号>/long_term.json,内容为 LLM 认为值得长期记住的信息,如群内发生的事件、群规、群友分享的有用知识等。LLM 可添加、修改、删除。不应记录临时对话或常识信息。

群友信息

存储在 <插件数据目录>/memory/friends/<QQ号>.json,每个群友一个文件,以 QQ 号命名。LLM 记录群友的昵称、职业、爱好、说过的话、与其他群友的关系等。具体保存方式如下:

{
  "id": "123456",
  "nickname": "小明",
  "aliases": ["小明哥", "明酱"],
  "past_nicknames": ["明明"],
  "info": ["职业:程序员", "爱好:打游戏"],
  "groups": ["114514","1919810"]
}
字段 来源 说明
nickname 系统自动更新 QQ 全局昵称
aliases LLM 管理 群友对 ta 的称呼
past_nicknames 系统自动记录 曾用 QQ 昵称,便于从记忆中识别人物
info LLM 管理 一般信息(职业、爱好等)
groups 系统自动维护 所在的群列表

表情包功能

工作原理

群聊中有人发图片/表情包
    ↓
下载图片 → VLM 分析内容和情感
    ↓
保存到缓存目录(<缓存目录>/sticker_cache/)
    ↓
下一次消息处理时,LLM 在 Prompt 中看到缓存的表情包
    ↓
LLM 决定是否收藏 → 保存到 memes 目录

表情包素材库

存放在 <插件数据目录>/memes/ 下:

memes/
├── memes.json          ← 管理员手动配置
├── collected.json      ← 机器人自动收集
└── *.jpg/png/gif       ← 表情包图片文件

管理员手动配置

编辑 memes.json:

[
  {
    "id": "happy_spin",
    "path": "happy_spin.jpg",
    "keywords": ["开心", "高兴", "庆祝"],
    "description": "开心到转圈的小人"
  }
]
字段 必填 说明
id ✅ 唯一标识符,AI 用这个选择表情包
path ✅ 图片文件名(相对于 memes 目录)
keywords ✅ 适用场景关键词
description ✅ 一句话描述内容

修改后执行 /重载表情包 即可生效,无需重启。

自动收集

机器人收到图片时,VLM 分析后保存到缓存。LLM 在回复时看到缓存的表情包,决定是否收藏:

{
  "memory": {
    "save_meme": [
      {"id": "a1b2c3d4e5f6", "description": "开心转圈的小人", "keywords": ["开心"]}
    ]
  }
}
  • 图片按 MD5 hash 去重
  • 超过 AIGF_MEME_MAX_COUNT 上限时,优先清理最近未使用的
  • 缓存中的表情包只处理一次,处理后清空

发送表情包

LLM 在回复中指定表情包 id(来自 memes.json 或 collected.json):

{"type": "meme", "id": "happy_spin"}

图片理解模式

通过 AIGF_IMAGE_MODE 配置:

模式 流程 适用场景
vlm(默认) 图片 → VLM 分析 → 文字描述给 LLM LLM 不支持图片输入
llm 图片 → base64 直接附在 LLM prompt 中 LLM 支持视觉(GPT-4o 等)

VLM 模式下,描述限制 50 字,情感只输出 3 个词,不识别具体角色名称(只描述外貌特征)。

预设系统

首次运行后在 <插件配置目录>/presets/ 下生成 default.json:

{
  "name": "小助手",
  "role": "一个友好的群聊助手,会用轻松的语气和大家聊天",
  "knowledges": [],
  "hidden": false
}

预设字段

字段 说明
name 角色名称
role 角色设定
knowledges 预设知识列表(会注入 Prompt)
hidden 是否在 /presets 中隐藏

添加新预设

在 presets/ 目录下创建新的 JSON 文件,如 猫娘.json:

{
  "name": "喵喵",
  "role": "一个可爱的群猫娘,群里的其它人是你的主人",
  "knowledges": [
    "猫娘有猫耳和猫尾巴",
    "猫娘喜欢吃鱼"
  ],
  "hidden": false
}

然后在群内执行 set_preset 猫娘 即可加载。

消息格式

LLM 支持以下回复类型:

类型 格式 说明
文本 {"type": "text", "content": "..."} 纯文本消息
@ {"type": "at", "name": "群友昵称"} 艾特群友
表情包 {"type": "meme", "id": "表情包id"} 发送表情包

文本和 @ 会合并为一条消息发送,表情包单独发送。

图片理解模式

支持两种图片理解模式,通过 AIGF_IMAGE_MODE 配置:

VLM 模式(默认)

图片 → VLM 分析 → 缓存描述 → 文字 prompt 给 LLM
  • LLM 不需要支持图片输入
  • VLM 单独调用,消耗较少 token
  • 适合 LLM 不支持视觉的场景

LLM 模式

图片 → 直接以 base64 附在 LLM prompt 中 → LLM 看图决策
  • LLM 直接看到图片,理解更准确
  • 不需要配置 VLM
  • 适合支持视觉的模型(如 GPT-4o、Qwen-VL)
  • 图片 base64 会消耗更多 token

依赖

  • NoneBot2 + OneBot V11 适配器
  • OpenAI 兼容 API(LLM)
  • VLM API(图片理解,可选)
  • Pillow(图片处理)
  • httpx、anyio
  • numpy

一些碎碎念

  • 本项目移除了原插件的 HippoRAG 和情绪系统,拟人程度远不如原插件
  • 本项目的token消耗理论上相较原插件能减少约30-50%,但绝对值仍不低,每次请求约消耗 20K tokens,在记忆数据丰富之后会更高
  • 推荐使用价格较为低廉的模型作为llm模型(群友就是要笨笨的才可爱呀),再以识图能力较好的vlm模型作为辅助(要是看不懂表情包还是会比较尴尬的)

Release files for nonebot-plugin-aigf 0.3.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for nonebot-plugin-aigf 0.3.1
File Size Uploaded
nonebot_plugin_aigf-0.3.1.tar.gz 7.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for nonebot-plugin-aigf 0.3.1
File Interpreter ABI Platform
nonebot_plugin_aigf-0.3.1-py3-none-any.whl Python 3 none any Details

Total release size: 14.0 kB

Release files / nonebot_plugin_aigf-0.3.1.tar.gz

Download URL nonebot_plugin_aigf-0.3.1.tar.gz
Size 7.6 kB
Tags Source
SHA-256 checksum
How to use checksums
b36d70286e1e16b24d0fe70d05d899d9d1dfda99c7bbe19173f923dd732168a4
BLAKE2b-256 checksum
How to use checksums
6420f4ebced936c9d82d7a54055c6e11474900d4906f2b39d7f77f5be5e332ff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.11

Release files / nonebot_plugin_aigf-0.3.1-py3-none-any.whl

Download URL nonebot_plugin_aigf-0.3.1-py3-none-any.whl
Size 6.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c9be7fc508196c37eb9e6e9066c5b17979687eeeb9d0b88cdc1cdac8cb21ccc2
BLAKE2b-256 checksum
How to use checksums
55c26b5dbf2acb5a75eae477246f5dbf13585ef85fea3c00f2fa32e5765702dd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.11

Release history Release notifications | RSS feed

0.4.0

2 release files

0.3.4

2 release files

0.3.2

2 release files

This release

0.3.1 This release

2 release files

0.3.0

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.3

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page