介绍
使用 ChatGLM-6B 为后端,NoneBot2 为平台的极其简单的本地中文(汉语) AI chat 插件。
首次加载等待时间视 Hugging Face 下载速度而定。
更新说明
如有其他功能需求或疑问,欢迎提 issues,当然如果您实现了某些功能或修复了问题,也非常欢迎您提 PR。
待办
- 限制记忆轮数(
在抄了,在抄了) - 图片输出功能(nonebot-plugin-htmlrender)(
在抄了,在抄了) - 管理员在线配置
- 增加写入读取本地配置文件(json)以实现配置的在线热更新
- @[Bot] 机器人 使用功能(调试阶段,我个人不太需要,不过后续加上吧)
办结/功能
- 完善的默认配置,开箱即用。
- 模型自动下载并存放到指定位置(HuggingFace Hub 提供)
- 保存对话记录以实现多轮对话
- 冷却时间(根据测试效果,默认 30 秒)
- 配置角色功能,基本实现
环境要求
| 量化等级 | 推理 | 微调 | 策略 |
|---|---|---|---|
| 无 | CPU | .float() | |
| FP16(无量化) | 13GB 显存 | 14GB | .half().cuda() |
| INT8 | 8GB 显存 | 9GB | .half().quantize(8).cuda() |
| INT4 | 6GB 显存 | 7GB | .half().quantize(4).cuda() |
| INT4 模型 | 5.2GB 显存 | .half().cuda() | |
| INT4-QE 模型 | 4.3GB 显存 | .half().cuda() |
现在默认使用 CPU 推理,方便开箱即用,但速度较慢。
硬件需求上:训练>微调>推理,但本插件仅考虑推理应用场景。
none-adapter-onebot 要求 Python 3.8+
安装与更新
软件环境
指除去 Python 和 nonebot 以外的软件环境
CUDA
- Windows:见 CUDA 官方文档 | 英文
- Linux:见 CUDA 官方文档 | 英文
PyTorch
插件
(一)使用 nb-cli 安装与更新
在 nonebot2 项目的根目录下打开命令行,输入以下指令即可安装
nb plugin install nonebot-plugin-chatglm --upgrade
(二)使用包管理器安装与更新
1、在 nonebot2 项目的插件目录下,打开命令行,根据你使用的包管理器,输入相应的安装命令:pip
pip install nonebot-plugin-chatglm
pdm
pdm add nonebot-plugin-chatglm
poetry
poetry add nonebot-plugin-chatglm
conda
conda install nonebot-plugin-chatglm
2、打开 nonebot2 项目根目录下的 pyproject.toml 文件,在 [tool.nonebot] 部分追加写入
plugins = ["nonebot_plugin_chatglm"]
配置与依赖
ChatGLM 模型
模型简介:ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。
选择模型
ChatGLM-6B 系列模型
| 模型名称 | 量化情况 | 权重大小 |
|---|---|---|
| ChatGLM-6B | 无 | 13.73GB |
| ChatGLM-6B-INT4 | INT4: GLM Block | 4.06GB |
| ChatGLM-6B-INT4-QE | INT4: GLM Block, Embedding, LM Head | 3.13GB |
- 如果是较小显存(< 10 G)且只用聊天对话模型(ChatGLM-6B-INT4-QE)1 则没用必要修改。
- 如果使用 6B 完整模型,则可以自行设置路径。
下载模型
默认使用HuggingFace Hub加载,即如果没有设置路径,则会自动下载到用户目录下的.cache/huggingface/modules/transformers_modules/THUDM/chatglm-6b-int4-qe,可以通过下面的代码转移模型。
自动下载:
- 无需设置,默认下载
ChatGLM-6B-INT4-QE模型 - 在
.env文件中增加chatglm_model = str,其中 str 为字符串格式的 Hugging Face Hub 路径(用户名/仓库)。
自动下载后转移模型到指定路径
from transformers import AutoTokenizer, AutoModel
model_name = input("HF HUB 路径,例如 THUDM/chatglm-6b-int4-qe: ")
model_path = input("本地存放路径,例如 ./path/modelname: ")
#用 AutoModel.from_pretrained() 下载模型
tokenizer = AutoTokenizer.from_pretrained(model_name,trust_remote_code=True,revision="main")
model = AutoModel.from_pretrained(model_name,trust_remote_code=True,revision="main")
#用 PreTrainedModel.save_pretrained() 保存模型到指定位置
tokenizer.save_pretrained(model_path,trust_remote_code=True,revision="main")
model.save_pretrained(model_path,trust_remote_code=True,revision="main")
手动下载:
- 清华云盘(仅模型文件,是 6B 完整模型,显存较小需要量化使用,暂未设置,需要自行在
chat.py文件中修改) - 🤗 Hugging Face(完整文件),约 4.2 GB。
模型更新与其他使用
模型的具体使用,还请关注 原仓库说明,提交检测 →
运行所需依赖
如果使用 pip 安装,实际已经自动安装了以下依赖,在此说明是为了方便检查
1、模型所需的依赖
ChatGLM 推理
pip install -U protobuf transformers>=4.23.1 cpm_kernels sentencepiece
ChatGLM 微调
pip install -U rouge_chinese nltk jieba datasets
2、NoneBot运行所需依赖
安装这个插件,那必然是已经有了NoneBot项目,或者移步去 NoneBot2 查看。由于还不会根据项目自动切换适配器,因此需要安装nonebot-adapter-onebot,以便调用Onebotv11进行通信。
配置
在 nonebot2 项目的.env或.env.prod或.env.dev(根据实际选择)文件中添加下表中的配置。默认情况下,无需添加配置即可启用。
| 配置项 | 必填 | 类型 | 默认值 | 说明 |
|---|---|---|---|---|
| chat_mode | 否 | str | cpu | 运行模式,cuda 或 cpu |
| chatglm_model | 否 | str | "./data/chatglm/model" | chatglm 模型及其配置文档路径 |
| chatglm_path | 否 | str | "./data/chatglm/" | 插件相关中间文件保存路径 |
| chatglm_cmd | 否 | list[str] | ["hi"] | 对话命令 |
| chat_cd | 否 | int | 30 | 冷却时间,避免高频调用 |
| chatglm_memo | 否 | int | 5 | 保存对话轮数 |
如果要较好的使用,强烈建议将
chat_mode设置为cuda。正常聊天使用来说,30 秒冷却较为合适;复杂问题聊天,60 秒较为合适。建议根据实际测试进行调整。
附加文件
(在基本功能完善后放出,在此之前,可以自建尝试)
roles 格式
{
"catgirl":"猫娘是一种拟人化的生物,其行为似猫但类人。现在你将模仿一只猫娘,与我对话每一句话后面都要加上“喵~”,如果你能明白我的意思,请回复“喵~好的我的主人!”如果你不能理解我说的话,你可以说“呜呜不太理解呢”。",
}
ChatGLM 可能发生记忆遗失,因此在进行角色扮演时,不要提问复杂内容。
simple 格式
示例如下
{
r"你好 [吗]?|hello": "您好,很高兴与您在此相遇,但是您想问什么呢?",
r"你是 [谁?]?": "我是 ChatGLM,一个参数 62 亿的人工智能语言模型,由清华大学和智谱 AI 训练开源,代号 ChatGLM-6B",
r"你的(主人|master) 是 [谁?]?": f"[CQ:at,qq={superusers}]",
}
使用
指令表
| 指令 | 权限 | 需要@ | 范围 | 说明 |
|---|---|---|---|---|
| hi | 所有人 | 否 | 私聊/群聊 | 与 chatglm 对话 |
| 清空记录 | 所有人 | 否 | 私聊/群聊 | 清空自己的对话历史记录 |
| 导出记录 | 所有人 | 否 | 群聊 | 导出记录文件到群中 |
| 清理全部 | 超级管理员 | 否 | 私聊 | 手动处理out of memory |
参考与致谢
基础
- @A-kirami,项目使用了 README模板,有修改
- ChatGLM-6B,模型和使用方法来源,一切的核心
- nonebot2,一切的基础
功能
- nonebot-plugin-novelai,学习的对象,cd 使用来自于此
- nonebot-plugin-ChatGLM6B,与本项目相似,但本项目从中学习转图片、对话记忆。
- ChatGLM-6B API、ChatGLM-webui
-
在其他位置配置量化后的 INT4 模型,发生一些编译错误,暂时
懒得没有能力解决。 ↩
Release files for nonebot-plugin-chatglm 0.1.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| nonebot-plugin-chatglm-0.1.6.tar.gz | 17.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| nonebot_plugin_chatglm-0.1.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 32.0 kB
Release files / nonebot-plugin-chatglm-0.1.6.tar.gz
| Download URL | nonebot-plugin-chatglm-0.1.6.tar.gz |
|---|---|
| Size | 17.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5d67b547cddab31e80001108eb8efac940b9f4d8bceee848a27e8a5c00ffb794
|
|
BLAKE2b-256 checksum How to use checksums |
5215ca5c82254bc9df43b997bd89c14045fd99119fd3763ea91900322053af7d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
pdm/2.7.0 CPython/3.9.2
|
Release files / nonebot_plugin_chatglm-0.1.6-py3-none-any.whl
| Download URL | nonebot_plugin_chatglm-0.1.6-py3-none-any.whl |
|---|---|
| Size | 14.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
eeb953c321c78d2c7496483bc5870a46e54cb8d3a40cf8ca4cc9b6fdf88058f2
|
|
BLAKE2b-256 checksum How to use checksums |
2fc8fd093b0ffb1b194ba5cc5590d930de5dc9ec96e124daec389f19c000f469
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
pdm/2.7.0 CPython/3.9.2
|