本文转载于:AIGC:在云上从0开始搭建langchain-ChatGLM,构建私域知识问答机器人DEMO
根据实践过程进行部分修改

简介

AIGC短板:知识茧房(缺少行业领域的私域数据,专有问题解答效果差;数据时效性缺陷,对实时要求高的问题效果差)。
解法之一:私域数据Embedding +向量数据库(语义检索—-向量相似度匹配)。将问题向量化,结合私域知识库中匹配到的“精确”内容,生成高质量prompt,再结合LLM的既有知识,以及概括、推理、扩展等能力,大大提升回答的准确性。这也是langchain-ChatGLM的基本原理:

本文介绍了在阿里云上从0开始搭建langchain-ChatGLM,构建私域知识问答机器人DEMO。可用于日常学习和研究,减少环境搭建时踩坑。

安装步骤

以在CentOS 7.9 64位 64位系统搭建LLM环境,安装《langchain-ChatGLM》为例:
注:Centos的安装和Ubuntu有区别,不是apt而是yum

1、 创建GPU实例(显存8GB以上,磁盘至少50G)

本文选择了带V100 GPU的 ecs.gn6e-c12g1.3xlarge实例,在实例创建时选择安装cuda 11.4。设置用户名及登录密码。
注:chatglm-6b 20G+,text2vec-large-chinese 2G+ 系统盘40G

2、 设置安全组配置

配置出方向端口22,并在源IP中加入本机IP。
注:可以不加本机IP,设置安全组出口即可,python webui.py会生成公网ip地址

3、 ssh到云ECS

如果是root登录,系统会提示正在安装CUDA,待安装完毕,查看GPU详情(若命令无法正常运行,则说明CUDA没安装好)

1
nvidia-smi

注:nvidia-smi中间没有空格
本文采用SecureCRT 8.3连接ECS,由于动态申请GPU资源,公网ip一直变动,需要重新绑定
新机器需要开启ssh服务(默认开启状态2023.06.30测),参考于使用SecureCRT远程连接阿里服务器
A、以Ubuntu为例,Ubuntu开启ssh服务
1
2
3
4
5
6
7
8
9
#1.安装ssh-server
sudo apt-get update
sudo apt-get install openssh-server
ps -e | grep ssh 检测shh是否启动
#2.启动ssh服务
sudo /etc/init.d/ssh restart 启动ssh服务
service ssh status 查看ssh服务状态
# service ssh start 启动ssh服务
# service ssh stop 停止ssh服务

B、 修改服务器内置文件
需要更改config文件
1
2
3
vim /etc/ssh/sshd_config 
PasswordAuthentication no #修改
PubkeyAuthentication yes #修改

C、重启服务器
1
2
service sshd restart
reboot

4、 在ECS上安装相关软件包

A、sudo yum-get update

1
sudo yum-get update

B、安装gcc编译器(可选,系统中通常已有)(不需要):
1
sudo yum install build-essential

C、安装Python,以3.8为例(可选,系统中通常已有)(不需要)
1
sudo yum install python3.8

D、安装miniconda
(1)下载安装包:注意miniconda包需选择对应python版本的包
1
wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-x86_64.sh

(2)运行安装脚本,并初始化:
1
bash Miniconda3-py38_23.3.1-0-Linux-x86_64.sh

(3)(可在2中完成)初始化终端 Shell,以便运conda。
1
~/miniconda3/bin/conda init

(4)初始化完成后,运行bash命令,即可进入conda环境:bash
(5)创建⼀个新的环境(可选):
1
conda create --name py38 python=3.8 -y

(6)激活py38环境(可选):
1
conda activate py38

5、安装git

1
sudo yum install git

6、下载langchain-ChatGLM并安装软件依赖

git clone langchain-ChatGLM

1
2
3
4
git clone https://github.com/imClumsyPanda/langchain-ChatGLM.git
cd langchain-ChatGLM && pip install -r requirements.txt
pip install fastapi uvicorn
conda install nltk # langchain依赖的语言工具包

7、模型下载

将chatglm-6b模型及Embedding 模型,下载到本地(可从本地加载模型):目前支持chatglm-6b-int4-qe、chatglm-6b-int4、chatglm-6b-int8、chatglm-6b、chatyuan、moss。本文以chatglm-6b为例。
注:模型需要占用数十G空间,可将ECS实例的本地盘格式化后挂载,将模型存放在本地盘上。

1
2
yum install git-lfs #安装git-lfs
git-lfs clone https://huggingface.co/THUDM/chatglm-6b

下载 Embedding 模型
目前支持ernie-tiny、ernie-base、text2vec-base、text2vec,本文以text2vec为例。
1
git clone https://huggingface.co/GanymedeNil/text2vec-large-chinese

模型更新
可打开模型所在文件夹后拉取最新模型文件/代码
1
git lfs pull

8、更新模型路径

config/model_config.py中的模型路径为本地路径。
llm_model_dict变量中”chatglm-6b”:”pretrained_model_name”: “./chatglm-6b”
embedding_model_dict变量中”text2vec”:”text2vec”: “./text2vec-large-chinese”

9、导入文档

目前主要支持md、txt、pdf、jpg格式。

10、运行CLI或web DEMO:

1
python cli_demo.py

webui:如需要公网访问,还需要将webui.py中修改:share=True
A、安装gradio

1
pip install gradio

B、在ECS实例安全组的入方向添加安全组规则,并放行8501端口(默认公网服务端口,也可以自定义)。
C、在ECS上运行脚本
1
python webui.py

D、脚本运行成功后,会展示生成的公网链接。在本机浏览器中输入该链接,就可以使用了。
此外,如果不想修改安全组端口,也无需公网访问。可以把模型的本地服务端口7860直接映射到自己的本地便携上,登录使用:
A、本地便携机上执行如下命令,将云ECS的7860端口映射到本地(IP及用户名填实际的):
ssh -L7860:localhost:7860 ecs-user@本地便携IP
B、在本地浏览器登录web界面:http://127.0.0.1:7860
相同的问题,在未结合私域数据下,使用相同ChatGLM模型回答如下:从对比可以看出,无私域数据情况下的回答有明显的错误。而结合私域数据后,答案很准确。

参考资料

1、阿里云:AIGC:在云上从0开始搭建langchain-ChatGLM,构建私域知识问答机器人DEMO
2、Bilibili:20元搞定,买云GPU训练一个自己的GPT
3、Model Whale:ChatGLM-6B 在 ModelWhale 平台的部署与微调教程
4、CSDN:使用SecureCRT远程连接阿里服务器
5、https://github.com/THUDM/ChatGLM-6B#readme
6、https://github.com/imClumsyPanda/langchain-ChatGLM
7、https://github.com/imClumsyPanda/langchain-ChatGLM/blob/master/docs/FAQ.md