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.zip

unzip /text2vec-base-chinese.zip

修改# vim docIndex.py的脚本

cd /root/db/LangChainTest-main

vim 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":
            break

        res = 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"] + ":")

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

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

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

相关文章

win11安装redis步骤详解

文章目录 一、redis的安装与下载1、下载2、解压3、启动redis4、测试是否安装成功 二、将redis加入到windows的服务中三、常用的redis服务命令 安装可参考的资料:https://www.runoob.com/redis/redis-install.html 一、redis的安装与下载 1、下载 下载地址&#xf…

提示工程师:如何写好Prompt

提示工程由来 提示工程是一门相对较新的学科,用于开发和优化提示以有效地将语言模型 (LM) 用于各种应用程序和研究主题。 研究人员使用提示工程来提高 LLM 在广泛的常见和复杂任务(例如问题回答和算术推理)上的能力。 开发人员使用提示工程…

120、仿真-51单片机温湿度光照强度C02 LCD1602 报警设计(Proteus仿真+程序+元器件清单等)

方案选择 单片机的选择 方案一:STM32系列单片机控制,该型号单片机为LQFP44封装,内部资源足够用于本次设计。STM32F103系列芯片最高工作频率可达72MHZ,在存储器的01等等待周期仿真时可达到1.25Mip/MHZ(Dhrystone2.1)。内部128k字节…

【Docker】Docker安装与操作

docker的安装与命令 一、安装 docker1. 安装依赖包2. 信息查看 二、Docker 镜像操作1. 搜索镜像2. 获取镜像3. 镜像加速下载4. 查看镜像相关信息5. 删除镜像6. 上传镜像7. 存出和载入镜像 三、Docker 容器操作1. 创建容器2. 查看容器3. 启动容器4. 停止容器5. 进入容器6. 容器与…

SpringBoot整合SpringCloudStream3.1+版本Kafka

SpringBoot整合SpringCloudStream3.1版本Kafka 下一节直通车 SpringBoot整合SpringCloudStream3.1版本的Kafka死信队列 为什么用SpringCloudStream3.1 Springcloud架构提供,基于spring生态能够快速切换市面上常见的MQ产品3.1后使用配置文件的形式定义channel&am…

# Linux下替换删除文件中的颜色等控制字符的方法

Linux下替换删除文件中的颜色等控制字符的方法 文章目录 Linux下替换删除文件中的颜色等控制字符的方法1 Linux下的控制字符(显示的文字并不是他本身):2 颜色字符范例:3 替换4 最后 我们在shell编程显示输出时,会定义文…

Linux的时间函数

2023年7月19日,周三下午 我今天基于GitHub搭建了自己的博客网站,欢迎大家来我的个人博客网站阅读我的博客 巨龙之路的GitHub个人博客 (julongzhilu.github.io) 目录 time函数原型使用方法ctime函数原型使用方法疑惑gmtime、 localtime函数原型什么是分…

WEB:FlatScience

背景知识 sql注入 SQLite数据库知识 SQLite3注入方法 题目 用dirsearch进行扫描,下面几个关键目录:robots.txt,login.php,admin.php,剩下的目录就是一些pdf格式的论文了 一个一个访问并查看源代码,在查看l…

常用API学习06(Java)

Biglnteger public BigInteger(int num, Random rnd) 获取随机大整数,范围:[0~2的num次方-1] public BigInteger(String val) 获取指定的大整数 public BigInteger(String val, int radix) 获取指定进制的大整数 public static BigInteg…

怎么给pdf文件加密?pdf文档如何加密

在数字化时代,保护个人和机密信息的重要性越来越受到关注。PDF(Portable Document Format)是一种广泛使用的文件格式,用于共享和存储各种类型的文档。然而,由于其易于编辑和复制的特性,保护PDF文件中的敏感…

一张表实现短视频“评论区“完整功能

前言 现如今,不管是哪种类型的应用,评论区都少不了。从工具类的到媒体信息流类的,评论留言都是最基本的互动环节。比如抖音短视频下,针对视频每个用户都可以发表自己的观点;而针对用户的评论,其他的用户又可…

Spring Cloud—GateWay之限流

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

Spring @RequestMapping 工作原理

Spring RequestMapping 工作原理 配置基础启动类及Controller类 SpringBootApplication public class DemoServiceApplication {public static void main(String[] args) {SpringApplication.run(DemoServiceApplication.class, args);} }RestController public class HelloC…

单元测试用例到底该如何设计?

目录 前言 使用参数方法创建测试用例 使用执行路径方法创建测试用例 总结 前言 最近一些大公司在进行去测试化的操作,这一切的根源大概可以从几年前微软一刀切砍掉所有内部正式的测试人员开始说起,当时微软内部的测试工程师有一部分转职成了开发工程…

【数据结构常见七大排序(三)上】—交换排序篇【冒泡排序】And【快速排序】

目录 前言 1.冒泡排序 1.1冒泡排序动图 1.2冒泡排序源代码 1.3冒泡排序的特性总结 2.快速排序👑 2.1hoare版本实现思想 排序前 排序中 排序后 2.2hoare版本快排源代码 2.3分析先走 情况1🥇 情况2🥈 前言 交换类排序两个常见的排…

嵌入式工程师常用的软件工具推荐

前言:常言道:工欲善其事,必先利其器。作为一名合格的嵌入式工程师,日常可能需要接触和处理各种奇奇怪怪的问题,这时候一款高适配性的工具将会令工作效率大大提升。作者根据个人的实际使用情况与粉丝的客观感受&#xf…

紧跟国家“新能源+”模式!涂鸦智慧能源方案助力夏季用电节能提效

“今天的你是几分熟?” 今年夏天,高温来得比往年更早,五六月份就提前开启了滚滚热浪模式,京津冀和山东等地最高气温也一度突破了历史极值。在提前到来的高温“烤”验下,全社会供电能力面临着极大挑战。 中国电力网预…

完整的电商平台后端API开发总结

对于开发一个Web项目来说,无论是电商还是其他品类的项目,注册与登录模块都是必不可少的;注册登录功能也是我们在日常生活中最长接触的,对于这个业务场景的需求与逻辑大概是没有什么需要详细介绍的,市面上常见的邮箱注册…

PSP - Jackhmmer 搜索 EMBL 序列数据库的相似序列

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131817060 EMBL (European Molecular Biology Laboratory,欧洲分子生物实验室):EMBL 数据库是一个由欧洲生物信息学研究所…

第六届字节跳动青训营报录比(宣传大使)

统计 前端基础卷:105 前端基础班:120-22(笔试不过基础班,宣传大使奖励进入)98 前端进阶卷:77 前端进阶班:18-216 后端基础卷:151 后端基础班:220 后端进阶卷:133 后端进…