diff --git a/content/langchain-ChatGLM_README.md b/content/langchain-ChatGLM_README.md index 89276da..cbf40e6 100644 --- a/content/langchain-ChatGLM_README.md +++ b/content/langchain-ChatGLM_README.md @@ -4,42 +4,34 @@ 🌍 [_READ THIS IN ENGLISH_](README_en.md) -🤖️ 一种利用 [ChatGLM-6B](https://github.com/THUDM/ChatGLM-6B) + [langchain](https://github.com/hwchase17/langchain) 实现的基于本地知识的 ChatGLM 应用。 +🤖️ 一种利用 [ChatGLM-6B](https://github.com/THUDM/ChatGLM-6B) + [langchain](https://github.com/hwchase17/langchain) 实现的基于本地知识的 ChatGLM 应用。增加 [clue-ai/ChatYuan](https://github.com/clue-ai/ChatYuan) 项目的模型 [ClueAI/ChatYuan-large-v2](https://huggingface.co/ClueAI/ChatYuan-large-v2) 的支持。 💡 受 [GanymedeNil](https://github.com/GanymedeNil) 的项目 [document.ai](https://github.com/GanymedeNil/document.ai) 和 [AlexZhangji](https://github.com/AlexZhangji) 创建的 [ChatGLM-6B Pull Request](https://github.com/THUDM/ChatGLM-6B/pull/216) 启发,建立了全部基于开源模型实现的本地知识问答应用。 -✅ 本项目中 Embedding 选用的是 [GanymedeNil/text2vec-large-chinese](https://huggingface.co/GanymedeNil/text2vec-large-chinese/tree/main),LLM 选用的是 [ChatGLM-6B](https://github.com/THUDM/ChatGLM-6B)。依托上述模型,本项目可实现全部使用**开源**模型**离线私有部署**。 +✅ 本项目中 Embedding 默认选用的是 [GanymedeNil/text2vec-large-chinese](https://huggingface.co/GanymedeNil/text2vec-large-chinese/tree/main),LLM 默认选用的是 [ChatGLM-6B](https://github.com/THUDM/ChatGLM-6B)。依托上述模型,本项目可实现全部使用**开源**模型**离线私有部署**。 ⛓️ 本项目实现原理如下图所示,过程包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的`top k`个 -> 匹配出的文本作为上下文和问题一起添加到`prompt`中 -> 提交给`LLM`生成回答。 ![实现原理图](img/langchain+chatglm.png) +从文档处理角度来看,实现流程如下: + +![实现原理图2](img/langchain+chatglm2.png) + 🚩 本项目未涉及微调、训练过程,但可利用微调或训练对本项目效果进行优化。 -## 更新信息 +🌐 [AutoDL 镜像](https://www.codewithgpu.com/i/imClumsyPanda/langchain-ChatGLM/langchain-ChatGLM) -**[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))。 +📓 [ModelWhale 在线运行项目](https://www.heywhale.com/mw/project/643977aa446c45f4592a1e59) -**[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/11]** -1. 加入 Web UI V0.1 版本(感谢 [@liangtongt](https://github.com/liangtongt)); -2. `README.md`中增加常见问题(感谢 [@calcitem](https://github.com/calcitem)); -3. 增加 LLM 和 Embedding 模型运行设备是否可用`cuda`、`mps`、`cpu`的自动判断。 -4. 在`knowledge_based_chatglm.py`中增加对`filepath`的判断,在之前支持单个文件导入的基础上,现支持单个文件夹路径作为输入,输入后将会遍历文件夹中各个文件,并在命令行中显示每个文件是否成功加载。 +参见 [变更日志](docs/CHANGELOG.md)。 -## 使用方式 +## 硬件需求 -### 硬件需求 - ChatGLM-6B 模型硬件需求 - + | **量化等级** | **最低 GPU 显存**(推理) | **最低 GPU 显存**(高效参数微调) | | -------------- | ------------------------- | --------------------------------- | | FP16(无量化) | 13 GB | 14 GB | @@ -49,63 +41,83 @@ - Embedding 模型硬件需求 本项目中默认选用的 Embedding 模型 [GanymedeNil/text2vec-large-chinese](https://huggingface.co/GanymedeNil/text2vec-large-chinese/tree/main) 约占用显存 3GB,也可修改为在 CPU 中运行。 + +## Docker 部署 +为了能让容器使用主机GPU资源,需要在主机上安装 [NVIDIA Container Toolkit](https://github.com/NVIDIA/nvidia-container-toolkit)。具体安装步骤如下: +```shell +sudo apt-get update +sudo apt-get install -y nvidia-container-toolkit-base +sudo systemctl daemon-reload +sudo systemctl restart docker +``` +安装完成后,可以使用以下命令编译镜像和启动容器: +``` +docker build -f Dockerfile-cuda -t chatglm-cuda:latest . +docker run --gpus all -d --name chatglm -p 7860:7860 chatglm-cuda:latest + +#若要使用离线模型,请配置好模型路径,然后此repo挂载到Container +docker run --gpus all -d --name chatglm -p 7860:7860 -v ~/github/langchain-ChatGLM:/chatGLM chatglm-cuda:latest +``` + + +## 开发部署 + ### 软件需求 -本项目已在 python 3.8 环境下完成测试。 -### 1. 安装 python 依赖包 -```commandline -pip install -r requirements.txt -``` -注:使用 langchain.document_loaders.UnstructuredFileLoader 进行非结构化文件接入时,可能需要依据文档进行其他依赖包的安装,请参考 [langchain 文档](https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/unstructured_file.html) -### 2. 执行脚本体验 Web UI 或命令行交互 -执行 [webui.py](webui.py) 脚本体验 **Web 交互** -```commandline -python webui.py +本项目已在 Python 3.8 - 3.10,CUDA 11.7 环境下完成测试。已在 Windows、ARM 架构的 macOS、Linux 系统中完成测试。 + +### 从本地加载模型 + +请参考 [THUDM/ChatGLM-6B#从本地加载模型](https://github.com/THUDM/ChatGLM-6B#从本地加载模型) + +### 1. 安装环境 + +参见 [安装指南](docs/INSTALL.md)。 + +### 2. 设置模型默认参数 + +在开始执行 Web UI 或命令行交互前,请先检查 [configs/model_config.py](configs/model_config.py) 中的各项模型参数设计是否符合需求。 + +### 3. 执行脚本体验 Web UI 或命令行交互 + +> 注:鉴于环境部署过程中可能遇到问题,建议首先测试命令行脚本。建议命令行脚本测试可正常运行后再运行 Web UI。 + +执行 [cli_demo.py](cli_demo.py) 脚本体验**命令行交互**: +```shell +$ python cli_demo.py ``` + +或执行 [webui.py](webui.py) 脚本体验 **Web 交互** + +```shell +$ python webui.py +``` + +或执行 [api.py](api.py) 利用 fastapi 部署 API +```shell +$ python api.py +``` + + +注:如未将模型下载至本地,请执行前检查`$HOME/.cache/huggingface/`文件夹剩余空间,至少15G。 + 执行后效果如下图所示: -![webui](img/ui1.png) -Web UI 中提供的 API 接口如下图所示: -![webui](img/ui2.png) +![webui](img/webui_0419.png) Web UI 可以实现如下功能: -1. 自动读取`knowledge_based_chatglm.py`中`LLM`及`embedding`模型枚举,选择后点击`setting`进行模型加载,可随时切换模型进行测试 -2. 可手动调节保留对话历史长度,可根据显存大小自行调节 -3. 添加上传文件功能,通过下拉框选择已上传的文件,点击`loading`加载文件,过程中可随时更换加载的文件 -4. 底部添加`use via API`可对接到自己系统 - -或执行 [knowledge_based_chatglm.py](knowledge_based_chatglm.py) 脚本体验**命令行交互** -```commandline -python knowledge_based_chatglm.py -``` +1. 运行前自动读取`configs/model_config.py`中`LLM`及`Embedding`模型枚举及默认模型设置运行模型,如需重新加载模型,可在 `模型配置` 标签页重新选择后点击 `重新加载模型` 进行模型加载; +2. 可手动调节保留对话历史长度、匹配知识库文段数量,可根据显存大小自行调节; +3. 具备模式选择功能,可选择 `LLM对话` 与 `知识库问答` 模式进行对话,支持流式对话; +4. 添加 `配置知识库` 功能,支持选择已有知识库或新建知识库,并可向知识库中**新增**上传文件/文件夹,使用文件上传组件选择好文件后点击 `上传文件并加载知识库`,会将所选上传文档数据加载至知识库中,并基于更新后知识库进行问答; +5. 后续版本中将会增加对知识库的修改或删除,及知识库中已导入文件的查看。 ### 常见问题 -Q: 本项目支持哪些文件格式? -A: 目前已测试支持 txt、docx、md 格式文件,更多文件格式请参考 [langchain 文档](https://python.langchain.com/en/latest/modules/indexes/document_loaders/examples/unstructured_file.html)。目前已知文档中若含有特殊字符,可能存在文件无法加载的问题。 +参见 [常见问题](docs/FAQ.md)。 -Q: 读取特定格式文件时遇到缺少`detectron2`时如何解决? +## Demo -A: 因该包安装过程中遇到问题较多,且仅部分格式文件需要,所以未加入`requirements.txt`。可以通过一下命令安装 - -```commandline -pip install "detectron2@git+https://github.com/facebookresearch/detectron2.git@v0.6#egg=detectron2" -``` - -Q: `Resource punkt not found.` 如何解决? - -A: https://github.com/nltk/nltk_data/raw/gh-pages/packages/tokenizers/punkt.zip 中的 `packages/tokenizers` 解压,放到 `Searched in:` 对应目录下。 - -Q: `Resource averaged_perceptron_tagger not found.` 如何解决? - -A: 将 https://github.com/nltk/nltk_data/blob/gh-pages/packages/taggers/averaged_perceptron_tagger.zip 下载,解压放到 `Searched in:` 对应目录下。 - -Q: 本项目可否在 colab 中运行? - -A: 可以尝试使用 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`。 -## DEMO - -以问题`chatglm-6b 的局限性具体体现在哪里,如何实现改进`为例 +以问题`chatglm-6b 的局限性具体体现在哪里,如何实现改进`为例: 未使用 langchain 接入本地文档时: @@ -134,19 +146,38 @@ A: 可以尝试使用 chatglm-6b-int4 模型在 colab 中运行,需要注意 >5. 改进模型架构:可以改进 ChatGLM-6B 的模型架构,提高模型的性能和表现。例如,可以使用更大的神经网络或者改进的卷积神经网络结构。 ## 路线图 -- [x] 实现 langchain + ChatGLM-6B 本地知识应用 -- [x] 基于 langchain 实现非结构化文件接入 -- [ ] 基于 langchain 实现更多类型本地知识文件接入 -- [ ] 增加 Web UI DEMO + +- [ ] Langchain 应用 + - [x] 接入非结构化文档(已支持 md、pdf、docx、txt 文件格式) + - [ ] 搜索引擎与本地网页接入 + - [ ] 结构化数据接入(如 csv、Excel、SQL 等) + - [ ] 知识图谱/图数据库接入 + - [ ] Agent 实现 +- [ ] 增加更多 LLM 模型支持 + - [x] [THUDM/chatglm-6b](https://huggingface.co/THUDM/chatglm-6b) + - [x] [THUDM/chatglm-6b-int8](https://huggingface.co/THUDM/chatglm-6b-int8) + - [x] [THUDM/chatglm-6b-int4](https://huggingface.co/THUDM/chatglm-6b-int4) + - [x] [THUDM/chatglm-6b-int4-qe](https://huggingface.co/THUDM/chatglm-6b-int4-qe) + - [x] [ClueAI/ChatYuan-large-v2](https://huggingface.co/ClueAI/ChatYuan-large-v2) +- [ ] 增加更多 Embedding 模型支持 + - [x] [nghuyong/ernie-3.0-nano-zh](https://huggingface.co/nghuyong/ernie-3.0-nano-zh) + - [x] [nghuyong/ernie-3.0-base-zh](https://huggingface.co/nghuyong/ernie-3.0-base-zh) + - [x] [shibing624/text2vec-base-chinese](https://huggingface.co/shibing624/text2vec-base-chinese) + - [x] [GanymedeNil/text2vec-large-chinese](https://huggingface.co/GanymedeNil/text2vec-large-chinese) +- [ ] Web UI - [x] 利用 gradio 实现 Web UI DEMO - - [ ] 添加模型加载进度条 - - [ ] 添加输出内容及错误提示 - - [ ] 国际化语言切换 - - [ ] 引用标注 - - [ ] 添加插件系统(可基础lora训练等) -- [ ] 利用 fastapi 实现 API 部署方式,并实现调用 API 的 web ui DEMO + - [x] 添加输出内容及错误提示 + - [x] 引用标注 + - [ ] 增加知识库管理 + - [x] 选择知识库开始问答 + - [x] 上传文件/文件夹至知识库 + - [ ] 删除知识库中文件 + - [ ] 利用 streamlit 实现 Web UI Demo +- [ ] 增加 API 支持 + - [x] 利用 fastapi 实现 API 部署方式 + - [ ] 实现调用 API 的 Web UI Demo ## 项目交流群 -![二维码](img/qr_code.jpg) +![二维码](img/qr_code_14.jpg) 🎉 langchain-ChatGLM 项目交流群,如果你也对本项目感兴趣,欢迎加入群聊参与讨论交流。