llms之rag:langchain-chatchat(一款中文友好的全流程本地知识库问答应用)的简介(支持 fastchat 接入的chatglm-2/llama-2等多款主流llms+多款embedding模型m3e等+多种textsplitter分词器)、安装(镜像部署【autodl云平台/docker镜像】,离线私有部署+支持rtx3090 ,支持faiss/milvus/pgvector向量库, 基于langchain 框架+fastapi的api调用服务+streamlit 的webui操作)、使用方法(不包括微调/训练,支持llm对话/知识库问答/搜索引擎问答)之详细攻略
目录
py之langchain:langchain(llm大型语言模型应用程序框架/将llms个体进行flow的能力)的简介、安装、使用方法之详细攻略
3、支持的llms模型、embedding 模型、分词器、向量数据库、工具
第一步,注册autodl,并选择租赁合适的服务器套餐(按时计费)
第二步,下载模型至本地:llm模型、embedding 模型
t1、基于多进程脚本 llm_api.py 启动 llm 服务
t2、基于命令行脚本 llm_api_stale.py 启动 llm 服务
t3、peft 加载(包括lora,p-tuning,prefix tuning, prompt tuning,ia等)
(3.1)、web ui 对话界面:llm对话功能+知识库问答功能+搜索引擎问答功能
(3.2)、web ui 知识库管理页面:添加至向量库+从向量库删除+从知识库中删除
相关文章
py之langchain:langchain(llm大型语言模型应用程序框架/将llms个体进行flow的能力)的简介、安装、使用方法之详细攻略
llms之rag之langchain-chatglm:基于langchain框架利用embedding模型(text2vec-large-chinese)+chatglm-6b模型(docker 部署)接入本地知识库—生成本地知识库/分割成块/向量化)→基于问题【embdding+向量化+相似度计算+匹配topk作为上下文】=生成prompt喂给大模型→llms响应—实现问答响应项目(cli/webui/vue,对话任务/知识库问答/bing搜索)图文教程之详细攻略
llms之rag:langchain-chatchat(一款中文友好的全流程本地知识库问答应用)的简介(支持 fastchat 接入的chatglm-2/llama-2等多款主流llms+多款embedding模型m3e等+多种textsplitter分词器)、安装(镜像部署【autodl云平台/docker镜像】,离线私有部署+支持rtx3090 ,支持faiss/milvus/pgvector向量库, 基于langchain 框架+fastapi的api调用服务+streamlit 的webui操作)、使用方法(不包括微调/训练,支持llm对话/知识库问答/搜索引擎问答)之详细攻略
langchain-chatchat的简介
2023年8月14日,原langchain-chatglm 项目已正式发布 v0.2.0 版本,并正式更名为 langchain-chatchat。是一款基于 langchain 与 chatglm 等大语言模型的本地知识库问答应用实现。该项目已重构为使用 fastchat + langchain + fastapi + streamlit 构建的基于 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的内容→再将问题和匹配到的内容一起提交给大语言模型→由模型整合出最终的结果输出给用户。
>> 本项目实现原理如下图所示,过程包括加载文件 → 读取文本 → 文本分割 → 文本向量化 → 问句向量化 → 在文本向量中匹配出与问句向量最相似的 top k个 → 匹配出的文本作为上下文和问题一起添加到 prompt中 → 提交给 llm生成回答。
1、原理图解
2、文档处理实现流程
3、支持的llms模型、embedding 模型、分词器、向量数据库、工具
本项目中默认使用的 llm 模型为 thudm/chatglm2-6b,默认使用的 embedding 模型为 moka-ai/m3e-base 为例。
(1)、支持的llms模型
(2)、支持的embedding 模型
本地模型 | 联网模型 |
本项目支持调用 huggingface 中的 embedding 模型,已支持的 embedding 模型如下: mokaai系列嵌入模型 baai系列嵌入模型
text2vec系列嵌入模型
其他模型 | 除本地模型外,本项目也支持直接接入 openai的在线嵌入模型。 支持的联网模型 |
(3)、支持的分词器
langchain 中的分词器 | 自定义分词器 |
本项目支持调用 langchain 的 text splitter 分词器以及基于此改进的自定义分词器,已支持的 text splitter 类型如下:
| 已经支持的定制分词器如下: |
(4)、支持的向量数据库
本地向量数据库 | 联网向量数据库 |
目前支持的本地向量数据库列表如下: | 联网向量数据库 |
(5)、支持的工具
本地工具 | 联网工具 |
本地工具
| 联网工具
|
4、推荐的模型组合
默认配置 | 在默认的配置文件中,我们提供了以下模型组合 embedding models: m3e-base textsplitter: chineserecursivetextsplitter kb_dataset: faiss |
模型微调 | 我们推荐开发者根据自己的业务需求进行模型微调,如果不需要微调且配置充足,可选择以下性能较好的配置 model_config.py llm: qwen-14b-chat 或 baichuan2-13b-chat embedding models: piccolo-large-zh 或 bge-large-zh-v1.5 history_len = 20 temperature = 0.1 |
模型使用 | 使用该模型将需要更高的硬件要求 1张 rtx a6000 或者 a40 等 48gb 显存以上的显卡。推荐 1 x a100 以上。 (使用多张显卡拼接也能运行,但是速度非常慢,2张4090拼接运行大概为一秒一个字的速度) 64gb 内存用于加载模型而不被kill 服务器级的cpu,推荐 xeon(r) platinum 8358p 以上 |
agent 功能 | >>如果开发者想使用更全面的 agent 功能,我们推荐开发者使用以下配置 llm: qwen-14b-chat 或 gpt-4 tools 的工具控制在10个之内 |
注意事项 | >>如果开发者知识库较大,有大量文档,大文件,我们推荐开发者使用 pg 向量数据库; >>如果开发者的知识库具有一定的关键词特征,例如: 问答对文件(以q + a 为一个组合的json文件) markdown文件 并排的pdf文件 具有多个表格的pdf文件 我们推荐开发者自行开发分词器,以达到更好的效果。 |
langchain-chatchat的安装
0、软件要求和硬件要求
(1)、软件要求
简介 | 要顺利运行本代码,请按照以下系统要求进行配置 |
已经测试过的系统
| 已经测试过的系统 windows 11 version 22h2 linux ubuntu 22.04.5 keenel version 6.5 其他系统可能出现极少数的系统兼容性问题。 |
最低要求 | 最低要求 python 版本: >= 3.8.5, < 3.11 cuda 版本: >= 12.0 (低于这个版本可能出现xformers无法安装) |
推荐要求 | 推荐要求 开发者在以下环境下进行代码调试,在该环境下能够避免最多环境问题。 python 版本 == 3.10.12 cuda 版本: == 12.2 |
(2)、硬件要求
简介 | 如果想要顺利在gpu运行本地模型的 int4 量化版本,你至少需要以下的硬件配置: |
chatglm2-6b & llama-7b | 最低显存要求: 7gb 推荐显卡: rtx 3060, rtx 2060 |
llama-13b
| 最低显存要求: 11gb 推荐显卡: rtx 2060 12gb, rtx 3060 12gb, rtx 3080, rtx a2000 |
qwen-14b-chat
| 最低显存要求: 13gb 推荐显卡: rtx 3090 |
llama-30b | 最低显存要求: 22gb 推荐显卡: rtx a5000, rtx 3090, rtx 4090, rtx 6000, tesla v100, rtx tesla p40 |
llama-65b | 最低显存要求: 40gb 推荐显卡: a100, a40, a6000 |
注意事项 | >>若使用 int8 推理,则显存大致为 int4 推理要求的 1.5 倍; >>若使用 fp16 推理,则显存大致为 int4 推理要求的 2.5 倍。 ��� 例如:使用 fp16 推理 qwen-7b-chat 模型,则需要使用 16gb 显存。 以上数据仅为估算,实际情况以 nvidia-smi 占用为准。 请注意,如果使用最低配置,仅能保证代码能够运行,但运行速度较慢,体验不佳。 |
同时,embedding 模型将会占用 1-2g 的显存,历史记录最多会占用数 g 显存,因此,需要多冗余一些显存。 | |
内存最低要求: 内存要求至少应该比模型运行的显存大。 例如,运行chatglm2-6b fp16模型,显存占用10g,推荐使用16g以上内存。 |
1、镜像部署
t1、基于autodl平台云端部署镜像
autodl镜像云端部署 | autodl 镜像中 v5 版本所使用代码已更新至本项目 0.2.0 版本。
|
|
|
注意事项:当不在使用云端服务器的时候,及时释放实例,否则会一直计费。
第一步,注册autodl,并选择租赁合适的服务器套餐(按时计费)
官方地址:autodl算力云 | 弹性、好用、省钱。租gpu就上autodl
参考教程:
第二步,创建镜像
第1个终端,启动llm服务
cd / root/langchain-chatglm/
conda activate /root/pyenv
python server/llm_api.py
第2个终端,启动api服务
cd / root/langchain-chatglm/
conda activate / root/pyenv
python server/api.py
第3个终端,启动web ui服务
cd /root/langchain-chatglm/
conda activate /root/pyenv
streamlit run webui.py --theme.base "light" --theme.primarycolor "#165dff" --theme.secondarybackgroundcolor "#f5f5f5" --theme.textcolor "#000000"
注意:此处可自定义配置背景颜色等。
t2、docker 镜像本地部署
docker 镜像本地部署
| docker 镜像 首先,定位到下载的项目文件夹下 其次,一行命令运行 docker: docker run -d --gpus all -p 80:8501 registry.cn-beijing.aliyuncs.com/chatchat/chatchat:0.2.0 |
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; >> 该版本目标为方便一键部署使用,请确保您已经在linux发行版上安装了nvidia驱动程序; >> 请注意,您不需要在主机系统上安装cuda工具包,但需要安装 nvidia driver 以及 nvidia container toolkit,请参考安装指南; >> 首次拉取和启动均需要一定时间,首次启动时请参照下图使用 docker logs -f <container id> 查看日志; >> 如遇到启动过程卡在 waiting.. 步骤,建议使用 docker exec -it <container id> bash 进入 /logs/ 目录查看对应阶段日志; |
2、开发部署
第一步,配置开发环境
软件需求 | 本项目已在 python 3.8.1 - 3.10,cuda 11.7 环境下完成测试。已在 windows、arm 架构的 macos、linux 系统中完成测试。 |
环境检查 | # 首先,确信你的机器安装了 python 3.8 - 3.10 版本 $ python --version python 3.8.13
# 如果低于这个版本,可使用conda安装环境 $ conda create -p /your_path/env_name python=3.8
# 激活环境 $ source activate /your_path/env_name
# 或,conda安装,不指定路径, 注意以下,都将/your_path/env_name替换为env_name $ conda create -n env_name python=3.8 $ conda activate env_name # activate the environment
# 更新py库 $ pip3 install --upgrade pip
# 关闭环境 $ source deactivate /your_path/env_name
# 删除环境 $ conda env remove -p /your_path/env_name |
项目依赖 | # 拉取仓库 $ git clone https://github.com/imclumsypanda/langchain-chatglm.git
# 进入目录 $ cd langchain-chatglm
# 安装全部依赖 $ pip install -r requirements.txt
# 默认依赖包括基本运行环境(faiss向量库)。如果要使用 milvus/pg_vector 等向量库,请将 requirements.txt 中相应依赖取消注释再安装。 |
此外,为方便用户 api 与 webui 分离运行,可单独根据运行需求安装依赖包。 t1、如果只需运行 api,可执行: $ pip install -r requirements_api.txt # 默认依赖包括基本运行环境(faiss向量库)。如果要使用 milvus/pg_vector 等向量库,请将 requirements.txt 中相应依赖取消注释再安装。
t2、如果只需运行 webui,可执行: $ pip install -r requirements_webui.txt | |
注:使用 langchain.document_loaders.unstructuredfileloader 进行 .docx 等格式非结构化文件接入时,可能需要依据文档进行其他依赖包的安装,请参考 langchain 文档。 |
请注意: 0.2.0 及更新版本的依赖包与 0.1.x 版本依赖包可能发生冲突,强烈建议新建环境后重新安装依赖包。
第二步,下载模型至本地:llm模型、embedding 模型
如需在本地或离线环境下运行本项目,需要首先将项目所需的模型下载至本地,通常开源 llm 与 embedding 模型可以从 huggingface 下载。项目文件下述两个git即可下载,但是其中的模型权重文件太大,要单独下载,并指定下载的文件夹。以本项目中默认使用的 llm 模型 thudm/chatglm2-6b 与 embedding 模型 moka-ai/m3e-base 为例:
thudm/chatglm2-6b:thudm/chatglm2-6b · hugging face
moka-ai/m3e-base:moka-ai/m3e-base · hugging face
下载模型需要先安装git lfs,然后运行
git clone thudm/chatglm2-6b · hugging face
git clone moka-ai/m3e-base · hugging face
第三步,设置配置项,指定本地模型路径
复制模板文件 | 修改路径:复制模型相关参数配置模板文件 configs/model_config.py.example 存储至项目路径下 ./configs 路径下,并重命名为 model_config.py文件。 复制服务相关参数配置模板文件 configs/server_config.py.example 存储至项目路径下 ./configs 路径下,并重命名为 server_config.py。 |
检查模型参数 | 在开始执行 web ui 或命令行交互前,请先检查 configs/model_config.py 和 configs/server_config.py 中的各项模型参数设计是否符合需求: >> 请确认已下载至本地的 llm 模型本地存储路径写在 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 模型本地存储路径写在 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 |
第五步,启动 api 服务或 web ui
t1、逐步启动
(1)、启动 llm 服务
如需使用开源模型进行本地部署,需首先启动 llm 服务,启动方式分为三种:
t1、基于多进程脚本 llm_api.py 启动 llm 服务
t2、基于命令行脚本 llm_api_stale.py 启动 llm 服务
t3、peft 加载
三种方式只需选择一个即可,具体操作方式详见 5.1.1 - 5.1.3。如果启动在线的api服务(如 openai 的 api 接口),则无需启动 llm 服务,即 5.1 小节的任何命令均无需启动。
t1、基于多进程脚本 llm_api.py 启动 llm 服务
启动服务 | 在项目根目录下,执行 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 控制每个卡使用的显存容量。 |
t2、基于命令行脚本 llm_api_stale.py 启动 llm 服务
注意事项 | 注意: >> llm_api_stale.py脚本原生仅适用于linux,mac设备需要安装对应的linux命令,win平台请使用wls; >> 加载非默认模型需要用命令行参数--model-path-address指定模型,不会读取model_config.py配置; |
启动服务 | 在项目根目录下,执行 server/llm_api_stale.py 脚本启动 llm 模型服务: $ python server/llm_api_stale.py |
多worker启动 | 该方式支持启动多个worker,示例启动方式: $ python server/llm_api_stale.py --model-path-address model1@host1@port1 model2@host2@port2 |
解决端口占用 | 如果出现server端口占用情况,需手动指定server端口,并同步修改model_config.py下对应模型的base_api_url为指定端口: $ python server/llm_api_stale.py --server-port 8887 |
多卡加载 | 如果要启动多卡加载,示例命令如下: $ python server/llm_api_stale.py --gpus 0,1 --num-gpus 2 --max-gpu-memory 10gib |
停止服务 | 注:以如上方式启动llm服务会以nohup命令在后台运行 fastchat 服务,如需停止服务,可以运行如下命令: $ python server/llm_api_shutdown.py --serve all 亦可单独停止一个 fastchat 服务模块,可选 [all, controller, model_worker, openai_api_server] |
t3、peft 加载(包括lora,p-tuning,prefix tuning, prompt tuning,ia等)
简介 | 本项目基于 fastchat 加载 llm 服务,故需以 fastchat 加载 peft 路径,即保证路径名称里必须有 peft 这个词,配置文件的名字为 adapter_config.json,peft 路径下包含 model.bin 格式的 peft 权重。 |
执行代码 | 示例代码如下: 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 详见 fastchat 相关 pr |
(2)、启动 api 服务
简介 | 本地部署情况下,按照 5.1 节启动 llm 服务后,再执行 server/api.py 脚本启动 api 服务; 在线调用api服务的情况下,直接执执行 server/api.py 脚本启动 api 服务; |
调用命令 | 调用命令示例: $ python server/api.py 启动 api 服务后,可访问 localhost:7861 或 {api 所在服务器 ip}:7861 fastapi 自动生成的 docs 进行接口查看与测试。 fastapi docs 界面
|
(3)、启动 web ui 服务:对话功能+知识库管理功能
t1、默认启动 | 按照 5.2 节启动 api 服务后,执行 webui.py 启动 web ui 服务(默认使用端口 8501) $ streamlit run webui.py |
t2、主题色启动 | 使用 langchain-chatchat 主题色启动 web ui 服务(默认使用端口 8501) $ streamlit run webui.py --theme.base "light" --theme.primarycolor "#165dff" --theme.secondarybackgroundcolor "#f5f5f5" --theme.textcolor "#000000" |
t3、指定端口号启动 | 或使用以下命令指定启动 web ui 服务并指定端口号 $ streamlit run webui.py --server.port 666 |
(3.1)、web ui 对话界面:llm对话功能+知识库问答功能+搜索引擎问答功能
(3.2)、web ui 知识库管理页面:添加至向量库+从向量库删除+从知识库中删除
t2、一键启动:建议
一键启动脚本 | 更新一键启动脚本 startup.py,一键启动所有 fastchat 服务、api 服务、webui 服务,示例代码: $ python startup.py --all-webui |
关闭运行服务 | 并可使用 ctrl + c 直接关闭所有运行服务。 可选参数包括 --all-webui, --all-api, --llm-api, --controller, --openai-api, --model-worker, --api, --webui,其中: --all-webui 为一键启动 webui 所有依赖服务; --all-api 为一键启动 api 所有依赖服务; --llm-api 为一键启动 fastchat 所有依赖的 llm 服务; --openai-api 为仅启动 fastchat 的 controller 和 openai-api-server 服务; 其他为单独服务启动选项。
若想指定非默认模型,需要用 --model-name 选项,示例: $ python startup.py --all-webui --model-name qwen-7b-chat |
注意事项 | 注意: 1. startup 脚本用多进程方式启动各模块的服务,可能会导致打印顺序问题,请等待全部服务发起后再调用,并根据默认或指定端口调用服务(默认 llm api 服务端口:127.0.0.1:8888,默认 api 服务端口:127.0.0.1:7861,默认 webui 服务端口:本机ip:8501) 2.服务启动时间示设备不同而不同,约 3-10 分钟,如长时间没有启动请前往 ./logs目录下监控日志,定位问题。 |
3、安装过程中常见问题集锦
https://github.com/chatchat-space/langchain-chatchat/blob/master/docs/faq.md
langchain-chatchat的使用方法
更新中……
发表评论