🤖️ 一种利用 langchain **实现的基于本地知识库的问答应用,目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。
💡 受 GanymedeNil 的项目 document.ai 和 AlexZhangji 创建的 ChatGLM-6B Pull Request 启发,建立了全流程可使用开源模型实现的本地知识库问答应用。现已支持使用 ChatGLM-6B 等大语言模型直接接入,或通过 fastchat api 形式接入 Vicuna, Alpaca, LLaMA, Koala, RWKV 等模型。
✅ 本项目中 Embedding 默认选用的是 GanymedeNil/text2vec-large-chinese,LLM 默认选用的是 ChatGLM-6B。依托上述模型,本项目可实现全部使用开源模型离线私有部署。
⛓️ 本项目实现原理如下图所示,过程包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的top k
个 -> 匹配出的文本作为上下文和问题一起添加到prompt
中 -> 提交给LLM
生成回答。
📺 原理介绍视频
从文档处理角度来看,实现流程如下:
🚩 本项目未涉及微调、训练过程,但可利用微调或训练对本项目效果进行优化。
🐳 Docker镜像:registry.cn-beijing.aliyuncs.com/isafetech/chatmydata:1.0 (感谢 @InkSong🌲 )
💻 运行方式:docker run -d -p 80:7860 --gpus all registry.cn-beijing.aliyuncs.com/isafetech/chatmydata:1.0
参见 版本更新日志。
-
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 存储空间模型下载方法可参考 常见问题 中 Q8。
量化等级 最低 GPU 显存(推理) 最低 GPU 显存(高效参数微调) FP16(无量化) 68 GB - INT8 20 GB - -
Embedding 模型硬件需求
本项目中默认选用的 Embedding 模型 GanymedeNil/text2vec-large-chinese 约占用显存 3GB,也可修改为在 CPU 中运行。
🐳 Docker镜像地址:registry.cn-beijing.aliyuncs.com/isafetech/chatmydata:1.0
🌲
💻 一行命令运行:
docker run -d -p 80:7860 --gpus all registry.cn-beijing.aliyuncs.com/isafetech/chatmydata:1.0
- 该版本镜像大小
25.2G
,使用v0.1.16,以nvidia/cuda:12.1.1-cudnn8-runtime-ubuntu22.04
为基础镜像 - 该版本内置两个
embedding
模型:m3e-base
,text2vec-large-chinese
,内置fastchat+chatglm-6b
- 该版本目标为方便一键部署使用,请确保您已经在Linux发行版上安装了NVIDIA驱动程序
- 请注意,您不需要在主机系统上安装CUDA工具包,但需要安装
NVIDIA Driver
以及NVIDIA Container Toolkit
,请参考安装指南 - 首次拉取和启动均需要一定时间,首次启动时请参照下图使用
docker logs -f <container id>
查看日志 - 如遇到启动过程卡在
Waiting..
步骤,建议使用docker exec -it <container id> bash
进入/logs/
目录查看对应阶段日志
为了能让容器使用主机GPU资源,需要在主机上安装 NVIDIA Container Toolkit。具体安装步骤如下:
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 - 3.10,CUDA 11.7 环境下完成测试。已在 Windows、ARM 架构的 macOS、Linux 系统中完成测试。
vue前端需要node18环境
参见 安装指南。
在开始执行 Web UI 或命令行交互前,请先检查 configs/model_config.py 中的各项模型参数设计是否符合需求。
如需通过 fastchat 以 api 形式调用 llm,请参考 fastchat 调用实现
注:鉴于环境部署过程中可能遇到问题,建议首先测试命令行脚本。建议命令行脚本测试可正常运行后再运行 Web UI。
执行 cli_demo.py 脚本体验命令行交互:
$ python cli_demo.py
或执行 webui.py 脚本体验 Web 交互
$ python webui.py
或执行 api.py 利用 fastapi 部署 API
$ python api.py
或成功部署 API 后,执行以下脚本体验基于 VUE 的前端页面
$ cd views
$ pnpm i
$ npm run dev
VUE 前端界面如下图所示:
WebUI 界面如下图所示:
Web UI 可以实现如下功能:
- 运行前自动读取
configs/model_config.py
中LLM
及Embedding
模型枚举及默认模型设置运行模型,如需重新加载模型,可在模型配置
Tab 重新选择后点击重新加载模型
进行模型加载; - 可手动调节保留对话历史长度、匹配知识库文段数量,可根据显存大小自行调节;
对话
Tab 具备模式选择功能,可选择LLM对话
与知识库问答
模式进行对话,支持流式对话;- 添加
配置知识库
功能,支持选择已有知识库或新建知识库,并可向知识库中新增上传文件/文件夹,使用文件上传组件选择好文件后点击上传文件并加载知识库
,会将所选上传文档数据加载至知识库中,并基于更新后知识库进行问答; - 新增
知识库测试 Beta
Tab,可用于测试不同文本切分方法与检索相关度阈值设置,暂不支持将测试参数作为对话
Tab 设置参数。 - 后续版本中将会增加对知识库的修改或删除,及知识库中已导入文件的查看。
参见 常见问题。
以问题chatglm-6b 的局限性具体体现在哪里,如何实现改进
为例:
未使用 langchain 接入本地文档时:
ChatGLM-6B 是一个基于 GPT-3 的聊天机器人,它的局限性主要体现在以下几个方面:
- 语言模型的精度:GPT-3 是一种大型的语言模型,它的精度比较高,但是仍然有一些局限性。例如,它可能无法准确地理解某些方言、口音或者复杂的句子结构。
- 知识图谱的完整性:GPT-3 可以生成一些知识图谱,但是其完整性和准确性可能不够。例如,它可能无法准确地理解某些领域的专业知识和术语。
- 对话生成的连贯性:GPT-3 可以生成一些连贯的对话,但是其生成的对话可能不够自然。例如,它可能会生成一些虚假的、不连贯的对话或者误解用户的意图。
为了改进 ChatGLM-6B,可以考虑以下几个方面:
- 提高语言模型的精度:可以通过增加训练数据、使用更好的语言模型架构、优化模型训练过程等方式来提高语言模型的精度。
- 增强知识图谱的完整性:可以通过增加知识图谱的维度、使用更好的知识图谱构建方法、优化知识图谱的匹配算法等方式来增强知识图谱的完整性。
- 提高对话生成的连贯性:可以通过增加对话生成模型的上下文信息、使用更好的上下文信息提取方法、优化对话生成模型的算法等方式来提高对话生成的连贯性。
- 引入更多的人类反馈:人类反馈可以帮助 ChatGLM-6B 更好地理解用户的意图和需求,从而提高对话生成的质量和准确性。可以通过引入更多的人类客服、使用人类反馈收集器等方式来引入更多的人类反馈。
使用 langchain 接入 ChatGLM-6B 项目的 README.md 文件后 ChatGLM 的回答:
ChatGLM-6B 是一个基于深度学习的自然语言处理模型,它在回答问题方面表现出色。但是,它也有一些局限性,具体如下:
- 语言理解有限:ChatGLM-6B 只学习了中文自然语言,对于其他语言可能会存在理解上的局限性。
- 知识储备不足:ChatGLM-6B 的训练数据集只包含了中文语料,因此它可能无法回答一些非中文的问题或者某些特定领域的问题。
- 数据量有限:ChatGLM-6B 的训练数据集只有几百万条记录,因此它可能无法回答一些非常具体或者复杂的问题。
为了改进 ChatGLM-6B,可以考虑以下几个方面:
- 学习更多的语言知识:可以学习其他语言的自然语言处理技术,扩大语言理解的范围。
- 扩大知识储备:可以收集更多的中文语料,或者使用其他语言的数据集来扩充知识储备。
- 增加数据量:可以使用更大的数据集来训练 ChatGLM-6B,提高模型的表现。
- 引入更多的评估指标:可以引入更多的评估指标来评估模型的表现,从而发现 ChatGLM-6B 存在的不足和局限性。
- 改进模型架构:可以改进 ChatGLM-6B 的模型架构,提高模型的性能和表现。例如,可以使用更大的神经网络或者改进的卷积神经网络结构。
- Langchain 应用
- 接入非结构化文档(已支持 md、pdf、docx、txt 文件格式)
- jpg 与 png 格式图片的 OCR 文字识别
- 搜索引擎接入
- 本地网页接入
- 结构化数据接入(如 csv、Excel、SQL 等)
- 知识图谱/图数据库接入
- Agent 实现
- 增加更多 LLM 模型支持
- 增加更多 Embedding 模型支持
- Web UI
- 基于 gradio 实现 Web UI DEMO
- 基于 streamlit 实现 Web UI DEMO
- 添加输出内容及错误提示
- 引用标注
- 增加知识库管理
- 选择知识库开始问答
- 上传文件/文件夹至知识库
- 知识库测试
- 删除知识库中文件
- 支持搜索引擎问答
- 增加 API 支持
- 利用 fastapi 实现 API 部署方式
- 实现调用 API 的 Web UI Demo
- VUE 前端
🎉 langchain-ChatGLM 项目微信交流群,如果你也对本项目感兴趣,欢迎加入群聊参与讨论交流。