diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4bc9a91 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,32 @@ +## 变更日志 + +**[2023/04/15]** + +1. 重构项目结构,在根目录下保留命令行 Demo [cli_demo.py](cli_demo.py) 和 Web UI Demo [webui.py](webui.py); +2. 对 Web UI 进行改进,修改为运行 Web UI 后首先按照 [configs/model_config.py](configs/model_config.py) 默认选项加载模型,并增加报错提示信息等; +3. 对常见问题进行补充说明。 + +**[2023/04/12]** + +1. 替换 Web UI 中的样例文件,避免出现 Ubuntu 中出现因文件编码无法读取的问题; +2. 替换`knowledge_based_chatglm.py`中的 prompt 模版,避免出现因 prompt 模版包含中英双语导致 chatglm 返回内容错乱的问题。 + +**[2023/04/11]** + +1. 加入 Web UI V0.1 版本(感谢 [@liangtongt](https://github.com/liangtongt)); +2. `README.md`中增加常见问题(感谢 [@calcitem](https://github.com/calcitem) 和 [@bolongliu](https://github.com/bolongliu)); +3. 增加 LLM 和 Embedding 模型运行设备是否可用`cuda`、`mps`、`cpu`的自动判断。 +4. 在`knowledge_based_chatglm.py`中增加对`filepath`的判断,在之前支持单个文件导入的基础上,现支持单个文件夹路径作为输入,输入后将会遍历文件夹中各个文件,并在命令行中显示每个文件是否成功加载。 + +**[2023/04/09]** + +1. 使用`langchain`中的`RetrievalQA`替代之前选用的`ChatVectorDBChain`,替换后可以有效减少提问 2-3 次后因显存不足而停止运行的问题; +2. 在`knowledge_based_chatglm.py`中增加`EMBEDDING_MODEL`、`VECTOR_SEARCH_TOP_K`、`LLM_MODEL`、`LLM_HISTORY_LEN`、`REPLY_WITH_SOURCE`参数值设置; +3. 增加 GPU 显存需求更小的`chatglm-6b-int4`、`chatglm-6b-int4-qe`作为 LLM 模型备选项; +4. 更正`README.md`中的代码错误(感谢 [@calcitem](https://github.com/calcitem))。 + +**[2023/04/07]** + +1. 解决加载 ChatGLM 模型时发生显存占用为双倍的问题 (感谢 [@suc16](https://github.com/suc16) 和 [@myml](https://github.com/myml)) ; +2. 新增清理显存机制; +3. 新增`nghuyong/ernie-3.0-nano-zh`和`nghuyong/ernie-3.0-base-zh`作为 Embedding 模型备选项,相比`GanymedeNil/text2vec-large-chinese`占用显存资源更少 (感谢 [@lastrei](https://github.com/lastrei))。 \ No newline at end of file diff --git a/FAQ.md b/FAQ.md new file mode 100644 index 0000000..bd5e290 --- /dev/null +++ b/FAQ.md @@ -0,0 +1,92 @@ +### 常见问题 + +Q1: 本项目支持哪些文件格式? + +A1: 目前已测试支持 txt、docx、md、pdf 格式文件,更多文件格式请参考 [langchain 文档](https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/unstructured_file.html)。目前已知文档中若含有特殊字符,可能存在文件无法加载的问题。 + +--- + +Q3: 使用过程中 Python 包`nltk`发生了`Resource punkt not found.`报错,该如何解决? + +A3: https://github.com/nltk/nltk_data/raw/gh-pages/packages/tokenizers/punkt.zip 中的 `packages/tokenizers` 解压,放到 `nltk_data/tokenizers` 存储路径下。 + + `nltk_data` 存储路径可以通过 `nltk.data.path` 查询。 + +--- + +Q4: 使用过程中 Python 包`nltk`发生了`Resource averaged_perceptron_tagger not found.`报错,该如何解决? + +A4: 将 https://github.com/nltk/nltk_data/blob/gh-pages/packages/taggers/averaged_perceptron_tagger.zip 下载,解压放到 `nltk_data/taggers` 存储路径下。 + + `nltk_data` 存储路径可以通过 `nltk.data.path` 查询。 + +--- + +Q5: 本项目可否在 colab 中运行? + +A5: 可以尝试使用 chatglm-6b-int4 模型在 colab 中运行,需要注意的是,如需在 colab 中运行 Web UI,需将`webui.py`中`demo.queue(concurrency_count=3).launch( + server_name='0.0.0.0', share=False, inbrowser=False)`中参数`share`设置为`True`。 + +--- + +Q6: 在 Anaconda 中使用 pip 安装包无效如何解决? + +A6: 此问题是系统环境问题,详细见 [在Anaconda中使用pip安装包无效问题](docs/在Anaconda中使用pip安装包无效问题.md) + +--- + +Q7: 本项目中所需模型如何下载至本地? + +A7: 本项目中使用的模型均为`huggingface.com`中可下载的开源模型,以默认选择的`chatglm-6b`和`text2vec-large-chinese`模型为例,下载模型可执行如下代码: + +```shell +# 安装 git lfs +$ git lfs install + +# 下载 LLM 模型 +$ git clone https://huggingface.co/THUDM/chatglm-6b /your_path/chatglm-6b + +# 下载 Embedding 模型 +$ git clone https://huggingface.co/GanymedeNil/text2vec-large-chinese /your_path/text2vec + +# 模型需要更新时,可打开模型所在文件夹后拉取最新模型文件/代码 +$ git pull +``` + +--- + +Q8: `huggingface.com`中模型下载速度较慢怎么办? + +A8: 可使用本项目用到的模型权重文件百度网盘地址: + +- ernie-3.0-base-zh.zip 链接: https://pan.baidu.com/s/1CIvKnD3qzE-orFouA8qvNQ?pwd=4wih +- ernie-3.0-nano-zh.zip 链接: https://pan.baidu.com/s/1Fh8fgzVdavf5P1omAJJ-Zw?pwd=q6s5 +- text2vec-large-chinese.zip 链接: https://pan.baidu.com/s/1sMyPzBIXdEzHygftEoyBuA?pwd=4xs7 +- chatglm-6b-int4-qe.zip 链接: https://pan.baidu.com/s/1DDKMOMHtNZccOOBGWIOYww?pwd=22ji +- chatglm-6b-int4.zip 链接: https://pan.baidu.com/s/1pvZ6pMzovjhkA6uPcRLuJA?pwd=3gjd +- chatglm-6b.zip 链接: https://pan.baidu.com/s/1B-MpsVVs1GHhteVBetaquw?pwd=djay + +--- + +Q9: 下载完模型后,如何修改代码以执行本地模型? + +A9: 模型下载完成后,请在 [configs/model_config.py](configs/model_config.py) 文件中,对`embedding_model_dict`和`llm_model_dict`参数进行修改,如把`llm_model_dict`从 + +```json +embedding_model_dict = { + "ernie-tiny": "nghuyong/ernie-3.0-nano-zh", + "ernie-base": "nghuyong/ernie-3.0-base-zh", + "text2vec": "GanymedeNil/text2vec-large-chinese" +} +``` + +修改为 + +```json +embedding_model_dict = { + "ernie-tiny": "nghuyong/ernie-3.0-nano-zh", + "ernie-base": "nghuyong/ernie-3.0-base-zh", + "text2vec": "/Users/liuqian/Downloads/ChatGLM-6B/text2vec-large-chinese" +} +``` + diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 0000000..a6ce18b --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,32 @@ +# 安装 + +## 环境检查 + +```shell +# 首先,确信你的机器安装了 Python 3.8 及以上版本 +$ python --version +Python 3.8.13 + +# 如果低于这个版本,可使用conda安装环境 +$ conda create -p /your_path/env_name python=3.8 + +# 激活环境 +$ source activate /your_path/env_name + +# 关闭环境 +$ source deactivate /your_path/env_name + +# 删除环境 +$ conda env remove -p /your_path/env_name +``` + +## 项目依赖 + +```shell +# 拉取仓库 +$ git clone https://github.com/imClumsyPanda/langchain-ChatGLM.git + +# 安装依赖 +$ pip install -r requirements.txt +``` +注:使用 `langchain.document_loaders.UnstructuredFileLoader` 进行非结构化文件接入时,可能需要依据文档进行其他依赖包的安装,请参考 [langchain 文档](https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/unstructured_file.html)。 \ No newline at end of file diff --git a/README.md b/README.md index d2e0edb..6732b77 100644 --- a/README.md +++ b/README.md @@ -16,37 +16,14 @@ 🚩 本项目未涉及微调、训练过程,但可利用微调或训练对本项目效果进行优化。 -## 更新信息 +## 变更日志 -**[2023/04/15]** -1. 重构项目结构,在根目录下保留命令行 Demo [cli_demo.py](cli_demo.py) 和 Web UI Demo [webui.py](webui.py); -2. 对 Web UI 进行改进,修改为运行 Web UI 后首先按照 [configs/model_config.py](configs/model_config.py) 默认选项加载模型,并增加报错提示信息等; -3. 对常见问题进行补充说明。 - -**[2023/04/12]** -1. 替换 Web UI 中的样例文件,避免出现 Ubuntu 中出现因文件编码无法读取的问题; -2. 替换`knowledge_based_chatglm.py`中的 prompt 模版,避免出现因 prompt 模版包含中英双语导致 chatglm 返回内容错乱的问题。 - -**[2023/04/11]** -1. 加入 Web UI V0.1 版本(感谢 [@liangtongt](https://github.com/liangtongt)); -2. `README.md`中增加常见问题(感谢 [@calcitem](https://github.com/calcitem) 和 [@bolongliu](https://github.com/bolongliu)); -3. 增加 LLM 和 Embedding 模型运行设备是否可用`cuda`、`mps`、`cpu`的自动判断。 -4. 在`knowledge_based_chatglm.py`中增加对`filepath`的判断,在之前支持单个文件导入的基础上,现支持单个文件夹路径作为输入,输入后将会遍历文件夹中各个文件,并在命令行中显示每个文件是否成功加载。 - -**[2023/04/09]** -1. 使用`langchain`中的`RetrievalQA`替代之前选用的`ChatVectorDBChain`,替换后可以有效减少提问 2-3 次后因显存不足而停止运行的问题; -2. 在`knowledge_based_chatglm.py`中增加`EMBEDDING_MODEL`、`VECTOR_SEARCH_TOP_K`、`LLM_MODEL`、`LLM_HISTORY_LEN`、`REPLY_WITH_SOURCE`参数值设置; -3. 增加 GPU 显存需求更小的`chatglm-6b-int4`、`chatglm-6b-int4-qe`作为 LLM 模型备选项; -4. 更正`README.md`中的代码错误(感谢 [@calcitem](https://github.com/calcitem))。 - -**[2023/04/07]** -1. 解决加载 ChatGLM 模型时发生显存占用为双倍的问题 (感谢 [@suc16](https://github.com/suc16) 和 [@myml](https://github.com/myml)) ; -2. 新增清理显存机制; -3. 新增`nghuyong/ernie-3.0-nano-zh`和`nghuyong/ernie-3.0-base-zh`作为 Embedding 模型备选项,相比`GanymedeNil/text2vec-large-chinese`占用显存资源更少 (感谢 [@lastrei](https://github.com/lastrei))。 +参见 [变更日志](CHANGELOG.md)。 ## 使用方式 ### 硬件需求 + - ChatGLM-6B 模型硬件需求 | **量化等级** | **最低 GPU 显存**(推理) | **最低 GPU 显存**(高效参数微调) | @@ -65,140 +42,42 @@ ### 1. 安装环境 -- 环境检查 - -```shell -# 首先,确信你的机器安装了 Python 3.8 及以上版本 -$ python --version -Python 3.8.13 - -# 如果低于这个版本,可使用conda安装环境 -$ conda create -p /your_path/env_name python=3.8 - -# 激活环境 -$ source activate /your_path/env_name - -# 关闭环境 -$ source deactivate /your_path/env_name - -# 删除环境 -$ conda env remove -p /your_path/env_name -``` - -- 项目依赖 - -```shell -# 拉取仓库 -$ git clone https://github.com/imClumsyPanda/langchain-ChatGLM.git - -# 安装依赖 -$ pip install -r requirements.txt -``` -注:使用 langchain.document_loaders.UnstructuredFileLoader 进行非结构化文件接入时,可能需要依据文档进行其他依赖包的安装,请参考 [langchain 文档](https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/unstructured_file.html) +参见 [安装指南](INSTALL.md)。 ### 2. 设置模型默认参数 在开始执行 Web UI 或命令行交互前,请先检查 [configs/model_config.py](configs/model_config.py) 中的各项模型参数设计是否符合需求。 ### 3. 执行脚本体验 Web UI 或命令行交互 + 执行 [webui.py](webui.py) 脚本体验 **Web 交互** + ```shell $ python webui.py ``` -注:如未将模型下载至本地,请执行前检查`$HOME/.cache/huggingface/`文件夹剩余空间,至少15G + +注:如未将模型下载至本地,请执行前检查`$HOME/.cache/huggingface/`文件夹剩余空间,至少15G。 执行后效果如下图所示: ![webui](img/ui1.png) Web UI 可以实现如下功能: 1. 运行前自动读取`configs/model_config.py`中`LLM`及`Embedding`模型枚举及默认模型设置运行模型,如需重新加载模型,可在界面重新选择后点击`重新加载模型`进行模型加载; -2. 可手动调节保留对话历史长度,可根据显存大小自行调节 -3. 添加上传文件功能,通过下拉框选择已上传的文件,点击`加载文件`按钮,过程中可随时更换加载的文件 +2. 可手动调节保留对话历史长度,可根据显存大小自行调节; +3. 添加上传文件功能,通过下拉框选择已上传的文件,点击`加载文件`按钮,过程中可随时更换加载的文件。 -或执行 [knowledge_based_chatglm.py](cli_demo.py) 脚本体验**命令行交互** +或执行 [knowledge_based_chatglm.py](cli_demo.py) 脚本体验**命令行交互**: ```shell $ python knowledge_based_chatglm.py ``` - ### 常见问题 -Q1: 本项目支持哪些文件格式? -A1: 目前已测试支持 txt、docx、md、pdf 格式文件,更多文件格式请参考 [langchain 文档](https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/unstructured_file.html)。目前已知文档中若含有特殊字符,可能存在文件无法加载的问题。 +参见 [常见问题](FAQ.md)。 -Q3: 使用过程中 Python 包`nltk`发生了`Resource punkt not found.`报错,该如何解决? +## Demo -A3: https://github.com/nltk/nltk_data/raw/gh-pages/packages/tokenizers/punkt.zip 中的 `packages/tokenizers` 解压,放到 `nltk_data/tokenizers` 存储路径下。 - - `nltk_data` 存储路径可以通过 `nltk.data.path` 查询。 - -Q4: 使用过程中 Python 包`nltk`发生了`Resource averaged_perceptron_tagger not found.`报错,该如何解决? - -A4: 将 https://github.com/nltk/nltk_data/blob/gh-pages/packages/taggers/averaged_perceptron_tagger.zip 下载,解压放到 `nltk_data/taggers` 存储路径下。 - - `nltk_data` 存储路径可以通过 `nltk.data.path` 查询。 - -Q5: 本项目可否在 colab 中运行? - -A5: 可以尝试使用 chatglm-6b-int4 模型在 colab 中运行,需要注意的是,如需在 colab 中运行 Web UI,需将`webui.py`中`demo.queue(concurrency_count=3).launch( - server_name='0.0.0.0', share=False, inbrowser=False)`中参数`share`设置为`True`。 - -Q6: 在 Anaconda 中使用 pip 安装包无效如何解决? - -A6: 此问题是系统环境问题,详细见 [在Anaconda中使用pip安装包无效问题](docs/在Anaconda中使用pip安装包无效问题.md) - -Q7: 本项目中所需模型如何下载至本地? - -A7: 本项目中使用的模型均为`huggingface.com`中可下载的开源模型,以默认选择的`chatglm-6b`和`text2vec-large-chinese`模型为例,下载模型可执行如下代码: - -```shell -# 安装 git lfs -$ git lfs install - -# 下载 LLM 模型 -$ git clone https://huggingface.co/THUDM/chatglm-6b /your_path/chatglm-6b - -# 下载 Embedding 模型 -$ git clone https://huggingface.co/GanymedeNil/text2vec-large-chinese /your_path/text2vec - -# 模型需要更新时,可打开模型所在文件夹后拉取最新模型文件/代码 -$ git pull -``` - -Q8: `huggingface.com`中模型下载速度较慢怎么办? - -A8: 可使用本项目用到的模型权重文件百度网盘地址: -- ernie-3.0-base-zh.zip 链接: https://pan.baidu.com/s/1CIvKnD3qzE-orFouA8qvNQ?pwd=4wih -- ernie-3.0-nano-zh.zip 链接: https://pan.baidu.com/s/1Fh8fgzVdavf5P1omAJJ-Zw?pwd=q6s5 -- text2vec-large-chinese.zip 链接: https://pan.baidu.com/s/1sMyPzBIXdEzHygftEoyBuA?pwd=4xs7 -- chatglm-6b-int4-qe.zip 链接: https://pan.baidu.com/s/1DDKMOMHtNZccOOBGWIOYww?pwd=22ji -- chatglm-6b-int4.zip 链接: https://pan.baidu.com/s/1pvZ6pMzovjhkA6uPcRLuJA?pwd=3gjd -- chatglm-6b.zip 链接: https://pan.baidu.com/s/1B-MpsVVs1GHhteVBetaquw?pwd=djay - -Q9: 下载完模型后,如何修改代码以执行本地模型? - -A9: 模型下载完成后,请在 [configs/model_config.py](configs/model_config.py) 文件中,对`embedding_model_dict`和`llm_model_dict`参数进行修改,如把`llm_model_dict`从 -``` -embedding_model_dict = { - "ernie-tiny": "nghuyong/ernie-3.0-nano-zh", - "ernie-base": "nghuyong/ernie-3.0-base-zh", - "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": "/Users/liuqian/Downloads/ChatGLM-6B/text2vec-large-chinese" -} -``` - -## DEMO - -以问题`chatglm-6b 的局限性具体体现在哪里,如何实现改进`为例 +以问题`chatglm-6b 的局限性具体体现在哪里,如何实现改进`为例: 未使用 langchain 接入本地文档时: @@ -227,6 +106,7 @@ embedding_model_dict = { >5. 改进模型架构:可以改进 ChatGLM-6B 的模型架构,提高模型的性能和表现。例如,可以使用更大的神经网络或者改进的卷积神经网络结构。 ## 路线图 + - [x] 实现 langchain + ChatGLM-6B 本地知识应用 - [x] 基于 langchain 实现非结构化文件接入 - [x] .md @@ -245,6 +125,7 @@ embedding_model_dict = { - [ ] 利用 fastapi 实现 API 部署方式,并实现调用 API 的 web ui DEMO ## 项目交流群 + ![二维码](img/qr_code.jpg) 🎉 langchain-ChatGLM 项目交流群,如果你也对本项目感兴趣,欢迎加入群聊参与讨论交流。