基于LangChain实现的知识库问答工具Langchain-Chatchat
基于embedding+LangChain+ChatGLM2-6B 构建行业知识库
Langchain-Chatchat
LangChain 中文文档
langchain
本文使用的Langchain-Chatchat版本是0.2.7
一、构建垂类行业知识库的两种方案
-
方案一:使用开源LLM本地部署和微调
- 优点:数据最安全,因为不管是模型还是训练数据都在本地
- 缺点:要调教出一个足够出色的模型,需要耗费较多的人力物力(当然相比于预训练已经好太多了)
- 具体实施:(LLAMA、ChatGLM2)+(Lora、P-Tuningv2、promote-tunning等)
- 开源方案:LLaMA-Factory
-
方案二:基于LLM+向量数据库
- 优点:成本相对低,更简单,无需训练甚至无需微调
- 缺点:如果使用选择ChatGPT等云端大模型,则需牺牲掉一些隐私性
- 具体实施:LangChain + FAISS +(ChatGPT、ChatGLM2、baichuan)
- 开源方案:Quivr、PrivateGPT、LangChain-Chatchat
二、LangChain + 向量数据库 + 开源大模型的实现方案
- 将私有知识库内容经过拆分、向量化之后,存入向量知识库
- 将用户的问题也进行向量化,利用向量相似性算法(例如余弦相似性)找到向量知识库最匹配的 top n 个片段
- 将这些片段,与用户问题一起作为 prompt 提交给 LLM 回答,作为 LLM 的背景知识,LLM 根据背景知识完成交互问答
三、LangChain-Chatchat使用步骤
Langchain-Chatchat详细wiki文档
1. 下载代码仓库准备基础环境
# 拉取仓库
git clone https://github.com/chatchat-space/Langchain-Chatchat.git
# 进入目录
cd Langchain-Chatchat
# 安装全部依赖
pip install -r requirements.txt
pip install -r requirements_api.txt
pip install -r requirements_webui.txt
# 默认依赖包括基本运行环境(FAISS向量库)。如果要使用 milvus/pg_vector 等向量库,请将 requirements.txt 中相应依赖取消注释再安装。
2. 下载模型文件
git lfs install
# 下载ChatGLM2模型
git-lfs clone https://huggingface.co/THUDM/chatglm2-6b
# 下载文本转向量模型
git-lfs clone https://huggingface.co/shibing624/text2vec-base-chinese
3. 初始化参数配置
- 复制配置文件
python copy_config_example.py
该脚本将会将所有config目录下的配置文件样例复制一份到config目录下,方便开发者进行配置。 接着,开发者可以根据自己的需求,对配置文件进行修改。
- 基础配置项 basic_config.py
该配置基负责记录日志的格式和储存路径,通常不需要修改。
-
模型配置项 model_config.py的核心参数
- MODEL_ROOT_PATH:本地模型路径配置。建议将所有下载的模型放到一个统一的目录下,然后将MODEL_ROOT_PATH指定为该目录
- EMBEDDING_MODEL:文本向量化对应的模型名称,与MODEL_PATH里面的embed_model里面的key对应,key对应的value与MODEL_ROOT_PATH地址拼接形成完成的模型地址
- LLM_MODELS:大语言模型的名称,与MODEL_PATH里面的llm_model里面的key对应,key对应的value与MODEL_ROOT_PATH地址拼接形成完成的模型地址
- ONLINE_LLM_MODEL:在线模型API配置。在ONLINE_LLM_MODEL已经预先写好了所有支持的在线API服务,通常只需要把申请的API_KEY等填入即可。
- HISTORY_LEN:历史对话轮数通常不建议设置超过10,因为这可能导致显存占用过高、速度处理慢
- TEMPERATURE:通常不建议设置过高。 在Agent对话模式和知识库问答中,我们强烈建议将要其设置成0或者接近于0。TEMPERATURE越高,生成内容的随机性越强
- Agent_MODEL = None 我们支持用户使用“模型接力赛”的用法,即: 选择的大模型仅能调用工具,但是在工具中表现较差,则这个工具作为 “模型调用工具” 如果用户设置了Agent_MODEL,则在 Agent 中,使用Agent_MODEL来执行任务,否则,使用LLM_MODEL
-
知识库配置项 kb_config.py
配置与知识库相关的参数,包括知识库的名称,使用的向量数据库类型,文本拆分策略,采用哪种分词器等
-
提示词配置项 prompt_config.py
- llm_chat: 基础的对话提示词, 通常来说,直接是用户输入的内容,没有系统提示词。
- knowledge_base_chat: 与知识库对话的提示词,在模板中,我们为开发者设计了一个系统提示词,开发者可以自行更改。
- agent_chat: 与Agent对话的提示词,同样,我们为开发者设计了一个系统提示词,开发者可以自行更改。
prompt模板使用Jinja2语法,简单点就是用双大括号代替f-string的单大括号 请注意,本配置文件支持热加载,修改prompt模板后无需重启服务。
- 服务配置项 server_config.py
配置服务绑定的IP和端口,以及相应超时时间等参数
4. 初始化知识库
python init_database.py --recreate-vs
5. 加载LoRA微调后的baichuan模型
微调模型加载实操
基于LLaMA-Factory开源代码使用LoRA方法微调baichuan2-base基座模型。
- 方案一:将LoRA微调后的参数与原参数合并,形成一个完整的模型参数(建议使用这种方式)
- 在使用LLaMA-Factory微调模型之后,会得到LoRA微调之后保存的目录,执行以下命令:
python src/export_model.py --model_name_or_path XXX --template default --finetuning_type lora --checkpoint_dir XXX --export_dir XXX
其中,–model_name_or_path对应基座模型的路径,–checkpoint_dir对应LoRA微调之后保存的参数李静,–export_dir对应合并之后保存的路径
- 修改model_config.py配置文件里面的LLM_MODELS和llm_model参数为–export_dir对应的名称和路径,可以在llm_model字典里面追加一个元素来指向合并后的模型
- 方案二:使用Langchain-Chatchat加载base模型和LoRA参数(此种方式目前存在问题)
Langchain-Chatchat基于 FastChat 加载 LLM 服务,故需以 FastChat 加载 PEFT 路径。针对chatglm,falcon,codet5p以外的模型,以及非p-tuning以外的peft方法,需对peft文件进行修改,步骤如下:
- 将config.json文件修改为adapter_config.json(使用LLaMA-Factory微调后已经是这个名字了)
- 保证文件夹包含pytorch_model.bin文件(复制Adapter_model.bin为pytorch_model.bin);
- 修改文件夹名称,保证文件夹包含’peft’一词,如文件夹交LoRA-peft;
- 将peft文件夹移入项目目录下;
- 确保adapter_config.json文件夹中base_model_name_or_path指向基础模型;
- 将peft路径添加到model_config.py的llm_model中,键为模型名,值为peft路径,注意使用相对路径,如key是"LoRA-peft",value也是"LoRA-peft";
- 开启 PEFT_SHARE_BASE_WEIGHTS=true环境变量,再执行python startup.py --all-webui
针对p-tuning和chatglm模型,需要对fastchat进行较大幅度的修改。参考微调模型加载实操
6. 启动服务
python startup.py --all-webui
四、LangChain-Chatchat使用优化
参考下列文章:
【知识库问答】-LangChain实战提升指南(强烈推荐)
大模型行业问答应用实践:数据向量化、RAG、langchain、Agent技术
五、遇到的问题
1. 加载baichuan模型失败
问题: Langchain-Chatchat加载baichuan模型报错 AttributeError: ‘BaichuanTokenizer’ object has no object ‘sp_model’
解决办法:
[BUG] ‘BaichuanTokenizer’ object has no attribute ‘sp_model’ #1665
AttributeError: ‘BaichuanTokenizer’ object has no attribute ‘sp_model’ #204
2. 文本相似度计算不准确
问题: 基于query文本检索不到知识库中对应的上下文内容,导致模型回复的内容不准确
解决办法: 可以参考【知识库问答】-LangChain实战提升指南的解决方案