安装 python 环境
参考(windows 下安装 stable diffusion webui - 掘金 (juejin.cn) 安装 python 环境
chatGLM
介绍
ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考我们的博客。
为了方便下游开发者针对自己的应用场景定制模型,我们同时实现了基于 P-Tuning v2 的高效参数微调方法 (使用指南) ,INT4 量化级别下最低只需 7GB 显存即可启动微调。
不过,由于 ChatGLM-6B 的规模较小,目前已知其具有相当多的局限性,如事实性/数学逻辑错误,可能生成有害/有偏见内容,较弱的上下文能力,自我认知混乱,以及对英文指示生成与中文指示完全矛盾的内容。请大家在使用前了解这些问题,以免产生误解。更大的基于 1300 亿参数 GLM-130B 的 ChatGLM 正在内测开发中。
源码与环境
源码下载
GitHub - THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型
git clone --depth 1 https://github.com/THUDM/ChatGLM-6B.git
依赖环境
安装依赖
cd ChatGLM-6B
pip install -r requirements.txt
部分依赖需要额外安装:
- webui 依赖
pip install gradio
- charset_normalizer
ImportError: cannot import name 'COMMON_SAFE_ASCII_CHARACTERS' from 'charset_normalizer.constant'
pip install cchardet
模型下载
- 官方网站:清华大学云盘 (tsinghua.edu.cn)
- hugging face: THUDM/chatglm-6b · Hugging Face
修改 web_demo.py 的文件中的模型路径,设置成本地模型路径
# tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
# model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
tokenizer = AutoTokenizer.from_pretrained("E:\model\chatglm\chatglm-6b-model", trust_remote_code=True)
model = AutoModel.from_pretrained("E:\model\chatglm\chatglm-6b-model", trust_remote_code=True).half().cuda()
模型默认 f16 精度加载,需要大概 13GB 显存。如果显存不够,可以尝试量化加载模型,方法如下:
# 目前只支持 4/8 bit 量化
model = AutoModel.from_pretrained("E:\model\chatglm\chatglm-6b-model", trust_remote_code=True).quantize(8).half().cuda()
进行 2 至 3 轮对话后,8-bit 量化下 GPU 显存占用约为 10GB,4-bit 量化下仅需 6GB 占用。随着对话轮数的增多,对应消耗显存也随之增长,由于采用了相对位置编码,理论上 ChatGLM-6B 支持无限长的 context-length,但总长度超过 2048(训练长度)后性能会逐渐下降。
模型量化会带来一定的性能损失,经过测试,ChatGLM-6B 在 4-bit 量化下仍然能够进行自然流畅的生成。使用 GPT-Q 等量化方案可以进一步压缩量化精度/提升相同量化精度下的模型性能,欢迎大家提出对应的 Pull Request。
量化过程需要在内存中首先加载 FP16 格式的模型,消耗大概 13GB 的内存。如果你的内存不足的话,可以直接加载量化后的模型,INT4 量化后的模型仅需大概 5.2GB 的内存:
# INT8 量化的模型将"THUDM/chatglm-6b-int4"改为"THUDM/chatglm-6b-int8"
model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True).half().cuda()
量化模型的参数文件也可以从这里手动下载。
运行
提供了一个基于 Gradio 的网页版 Demo 和一个命令行 Demo。使用时首先需要下载本仓库:
git clone https://github.com/THUDM/ChatGLM-6B
cd ChatGLM-6B
网页版 Demo
首先安装 Gradio:pip install gradio,然后运行仓库中的 web_demo.py:
python web_demo.py
程序会运行一个 Web Server,并输出地址。在浏览器中打开输出的地址即可使用。最新版 Demo 实现了打字机效果,速度体验大大提升。注意,由于国内 Gradio 的网络访问较为缓慢,启用 demo.queue().launch(share=True, inbrowser=True) 时所有网络会经过 Gradio 服务器转发,导致打字机体验大幅下降,现在默认启动方式已经改为 share=False,如有需要公网访问的需求,可以重新修改为 share=True 启动。
命令行 Demo
运行仓库中 cli_demo.py:
python cli_demo.py
程序会在命令行中进行交互式的对话,在命令行中输入指示并回车即可生成回复,输入 clear 可以清空对话历史,输入 stop 终止程序。
API部署
首先需要安装额外的依赖 pip install fastapi uvicorn,然后运行仓库中的 api.py:
python api.py
默认部署在本地的 8000 端口,通过 POST 方法进行调用
curl -X POST "http://127.0.0.1:8000" \
-H 'Content-Type: application/json' \
-d '{"prompt": "你好", "history": []}'
得到的返回值为
{
"response":"你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。",
"history":[["你好","你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"]],
"status":200,
"time":"2023-03-23 21:38:40"
}
langchain-chatGLM
Quickstart Guide — 🦜🔗 LangChain 0.0.153
介绍
一种利用 ChatGLM-6B + langchain 实现的基于本地知识的 ChatGLM 应用。增加 clue-ai/ChatYuan 项目的模型 ClueAI/ChatYuan-large-v2 的支持。
💡 受 GanymedeNil 的项目 document.ai 和 AlexZhangji 创建的 ChatGLM-6B Pull Request 启发,建立了全部基于开源模型实现的本地知识问答应用。
✅ 本项目中 Embedding 默认选用的是 GanymedeNil/text2vec-large-chinese,LLM 默认选用的是 ChatGLM-6B。依托上述模型,本项目可实现全部使用开源模型离线私有部署。
⛓️ 本项目实现原理如下图所示,过程包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的top k个 -> 匹配出的文本作为上下文和问题一起添加到prompt中 -> 提交给LLM生成回答。
源码与依赖
源码
git clone --depth 1 https://github.com/imClumsyPanda/langchain-ChatGLM.git
GitHub - thomas-yanxin/LangChain-ChatGLM-Webui: 基于LangChain和ChatGLM-6B等系列LLM的针对本地知识库的自动问答
依赖安装
cd langchain-ChatGLM
pip install -r requirements.txt
模型下载
- ChatGLM 模型参考上面 ChatGLM 部分
- Embedding 模型:
修改 configs/model_config.py 中的模型路径
- ChatGLM 模型路径:llm_model_dict
- Embedding 模型路径:embedding_model_dict
# embedding_model_dict = {
# "ernie-tiny": "nghuyong/ernie-3.0-nano-zh",
# "ernie-base": "nghuyong/ernie-3.0-base-zh",
# "text2vec-base": "shibing624/text2vec-base-chinese",
# "text2vec": "GanymedeNil/text2vec-large-chinese",
# }
embedding_model_dict = {
"ernie-tiny": "nghuyong/ernie-3.0-nano-zh",
"ernie-base": "nghuyong/ernie-3.0-base-zh",
"text2vec-base": "E:\project\langchain-chatglm\model\\text2vec-base-chinese",
"text2vec": "E:\project\langchain-chatglm\model\\text2vec-large-chinese",
}
# Embedding model name
EMBEDDING_MODEL = "text2vec"
# Embedding running device
EMBEDDING_DEVICE = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
# supported LLM models
# llm_model_dict = {
# "chatyuan": "ClueAI/ChatYuan-large-v2",
# "chatglm-6b-int4-qe": "THUDM/chatglm-6b-int4-qe",
# "chatglm-6b-int4": "THUDM/chatglm-6b-int4",
# "chatglm-6b-int8": "THUDM/chatglm-6b-int8",
# "chatglm-6b": "THUDM/chatglm-6b",
# }
llm_model_dict = {
"chatyuan": "ClueAI/ChatYuan-large-v2",
"chatglm-6b-int4-qe": "THUDM/chatglm-6b-int4-qe",
"chatglm-6b-int4": "THUDM/chatglm-6b-int4",
"chatglm-6b-int8": "THUDM/chatglm-6b-int8",
"chatglm-6b": "E:\model\chatglm\chatglm-6b-model",
}
# LLM model name
LLM_MODEL = "chatglm-6b"
运行
执行 cli_demo.py 脚本体验命令行交互:
$ python cli_demo.py
或执行 webui.py 脚本体验 Web 交互
$ python webui.py
- 运行前自动读取
configs/model_config.py中LLM及Embedding模型枚举及默认模型设置运行模型,如需重新加载模型,可在模型配置标签页重新选择后点击重新加载模型进行模型加载; - 可手动调节保留对话历史长度、匹配知识库文段数量,可根据显存大小自行调节;
- 具备模式选择功能,可选择
LLM对话与知识库问答模式进行对话,支持流式对话; - 添加
配置知识库功能,支持选择已有知识库或新建知识库,并可向知识库中新增上传文件/文件夹,使用文件上传组件选择好文件后点击上传文件并加载知识库,会将所选上传文档数据加载至知识库中,并基于更新后知识库进行问答; - 后续版本中将会增加对知识库的修改或删除,及知识库中已导入文件的查看。