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

news2024/12/23 0:23:23

一.介绍

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

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

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

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

相关文章

行为型模式 - 责任链模式

概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同&a…

2023出海增长背后的隐忧

2023出海增长背后的隐忧 2023.7.19版权声明:本文为博主chszs的原创文章 今年出口逆势增长的领域,新能源车、锂电池、太阳能电池,号称新三样,有数据支撑,看起来鼓舞人心。 见:外贸出口“新三样”&#xf…

Vue2计算属性如何传参

Vue2官网并没解释计算属性应该怎么传值,但是呢,通过闭包的方式(使用箭头表达式)实际上是可以给计算属性传参的(当然,多个参数也是可行的)。 以下是本人项目开发使用自己基于ElementUI封装的集信息采集与文件上传功能的…

软件基础问答题

性能: 负载压力测试是指在一定约束条件下测试系统所能承受的并发用户量、运行时间、数据量等,以确定系统所能承受的最大负载压力。 负载测试是通过逐步增加系统负载,测试系统性能的变化,并最终确定在满足性能指标的情况下&#xf…

如何控制项目管理的时间节点?

“这个任务着急,先把这个做出来”“临时加个任务”我们在项目开发中,经常遇到这些问题,往往造成项目范围增加、进度延迟、成本增加等问题,项目风险不断增加。 那么我们应该如何更高效地管理项目,尤其是针对关键时间节点…

Win10家庭版安装docker 以及解决 docker is starting

👨 作者简介:大家好,我是Taro,前端领域创作者 ✒️ 个人主页:唐璜Taro 🚀 支持我:点赞👍📝 评论 ⭐️收藏 文章目录 前言一、Hype-v是什么?二、使用步骤1.do…

自动登录harbor脚本

在CI/CD自动化流程中,或者执行shell脚本拉取本地镜像时,需要手工docker login本地仓库,十分的不方便,这里提供一个可以执行的sh脚本,自动登录本地的镜像仓库。 1、安装expect yum -y install expect 2、创建sh文件 vi…

基于XPopup实现的弹窗效果

基于XPopup实现的弹窗效果: implementation com.github.li-xiaojun:XPopup:2.9.191、底部弹窗(BottomPopupView) class OutlinkDealDialog(context: Context,private val selectClickCallback: ((index: Int) -> Unit)? null, ) : BottomPopupView(context) {…

Mybatis简介

1.1 框架介绍 框架是一款半成品软件,可以基于这个半成品软件继续开发,来完成我们个性化的需求! 如图: 1.2 框架要解决的问题 框架要解决最重要的是技术整合的问题 不同的软件企业需要从 J2EE 中选择不同的技术,使得软件企业最…

【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(备份+恢复篇)

深入探索和分析MySQL数据库的数据备份和恢复实战开发指南 MySQL数据库备份全量备份全量备份应用场景 增量备份binlogbinlog主要作用binlog的作用主要有两个方面 开启binlog日志功能要开启MySQL的binlog日志步骤 mysqlbinlogmysqlbinlog的使用案例 全量备份与增量备份结合按天全…

TKDE论文,跑的改的,GPSCVULDETECTOR

Combining Graph Neural Networks With Expert Knowledge for Smart Contract Vulnerability Detection 论文代码GitHub https://github.com/Messi-Q/GPSCVulDetectorpaper https://ieeexplore.ieee.org/abstract/document/9477066/参考IJCAI 21中AME的数据集 https://gith…

huggingface新作品:快速和简便的训练模型

AutoTrain Advanced是一个用于训练和部署最先进的机器学习模型的工具。它旨在提供更快速、更简便的方式来进行模型训练和部署。 安装 您可以通过PIP安装AutoTrain-Advanced的Python包。请注意,为了使AutoTrain Advanced正常工作,您将需要python > 3.…

微信小程序源码反编译(wxss样式无法恢复的问题)

背景:从微信小程序源码上线后,网上一直有大神写程序来反编微信小程序的源码,不过现在来看基本都不能用了,有的能用也不能获取样式wxss文件,经过我的不懈努力,找到一些办法,接下来我会一步步讲。…

HarmonyOS课程体验官招募(第四期),寻找乐于分享,精益求精的伙伴

华为开发者联盟HarmonyOS课程体验官(第四期)活动,开始招募啦! 如果你精益求精、乐于分享;如果你愿意为学堂课程优化改进出谋划策,那就快来加入我们吧!学堂期待与你共同成长、一起进步&#xff0…

大模型开发(八):基于思维链(CoT)的进阶提示工程

全文共8000余字,预计阅读时间约16~27分钟 | 满满干货(附复现代码),建议收藏! 本文目标:介绍提示工程基础类方法、思维链提示方法和LtM的提示方法,并复现解决论文中四个经典推理问题。 代码下载…

JimuReport积木报表 v1.5.9版本发布—免费的可视化报表

项目介绍 一款免费的数据可视化报表,含报表和大屏设计,像搭建积木一样在线设计报表!功能涵盖,数据报表、打印设计、图表报表、大屏设计等! Web 版报表设计器,类似于excel操作风格,通过拖拽完成报…

中睿天下与北京理工大学网络攻防溯源联合实验室揭牌仪式成功举行

7月17日,中睿天下和北理工共建网络攻防溯源联合实验室揭牌仪式暨“网络安全攻防对抗实战”暑期课程开幕式在北京理工大学举行。中睿天下联合创始人魏海宇、创新实验室负责人朱鲲鹏、北京理工大学网络空间安全学院副院长嵩天、副院长张延军、副院长刘莲及部分师生代表…

c++qt 学习笔记,与注意事项

目录 1 构建一个简单的应用 1.1 创建工程 1.2 widget.h文件修改 1.3 widget.cpp文件修改 1.4 生成可执行exe文件 2 内置部件总结 2.1 输入部件类 2.1.1 普通按钮QPushButton示例 2.1.2 工具按钮QToolButton 2.1.3 单选按钮QRadioButton 2.1.4 复选按钮 2.1.5 con…

Unity - Stencil Test 开关,无法通过脚本或是 shader lab 开关来控制

查看过 shader lab 文档: ShaderLab command: Stencil,没有看到 stencil test 关闭的功能,我真的无语。。。 只能开,不能关,意思一个 shader lab 一旦编写了 stencil { } 的内容,就必须开启。。。 好 low 的设计 在网…

【C语言】深剖数据在内存中的存储

👦个人主页:Weraphael ✍🏻作者简介:目前正在回炉重造C语言(2023暑假) ✈️专栏:【C语言航路】 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你…