用通俗易懂的方式讲解大模型:基于 LangChain 和 ChatGLM2 打造自有知识库问答系统

随着人工智能技术的迅猛发展,问答机器人在多个领域中展示了广泛的应用潜力。在这个信息爆炸的时代,许多领域都面临着海量的知识和信息,人们往往需要耗费大量的时间和精力来搜索和获取他们所需的信息。

在这种情况下,垂直领域的 AI 问答机器人应运而生。OpenAI 的 GPT3.5 和 GPT4 无疑是目前最好的 LLM(大语言模型),借助 OpenAI 的 GPT 确实可以快速地打造出一个高质量的 AI 问答机器人,但是 GPT 在实际应用上存在着不少限制。比如 ChatGPT 的知识库是通用领域的,对于垂直领域的知识理解有限,而且对于不熟悉的知识还会存在幻觉的问题。

另外 GPT 的训练语料大部分是英文的,对于中文的理解也存在一定的问题,这对于国内公司来说是一个很大的问题。

本文将介绍如何使用中文 LLM—— ChatGLM2 结合 LangChain 来打造一个垂直领域的知识库问答系统,并在云 GPU 服务上部署运行。

GPU 服务器选择

如果想要在机器上跑自己部署的 LLM,那么你至少需要一台配置不错的 GPU 服务器,否则推理的速度会很慢。想要拥有 GPU 服务器,你可以选择购买或者租用。如果你有足够的资金,那么可以选择购买一台 GPU 服务器,如果你的资金有限,那么可以选择租用云 GPU 服务器。本文主要以租用云 GPU 服务器为例来讲解内容。

随着 AI 的火热,国内出现各种云 GPU 服务厂商,老牌的国内各大云厂商也都纷纷支持 GPU 服务器,经过笔者的试用,发现 AutoDL 和阿里云的 GPU 服务器性价比最高,而且系统也比较稳定且无需绑定额外的开发框架,所以笔者比较推荐这两个云服务器厂商。

技术交流

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

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

在这里插入图片描述

阿里云

先说说为什么推荐阿里云的 GPU 服务器,这是因为他们推出了一个免费试用计划[1],可以让开发者免费试用 5000CU*H 的 GPU,试用时间为 3 个月,支持 A10/V100/G6 3 种显卡机型。

不免费的话阿里云的 GPU 服务器还是比较贵的,V100 16G 的服务器一个小时要大约 30 块钱,还不包括存储的费用。免费的额度使用完后,建议找其他的云服务器厂商。

AutoDL

AutoDL[2]是一款新晋的云 GPU 深度学习环境出租平台,相比阿里云的 GPU 服务器价格,AutoDL 的价格可谓相当亲民。

以 V100 服务器为例,阿里云的 V100 16G 的服务器收费大概是 30 元每小时且不包存储,而 AutoDL 的 V100 32G 服务器仅需 2.4 元每小时,还送 50GB 的存储,价格是阿里云的十分之一不到,配置还更高。

所以我建议的云 GPU 服务器使用策略是:先免费试用阿里云三个月的 GPU 服务器,然后再使用 AutoDL 的 GPU 服务器。如果你有更加划算的 GPU 服务器推荐,欢迎在评论区留言。

创建实例

无论你是使用阿里云还是 AutoDL,都需要先创建一个服务器实例,创建实例按照官方说明文档即可,需要注意的是实例的镜像选择,笔者选择的是 PyTorch 1.1x + Ubuntu 20.04 的镜像,这个镜像已经安装了 PyTorch 和 CUDA ,使用起来也比较稳定,其他的镜像部署过程中可能会出现各种问题。

另外建议选择显存至少为 16GB 的显卡,因为 ChatGLM2-6B 的推理需要至少 12GB 的显存,再加上 LangChain 其他模型的显存消耗,所以至少要保证 16GB 的显存才能进行后面的部署工作。

部署 ChatGLM2

我们先部署 ChatGLM2,ChatGLM2 是开源中英双语对话模型的第二代,对中文的处理能力要优于其他大模型,比第一代有了更强大的性能,更长的上下文,更高效的推理,更开放的协议。

克隆仓库

开始克隆仓库并安装依赖,在阿里云和 AutoDL 上安装 python 依赖包时,系统默认的是使用阿里的源,安装速度会比较慢,这里我推荐用百度的源,速度快非常多。

git clone https://github.com/THUDM/ChatGLM2-6B.git  
cd ChatGLM2-6B  
pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple # 用百度的源  

模型下载

接着是下载模型,这里我使用的是 ChatGLM2-6B 的模型,模型文件是存放在 HuggingFace 上面,最近国内连接 HuggingFace 经常会不通,不清楚是不是被墙了,所以如果下载过程中遇到问题,可以尝试使用科学上网进行代理。下面介绍两种下载方法。

自动下载

第一种是直接运行web_demo.py,这样程序在执行时会先检查本地是否有模型,没有的话就会自动下载模型,下载完成后再开始执行程序,下载下来的模型存放在这个目录:~/.cache/huggingface/hub/models--THUDM--chatglm2-6b/blobs,模型大小大概有 10G 左右。

手动下载

第二种是使用git clone下载模型,因为模型比较大,所以要先确认 git 的大文件下载功能是否已开启,执行命令git lfs install,如果显示Git LFS initialized.则说明已开启,否则需要先安装Git LFS,可以在这个网站[3]查看如何安装。

然后执行git clone命令下载模型。

git clone https://huggingface.co/THUDM/chatglm2-6b  

手动下载模型需要修改web_demo.py文件中的模型路径,将from_pretrained中的模型路径修改为下载后的模型路径。

-tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)  
-model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True, device='cuda')  
+tokenizer = AutoTokenizer.from_pretrained("/mnt/workspace/chatglm2-6b", trust_remote_code=True)  
+model = AutoModel.from_pretrained("/mnt/workspace/chatglm2-6b", trust_remote_code=True).quantize(4).cuda()  

部署验证

最后我们希望将 ChatGLM2 运行起来,看安装是否成功,ChatGLM2 提供了一个 web 程序,启动这个程序后我们可以在浏览器中访问它的功能,web 程序的访问端口是 7860,但我们的服务器不一定会开放这个端口对外提供访问,因此我们还需要再改下web_demo.py的代码,来让它可以提供外部访问的地址。

-demo.queue().launch(share=False, inbrowser=True)  
+demo.queue().launch(share=True, inbrowser=True)  

share设置为 True,这样程序启动后会生成一个对外访问地址,我们在本地浏览器直接访问这个地址就可以了。执行命令python web_demo.py启动 web 程序。

/mnt/workspace/ChatGLM2-6B> python web_demo.py  
[2023-07-13 11:20:33,304] [INFO] [real_accelerator.py:110:get_accelerator] Setting ds_accelerator to cuda (auto detect)  
Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████| 7/7 [01:25<00:00, 12.25s/it]  
Running on local URL:  http://127.0.0.1:7860  
Running on public URL: https://46841e4217313f9dbb.gradio.live  This share link expires in 72 hours. For free permanent hosting and GPU upgrades (NEW!), check out Spaces: https://huggingface.co/spaces  

public URL就是我们要访问的地址,需要注意的是这个地址不是一成不变的,而是每次启动都会生成新的地址。下面是 web 程序的界面。

部署 LangChain-ChatGLM

接下来我们再部署 LangChain-ChatGLM,首先介绍一下 LangChain 和 LangChain-ChatGLM 这 2 个项目。

LangChain[4]是一个强大的框架,旨在帮助开发人员使用语言模型构建端到端的应用程序。它提供了一套工具、组件和接口,可简化创建由 LLM 提供支持的应用程序的过程。LangChain 可以轻松管理与语言模型的交互,将多个组件链接在一起,并集成额外的资源,例如 API 和数据库。

Langchain-ChatGLM[5] 是一种利用 Langchain 思想实现的基于本地知识库的问答应用,目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。它对中文文档分隔,问题加上下文拼接上都做了相应的优化。

Langchain-ChatGLM 开始是基于 ChatGLM 第一代来开发的,后面慢慢支持更多的模型,ChatGLM2 推出后,项目也很快集成了 ChatGLM2。

克隆仓库

和ChatGLM2一样,我们首先要下载 Langchain-ChatGLM 项目代码并安装依赖。

git clone https://github.com/imClumsyPanda/langchain-ChatGLM.git  
cd langchain-ChatGLM  
pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple # 用百度的源

下载 Embedding 模型

Langchain-ChatGLM 除了要用到 ChatGLM2 模型外,还需要用到一个用来 Embedding 文档和 Prompt 的模型,默认是用的text2vec-large-chinese,但这个模型推理用的显存比较大,大概要 3G 多显存,我们可以使用一个小一点的模型text2vec-base-chinese

同样地,我们只需要用git clone下载模型。

git clone https://huggingface.co/shibing624/text2vec-base-chinese  

修改配置文件

模型下载完成后修改配置文件config/model_config.py,将embedding_model_dict中的模型地址改为下载后的 Embedding 模型地址,再修改默认的 Embedding 模型名称为text2vec-base。同时修改llm_model_dictchatglm2-6b的模型地址为我们下载的 ChatGLM2 模型地址,并且修改默认的 LLM 模型为chatglm2-6b

 embedding_model_dict = {  "ernie-tiny": "nghuyong/ernie-3.0-nano-zh",  "ernie-base": "nghuyong/ernie-3.0-base-zh",  
-    "text2vec-base": "shibing624/text2vec-base-chinese",  
+    "text2vec-base": "/mnt/workspace/text2vec-base-chinese",  # Embedding model name  
-EMBEDDING_MODEL = "text2vec"  
+EMBEDDING_MODEL = "text2vec-base"  "chatglm2-6b": {  "name": "chatglm2-6b",  
-        "pretrained_model_name": "THUDM/chatglm2-6b",  
+        "pretrained_model_name": "/mnt/workspace/chatglm2-6b",  # LLM 名称  
-LLM_MODEL = "chatglm-6b"  
+LLM_MODEL = "chatglm2-6b"

针对 ChatGLM2 的修改

因为 ChatGLM2 刚推出不久,Langchain-ChatGLM 对其适配还不太完善,需要手动再修改一些代码才能让 ChatGLM2 正常运行。修改的代码主要是/models/loader/loader.py文件中的_load_model方法,修改内容如下。

                         LoaderClass.from_pretrained(checkpoint,  config=self.model_config,  torch_dtype=torch.bfloat16 if self.bf16 else torch.float16,  
-                                                    trust_remote_code=True)  
-                        .half()  
-                        .cuda()  
+                                                    trust_remote_code=True, device='cuda')  
+                        # .half()  
+                        # .cuda()

部署运行

最后跟 ChatGLM2 一样,我们修改 Langchain-ChatGLM 的 web 程序,以便我们可以在浏览器中访问到这个 web 程序。修改webui.py文件,将share设置为 True。

-         share=False,  
+         share=True,  

修改完后执行命令python webui.py启动 web 程序。

/mnt/workspace/langchain-ChatGLM> python webui.py  
INFO  2023-07-13 14:37:52,071-1d:  
loading model config  
llm device: cuda  
embedding device: cuda  
dir: /mnt/workspace/langchain-ChatGLM  
flagging username: e717a58b4ce9444e82491cefeb80bf56  [2023-07-13 14:37:58,105] [INFO] [real_accelerator.py:110:get_accelerator] Setting ds_accelerator to cuda (auto detect)  
Loading /mnt/workspace/chatglm2-6b...  
Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████| 7/7 [01:29<00:00, 12.80s/it]  
Loaded the model in 91.42 seconds.  
{'answer': '你好!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。'}  
Running on local URL:  http://0.0.0.0:7860  
Running on public URL: https://b0f2e23a9ea5b74b4a.gradio.live  This share link expires in 72 hours. For free permanent hosting and GPU upgrades (NEW!), check out Spaces: https://huggingface.co/spaces  

访问public URL地址就可以看到我们的 web 程序了。

系统使用介绍

添加知识库文档步骤如下:

  • 先选新建知识库

  • 输入知识库名字,点击“添加至知识选项”

  • 上传文件,完了后点击“上传文件并加载知识库”

然后就可以基于这个知识库进行问答了,操作十分简单。

总结

本文介绍了 GPU 服务器的选型,ChatGLM2 和 Langchain-ChatGLM 的部署和使用,如果想要了解更多关于 Langchain-ChatGLM 的实现原理,可以在他们 GitHub 仓库中查看更多的信息。如果你想打造属于自身业务的问答系统,可以参考本文的方法,希望可以帮助到你。

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

参考:

[1]免费试用计划: https://free.aliyun.com/?searchKey=PAI&spm=5176.22772544.J_4237718650.1.14c32ea9Ojx8Dh

[2]AutoDL: https://www.autodl.com/home

[3] 这个网站: https://github.com/git-lfs/git-lfs?utm_source=gitlfs_site&utm_medium=installation_link&utm_campaign=gitlfs#installing

[4] LangChain: https://docs.langchain.com/docs/

[5] Langchain-ChatGLM: https://github.com/imClumsyPanda/langchain-ChatGLM

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

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

相关文章

C++ //例13.14 将一批数据以二进制形式存放在磁盘文件中。例13.15 将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。

C程序设计 &#xff08;第三版&#xff09; 谭浩强 例13.14 例13.15 例13.14 将一批数据以二进制形式存放在磁盘文件中。 例13.15 将刚才以二进制形式存放在磁盘文件中的数据读入内存并在显示器上显示。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差异。…

Zookeeper之快速入门

前言 本篇文章主要还是让人快速上手入门&#xff0c;想要深入的话可以通过书籍系统的学习。 简介 是什么 可用于协调、构建分布式应用。 本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录树方式的数据存储&#xff0c;并且可以对树中的节点进行有效管理…

AI产品经理-借力

AI产品经理-借力&#xff1a;学会善用供应商改造自有产品 1.整个项目的工作方法 2.项目启动-行业调研 3.项目启动-供应商选型

喜讯|极狐GitLab 通过信通院汽车软件研发效能成熟度模型能力

12 月 27 日&#xff0c;在由中国信息通信研究院&#xff08;下称信通院&#xff09;、中国通信标准化协会联合主办的2023系统稳定性与精益软件工程大会-汽车云质效专场峰会上&#xff0c;信通院发布了“2023年下半年汽车云评估结果”&#xff0c;极狐GitLab 一体化 DevOps 平台…

centos7 使用openssl 配置证书服务器(史上最详细版本)

背景 最近接到一个任务&#xff1a;由于我们的产品涉及使用数字证书进行签名、签章&#xff0c;如果需要使得签名签章暗具有法律效力&#xff0c;就必须使用权威CA中心颁发的数字证书&#xff0c;就需要小钱钱&#xff1b;但是对于测试来说&#xff0c;就可以适当减少小钱钱的…

2023 年中国高校大数据挑战赛赛题B DNA 存储中的序列聚类与比对-解析与参考代码

题目背景&#xff1a;目前往往需要对测序后的序列进行聚类与比对。其中聚类指的是将测序序列聚类以判断原始序列有多少条&#xff0c;聚类后相同类的序列定义为一个簇。比对则是指在聚类基础上对一个簇内的序列进行比对进而输出一条最有 可能的正确序列。通过聚类与比对将会极大…

stata回归结果输出中,R方和F值到底是用来干嘛的?

先直接回答问题&#xff0c;R方表示可决系数&#xff0c;反映模型的拟合优度&#xff0c;也就是模型的解释能力如何&#xff0c;也可以理解为模型中的各个解释变量联合起来能够在多大程度上解释被解释变量&#xff1b;F值用于模型整体的统计显著性&#xff0c;对应的P值越小&am…

代码随想录刷题笔记(DAY2)

今日总结&#xff1a;今天在学 vue 做项目&#xff0c;学校还有很多作业要完成&#xff0c;熬到现在写完了三道题&#xff0c;有点太晚了&#xff0c;最后一道题的题解明天早起补上。&#xff08;补上了&#xff09; Day 2 01. 有序数组的平方&#xff08;No. 977&#xff09;…

力扣:968. 监控二叉树(贪心,二叉树)

题目&#xff1a; 给定一个二叉树&#xff0c;我们在树的节点上安装摄像头。 节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。 计算监控树的所有节点所需的最小摄像头数量。 示例 1&#xff1a; 输入&#xff1a;[0,0,null,0,0] 输出&#xff1a;1 解释&…

AIGC时代下,结合ChatGPT谈谈儿童教育

引言 都2024年了&#xff0c;谈到儿童教育&#xff0c;各位有什么新奇的想法嘛 我觉得第一要务&#xff0c;要注重习惯养成&#xff0c;我觉得聊习惯养成这件事情范围有点太大了&#xff0c;我想把习惯归纳于底层逻辑&#xff0c;我们大家都知道&#xff0c;在中国式教育下&a…

vue-cli3/webpack打包时去掉console.log调试信息

文章目录 前言一、terser-webpack-plugin是什么&#xff1f;二、使用配置vue-cli项目 前言 开发环境下&#xff0c;console.log调试信息&#xff0c;有助于我们找到错误&#xff0c;但在生产环境&#xff0c;不需要console.log打印调试信息&#xff0c;所以打包时需要将consol…

servlet+jdbc实现用户注册功能

一、需求 在Servlet中可以使用JDBC技术访问数据库&#xff0c;常见功能如下&#xff1a; 查询DB数据&#xff0c;然后生成显示页面&#xff0c;例如&#xff1a;列表显示功能。接收请求参数&#xff0c;然后对DB操作&#xff0c;例如&#xff1a;注册、登录、修改密码等功能。…

前端基本性能指标及lighthouse使用

文章目录 1、基本指标介绍2、Performace分析2.1 performance属性2.2 使用performace计算2.3 Resource Timing API2.4 不重复的耗时时段区分2.5 其他组合分析2.6 JS 总加载耗时2.7 CSS 总加载耗时 3、lighthouse基本使用3.1 使用Chrome插件lighthouse3.2 使用Chrome浏览器开发者…

信息泄露总结

文章目录 一、备份文件下载1.1 网站源码1.2 bak文件泄露1.3 vim缓存1.4 .DS_Store 二、Git泄露2.1 git知识点2.1 log2.2 stash 三、SVN泄露3.1 SVN简介3.2 SVN的文件3.3 SVN利用 四、Hg泄露 一、备份文件下载 1.1 网站源码 常见的网站源码备份文件后缀&#xff1a; tartar.gz…

hyperf console 执行

一、原理描述 hyperf中&#xff0c;不难发现比如自定义控制器中获取参数&#xff0c;hyperf.php中容器获取&#xff0c;传入的都是接口&#xff0c;而不是实体类。 这是因为框架中的配置文件有设置对应抽象类的子类&#xff0c;框架加载的时候将其作为数组&#xff0c;使用的…

零基础学Java第二天

复习回顾&#xff1a; 1.dos命令 dir 显示当前文件夹下面的所有的文件和文件夹 cd 切换目录的 mkdir 创建文件夹的 rd 删除文件夹的 del 删除文件 D: 切换盘符 cls 清屏 2.书写Java代码换行打印《静夜诗》这首古诗 class Demo1 { …

深入理解 C# 中的字符串比较:String.CompareTo vs String.Equals

深入理解 C# 中的字符串比较&#xff1a;String.CompareTo vs String.Equals 在处理字符串时&#xff0c;了解如何正确比较它们对于编写清晰、有效和可靠的 C# 程序至关重要。本文将深入探讨 C# 中的两个常用字符串比较方法&#xff1a;String.CompareTo 和 String.Equals&…

Mybatis行为配置之Ⅲ—其他行为配置项说明

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

电子工程师如何接私活赚外快?

对电子工程师来说&#xff0c;利用业余时间接私活是个很常见的技术&#xff0c;不仅可以赚取额外收入&#xff0c;也能提升巩固技术&#xff0c;可以说国内十个工程师&#xff0c;必有五个在接私活养家糊口&#xff0c;如果第一次接私活&#xff0c;该如何做&#xff1f; 很多工…

再升级|川石教育鸿蒙应用开发4.0教程发布

全新鸿蒙蓄势待发 HarmonyOS是一款面向未来的全场景分布式智慧操作系统。 对于消费者而言&#xff0c;HarmonyOS用一个统一的软件系统从根本上解决消费者面对大量智能终端体验割裂的问题&#xff0c;为消费者带来统一、便利、安全的智慧化全场景体验。 对于开发者而言&#xf…