Muice-Chatbot

Muice-Chatbot

沐雪,一个会自动找你聊天的AI女孩子

Stars: 247

Visit
 screenshot

Muice-Chatbot is an AI chatbot designed to proactively engage in conversations with users. It is based on the ChatGLM2-6B and Qwen-7B models, with a training dataset of 1.8K+ dialogues. The chatbot has a speaking style similar to a 2D girl, being somewhat tsundere but willing to share daily life details and greet users differently every day. It provides various functionalities, including initiating chats and offering 5 available commands. The project supports model loading through different methods and provides onebot service support for QQ users. Users can interact with the chatbot by running the main.py file in the project directory.

README:

Stars Model HuggingFace Python

介绍✨

沐雪,一只会主动找你聊天的AI女孩子,其对话模型基于ChatGLM2-6BQwen微调而成,训练集长度3K+ ,具有二次元女孩子的说话风格,比较傲娇,但乐于和你分享生活的琐碎,每天会给你不一样的问候。

功能🪄

✅ 支持近乎全自动安装环境

✅ 提供本人由3k+对话数据微调的ChatGLM2-6B P-Tuning V2模型与Qwen Qlora微调模型

✅ 主动发起聊天(随机和每天早中晚固定时间)

✅ 提供5条命令以便在聊天中进行刷新回复等操作

✅ OFA图像识别:识别表情包、理解表情包、发送表情包

✅ 支持通过fishaudio/fish-speech进行语言合成(沐雪tts模型尚未发布)

✅ 在群聊中聊天(支持被 @ 回复或不被 @ 随机回复)

✅ 在控制台中实时对话(暂不支持打QQ电话)

⬜ 对记忆模块进行优化,实现长期记忆与短期记忆

快速开始💻

建议环境:

  • Python 3.10
  • 一张拥有6GB+ 显存的显卡(int4量化最低要求: 4G ; CPU推理内存要求:16G+)

自动安装

目前已做到自动安装所有软件、依赖,通过code->download zip下载解压最新源码。

双击install_env.bat安装(不能启用旧版控制台),或在命令行中运行以下命令:

.\install_env.bat

自动安装可能需要较长时间,请耐心等待,安装完成后,你仍需手动下载模型。

请注意,自动安装脚本使用的是python的虚拟环境,不需要conda,留意安装脚本的提示。

手动安装(使用 conda)

git clone https://github.com/Moemu/Muice-Chatbot
cd Muice-Chatbot
conda create --name Muice python=3.10.10
conda activate Muice
pip install -r requirements.txt

模型下载和加载

目前支持的基底模型如下表:

基底模型 对应微调模型版本号 额外依赖库
ChatGLM2-6B-Int4 2.2-2.4 cpm_kernels
ChatGLM2-6B 2.0-2.3
Qwen-7B-Chat-Int4 2.3、2.6.2 llmtuner
Qwen2-1.5B-Instruct-GPTQ-Int4 2.5.3 llmtuner
RWKV(Seikaijyu微调) 参见HF (需要下载配置RWKV-Runner)

微调模型下载:Releases

请将基底模型与微调模型放放入model文件夹中(确保微调模型目录下存在.model文件而不是文件夹,部分微调模型由于疏忽还套了一层checkpoint文件夹)

本仓库目前支持如下模型加载方式:

  1. 通过API加载
  2. 通过transformers的AutoTokenizer, AutoModel函数加载
  3. 通过llmtuner.chat(LLaMA-Factory)的ChatModel类加载
  4. 通过RWKV-Runner提供的API服务加载

在已测试的模型中,我们建议以下模型通过对应的方式加载,其他模型亦可以通过类似的方式加载:

基底模型 微调方式 加载方法
ChatGLM P-tuning V2 transformers
Qwen sft llmtuner
RWKV(Seikaijyu微调) pissa rwkv-api

在配置文件中可调整模型的加载方式:

"model_loader": "api/transformers/llmtuner/rwkv-api",
"model_name_or_path": "基底模型位置",
"adapter_name_or_path": "沐雪微调模型位置"

(若是API/rwkv-api加载,model_name_or_path填api地址)

如果你没有合适的显卡,需要通过CPU加载模型,请安装配置gcc环境并勾选openmp.

OFA图像识别(识别/发送表情包)

本项目支持OFA图像识别,即对聊天图片进行特征提取,并通过OFA模型进行描述生成。发送信息时,会检索本地图片库,若存在匹配的图片,则会发送图片。

若您希望使用OFA图像识别,请在配置文件中设置enable_ofa_imagetrue,并设置ofa_image_model_name_or_path为OFA图像识别模型的路径。

OFA使用到的依赖需要额外安装:

conda activate Muice
pip install -r ofa_requirements.txt

目前支持的OFA模型如下表:

OFA模型
OFA-Image-Caption-Meme-Large-ZH (建议)
ofa_image-caption_muge_base_zh

本地图片数据库位于image_data文件夹中,程序会每五分钟备份一次数据库,默认保留5个备份槽位。

若您想要回退数据库到某个时间点,请将image_data文件夹中的image_data.db删除,并将备份槽位文件image_data.db.backup_xxx_xxx修改为image_data.db

语音回复

若您希望使用语音回复,请在配置文件中设置Voice_Reply_Rate为大于0的整数,机器人将会以一定概率回复语音消息。

语音回复使用到的项目:fishaudio/fish-speech

在fish-speech的webui启动(使用--infer参数)后,更改fish_speech_api.py中的Clientreference_audioreference_text即可。

  • Client为fish-speech的webui地址

  • reference_audio为参考音频文件路径,此音频用于变声效果。

  • reference_text为参考音频文件的参考文本。

启动实时语音聊天

1.安装依赖:

conda activate Muice
pip install -r audio_requirements.txt

2.安装配置语音回复(详见上文)

3.获取语音识别模型

目前支持的模型如下表:

语音识别模型
SenseVoice多语言语音理解模型Small

你可以通过以下命令下载并解压模型:

modelscope download --model iic/SenseVoiceSmall --local_path ./SenseVoice

下载完成后,在配置文件中设置audio_name_or_path为模型文件夹的路径。

4.配置信息和设备

你可以通过以下命令查看输入输出设备信息:

python realtime_refence.py --get_device

realtime_refence.py中配置输入输出设备信息:

CHUNK = 1024  # 每次读取的音频块大小
FORMAT = pyaudio.paFloat32  # 音频格式
CHANNELS = 1  # 输入设备声道
RATE = 22050  # 采样率(16000/22050/44100)
THRESHOLD = 75  # 声音响度阈值(60-150左右,请根据实际情况调节)
SILENCE_THRESHOLD_MS = 1500  # 静音持续时间阈值(毫秒)
SILENCE_COUNT = int(SILENCE_THRESHOLD_MS / (1000 * CHUNK / RATE))  # 静音计数器阈值
use_virtual_device = False  # 是否使用虚拟设备(当你需要通过语音通话时,请设置为True)
if use_virtual_device:
    speaker_device_index = 3  # 输入设备索引
    mic_device_index = 10  # 输出设备索引
    device_index = speaker_device_index
else:
    device_index = 1  # 录音设备索引

4.启动实时语音聊天

python realtime_refence.py

bot服务配置

现以提供onebot服务支持, 无需担心gocq的风控(喜)

本项目使用onebotV11协议, 若您希望于QQ使用, 推荐参考LLOneBot使用onebot服务

注:请在安装好LLOneBot后, 于设置中开启反向WebSocket服务, 填写ws://127.0.0.1:21050/ws/api, 以正常运行

您也可以使用Lagrange.Core以及OpenShamrock等来链接QQ, 或其他适配器链接其他软件,详见onebotV11适配器

能使用请勿随意更新ntQQ, 若无法使用请尝试降级ntQQ

总结

在完成这些操作后,你应该得到类似如下所示的文件结构:

Muice-Chatbot     <- 主路径
 ├─llm
 ├─model
 │  ├─ chatglm2-6b       <- 原始模型 (三者三选一)
 │  ├─ chatglm2-6b-int4  <- int4原始模型
 │  ├─ Qwen-7B-Chat-Int4 <- Qwen-7B-int4原始模型
 │  └─ Muice
 ├─configs.json  <- 配置文件
 ├─ws.py         <- ws服务
 ├─main.py       <- 主函数
 ├─requirements.txt
 └─...

配置⚒️

本项目使用configs.json作为配置文件,目前支持配置的项如下:

{
    "model_loader": "transformers",
    "model_name_or_path": "./model/chatglm2-6b",
    "adapter_name_or_path": "./model/Muice",
    "enable_ofa_image": false,
    "ofa_image_model_name_or_path": "",
    "Trust_QQ_list": [],
    "AutoCreateTopic": false,
    "read_memory_from_file": true,
    "known_topic_probability": 0.003,
    "time_topic_probability": 0.75,
    "port":21050,
    "Reply_Wait": true,
    "bot_qq_id":123456789,
    "Is_CQ_Code": false,
    "Group_Message_Reply_Only_To_Trusted": true,
    "Reply_Rate": 50,
    "At_Reply": false,
    "NonReply_Prefix": [],
    "Voice_Reply_Rate": 0
}

model_loader: 指定模型加载器的类型,当前支持api/transformers/llmtuner/rwkv-api

model_name_or_path: 指定基底模型的名称或路径,例如./model/chatglm2-6b

adapter_name_or_path: 指定预训练模型的名称或路径, 例如./model/Muice

enable_ofa_image: 是否使用OFA图像识别。

ofa_image_model_name_or_path: OFA图像识别模型的名称或路径。

Trust_QQ_list: 信任QQ号列表,只有在此列表中的QQ号发送的消息,机器人才会回复。

AutoCreateTopic: 是否自动发起新对话。如果启用,将默认以Trust_QQ_list中的第一个QQ号作为对话发起对象。

read_memory_from_file: 是否从文件中读取记忆。这对于项目重启后恢复之前的对话状态非常有用。

known_topic_probability: 随机发起已知话题的概率。

time_topic_probability: 根据时间(早、中、傍、晚)触发日常问候的概率。

port: 反向WebSocket服务的端口号,默认21050

Reply_Wait: (私聊)是否回复时等待一段时间。

bot_qq_id: 机器人的QQ号。

Is_CQ_Code: 是否启用CQ码处理信息。

Group_Message_Reply_Only_To_Trusted: (群聊)是否仅对信任的qq回复。

Reply_Rate: (群聊)机器人回复的概率,取值范围为0-100。

At_Reply: (群聊)是否只回复@机器人的消息。

NonReply_Prefix: 消息前缀,机器人不会回复以这些前缀开头的消息。

Voice_Reply_Rate: 语音回复的概率,取值范围为0-100。

使用🎉

在本项目根目录下运行 main.py

conda activate Muice
python main.py

命令🕹️

命令 释义
/clean 清空本轮对话历史
/refresh 刷新本次对话
/help 显示所有可用的命令列表
/reset 重置所有对话数据(将存档对话数据)
/undo 撤销上一次对话

示例对话(训练集)📑

参见公开的训练集Moemu/Muice-Dataset

沐雪人设

与其他聊天机器人项目不同,本项目提供由本人通过自家对话数据集微调后的模型,在Release中提供下载,关于微调后的模型人设,目前公开的信息如下:

沐雪人设图(若无法打开请通过右键打开)

训练集开源地址: Moemu/Muice-Dataset

原始模型:THUDM/ChatGLM2-6B & QwenLM/Qwen)

本项目源码使用MIT license,对于微调后的模型文件,不建议作为商业用途

关于🎗️

代码实现:MoemuMoeSnowyFoxNaivG

训练集编写与模型微调:Moemu (RWKV微调:Seikaijyu

总代码贡献:

图片加载中...

Star History:

Star History Chart

For Tasks:

Click tags to check more tools for each tasks

For Jobs:

Alternative AI tools for Muice-Chatbot

Similar Open Source Tools

For similar tasks

For similar jobs