基于LangChain实现的知识库问答工具Langchain-Chatchat

news2025/1/22 14:52:09

基于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.coloradmin.cn/o/1268618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java第二十章总结

一、线程简介 1.什么是进程: 进程是程序的运行过程,是系统进行资源分配和调度的一个独立单位。通俗来讲,进程就是在操作系统中运行的程序,例如:电脑中运行的微信、eclipse、idea等。 2.什么是线程 线程是操作系统能…

目标检测——R-CNN算法解读

论文:Rich feature hierarchies for accurate object detection and semantic segmentation 作者:Ross Girshick, Jeff Donahue, Trevor Darrell, Jitendra Malik 链接:https://arxiv.org/abs/1311.2524 代码:http://www.cs.berke…

不会PS!超简单的制作产品册方法

​产品册是展示产品的重要工具,对于很多企业来说,制作一本精美的产品册是必不可少的。但是,对于一些不会PS的人来说,制作产品册可能会觉得非常困难。其实,制作产品册并不需要PS等专业工具,只需要一些简单的…

电巢直播|揭秘FCBGA先进封装基板兴力量ze

随着2022年底ChatGPT的问世,我们不仅见证了从互联网时代到AI应用时代的跨越,也迎来了一个数据流量不断攀升的新纪元。在这个以数据为核心的新时代,算力网络成为支撑巨大数字经济的基石,其背后则是对硬件性能持续提升的迫切需求。 …

重点在正负上如何描述?看CHAT有何见解

问CHAT:重点在正负上如何描述? CHAT回复:在描述数据的波动情况时,也可关注其正负方向的变化。通常有以下几种方式: 1. 均值(Mean):在一众数值中,如果大部分数值是正值且…

【数值计算方法(黄明游)】常微分方程初值问题的数值积分法:欧拉方法(向后Euler)【理论到程序】

文章目录 一、数值积分法1. 一般步骤2. 数值方法 二、欧拉方法(Euler Method)1. 向前欧拉法(前向欧拉法)2. 向后欧拉法(后向欧拉法)a. 基本理论b. 算法实现 常微分方程初值问题的数值积分法是一种通过数值方…

ISCTF2023 部分wp

学一年了还在入门( web where_is_the_flag ISCTF{41631519-1c64-40f6-8dbb-27877a184e74} 圣杯战争 <?php // highlight_file(__FILE__); // error_reporting(0);class artifact{public $excalibuer;public $arrow;public function __toString(){echo "为Saber选择…

实施工程师运维工程师面试题

Linux 1.请使用命令行拉取SFTP服务器/data/20221108/123.csv 文件&#xff0c;到本机一/data/20221108目录中。 使用命令行拉取SFTP服务器文件到本机指定目录&#xff0c;可以使用sftp命令。假设SFTP服务器的IP地址为192.168.1.100&#xff0c;用户名为username&#xff0c;密…

【爬虫实战】最新python豆瓣热榜Top250

一.最终效果 豆瓣是大多数新手练习爬虫的 二.数据定位过程 对于一个目标网站&#xff0c;该如何快速判定页面上的数据来源&#xff1f;首先你需要简单web调试能力&#xff0c;对大多数开发者来说都chrome浏览器应该是不二选择&#xff0c;当然我选中的也是。F12打开调试面板&…

Vite 了解

1、vite 与 create-vite 的区别 2、vite 解决的部分问题 3、vite配置文件的细节 3.1、vite语法提示配置 3.2、环境的处理 3.3、环境变量 上图补充 使用 3.4、vite 识别&#xff0c;vue文件的原理 简单概括就是&#xff0c;我们在运行 npm润dev 的时候&#xff0c;vite 会搭起…

springboot+mysql实现就业信息管理系统

springbootmysql实现的就业信息管理系统,有普通用户和管理员两种角色,演示地址:yanshi.ym4j.com:8091 普通用户账号&#xff1a;test 密码&#xff1a;123456管理员账号&#xff1a;admin 密码&#xff1a;123456 共包含就业信息管理、就业统计、用户管理等功能。 登录 就业信…

网络通信概述

文章目录 IP地址端口号协议三要素作用 五元组协议分层OSI七层模型TCP/IP 五层模型应用层传输层网络层数据链路层物理层 封装和分用发送方 - 封装中间转发接收方 - 分用 一般认为计算机网络就是利用通信线路和通信设备将地理上分散的、具有独立功能的多个计算机系统按不同的形式…

Qt 天气预报项目

参考引用 QT开发专题-天气预报 1. JSON 数据格式 1.1 什么是 JSON JSON (JavaScript Object Notation)&#xff0c;中文名 JS 对象表示法&#xff0c;因为它和 JS 中对象的写法很类似 通常说的 JSON&#xff0c;其实就是 JSON 字符串&#xff0c;本质上是一种特殊格式的字符串…

销门!销售秘籍都在这了

很多刚进销售行业&#xff0c;或者初入职场的小白&#xff0c;肯定会有这一段迷茫/茫然期&#xff1a;为什么同事每天都有客户打电话/实地拜访呢&#xff1f; 而自己却无所事事&#xff0c;也没有客户找我&#xff0c;也不知道去哪里拜访客户。 这个阶段对于销售小白来说是很…

联想SR660 V2服务器使用默认用户登录BMC失败

新到了一台服务器&#xff0c;使用默认用户登录BMC失败 登录失败提示&#xff1a;账号或密码错误 解决方案&#xff1a; 1、重置BMC 2、新增用户 开机后在出现 ThinkServer 界面按 F1&#xff0c;进入 BIOS 界面 进入 System Settings-BMC Configuration 菜单相关&#xf…

聊聊VMware vSphere

VMware vSphere是一种虚拟化平台和云计算基础设施解决方案&#xff0c;由VMware公司开发。它为企业提供了一种强大的虚拟化和云计算管理平台&#xff0c;能够在数据中心中运行、管理和保护应用程序和数据。vSphere平台与VMware ESXi虚拟化操作系统相结合&#xff0c;提供了完整…

1992-2021年区县经过矫正的夜间灯光数据(GNLD、VIIRS)

1992-2021年区县经过矫正的夜间灯光数据&#xff08;GNLD、VIIRS&#xff09; 1、时间&#xff1a;1992-2021年3月&#xff0c;其中1992-2013年为年度数据&#xff0c;2013-2021年3月为月度数据 2、来源&#xff1a;DMSP、VIIRS 3、范围&#xff1a;区县数据 4、指标解释&a…

从零开始:PHP实现阿里云直播的简单方法!

1. 配置阿里云直播的推流地址和播放地址 使用阿里云直播功能前&#xff0c;首先需要在阿里云控制台中创建直播应用&#xff0c;然后获取推流地址和播放地址。 推流地址一般格式为&#xff1a; rtmp://{Domain}/{AppName}/{StreamName}?auth_key{AuthKey}-{Timestamp}-{Rand…

(亲测有效)解决windows11无法使用1500000波特率的问题

大家好&#xff01;我是编码小哥&#xff0c;欢迎关注&#xff0c;持续分享更多实用的编程经验和开发技巧&#xff0c;共同进步。 1、问题描述 从图1可以看出串口是正常的&#xff0c;安装的驱动是CP210xVCPInstaller_x64.exe&#xff0c;但是从图2可以看出&#xff0c;串口拒…

【刷题】DFS

DFS 递归&#xff1a; 1.判断是否失败终止 2.判断是否成功终止&#xff0c;如果成功的&#xff0c;记录一个成果 3.遍历各种选择&#xff0c;在这部分可以进行剪枝 4.在每种情况下进行DFS&#xff0c;并进行回退。 199. 二叉树的右视图 给定一个二叉树的 根节点 root&#x…