基于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 + 向量数据库 + 开源大模型的实现方案

在这里插入图片描述

  1. 将私有知识库内容经过拆分、向量化之后,存入向量知识库
  2. 将用户的问题也进行向量化,利用向量相似性算法(例如余弦相似性)找到向量知识库最匹配的 top n 个片段
  3. 将这些片段,与用户问题一起作为 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微调后的参数与原参数合并,形成一个完整的模型参数(建议使用这种方式)
  1. 在使用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对应合并之后保存的路径

  1. 修改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文件进行修改,步骤如下:

  1. 将config.json文件修改为adapter_config.json(使用LLaMA-Factory微调后已经是这个名字了)
  2. 保证文件夹包含pytorch_model.bin文件(复制Adapter_model.bin为pytorch_model.bin);
  3. 修改文件夹名称,保证文件夹包含’peft’一词,如文件夹交LoRA-peft;
  4. 将peft文件夹移入项目目录下;
  5. 确保adapter_config.json文件夹中base_model_name_or_path指向基础模型;
  6. 将peft路径添加到model_config.py的llm_model中,键为模型名,值为peft路径,注意使用相对路径,如key是"LoRA-peft",value也是"LoRA-peft";
  7. 开启 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实战提升指南的解决方案

  • 24
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值