简介
AIGC短板:知识茧房(缺少行业领域的私域数据,专有问题解答效果差;数据时效性缺陷,对实时要求高的问题效果差)。
解法之一:私域数据Embedding +向量数据库(语义检索---向量相似度匹配)。将问题向量化,结合私域知识库中匹配到的“精确”内容,生成高质量prompt,再结合LLM的既有知识,以及概括、推理、扩展等能力,大大提升回答的准确性。这也是langchain-ChatGLM的基本原理:
本文介绍了在阿里云上从0开始搭建langchain-ChatGLM,构建私域知识问答机器人DEMO。可用于日常学习和研究,减少环境搭建时踩坑。
安装步骤
以在Ubuntu 18.04 64位系统搭建LLM环境,安装《langchain-ChatGLM》为例:
1、 创建GPU实例(显存8GB以上,磁盘至少50G),本文选择了带P100 GPU的 ecs.gn5-c4g1.xlarge实例,在实例创建时选择安装cuda 11.4。设置用户名及登录密码。
2、 设置安全组配置,配置出方向端口22,并在源IP中加入本机IP。
3、 Ssh到云ECS。如果是root登录,系统会提示正在安装CUDA,待安装完毕,查看GPU详情(若命令无法正常运行,则说明CUDA没安装好):nvidia-smi
4、 在ECS上安装相关软件包:
A、sudo apt-get update
B、安装gcc编译器(可选,系统中通常已有):sudo apt install build-essential
C、安装Python,以3.8为例:sudo apt install python3.8
D、安装miniconda:
(1)下载安装包:注意miniconda包需选择对应python版本的包
wget https://repo.anaconda.com/miniconda/Miniconda3-py38_23.3.1-0-Linux-x86_64.sh
(2)运行安装脚本,并初始化:bash Miniconda3-py38_23.3.1-0-Linux-x86_64.sh
(3)(可在2中完成)初始化终端 Shell,以便运⾏conda。~/miniconda3/bin/conda init
(4)初始化完成后,运行bash命令,即可进入conda环境:bash
(5)创建⼀个新的环境(可选):conda create --name aigc python=3.8 -y
(6)激活aigc环境(可选):conda activate aigc
5、安装git:sudo apt install git
6、git clone langchain-ChatGLM,并安装软件依赖:
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实例的本地盘格式化后挂载,将模型存放在本地盘上。
安装git-lfs:apt install git-lfs
git-lfs clone https://huggingface.co/THUDM/chatglm-6b
# 下载 Embedding 模型,目前支持ernie-tiny、ernie-base、text2vec-base、text2vec,本文以text2vec为例。
$ git clone https://huggingface.co/GanymedeNil/text2vec-large-chinese /your_path/
# 模型需要更新时,可打开模型所在文件夹后拉取最新模型文件/代码
$ git lfs pull
8、更新config/model_config.py中的模型路径为本地路径。
llm_model_dict变量中"chatglm-6b":"pretrained_model_name": "/home/fsnode/chatglm-6b"
embedding_model_dict变量中"text2vec":"text2vec": "/home/fsnode/text2vec-large-chinese"
9、导入自有的文档到ecs,目前主要支持md、txt、pdf、jpg格式。
10、运行CLI或web DEMO:
cli_demo:python cli_demo.py
webui:如需要公网访问,还需要将webui.py中修改:share=True
A、安装gradio :pip install gradio
B、在ECS实例安全组的入方向添加安全组规则,并放行8501端口(默认公网服务端口,也可以自定义)。
C、在ECS上运行脚本:python webui.py
D、脚本运行成功后,会展示生成的公网链接。在本机浏览器中输入该链接,就可以使用了。
此外,如果不想修改安全组端口,也无需公网访问。可以把模型的本地服务端口7860直接映射到自己的本地便携上,登录使用:
A、本地便携机上执行如下命令,将云ECS的7860端口映射到本地(IP及用户名填实际的):
ssh -L7860:localhost:7860 ecs-user@ecs公网IP
B、在本地浏览器登录web界面:http://127.0.0.1:7860
相同的问题,在未结合私域数据下,使用相同ChatGLM模型回答如下:从对比可以看出,无私域数据情况下的回答有明显的错误。而结合私域数据后,答案很准确。
附录
参考资料:
https://github.com/THUDM/ChatGLM-6B#readme
https://github.com/imClumsyPanda/langchain-ChatGLM
https://github.com/imClumsyPanda/langchain-ChatGLM/blob/master/docs/FAQ.md