LangChain + Embedding + Chromdb,关联使用ChatGLM的本地搭建训练平台教程

一.介绍

    OpenAI 在国内用户注册会遇到各种阻力,目前可行的方法是使用本地数据集的功能实现联网搜索并给出回答,提炼出TXT、WORD 文档里的内容。
    现在主流的技术是基于强大的第三方开源库:LangChain

文档地址:🦜️🔗 Langchain

​    这个库目前非常活跃,每天都在迭代,已经有 22k 的 star,更新速度飞快。
    LangChain 是一个用于开发由语言模型驱动的应用程序的框架。他主要拥有 2 个能力:

  1. 可以将 LLM 模型与外部数据源进行连接

  2. 允许与 LLM 模型进行交互

LLM 模型:Large Language Model,大型语言模型

1.1 基础功能

LLM 调用

  • 支持多种模型接口,比如 OpenAI、Hugging Face、AzureOpenAI ...

  • Fake LLM,用于测试

  • 缓存的支持,比如 in-mem(内存)、SQLite、Redis、SQL

  • 用量记录

  • 支持流模式(就是一个字一个字的返回,类似打字效果)

Prompt管理,支持各种自定义模板

拥有大量的文档加载器,比如 Email、Markdown、PDF ...

对索引的支持

  • 文档分割器

  • 向量化

  • 对接向量存储与搜索,比如 Chroma、Pinecone、Qdrand

Chains

  • LLMChain

  • 各种工具Chain

  • LangChainHub

1.2 必知概念

相信大家看完上面的介绍多半会一脸懵逼。不要担心,上面的概念其实在刚开始学的时候不是很重要,当我们讲完后面的例子之后,在回来看上面的内容会一下明白很多。

但是,这里有几个概念是必须知道的。

1.3 Text Spltters 文本分割

顾名思义,文本分割就是用来分割文本的。为什么需要分割文本?因为我们每次不管是做把文本当作 prompt 发给 Langchian ,embedding 功能都是有字符限制的。

比如 我们将一份300页的 pdf 发给 LangChian,让他进行总结,这里就需要使用文本分割器去分割我们 loader 进来的 Document。

1.4 Vectorstores 向量数据库

因为数据相关性搜索其实是向量运算。所以,不管我们是使用 openai api embedding 功能还是直接通过向量数据库直接查询,都需要将我们的加载进来的数据 Document 进行向量化,才能进行向量运算搜索。转换成向量也很简单,只需要我们把数据存储到对应的向量数据库中即可完成向量的转换。

官方也提供了很多的向量数据库供我们使用。

https://python.langchain.com/en/latest/modules/indexes/vectorstores.html

1.5 Chain 链

我们可以把 Chain 理解为任务。一个 Chain 就是一个任务,当然也可以像链条一样,一个一个的执行多个链。​​

1.6 Embedding

用于衡量文本的相关性。这个也是 LangChain 能实现构建自己知识库的关键所在。

他相比 fine-tuning 最大的优势就是,不用进行训练,并且可以实时添加新的内容,而不用加一次新的内容就训练一次,并且各方面成本要比 fine-tuning 低很多。

二.实战

    通过上面的必备概念大家应该已经可以对 LangChain 有了一定的了解,但是可能还有有些懵。

视频教程:

LangChain接入本地数据实操_哔哩哔哩_bilibiliLangChain接入本地数据实操, 视频播放量 8725、弹幕量 0、点赞数 288、投硬币枚数 109、收藏人数 974、转发人数 200, 视频作者 灵镜实验室, 作者简介 连接科技与生活 | 透过热闹看门道,相关视频:LangChain: 使用AI连接数据源的时代已经到来了!,langchain-chatglm:本地私有化部署企业专有大语言模型,建立企业的私有知识库,利用LangChain和国产大模型ChatGLM-6B实现基于本地知识库的自动问答,LangChain + OpenAI 5分钟实现自然语言SQL数据挖掘,LangChain + GLM =本地知识库,Streamlit + LangChain - 10分钟创建AI Web应用,PDF聊天机器人,LangChain03-九个经典用例:聊天、数据分析、评价系统等,OpenAI + LangChain + Spark - 基于自然语言的海量企业级数据查询与分析,13分钟解读LangChain(精译中字),5分钟学会搭建本地知识库聊天机器人(基于GPT4+Llamaindex+LangChain)https://www.bilibili.com/video/BV18X4y1t79H/?spm_id_from=333.337.search-card.all.click

注意:这个视频只是快速查看本次实战搭建本地知识库实操的demo,其中有很多细节是略过的,切记不能直接效仿。

2.1 搭建本地ChatGLM

项目地址:GitHub - THUDM/ChatGLM-6B: ChatGLM-6B:开源双语对话语言模型 | An Open Bilingual Dialogue Language Model

官网介绍:

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考我们的博客。

第一步,本地安装 Python

这一步暂略,可以自行下载安装 Python 环境。

Python 下载地址:Download Python | Python.org

注意:安装 >9 以上版本,建议安装 3.93.17。

安装手册:

CentOS 7 的 Python2 升级成 Python 3.9.17_python 3.9.17 下载_查里王的博客-CSDN博客

第二步,下载项目程序包

  • 下载地址见附件,直接下载下来并解压。我这里解压到 :/root/chatgpt/ChatGLM-6B-main

ChatGLM-6B-main,下载附件包如下:

 

第三步,下载模型包 chatglm(14GB存储空间)

下载地址:GitHub - THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 开源双语对话语言模型

备选地址:THUDM/chatglm-6b at main

注意:海外的huggingface针对国内的IP是封锁的,无法直接下载,可以使用我存放在百度企业网盘里的源码包;

注意:百度企业网盘不让上传14GB的数据集;百度网盘单次只能上传4GB,由于个人没有开通网盘,所以只能通过公网下载;

官网介绍:

ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 ChatGLM 相同的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。

注意:下载后放到第二步程序包下,自行创建目录 chatglm-6b,如下:

#cd /root/.cache/huggingface/hub/models--THUDM--chatglm-6b/
yum -y install gcc-c++
pip install --upgrade pip setuptools wheel
pip install hnswlib langchain chromadb urllib3==1.26.6 sentence_transformers unstructured tiktoken gradio mdtex2html sentencepiece accelerate torch cpm_kernels protobuf transformers

注意:建议更新pip的源,别用阿里云,速度奇慢无比,推荐用中科大或者豆瓣的源地址作为PIP库;

Python pip更换升级源_更新pip的源_查里王的博客-CSDN博客

第四步,运行网页版 demo

vim 修改一下web_demo.py的配置

vim /root/chatgpt/ChatGLM-6B-main

 模型默认是访问huggingface的在线库,必须更改为本地的chatglb-6b的离线库的路径;

  • 如果本地有GPU,可以使用 half().cuda();

  • 如果本地没有GPU,就需要修改成 float();

执行如下命令,运行网页版本的 demo,如下:

cd /root/chatgpt/ChatGLM-6B-main
python web_demo.py

 程序会运行一个 Web Server,并输出地址。在浏览器中打开输出的地址即可使用。最新版 Demo 实现了打字机效果,速度体验大大提升。注意,由于国内 Gradio 的网络访问较为缓慢,启用 demo.queue().launch(share=True, inbrowser=True) 时所有网络会经过 Gradio 服务器转发,导致打字机体验大幅下降,现在默认启动方式已经改为 share=False,如有需要公网访问的需求,可以重新修改为 share=True 启动。

 第五步,测试网页版程序

浏览器打开地址 并访问,输入问题,可以看到 ChatGLM 会给予回复。

 2.2 搭建本地数据切片向量化 Embeddings + ChromaDB

把Langchain和中文向量文本字符集下载到本地目录,并进行解压

unzip /root/db/LangChainTest-main.zipunzip /text2vec-base-chinese.zip

修改# vim docIndex.py的脚本

cd /root/db/LangChainTest-mainvim docIndex.py

1.将model_name = 'xxxxxx'换成解压路径,例如:/root/db/text2vec-base-chinese

2.将embeddings_model_name = '/root/db/text2vec-base-chinese'

embeddings = HuggingFaceEmbeddings(model_name='/root/db/text2vec-base-chinese')也修改成解压的路径

执行 docIndex.py,将txt文本内容进行向量化入库到chromaDB中

最后,把main注释掉,取消以下的内容注释

if __name__ == "__main__":#main()embeddings_model_name = '/root/db/text2vec-base-chinese'embeddings = HuggingFaceEmbeddings(model_name='/root/db/text2vec-base-chinese')db = Chroma(persist_directory=persist_directory, embedding_function=embeddings, client_settings=CHROMA_SETTINGS)print(db.similarity_search("产品线划分是什么样的?"))

 可以输出内容的即表示正确(由于客户提供的文档签署了保密协议,我这里就不贴图了)

三.LangChain 调用 ChatGLM

修改main.py中的embeddings的模型地址

vim /root/db/LangChainTest-main/main.py

将model_name修改成/root/db/text2vec-base-chinese

if __name__ == '__main__':embeddings = HuggingFaceEmbeddings(model_name='/root/db/text2vec-base-chinese')db = Chroma(persist_directory=persist_directory, embedding_function=embeddings, client_settings=CHROMA_SETTINGS)retriever = db.as_retriever(search_kwargs={"k": target_source_chunks})#llm = OpenAI(model_name="text-ada-001", n=2, best_of=2)llm = ChatGLM()prompt_template = """基于以下已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 "根据已知信息无法回答该问题" 或 "没有提供足够的相关信息",不允许在答案中添加编造成分,答案请使用中文。已知内容:{context}问题:{question}"""promptA = PromptTemplate(template=prompt_template, input_variables=["context", "question"])chain_type_kwargs = {"prompt": promptA}qa = RetrievalQA.from_chain_type(llm=llm, retriever=retriever, chain_type="stuff",chain_type_kwargs=chain_type_kwargs, return_source_documents=True)while True:query = input("\n请输入问题: ")if query == "exit":breakres = qa(query)answer, docs = res['result'], res['source_documents']print("\n\n> 问题:")print(query)print("\n> 回答:")print(answer)for document in docs:print("\n> " + document.metadata["source"] + ":")

最后的结果,就会提示:请输入问题,表示搭建本地库成功!

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

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

相关文章

基于单片机的教室智能照明台灯控制系统的设计与实现

功能介绍 以51单片机作为主控系统;LCD1602液晶显示当前时间、年月日、时分秒、前教室人数;2路红外探头用来感应当前教室进出人数;按键可以设置当前时间、自动手动模式、开启和关闭教室灯光时间;在手动模式下,可以通过按…

uni-app:单位像素rpx

rpx:响应式单位,长宽可以随着屏幕大小改变,其尺寸根据iPhone 6的标准来参考(750rpx为占满屏幕宽,1334rpx为占满屏幕长。7501334rpx) 例子: 现在展示型号为iPhone 12 pro的型号,这里750px和750…

51单片机学习--矩阵键盘、电子密码锁

矩阵键盘的模块原理图&#xff1a; 功能&#xff1a;按下矩阵按键&#xff0c;在LCD上显示对应的数值。 采用模块化编程&#xff0c;在此只给出MatrixKey.c 和 main.c 两部分代码 #include <REGX52.H> #include "Delay.h"/*矩阵键盘读取键码按下不放&#xf…

【有功功率、无功功率】可再生能源配电馈线的鲁棒经济调度研究[IEEE13节点](Matlab代码实现)

&#x1f4a5;1 概述 "有功功率和无功功率" 是与电力系统中能量传输和功率控制相关的两个重要概念。 有功功率&#xff08;Active Power&#xff09;是指电力系统中传输和消耗能量的功率&#xff0c;也被称为实功功率。它负责提供电力系统中的实际电能需求&#xf…

DTU凭什么可以为数据提供高效可靠的稳定传输?

当谈及到智能化的发展时&#xff0c;其实它已经正在影响着各行各业&#xff0c;当前许多传统行业也正在向智能化转变。如果你细心留意的话&#xff0c;就会发现在我们日常生活中多少都会见到它们的身影&#xff0c;例如&#xff1a;村庄各家各户墙外所挂的煤改电设备、居民楼小…

【数学建模】统计分析方法

文章目录 1.回归分析2. 逻辑回归3. 聚类分析4. 判别分析5. 主成分分析6. 因子分析7. 对应分析 1.回归分析 数据量要多&#xff0c;样本总量n越大越好——>保证拟合效果更好&#xff0c;预测效果越好 一般n>40/45较好 方法 建立回归模型 yiβ0β1i……βkxkiεi 所估计的…

IDEA使用GIT提交代码中文日志(commit message)乱码

最近换了新的开发环境&#xff0c;导致提交gti中文注释乱码&#xff0c;遂记录一下解决方案 idea中查看git提交信息显示中文是正常的 gitee上显示乱码 本地显示也是乱码 一、命令修改编码格式 git 安装目录下执行 git config --global i18n.commitencoding utf-8git config …

pdf怎么翻译?有这个工具就够了

pdf怎么翻译&#xff1f;PDF文档一直是我们日常生活和工作中不可避免的一部分。但是&#xff0c;当我们需要翻译PDF文件时&#xff0c;我们往往会感到无助&#xff0c;因为PDF文档不能像其他文本文件一样直接复制和粘贴。那么今天就给大家介绍一款可以帮助我们进行PDF翻译的工具…

【技能实训】DMS数据挖掘项目-Day09

文章目录 任务9【任务9.1.1】升级DataBase类为可序列化的类&#xff0c;以便在文件保存或网络中传递【任务9.1.2】升级LogRec类为可序列化的类&#xff0c;以便在文件保存或网络中传递【任务9.1.3】升级MatchedLogRec类为可序列化的类&#xff0c;以便在文件保存或网络中传递【…

Java编程-基本排序算法

冒泡排序 图解 &#xff08;注&#xff1a;图片来源网络&#xff09; Java代码 package suanfa_Ja;import org.apache.hadoop.security.SaslOutputStream;// 基本排序算法&#xff0c;冒泡排序 时间复杂度 O(n^2) 空间复杂度O(1) public class BubbleSort {public static v…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【4】-O3 不支持 编译失败

gcc -O3 编译失败 结论&#xff1a;默认情况下SPEC CPU 2006 1.2 不支持 gcc -O3编译参数。

Linux 安装 nginx

正常是两种安装方式 一种是使用系统的包管理软件&#xff0c;比如centos的yum -y install nginx命令&#xff08;简单但不推荐&#xff0c;配置文件分散不易管理&#xff0c;且需要配置第三方源yum -y install epel-release等&#xff0c;如果是简单使用&#xff0c;配置文件什…

[GXYCTF2019]simple CPP

前言 三个加密区域&#xff0c;第一次是基本运算&#xff0c;八位叠加&#xff0c;z3方程 分析 第一轮加密&#xff0c;和Dst中模27异或 &#xff08;出题人对动调有很大意见呢&#xff09; 将输入的字符串按八位存入寄存器中&#xff0c;然后将寄存器内容转存到内存 第一次…

【数据结构与算法】哈夫曼编码(最优二叉树)实现

哈夫曼编码 等长编码&#xff1a;占的位置一样 变长编码&#xff08;不等长编码&#xff09;&#xff1a;经常使用的编码比较短&#xff0c;不常用的比较短 最优&#xff1a;总长度最短 最优的要求&#xff1a;占用空间尽可能短&#xff0c;不占用多余空间&#xff0c;且不…

C\C++ 使用ping判断ip是否能连通

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan 简介&#xff1a; ping是一种用于测试网络连接的工具&#xff0c;它通过发送数据包到目标设备并等待其响应来工作&#xff0c;以检查网络是否连通。下面是例子. 效果&#xff1a; 代码…

JavaScript的WebAPI

这里写目录标题 DOM 基本概念获取元素事件概念事件的三要素操作元素获取/修改表单元素属性行内样式操作类名样式操作操作节点 DOM 基本概念 DOM 全称为 Document Object Model. W3C 标准给我们提供了一系列的函数, 让我们可以操作: 网页内容 ,网页结构, 网页样式 DOM数的结构如…

软通动力与华秋达成生态共创合作,共同推动物联网硬件创新

7月11日&#xff0c;在2023慕尼黑上海电子展现场&#xff0c;软通动力信息技术(集团)股份有限公司(以下简称“软通动力”)与深圳华秋电子有限公司(以下简称“华秋”)签署了生态共创战略合作协议&#xff0c;共同推动物联网硬件生态繁荣发展。当前双方主要基于软通动力的产品及解…

【Python基础函数笔记】获取当前时间并写入日志

1.获取当前时间 import os from datetime import datetime import pytzdef get_cur_time():# 获取当前时间return datetime.strftime(datetime.now(pytz.timezone(Asia/Singapore)), %Y-%m-%d_%H-%M-%S)# 基础目录 basedir a logdir os.path.join(basedir, logs, str(args.n…

Spring Cloud—GateWay之限流

RequestRateLimiter RequestRateLimiter GatewayFilter 工厂使用 RateLimiter 实现来确定是否允许当前请求继续进行。如果不允许&#xff0c;就会返回 HTTP 429 - Too Many Requests&#xff08;默认&#xff09;的状态。 这个过滤器需要一个可选的 keyResolver 参数和特定于…

STL源码刨析_stack _queue

目录 一. 介绍 1. stack 介绍 2. queue 介绍 二. 模拟实现 1. stack 模拟实现 2. queue 模拟实现 三. deque 1. deque 接口 2. 底层 一. 介绍 1. stack 介绍 stack&#xff08;栈&#xff09;是一种容器适配器&#xff0c;它提供了一种后进先出&#xff08;LIFO&#xff0…