用通俗易懂的方式讲解大模型:基于 Langchain 和 ChatChat 部署本地知识库问答系统

之前写了一篇文章介绍基于 LangChain 和 ChatGLM 打造自有知识库问答系统,最近该项目更新了0.2新版本,这个版本与之前的版本差别很大,底层的架构发生了很大的变化。

该项目最早是基于 ChatGLM 这个 LLM(大语言模型)来搭建的,但后来集成的 LLM 越来越多, 我估计项目团队也借此机会将项目名称改成了Langchain-Chatchat。版本更新之后,项目的部署方式也发生了变化,之前的部署方式已经不适用了,这里我将介绍一下新版本的部署方式。

机器配置

项目的部署需要一台 GPU 服务器,不管是云服务器还是本地服务器都可以,但是需要注意的是,服务器至少需要16G 的显存,太低的话项目会运行不起来。

关于云 GPU 服务器的选择可以参考我之前的文章这里不再赘述。

我选择的是在 AutoDL 服务器上部署。

通俗易懂讲解大模型系列

  • 用通俗易懂的方式讲解大模型:使用 Docker 部署大模型的训练环境
  • 用通俗易懂的方式讲解大模型:在 Ubuntu 22 上安装 CUDA、Nvidia 显卡驱动、PyTorch等大模型基础环境
  • 用通俗易懂的方式讲解大模型:Llama2 部署讲解及试用方式
  • 用通俗易懂的方式讲解大模型:LangChain 知识库检索常见问题及解决方案
  • 用通俗易懂的方式讲解大模型:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统
  • 用通俗易懂的方式讲解大模型:代码大模型盘点及优劣分析
  • 用通俗易懂的方式讲解大模型:Prompt 提示词在开发中的使用

技术交流

建了大模型技术交流群! 想要学习、技术交流、获取如下原版资料的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:来自CSDN + 技术交流

在这里插入图片描述

项目更新内容

Langchain-Chatchat 项目的更新内容可以参考这里[3],主要有以下几点:

使用 FastChat 提供开源 LLM 模型的 API

FastChat[4]是一个用于训练和评估遵循指令 LLM 的框架,可以将 LLM 部署为带有标准应用程序编程接口(API)的软件服务。

这个改动带来的最大变化就是,原来是部署 1 个服务(WebUI),现在需要部署 3 个服务,分别是 LLM API 服务、 Langchain Chatchat 本身的 API 服务和 WebUI 服务,这样的好处是可以将原先的内部服务都解耦出来,用户可以选择不同的服务来构建自己的应用。比如你的项目只需要用到 LLM,那么你只需要部署 LLM API 服务就可以了;或者是你想用自己的前端服务,那么你只需要部署 2 个 API 服务,然后自己写一个前端服务就可以。

接口参数根据 OpenAI API 接口形式接入

接口参数根据 OpenAI API 接口形式接入,让请求参数更加合理。比如以前对话 API 中的对话历史参数是一个二维数组,跟我们熟悉的 OpenAI API 参数差别很大,可以看下面的例子:

# 原 Langchain ChatGLM 的对话历史参数
history: [["你好", "你好,有什么可以帮到你"], ["1 加 1 等于几", "2"]]

# OpenAI 的对话历史参数
messages: [{ "role": "user", "content": "你好" }, { "role": "assistant", "content": "你好,有什么可以帮到你" }]

# 新版 Langchain Chatchat 的对话历史参数
history: [{ "role": "user", "content": "你好" }, { "role": "assistant", "content": "你好,有什么可以帮到你" }]

可以看到原来的参数形式是一个二维数组,每轮对话都会放到一个子数组中,包含用户和 AI 的对话信息,而 OpenAI 的参数形式是一个对象数组,每个对象包含对话的角色和对话的内容,这样的数据结构程序会更容易处理,新版的参数形式改成了 OpenAI 的这种形式,虽然字段名有些不一样。

使用 Streamlit 提供 WebUI 服务

原先是用Gadio来编写 WebUI 页面的,现在改成了StreamlitStreamlit提供了创建更复杂应用程序的能力,而且它提供了丰富的组件库,并支持自定义组件,可以看到新版的页面更加美观。

项目中默认 LLM 模型改为 CHATGLM2-6B

原来默认用的 LLM 是 ChatGLM-6B,现在改成了 ChatGLM2-6B,ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,增加了更强大的性能,更长的上下文,更高效的推理和更开发的协议。

默认 Embedding 模型改为 M3E-BASE

原来的 Embedding 模型是 GanymedeNil/text2vec-large-chinese[5],现在改成了moka-ai/m3e-base[6],TEXT2VEC 和 M3E-BASE 都支持中文,但 M3E-BASE 对英文的支持更好,文件加载方式与文段划分方式也有调整,后续将重新实现上下文扩充,并增加可选设置。

项目部署

下面我们开始来部署 Langchain-Chatchat 项目。

项目初始化

下载项目代码,同时安装依赖,注意新版的依赖文件有 3 个,一个是 API 服务的依赖文件 requirements_api.txt,一个是 WebUI 服务的依赖文件 requirements_webui.txt,还有一个是整个项目的依赖文件 requirements.txt,因为我们前后端都要部署,所以我们要用整个项目的依赖文件来安装依赖:

git clone https://github.com/chatchat-space/Langchain-Chatchat.git
cd Langchain-Chatchat
pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple # 照例加上百度源提高下载速度

如果是第一次运行本项目,需要通过以下命令来初始化知识库:

$ python init_database.py --recreate-vs

模型下载

下载 ChatGLM2-6B 和 M3E-BASE 模型,这两个模型都在 HuggingFace 上,可以直接克隆仓库:

# 开启大文件下载
git lfs install
# 下载 ChatGLM2-6B
git clone https://huggingface.co/THUDM/chatglm2-6b
# 下载 M3E-BASE
git clone https://huggingface.co/moka-ai/m3e-base

项目配置修改

模型下载完成后接着修改配置文件,新版的项目提供了一个配置文件模板model_config.py.example文件,需要将其复制一份并重命名为model_config.py,然后修改里面的配置项:

cd Langchain-Chatchat
cp configs/model_config.py.example configs/model_config.py

然后修改model_config.py文件中的配置项,将模型的路径改成你自己的路径:

embedding_model_dict = {
-  "m3e-base": "moka-ai/m3e-base",
+  "m3e-base": "/你的下载路径/m3e-base",

llm_model_dict = {
    "chatglm2-6b": {
-       "local_model_path": "THUDM/chatglm2-6b",
+       "local_model_path": "/你的下载地址/chatglm2-6b",

LLM API 服务部署

执行以下命令启动 LLM API 服务:

python server/llm_api.py

注意: llm_api.py 中的openai_api_port端口要和configs/model_config.py中 LLM 的服务端口保持一致,否则接口调用会报错。另外如果你是在 AutoDL 的服务器上部署的话,服务器的8888端口会被Juypter服务占用,建议改成其他端口,代码实例如下:

# llm_api.py
openai_api_port = 7777 # 如果你是用AutoDL服务器的话,这个端口不要用8888

# configs/model_config.py

"chatglm-6b": {
   "local_model_path": "/你的下载地址/chatglm-6b",
   "api_base_url": "http://localhost:7777/v1",  # 这里的端口要和上面的openai_api_port保持一致
   "api_key": "EMPTY"
},

服务启动后,实际会启动 3 个子服务,端口分别是8888(上面我们改成了7777)、2000120002,其中8888端口的服务是 LLM 的接口服务,里面提供了文本推理、embedding、token 检查等接口,跟 OpenAI 的接口十分相似。其他 2 个端口的服务我理解是对 LLM 服务的一些监控和管理。

如果启动服务后发现调用接口异常,可以在本地通过 curl 命令对8888端口的服务进行测试。

API 服务部署

执行以下命令启动 API 服务:

python server/api.py

这个服务主要提供了 Langchain Chatchat 的功能接口,包括 LLM 问答、知识库问答、知识库管理等接口。同样地,我们也可以通过 curl 命令对该服务进行测试,服务的端口默认是 7861

WebUI 服务部署

最后是启动 WebUI 服务,执行以下命令启动 WebUI 服务,默认的端口号是8501,可以通过--server.port参数来修改端口:

streamlit run webui.py --server.port 6006

我在启动 WebUI 服务时还遇到一个问题,就是启动服务时报了protobuf这个依赖包版本不对的错误,导致 Web 服务启动失败,后面我将protobuf的版本降级成了3.20.3就可以正常启动了。

启动后可以通过浏览器访问 WebUI 服务,界面如下所示:

图片

其他未测试的部署方式

因为项目新版本才刚发布,我还没有对所有部署方式进行试用,比如对于 API 服务,除了单独启动服务外,还有一个api_allinone.py的文件,我理解是用来同时启动 LLM API 服务和 API 服务的。还有一个webui_allinone.py的文件,应该是用来同时启动所有服务的。这些功能可以让我们更加方便的部署项目,大家可以自行验证这些部署方式。

由于新版本刚发布,新版本的功能可能存在不少问题,在项目的 issue 区可以看到大量新版本的问题,包括服务启动不起来,或者是启动起来之后 Web 页面没有反应等问题,这些问题应该都是可以解决的,只是需要再给项目团队一些时间。

总结

AI 知识库问答系统是一个很有前景的方向,它是对传统知识库系统的一种升级,相信在未来会有很多垂直领域的公司会用到这个技术。从 Langchain Chatchat 项目的发展过程上来看,项目从原来的一个 demo 级别的项目,逐渐向一个完整的产品迈进,在架构、UI 界面、LLM 集成方面也在不断完善,我相信这是一个未来可期的项目。而对于那些还在用老版本的小伙伴,建议尽快升级到新版本,因为项目团队以后的主要精力都会放在新版本的开发上,老版本的功能可能不会再更新了。

关注我,一起学习各种人工智能和 AIGC 新技术,欢迎交流,如果你有什么想问想说的,欢迎在评论区留言。

参考:

[3] https://github.com/chatchat-space/Langchain-Chatchat/releases/tag/v0.2.0_

[4]FastChat: https://github.com/lm-sys/FastChat

[5]GanymedeNil/text2vec-large-chinese: https://huggingface.co/GanymedeNil/text2vec-large-chinese

[6]moka-ai/m3e-base: https://huggingface.co/moka-ai/m3e-base

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【SAP-FICO】--总账标识配置路径OBXR

FICO业务需求: F-02,财务会计凭证填写09客户A时,带出的总账标识为可编辑。 需求截图: 第一步:了解需求 首先,我们要明白,财务凭证生成,是分多种类型(不同类型的凭证&a…

HarmonyOS自学-Day4(TodoList案例)

目录 文章声明⭐⭐⭐让我们开始今天的学习吧!TodoList小案例 文章声明⭐⭐⭐ 该文章为我(有编程语言基础,非编程小白)的 HarmonyOS自学笔记,此类文章笔记我会默认大家都学过前端相关的知识知识来源为 HarmonyOS官方文…

ES6+ 面试常问题

一、let const var 的区别 1. var: 没有块级作用域的概念,有函数作用域和全局作用域的概念全局作用域性下创建变量会被挂在到 windows 上存在变量提升同一作用域下,可以重复赋值创建未初始化,值为 undefined 2. let&#xff1a…

相机删除视频恢复后损坏打不开修复方法

同事对热恋5年的女朋友精心准备了一场浪漫求婚仪式,让朋友帮忙用单反相机拍摄记录这一美好时刻。不巧的的是朋友清理相机空间时,不小心把这一视频删除了,找人帮忙把视频恢复了,却无奈发现恢复出来的视频播放不了,真是好…

【第4期】Springboot集成阿里云对象存储OSS+Vue+Iview文件上传组件

本期简介 文件上传是非常常见的功能,本期要实现的功能是将文件存储到阿里云分布式对象存储OSS中,这样做的好处是随便哪里都可以方便的展示出该图片,并且图片以链接形式在客户端浏览器渲染,流量不会经过后台,降低后台压…

【23.12.29期--Spring篇】Spring的 IOC 介绍

介绍一下Spring的IOC ✔️引言✔️ lOC的优点✔️Spring的IOC✔️ 拓展知识仓✔️IOC是如何实现的? ✔️引言 所谓的IOC (inversion of control) ,就是控制反转的意思。何为控制反转? 在传统的程序设计中,应用程序代码通常控制着对象的创建和…

Pycharm 切换interpreter---python的环境和第三方库问题

这篇回答两个问题: 1.为什么在 pycharm中打开新的project,切换interpreter 之后发现自己之前装的库消失了? 2.为什么 interpreter 切换到python3.8了, terminal 还是在 3.9?? 问题的关键:搞懂什…

STM32CubeMX学习(二) USB CDC 双向通信

STM32CubeMX学习(二) USB CDC 双向通信 简介CubeMX新建工程(串口LED)测试串口和LED串口接收测试USB CDC通信 简介 利用正点原子F407探索者开发板,测试基于USB CDC的双向数据通信。 CubeMX新建工程(串口LE…

工业企业出口技术复杂度测算(2000-2014年)

工业企业出口技术复杂度的测算是对工业企业出口产品的技术含量和复杂度进行评估的过程。这种测算通常涉及分析出口产品的研发强度、生产过程的复杂性、所需的技术知识水平以及产品在全球市场上的竞争力。技术复杂度高的产品可能包括高端制造业产品,如先进电子设备、…

如何使用idea部署springboot项目全过程

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

单机+内部备份_全备案例

此场景为单机数据库节点内部备份,方便部署和操作,但备份REPO与数据库实例处于同一个物理主机,冗余度较低。 前期准备 配置ksql免密登录(必须) 在Kingbase数据库运行维护中,经常用到ksql工具登录数据库,本地免密登录…

Unity | 快速修复Animation missing错误

目录 一、背景 二、效果 三、解决办法 一、背景 最近在做2D 骨骼动画相关的Demo,我自己使用Unity引擎进行骨骼绑定并创建了anim后,一切正常,anim也能播放。但是昨天我修改Obj及子物体的名称(由中文改为英文,如&…

数据分析师,就是做报表?错!!

企业作为数据载体,没有数据,大概率也不会再有企业存在 !! 数据分析师,正是这只小舟的船桨,掌舵所有人的命运。注意,是分析师,不是表哥,表姐... 那么作为数据分析师,应该有哪些硬技能…

Python入门学习篇(十二)——内置函数匿名函数

1 内置函数——数学函数 1.1 绝对值函数 1.1.1 语法 abs(参数) # 里面的参数既可以是整数,也可以是小数1.1.2 示例代码 m -1.99 n -9 print(f"{m}的绝对值为: {abs(m)}") print(f"{n}的绝对值为: {abs(n)}")1.1.3 运行截图 1.2 求商和余数 1.2.1 语…

[Angular] 笔记 16:模板驱动表单 - 选择框与选项

油管视频: Select & Option (Template Driven Forms) Select & Option 在 pokemon.ts 中新增 interface: export interface Pokemon {id: number;name: string;type: string;isCool: boolean;isStylish: boolean;acceptTerms: boolean; }// new interface…

算法基础之蒙德里安的梦想

蒙德里安的梦想 核心思想: 状态压缩dp 总方案 横放的方案 剩下的地方竖着放是固定的了 状态压缩 : 将每一列的图(横终点 横起点 竖) 用一个二进制数存下 向后凸的为1 反之为0 状态计算: 所有 i – 1 列 不冲突的 都加和 f[i , j] f[i - 1…

图像文件怎么才能转换为Excel

将图像文件转换为Excel需要通过OCR(Optical Character Recognition,光学字符识别)技术,先将图片中的文字识别出来,再将识别出的文字导入到Excel中。这可以使用一些在线或离线的OCR工具,例如ABBYY FineReade…

Linux 线程安全 (2)

文章目录 线程同步概念条件变量使用生产消费模型信号量的使用读写锁的使用 Linux 线程安全 (1) 线程同步概念 竞态条件:因为时序问题,而导致程序异常. 饥饿问题:只使用互相锁保证线程安全时,锁资源总被某…

听说上海移动年终奖16个月!我承认我酸了!

* 你好,我是前端队长,在职场,玩副业,文末有福利! 今天,队长看到一篇帖子,有网友发帖说上海移动的年终奖发了16个月,我承认我酸了。 看到这里,我承认我也酸了。16个月是什么概念&…

案例-旋转的太极图案(HTML+CSS)

使用css的动画变换效果完成“ 旋转太极“。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>*{margin: 0;padding: 0;background-color: antiquewhite;}.tj{width: 0;height: 300px;/* border…