🤖️ 一种利用 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生成回答。

ChatGLM-6B 模型硬件需求
注：如未将模型下载至本地，请执行前检查$HOME/.cache/huggingface/文件夹剩余空间，模型文件下载至本地需要 15 GB 存储空间。
模型下载方法可参考 常见问题 中 Q8。
| 量化等级   | 最低 GPU 显存（推理） | 最低 GPU 显存（高效参数微调） |
| -------------- | ------------------------- | --------------------------------- |
| FP16（无量化） | 13 GB                     | 14 GB                             |
| INT8           | 8 GB                     | 9 GB                             |
| INT4           | 6 GB                      | 7 GB                              |

MOSS 模型硬件需求
注：如未将模型下载至本地，请执行前检查$HOME/.cache/huggingface/文件夹剩余空间，模型文件下载至本地需要 70 GB 存储空间
| 量化等级  | 最低 GPU 显存（推理） | 最低 GPU 显存（高效参数微调） |
|-------------------|-----------------------| --------------------------------- |
| FP16（无量化） | 68 GB             | -                     |
| INT8      | 20 GB          | -                     |

Embedding 模型硬件需求
本项目中默认选用的 Embedding 模型 GanymedeNil/text2vec-large-chinese 约占用显存 3GB，也可修改为在 CPU 中运行。

为了能让容器使用主机GPU资源，需要在主机上安装 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

docker run --gpus all -d --name chatglm -p 7860:7860 -v ~/github/langchain-ChatGLM:/chatGLM  chatglm-cuda:latest
```

本项目已在 Python 3.8 - 3.10，CUDA 11.7 环境下完成测试。已在 Windows、ARM 架构的 macOS、Linux 系统中完成测试。

在开始执行 Web UI 或命令行交互前，请先检查 configs/model_config.py 中的各项模型参数设计是否符合需求。

或执行 api.py 利用 fastapi 部署 API
shell
$ python api.py
或成功部署 API 后，执行以下脚本体验基于 VUE 的前端页面
```shell
$ cd views

运行前自动读取configs/model_config.py中LLM及Embedding模型枚举及默认模型设置运行模型，如需重新加载模型，可在 模型配置 Tab 重新选择后点击 重新加载模型 进行模型加载；

添加 配置知识库 功能，支持选择已有知识库或新建知识库，并可向知识库中新增上传文件/文件夹，使用文件上传组件选择好文件后点击 上传文件并加载知识库，会将所选上传文档数据加载至知识库中，并基于更新后知识库进行问答；

新增 知识库测试 Beta Tab，可用于测试不同文本切分方法与检索相关度阈值设置，暂不支持将测试参数作为 对话 Tab 设置参数。

ChatGLM-6B 是一个基于 GPT-3 的聊天机器人,它的局限性主要体现在以下几个方面:
1. 语言模型的精度:GPT-3 是一种大型的语言模型,它的精度比较高,但是仍然有一些局限性。例如,它可能无法准确地理解某些方言、口音或者复杂的句子结构。
2. 知识图谱的完整性:GPT-3 可以生成一些知识图谱,但是其完整性和准确性可能不够。例如,它可能无法准确地理解某些领域的专业知识和术语。
3. 对话生成的连贯性:GPT-3 可以生成一些连贯的对话,但是其生成的对话可能不够自然。例如,它可能会生成一些虚假的、不连贯的对话或者误解用户的意图。

为了改进 ChatGLM-6B,可以考虑以下几个方面:
1. 提高语言模型的精度:可以通过增加训练数据、使用更好的语言模型架构、优化模型训练过程等方式来提高语言模型的精度。
2. 增强知识图谱的完整性:可以通过增加知识图谱的维度、使用更好的知识图谱构建方法、优化知识图谱的匹配算法等方式来增强知识图谱的完整性。
3. 提高对话生成的连贯性:可以通过增加对话生成模型的上下文信息、使用更好的上下文信息提取方法、优化对话生成模型的算法等方式来提高对话生成的连贯性。
4. 引入更多的人类反馈:人类反馈可以帮助 ChatGLM-6B 更好地理解用户的意图和需求,从而提高对话生成的质量和准确性。可以通过引入更多的人类客服、使用人类反馈收集器等方式来引入更多的人类反馈。

ChatGLM-6B 是一个基于深度学习的自然语言处理模型,它在回答问题方面表现出色。但是,它也有一些局限性,具体如下:
1. 语言理解有限:ChatGLM-6B 只学习了中文自然语言,对于其他语言可能会存在理解上的局限性。
2. 知识储备不足:ChatGLM-6B 的训练数据集只包含了中文语料,因此它可能无法回答一些非中文的问题或者某些特定领域的问题。
3. 数据量有限:ChatGLM-6B 的训练数据集只有几百万条记录,因此它可能无法回答一些非常具体或者复杂的问题。

1. 学习更多的语言知识:可以学习其他语言的自然语言处理技术,扩大语言理解的范围。
2. 扩大知识储备:可以收集更多的中文语料,或者使用其他语言的数据集来扩充知识储备。
3. 增加数据量:可以使用更大的数据集来训练 ChatGLM-6B,提高模型的表现。
4. 引入更多的评估指标:可以引入更多的评估指标来评估模型的表现,从而发现 ChatGLM-6B 存在的不足和局限性。
5. 改进模型架构:可以改进 ChatGLM-6B 的模型架构,提高模型的性能和表现。例如,可以使用更大的神经网络或者改进的卷积神经网络结构。

通过提供种子词或短语，模型可以生成与该种子词或短语相关的文本，并通过提供有关期望输出和角色的信息，模型可以以特定于角色或指令的风格或语气生成文本。

- 提示公式：“对以下电子邮件 [插入电子邮件] 进行文本分类，并根据其内容和发件人将其分类为不同的类别，例如垃圾邮件、重要邮件或紧急邮件。”

                                                             ——New Bing

com/art-of-asking-chatgpt-for-high-quality-answ-engineering-techniques/#i-3	"《如何向ChatGPT提问并获得高质量的答案》"