chatchat-space / Langchain-Chatchat
- четверг, 17 августа 2023 г. в 00:00:06
Langchain-Chatchat (formerly langchain-ChatGLM), local knowledge based LLM (like ChatGLM) QA app with langchain | 基于 Langchain 与 ChatGLM 等语言模型的本地知识库问答
LangChain-Chatchat (原 Langchain-ChatGLM): 基于 Langchain 与 ChatGLM 等大语言模型的本地知识库问答应用实现。
🤖️ 一种利用 langchain 思想实现的基于本地知识库的问答应用,目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。
💡 受 GanymedeNil 的项目 document.ai 和 AlexZhangji 创建的 ChatGLM-6B Pull Request 启发,建立了全流程可使用开源模型实现的本地知识库问答应用。本项目的最新版本中通过使用 FastChat 接入 Vicuna, Alpaca, LLaMA, Koala, RWKV 等模型,依托于 langchain 框架支持通过基于 FastAPI 提供的 API 调用服务,或使用基于 Streamlit 的 WebUI 进行操作。
✅ 依托于本项目支持的开源 LLM 与 Embedding 模型,本项目可实现全部使用开源模型离线私有部署。与此同时,本项目也支持 OpenAI GPT API 的调用,并将在后续持续扩充对各类模型及模型 API 的接入。
⛓️ 本项目实现原理如下图所示,过程包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的 top k
个 -> 匹配出的文本作为上下文和问题一起添加到 prompt
中 -> 提交给 LLM
生成回答。
📺 原理介绍视频
从文档处理角度来看,实现流程如下:
🚩 本项目未涉及微调、训练过程,但可利用微调或训练对本项目效果进行优化。
🌐 AutoDL 镜像 中 v5
版本所使用代码已更新至本项目 0.2.0
版本。
💻 一行命令运行 Docker:
docker run -d --gpus all -p 80:8501 registry.cn-beijing.aliyuncs.com/chatchat/chatchat:0.2.0
参见 版本更新日志。
从 0.1.x
升级过来的用户请注意,需要按照开发部署过程操作,将现有知识库迁移到新格式,具体见知识库初始化与迁移。
0.2.0
版本与 0.1.x
版本区别本项目中默认使用的 LLM 模型为 THUDM/chatglm2-6b,默认使用的 Embedding 模型为 moka-ai/m3e-base 为例。
本项目最新版本中基于 FastChat 进行本地 LLM 模型接入,支持模型如下:
peft
。注意:如果加载多个peft模型,你可以通过在任何模型工作器中设置环境变量 PEFT_SHARE_BASE_WEIGHTS=true
来使它们共享基础模型的权重。以上模型支持列表可能随 FastChat 更新而持续更新,可参考 FastChat 已支持模型列表。
除本地模型外,本项目也支持直接接入 OpenAI API,具体设置可参考 configs/model_configs.py.example
中的 llm_model_dict
的 openai-chatgpt-3.5
配置信息。
本项目支持调用 HuggingFace 中的 Embedding 模型,已支持的 Embedding 模型如下:
🐳 Docker 镜像地址: registry.cn-beijing.aliyuncs.com/chatchat/chatchat:0.2.0)
docker run -d --gpus all -p 80:8501 registry.cn-beijing.aliyuncs.com/chatchat/chatchat:0.2.0
33.9GB
,使用 v0.2.0
,以 nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04
为基础镜像embedding
模型:m3e-large
,内置 chatglm2-6b-32k
NVIDIA Driver
以及 NVIDIA Container Toolkit
,请参考安装指南docker logs -f <container id>
查看日志Waiting..
步骤,建议使用 docker exec -it <container id> bash
进入 /logs/
目录查看对应阶段日志本项目已在 Python 3.8.1 - 3.10,CUDA 11.7 环境下完成测试。已在 Windows、ARM 架构的 macOS、Linux 系统中完成测试。
参见 开发环境准备。
请注意: 0.2.0
及更新版本的依赖包与 0.1.x
版本依赖包可能发生冲突,强烈建议新建环境后重新安装依赖包。
如需在本地或离线环境下运行本项目,需要首先将项目所需的模型下载至本地,通常开源 LLM 与 Embedding 模型可以从 HuggingFace 下载。
以本项目中默认使用的 LLM 模型 THUDM/chatglm2-6b 与 Embedding 模型 moka-ai/m3e-base 为例:
下载模型需要先安装Git LFS,然后运行
$ git clone https://huggingface.co/THUDM/chatglm2-6b
$ git clone https://huggingface.co/moka-ai/m3e-base
复制文件 configs/model_config.py.example 存储至项目路径下 ./configs
路径下,并重命名为 model_config.py
。
在开始执行 Web UI 或命令行交互前,请先检查 configs/model_config.py
中的各项模型参数设计是否符合需求:
llm_model_dict
对应模型的 local_model_path
属性中,如:llm_model_dict={
"chatglm2-6b": {
"local_model_path": "/Users/xxx/Downloads/chatglm2-6b",
"api_base_url": "http://localhost:8888/v1", # "name"修改为 FastChat 服务中的"api_base_url"
"api_key": "EMPTY"
},
}
embedding_model_dict
对应模型位置,如:embedding_model_dict = {
"m3e-base": "/Users/xxx/Downloads/m3e-base",
}
当前项目的知识库信息存储在数据库中,在正式运行项目之前请先初始化数据库(我们强烈建议您在执行操作前备份您的知识文件)。
如果您是从 0.1.x
版本升级过来的用户,针对已建立的知识库,请确认知识库的向量库类型、Embedding 模型 configs/model_config.py
中默认设置一致,如无变化只需以下命令将现有知识库信息添加到数据库即可:
$ python init_database.py
如果您是第一次运行本项目,知识库尚未建立,或者配置文件中的知识库类型、嵌入模型发生变化,需要以下命令初始化或重建知识库:
$ python init_database.py --recreate-vs
如需使用开源模型进行本地部署,需首先启动 LLM 服务,启动方式分为三种:
三种方式只需选择一个即可,具体操作方式详见 5.1.1 - 5.1.3。
如果启动在线的API服务(如 OPENAI 的 API 接口),则无需启动 LLM 服务,即 5.1 小节的任何命令均无需启动。
在项目根目录下,执行 server/llm_api.py 脚本启动 LLM 模型服务:
$ python server/llm_api.py
项目支持多卡加载,需在 llm_api.py 中修改 create_model_worker_app 函数中,修改如下三个参数:
gpus=None,
num_gpus=1,
max_gpu_memory="20GiB"
其中,gpus
控制使用的显卡的ID,如果 "0,1";
num_gpus
控制使用的卡数;
max_gpu_memory
控制每个卡使用的显存容量。
在项目根目录下,执行 server/llm_api_launch.py 脚本启动 LLM 模型服务:
$ python server/llm_api_launch.py
该方式支持启动多个worker,示例启动方式:
$ python server/llm_api_launch.py --model-path-addresss model1@host1@port1 model2@host2@port2
如果要启动多卡加载,示例命令如下:
$ python server/llm_api_launch.py --gpus 0,1 --num-gpus 2 --max-gpu-memory 10GiB
注:以如上方式启动LLM服务会以nohup命令在后台运行 fastchat 服务,如需停止服务,可以运行如下命令,但该脚本仅适用于linux和mac平台:
$ python server/llm_api_shutdown.py --serve all
亦可单独停止一个 FastChat 服务模块,可选 [all
, controller
, model_worker
, openai_api_server
]
本项目基于 FastChat 加载 LLM 服务,故需以 FastChat 加载 LoRA 路径,即保证路径名称里必须有 peft 这个词,配置文件的名字为 adapter_config.json,peft 路径下包含 model.bin 格式的 LoRA 权重。
示例代码如下:
PEFT_SHARE_BASE_WEIGHTS=true python3 -m fastchat.serve.multi_model_worker \
--model-path /data/chris/peft-llama-dummy-1 \
--model-names peft-dummy-1 \
--model-path /data/chris/peft-llama-dummy-2 \
--model-names peft-dummy-2 \
--model-path /data/chris/peft-llama-dummy-3 \
--model-names peft-dummy-3 \
--num-gpus 2
本地部署情况下,按照 5.1 节启动 LLM 服务后,再执行 server/api.py 脚本启动 API 服务;
在线调用API服务的情况下,直接执执行 server/api.py 脚本启动 API 服务;
调用命令示例:
$ python server/api.py
启动 API 服务后,可访问 localhost:7861
或 {API 所在服务器 IP}:7861
FastAPI 自动生成的 docs 进行接口查看与测试。
按照 5.2 节启动 API 服务后,执行 webui.py 启动 Web UI 服务(默认使用端口 8501
)
$ streamlit run webui.py
使用 Langchain-Chatchat 主题色启动 Web UI 服务(默认使用端口 8501
)
$ streamlit run webui.py --theme.base "light" --theme.primaryColor "#165dff" --theme.secondaryBackgroundColor "#f5f5f5" --theme.textColor "#000000"
或使用以下命令指定启动 Web UI 服务并指定端口号
$ streamlit run webui.py --server.port 666
新增api一键启动脚本,可一键开启fastchat后台服务及本项目提供的langchain api服务,调用示例:
调用默认模型:
$ python server/api_allinone.py
加载多个非默认模型:
$ python server/api_allinone.py --model-path-address model1@host1@port1 model2@host2@port2
多卡启动:
python server/api_allinone.py --model-path-address model@host@port --num-gpus 2 --gpus 0,1 --max-gpu-memory 10GiB
其他参数详见各脚本及fastchat服务说明。
加载本地模型:
$ python webui_allinone.py
调用远程api服务:
$ python webui_allinone.py --use-remote-api
后台运行webui服务:
$ python webui_allinone.py --nohup
加载多个非默认模型:
$ python webui_allinone.py --model-path-address model1@host1@port1 model2@host2@port2
多卡启动:
python webui_alline.py --model-path-address model@host@port --num-gpus 2 --gpus 0,1 --max-gpu-memory 10GiB
其他参数详见各脚本及fastchat服务说明。
参见 常见问题。
🎉 langchain-ChatGLM 项目微信交流群,如果你也对本项目感兴趣,欢迎加入群聊参与讨论交流。