From 1c27eb29b50cbf3577f352f4cb61bd90d1a6a503 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Mon, 3 Mar 2025 12:41:13 +0800 Subject: [PATCH] =?UTF-8?q?readme=E9=94=90=E6=84=8F=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 174 +++++++------------------------------------ docs/installation.md | 102 +++++++++++++++++++++++++ docs/video.png | Bin 0 -> 28002 bytes 3 files changed, 130 insertions(+), 146 deletions(-) create mode 100644 docs/installation.md create mode 100644 docs/video.png diff --git a/README.md b/README.md index 00afd83e..c611d85e 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@
- ![Python Version](https://img.shields.io/badge/Python-3.x-blue) ![License](https://img.shields.io/github/license/SengokuCola/MaiMBot) ![Status](https://img.shields.io/badge/状态-开发中-yellow) @@ -12,163 +11,33 @@ ## 📝 项目简介 -**麦麦qq机器人的源代码仓库** +**麦麦是一个基于大语言模型的智能QQ群聊机器人** -基于llm、napcat、nonebot和mongodb的专注于群聊天的qqbot +- 🤖 基于 nonebot2 框架开发 +- 🧠 LLM 提供对话能力 +- 💾 MongoDB 提供数据持久化支持 +- 🌐 NapCat 作为QQ协议端支持
- 麦麦演示视频 + 麦麦演示视频
👆 点击观看麦麦演示视频 👆
-> ⚠️ **警告**:代码可能随时更改,目前版本不一定是稳定版本 -> ⚠️ **警告**:请自行了解qqbot的风险,麦麦有时候一天被腾讯肘七八次 -> ⚠️ **警告**:由于麦麦一直在迭代,所以可能存在一些bug,请自行测试,包括胡言乱语( +> ⚠️ **注意事项** +> - 项目处于活跃开发阶段,代码可能随时更改 +> - 文档未完善,有问题可以提交 Issue 或者 Discussion +> - QQ机器人存在被限制风险,请自行了解,谨慎使用 +> - 由于持续迭代,可能存在一些已知或未知的bug -关于麦麦的开发和建议相关的讨论群:766798517(不建议发布无关消息)这里不会有麦麦发言! +**交流群**: 766798517(仅用于开发和建议相关讨论) -## 开发计划TODO:LIST +## 📚 文档 -- 兼容gif的解析和保存 -- 小程序转发链接解析 -- 对思考链长度限制 -- 修复已知bug -- 完善文档 -- 修复转发 -- config自动生成和检测 -- log别用print -- 给发送消息写专门的类 -- 改进表情包发送逻辑l - - -## 📚 详细文档 -- [项目详细介绍和架构说明](docs/doc1.md) - 包含完整的项目结构、文件说明和核心功能实现细节(由claude-3.5-sonnet生成) - -### 安装方法(还没测试好,随时outdated ,现在部署可能遇到未知问题!!!!) - -#### Linux 使用 Docker Compose 部署 -获取项目根目录中的```docker-compose.yml```文件,运行以下命令 -```bash -NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker compose up -d -``` -配置文件修改完成后,运行以下命令 -```bash -NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker compose restart -``` - -#### 手动运行 -1. **创建Python环境** - 推荐使用conda或其他虚拟环境进行依赖安装,防止出现依赖版本冲突问题 - ```bash - # 安装requirements - pip install -r requirements.txt - ``` -2. **MongoDB设置** - - 安装并运行mongodb - - 麦麦bot会自动连接默认的mongodb,端口和数据库名可配置 - -3. **Napcat配置** - - 安装并运行Napcat,登录 - - 在Napcat的网络设置中添加ws反向代理:ws://localhost:8080/onebot/v11/ws - -4. **配置文件设置** - - 修改.env的 变量值为 prod - - 将.env.prod文件打开,填上你的apikey(硅基流动或deepseekapi) - - 将bot_config_toml改名为bot_config.toml,打开并填写相关内容,不然无法正常运行 - - #### .env 文件配置说明 - ```ini - # 环境配置 - ENVIRONMENT=dev # 开发环境设置 - HOST=127.0.0.1 # 主机地址 - PORT=8080 # 端口号 - - # 命令前缀设置 - COMMAND_START=["/"] # 命令起始符 - - # 插件配置 - PLUGINS=["src2.plugins.chat"] # 启用的插件列表 - - # MongoDB配置 - MONGODB_HOST=127.0.0.1 # MongoDB主机地址 - MONGODB_PORT=27017 # MongoDB端口 - DATABASE_NAME=MegBot # 数据库名称 - MONGODB_USERNAME="" # MongoDB用户名(可选) - MONGODB_PASSWORD="" # MongoDB密码(可选) - MONGODB_AUTH_SOURCE="" # MongoDB认证源(可选) - - #api配置项,建议siliconflow必填,识图需要这个 - SILICONFLOW_KEY= - SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1/ - DEEP_SEEK_KEY= - DEEP_SEEK_BASE_URL=https://api.deepseek.com/v1 - ``` - - #### bot_config.toml 文件配置说明 - ```toml - # 数据库设置 - [database] - host = "127.0.0.1" # MongoDB主机地址 - port = 27017 # MongoDB端口 - name = "MegBot" # 数据库名称 - - # 机器人基本设置 - [bot] - qq = # 你的机器人QQ号(必填) - nickname = "麦麦" # 机器人昵称 - - # 消息处理设置 - [message] - min_text_length = 2 # 最小响应文本长度 - max_context_size = 15 # 上下文最大保存数量 - emoji_chance = 0.2 # 表情包使用概率 - - # 表情包功能设置 - [emoji] - check_interval = 120 # 表情检查间隔(秒) - register_interval = 10 # 表情注册间隔(秒) - - # CQ码设置 - [cq_code] - enable_pic_translate = false # 是否启用图片转换(无效) - - # 响应设置 - [response] - api_using = "siliconflow" # 回复使用的API(siliconflow/deepseek) - model_r1_probability = 0.8 # R1模型使用概率 - model_v3_probability = 0.1 # V3模型使用概率 - model_r1_distill_probability = 0.1 # R1蒸馏模型使用概率(对deepseek api 无效) - - # 其他设置 - [others] - enable_advance_output = false # 是否启用详细日志输出 - - # 群组设置 - [groups] - talk_allowed = [ # 允许回复的群号列表 - # 在这里添加群号,逗号隔开 - ] - - talk_frequency_down = [ # 降低回复频率的群号列表 - # 在这里添加群号,逗号隔开 - ] - - ban_user_id = [ # 禁止回复的用户QQ号列表 - # 在这里添加QQ号,逗号隔开 - ] - ``` - -5. **运行麦麦** - 在含有bot.py程序的目录下运行(如果使用了虚拟环境需要先进入虚拟环境) - ```bash - nb run - ``` -6. **运行其他组件** - run_thingking.bat 可以启动可视化的推理界面(未完善)和消息队列及其他信息预览(WIP) - knowledge.bat可以将/data/raw_info下的文本文档载入到数据库(未启动) +- [安装与配置指南](docs/installation.md) - 详细的部署和配置说明 +- [项目架构说明](docs/doc1.md) - 项目结构和核心功能实现细节 ## 🎯 功能介绍 @@ -204,6 +73,19 @@ NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker compose restart - 幽默和meme功能:WIP的WIP - 让麦麦玩mc:WIP的WIP的WIP +## 开发计划TODO:LIST + +- 兼容gif的解析和保存 +- 小程序转发链接解析 +- 对思考链长度限制 +- 修复已知bug +- 完善文档 +- 修复转发 +- config自动生成和检测 +- log别用print +- 给发送消息写专门的类 +- 改进表情包发送逻辑 + ## 📌 注意事项 纯编程外行,面向cursor编程,很多代码史一样多多包涵 diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 00000000..9fba9ecd --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,102 @@ +# 🔧 安装与配置指南 + +## 部署方式 + +### 🐳 Docker部署(推荐) + +1. 获取配置文件: +```bash +wget https://raw.githubusercontent.com/SengokuCola/MaiMBot/main/docker-compose.yml +``` + +2. 启动服务: +```bash +NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker compose up -d +``` + +3. 修改配置后重启: +```bash +NAPCAT_UID=$(id -u) NAPCAT_GID=$(id -g) docker compose restart +``` + +### 📦 手动部署 + +1. **环境准备** +```bash +# 创建虚拟环境(推荐) +python -m venv venv +source venv/bin/activate # Linux +venv\\Scripts\\activate # Windows + +# 安装依赖 +pip install -r requirements.txt +``` + +2. **配置MongoDB** +- 安装并启动MongoDB服务 +- 默认连接本地27017端口 + +3. **配置NapCat** +- 安装并登录NapCat +- 添加反向WS:`ws://localhost:8080/onebot/v11/ws` + +4. **配置文件设置** +- 复制并修改环境配置:`.env.prod` +- 复制并修改机器人配置:`bot_config.toml` + +5. **启动服务** +```bash +nb run +``` + +6. **其他组件** +- `run_thingking.bat`: 启动可视化推理界面(未完善)和消息队列预览 +- `knowledge.bat`: 将`/data/raw_info`下的文本文档载入数据库 + +## ⚙️ 配置说明 + +### 环境配置 (.env.prod) +```ini +# API配置(必填) +SILICONFLOW_KEY=your_key +SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1/ +DEEP_SEEK_KEY=your_key +DEEP_SEEK_BASE_URL=https://api.deepseek.com/v1 + +# 服务配置 +HOST=127.0.0.1 +PORT=8080 + +# 数据库配置 +MONGODB_HOST=127.0.0.1 +MONGODB_PORT=27017 +DATABASE_NAME=MegBot +``` + +### 机器人配置 (bot_config.toml) +```toml +[bot] +qq = "你的机器人QQ号" +nickname = "麦麦" + +[message] +max_context_size = 15 +emoji_chance = 0.2 + +[response] +api_using = "siliconflow" # 或 "deepseek" + +[others] +enable_advance_output = false # 是否启用详细日志输出 + +[groups] +talk_allowed = [] # 允许回复的群号列表 +talk_frequency_down = [] # 降低回复频率的群号列表 +ban_user_id = [] # 禁止回复的用户QQ号列表 +``` + +## ⚠️ 注意事项 + +- 目前部署方案仍在测试中,可能存在未知问题 +- 配置文件中的API密钥请妥善保管,不要泄露 +- 建议先在测试环境中运行,确认无误后再部署到生产环境 \ No newline at end of file diff --git a/docs/video.png b/docs/video.png new file mode 100644 index 0000000000000000000000000000000000000000..95754a0c01e8eb4f287c1f642d37e79e3d3f7aeb GIT binary patch literal 28002 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