基于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实战提升指南的解决方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/230658.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python+requests+unittest+excel搭建接口自动化测试框架

一、框架结构: 工程目录 代码:基于python2编写 二、Case文件设计 三、基础包 base 3.1 封装get/post请求(runmethon.py) import requests import json class RunMethod:def post_main(self,url,data,headerNone):res Noneif h…

Apache Flink(二):数据架构演变

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹…

自定义注解的定义及使用场景

文章目录 1. 自定义注解如何使用2. 自定义注解使用场景2.1 自定义注解使用AOP做权限校验2.2 自定义注解使用AOP记录用户操作日志2.3 自定义注解使用AOP记录接口请求时长 1. 自定义注解如何使用 需要使用interface修饰,加上三个元注解 Documented:生成API…

玩转大数据:2-揭秘Hadoop家族神秘面纱

1. 初识Hadoop家族 在当今的数字化时代,大数据已成为企业竞争的关键因素之一。为了有效地管理和分析这些庞大的数据,许多企业开始采用Hadoop生态系统。本文将详细介绍Hadoop生态系统的构成、优势以及应用场景。 首先,让我们来了解一下什么是…

Failed to connect to gitee.com port 443: Time out 连接超时提示【Bug已完美解决-鸿蒙开发】

文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2:解决方案3:此Bug解决方案总结解决方案总结**心得体会:解决连接超时问题的三种方案**项目场景: 导入Sample时遇到导入失败的情况,并提示“Failed to connect to gitee.com port 443: Time out”连接超…

西工大网络空间安全学院计算机系统基础实验一(45678)

接着来看第4个函数,int replaceByte(int x, int n, int c),看题目给出的例子,replaceByte(0x12345678,1,0xab) 0x1234ab78。我们可以多写几个例子,进而找出规律,比如: replaceByte(0x12345678,2,0xab) 0…

达梦数据库使用

达梦数据库使用 📑前言 本文主要是【达梦数据库】——达梦数据库简单使用的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他…

PointerEvent实现拖动滑块效果(支持左右吸附)

效果展示&#xff1a; 参数说明&#xff1a; adsorbLen &#xff1a;为0则不吸附&#xff0c;不为0则为左右吸附的距离。也可以自己修改左右的吸附长度。 代码&#xff1a; <template><div class"slider-box" ref"sliderBoxRef"><div re…

洛谷100题DAY8

36.P1416 攻击火星 此题找出规律即可 #include<bits/stdc.h> using namespace std; int n; int main() {cin >> n;cout << max(0, n - 2);return 0; } 37.P1551 亲戚 并查集模板题目 两个人如果使亲戚就合并建立联系&#xff0c;最后进行查找即可 #incl…

【送书活动二期】Java和MySQL数据库中关于小数的保存问题

之前总结过一篇文章mysql数据库&#xff1a;decimal类型与decimal长度用法详解&#xff0c;主要是个人学习期间遇到的mysql中关于decimal字段的详解&#xff0c;最近在群里遇到一个小伙伴提出的问题&#xff0c;也有部分涉及&#xff0c;今天就再大致总结一下Java和MySQL数据库…

一个00后女生在csdn创作1095的创作纪念日

大家好&#xff0c;我是你们熟悉的微枫奶糖 肥晨&#xff0c;今天收到私信&#xff0c;突然发现&#xff0c;我来到CSDN已经1095天了。让我来分享一下吧~ 机缘 不知不觉来csdn已经1095天了&#xff0c;祝贺我在CSDN的创作纪念日&#xff01; 这是一个非常值得纪念的日子&…

PlantUML语法(全)及使用教程-类图

目录 1. 类图1.1、什么是类图1.2、元素声明1.3、类之间的关系1.4、关系上的标签1.5、在元素名称和关系标签中使用非字母1.6、添加方法 1. 类图 类图的设计语法与编程语言的传统语法相似。这种相似性为开发人员提供了一个熟悉的环境&#xff0c;从而使创建图表的过程更简单、更直…