大模型实战教程:使用Langchain与ChatGLM实现本地知识库

news2024/11/23 12:00:33

大语言模型也只是将用户提供的大规模数据集训练而来,也并非万能的什么都知道,特别是一些小众知识、内部数据或私密的个人数据等,此时ChatGLM3肯定会胡乱回答就是ChatGPT4也不一定能给出满意回答;不少公司、个人都有自己的知识库或日志等此时如有可将这些数据以某种方式挂在大模型上此时在知识库存在的知识可从中作答,不属于知识库中的内容还是按照大模型原来方式生成,精准度会高不少;知识库的内容包括文本、PDF、图片、视频、网页等等;
  基于LLM的本地私有化知识库实现主要分为两种:
  1、模型训练微调: 将知识库的内容整理成训练数据集,拿这些整理好的数据集来训练该模型,最终让模型“学会”该知识库的内容,至于效果如何很大程度取决于该数据集的质量和训练的调参,这种方式较复杂、门槛高;
  2、外挂知识库: 在向模型提问时提供一些知识库中的内容让它在其中找到正确的答案,外挂的形式门槛相对低一点大部分的工作主要是文档的处理:加载、切分、向量化、持久化、相识度对比等以及Prompt编写,本文所使用的方式也是此种;

文档处理

这里只涉及到文本的处理,比较好的做法是从知识库中挑选出问题以及相关的内容,这样准确的相对比较高,本文只是简单粗暴的把所有数据都丢给它让它去学习处理;

知识库预处理相关概念

加载文件: 加载知识库中的文本
  文本分割(TextSplitter): 按一定规则将文本分割,具体参数有:separator:分隔符、chunk_size: 文本块长度、chunk_overlap: 文本块之间重叠的长度、length_function:计算长度的方法;文本块长度选择可能会对文本分割效果右较大的影响;

文本向量化: 将文本转换为向量,文本向量化后用于后续存储、计算相识度、检索相关文本等;

文本内嵌(Embedding): 将离散的符号或对象表示为连续的向量空间中的点;文本嵌入可用于以下功能:搜索、聚类、推荐、异常检测、多样本测量、分类;此处主要是用于查询的嵌入向量(问题向量化后)与每个文档的嵌入向量之间的余弦相似度,并返回得分最高的文档。Embedding开源模型模型有:Text2vec、Ernie-3.0、M3E等

持久化: 将向量化的数值存储到向量数据库方便后续直接使用,向量数据库有Chroma、Qdrant等;

代码实现

下面通过使用LangChain与ChatGLM实现本地知识库外挂,主要分为如下几步:启动ChatGLM ApiServer服务、加载文档与文本分割、文本向量化与文本内嵌、通过LangChain将LLM与向量库Retriever(检索器)关联、绑定gradio;
  由于网络原因在此过程中会下载nltk_data数据集 与Embedding模型 ,自动下载可能不会成功,可手动下载放到相关目录即可;

导入模块
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores.chroma import Chroma
from langchain.embeddings.huggingface import HuggingFaceBgeEmbeddings
import os
from langchain.chains import RetrievalQA
from langchain.llms.chatglm import ChatGLM
from langchain.prompts import PromptTemplate

embedding_model_dict={
    'ernie-tiny':"nghuyong/ernie-3.0-nano-zh",
    'ernie-base':"nghuyong/ernie-3.0-base-zh",
    'text2vec':"GanymedeNil/text2vec-large-chinese",
    'text2vec2':"ver/sbert-base-chinese-nil",
    'text2vec3':"shibing624/text2vec-base-chinese",
}

安装依赖

pip install unstructured 
pip install sentence_transformers 
pip install chromadb
pip install gradio

加载文档与文本分割: 通过LangChain目录加载器加载指定目录中的所有文档,使用字符文本分割器对所有文档进行分割,文本块大小为265、块重叠长度为0;其他分割器还有:MarkdownHeaderTextSplitter、HTMLHeaderTextSplitter、RecursiveCharacterTextSplitter等;

def load_documents(dir="books"):
    loader = DirectoryLoader(dir)
    documents= loader.load()
    text_spliter = CharacterTextSplitter(chunk_size=265,chunk_overlap=0)
    split_docs = text_spliter.split_documents(documents)
    return split_docs

文本向量化与文本内嵌: 将文档存储向量库Chroma,并指定文档的Embedding模型;

def store_chroma(docs,embeddings,dir="VectorStore"):
   db = Chroma.from_documents(docs,embeddings,persist_directory=dir)
   db.persist()
   return db

载入embedding模型: 加载HuggingFaceBge托管的Embedding模型;

def load_embedding_mode(model_name='tiny'):
    encode_kwargs = {'normalize_embeddings': False}
    # model_kwargs = {'device':'cuda:0'}
    return HuggingFaceBgeEmbeddings(
        # model_name=embedding_model_dict[model_name],
        model_name="./ernie-3.0-nano-zh",
        encode_kwargs=encode_kwargs
    )

加载向量库: 如本地存在持久化的向量库则加载否则加载文档并存储向量库;

def load_db():
  embeddings =  load_embedding_mode('ernie-tiny')
  if not os.path.exists('VectorStore'):
     documents = load_documents()
     db = store_chroma(documents,embeddings)
  else:
     db = Chroma(persist_directory='VectorStore',embedding_function=embeddings)
  return db

定义LLM关联检索问答链:定义ChatGLM模型调用客户端、获取向量库检索器retriever 、定义LangChain问答链RetrievalQA对象,链类型为:stuff、LLM模型为ChatGLM;
   token: 最大8000
   top_p: 影响文本多样性,越大多样性越强取值范围:[0,1.0]
   chain_type_kwargs: 使用prompt可让QA给出格式化的答案,如典型prompt为:

 """已知信息:{context} 根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题” 或 “没有提供足够的相关信息”,不允许在答案中添加编造成分,答案请使用中文。问题是:{question}"""  

chain_type: 参数包括如下几种:
   stuff: 适用小文本,速度较快将所有相关文档块拼接起来给LLM,可能会超过上下文大小
   map_reduce:LLM对每个相关文档块做一次总结,LLM把后总结汇总再做最终总结
   refine:LLM对每一个文档块进行总结,后逐步汇总成一个总结
   map_rerank: 对文档块总结进行打分,答案取选取分数高

PROMPT_TEMPLATE = """已知信息:{context} 
根据上述已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 “根据已知信息无法回答该问题” 或 “没有提供足够的相关信息”,不允许在答案中添加编造成分,答案请使用中文。问题是:{question}
"""
PROMPT = PromptTemplate(
    template=PROMPT_TEMPLATE, input_variables=["context", "question"]
)
def retrieverQa():
    db=load_db()
    retriever = db.as_retriever()
    llm = ChatGLM(
    endpoint_url="http://127.0.0.1:8000",
    max_token=8000,
    top_p=0.9)
    qa = RetrievalQA.from_chain_type(
        llm=llm,
        chain_type='stuff', 
        retriever=retriever,
        chain_type_kwargs={"prompt": PROMPT}
    )
    return qa

关联gradio: 将RetrievalQA对象与gradio关联,把页面输入的内容传入问答器;

def chatQA(quetion,history):
    qa = retrieverQa()
    resp = qa.run(quetion)
    return resp

demo = gr.ChatInterface(chatQA)
demo.launch(inbrowser=True)

最终效果

通过问答对比可以看到外挂知识库后效果比较明显,并不会无中生有,根据知识库选取了相关内容总结回答;

未接入本地知识库时,ChatGLM3模型输出的内容:
南海农场位于中国海南省三亚市,是一个重要的热带农业基地。这里种植着各种热带作物,如水稻、蔬菜、水果等,满足三亚市及附近地区的居民和游客的需求。南海农场还具备较高的生态价值,为当地的生态环境保护和可持续发展做出了贡献。
使用了本地知识库后:
南海农场是一个位于海南的农场,主要经济作物包括荔枝、胡椒、橡胶、水稻等。茶叶和水果也是该农场的重要经济来源之一。农场设有中学、小学、医院和茶胶加工厂等设施。此外,农场还拥有自己的橡胶和水稻种植区,以及一个味精厂。农场共有7个作业区和62个生产队,并管辖黄竹镇8个村民委员会。

图片

这仅仅是一个Demo外挂知识库的最终效果如何取决于:文本分割、Embedding模型、向量库、LLM模型、知识库的预处理、调参等等;

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

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

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

相关文章

大型集团企业指标体系建设

大型集团企业在进行指标体系建设时,通常会遵循以下几个方面的要求来确保体系的有效性和适用性: 全面性:指标体系应覆盖企业的各个方面,包括但不限于财务状况、市场表现、运营效率、客户满意度、员工发展等。这有助于企业从多个角度…

c4d的vray的蒙版渲染

在一个比较隐藏的角落,extensions>v-ray Tags> Object Properties>勾选Matte Surface,Alpha Contribution打上-1.

JVM面试真题总结(七)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 解释GC的引用计数算法及其局限性 引用计数算法是一种非常直观、简…

Rocky Linux 9 初次安装后启用 SSH Root 远程登录

Rocky Linux 9 是由 CentOS 的创始人发布的版本,目的是解决 CentOS 停服后企业用户的替代需求。Rocky Linux 9 基于 Red Hat Enterprise Linux 9 下游版本。在 Rocky Linux 9 中,为了增强系统的安全性,默认禁用了 SSH root 密码登录。这是为了…

第12章 进入保护模式

第12章 进入保护模式 章节一开始说明了为什么要有保护模式?后续介绍了如何进入保护模式。 实模式:在实模式下,程序是可以“为所欲为”的。它想访问内存的哪一部分,都可以很轻松地通过设置段地址和偏移地址来办到。 保护模式&am…

Plasma FX

Plasma FX是使用自定义着色器的等离子效果的集合。 通过调整粒子系统参数和颜色,可以轻松自定义效果。 特征 50+效果 定制化 等离子粒子着色器 演示场景 移动预制件 下载:​​Unity资源商店链接资源下载链接 效果图:

nodejs基础教程之-异步编程promise/async/generator

1. 异步 所谓"异步",简单说就是一个任务分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段,比如,有一个任务是读取文件进行处理,异步的执行过程就是下面…

C#获取计算机信息

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Management; n…

基于SSM的二手物品交易管理系统的设计与实现 (含源码+sql+视频导入教程+文档+PPT)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的二手物品交易管理系统7拥有两种角色 管理员:用户管理、分类管理、商品管理、订单管理、系统管理等 用户:登录注册、充值、收货、评价、收藏、购物车、订…

vue + Element UI table动态合并单元格

一、功能需求 1、根据名称相同的合并工作阶段和主要任务合并这两列,但主要任务内容一样,但要考虑主要任务一样,但工作阶段不一样的情况。(枞向合并) 2、落实情况里的定量内容和定性内容值一样则合并。(横向…

【机器学习】马尔可夫随机场的基本概念、和贝叶斯网络的联系与对比以及在python中的实例

引言 马尔可夫随机场(Markov Random Field,简称MRF)是一种用于描述变量之间依赖关系的概率模型,它在机器学习和图像处理等领域有着广泛的应用 文章目录 引言一、马尔科夫随机场1.1 定义1.2 特点1.3 应用1.4 学习算法1.5 总结 二、…

使用 Apache Spark 和 Deequ 分析大数据集

在当今的数据驱动环境中,掌握使用 Apache Spark 和 Deequ 对大型数据集进行分析对于任何处理数据分析、SEO 优化或需要深入研究数字内容的类似领域的专业人士来说都至关重要。 Apache Spark 提供处理大量数据所需的计算能力,而 Deequ 提供质量保证层&am…

杨氏矩阵中查找某个数字是否存在(不能使用遍历)

杨氏矩阵&#xff1a; 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的 如图所示&#xff1a; i为行&#xff0c;j为列 如果要找9&#xff0c;先从arr【0】【2】处开始找&#xff0c;3<9,i,排除第一行&#xff0c;6<9,i,排除第…

基于SSM和VUE的药品管理系统(含源码+sql+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM和VUE的药品管理系统2拥有两种角色 管理员&#xff1a;药品管理、出库管理、入库管理、销售员管理、报损管理等 销售员&#xff1a;登录注册、入库、出库、销售、报损等 1.1 背景…

c++习题31-阶乘和

目录 一&#xff0c;题目 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;题目 描述 用高精度计算出 S1!2!3!…n!&#xff08;n≤50&#xff09;,其中“!”表示阶乘&#xff0c;例如&#xff1a;5!54321。 输入正整数n&#xff0c;输出计算结果S。 输入描述 …

微信公众号管理系统-需求整理

微信公众号管理系统-需求整理 文章目录 一、拟开发功能1.公众账号管理(必须)2.菜单管理(必须)2.1 跳转网页(view)2.2 发送消息(media_id)2.3 永久素材管理2.4 打开指定小程序(miniprogram)2.5 自定义点击事件(click)3.权限控制(必须)二、参与人员三、开发周期四、环境及…

二叉树的层序遍历-广度优先遍历

正常来讲二叉树的层序遍历 我们 使用递归 &#xff0c;来进行 就可以得到正确答案&#xff0c;但是有时候递归比较难以理解&#xff0c;我们今天用队列的形式 来进行二叉树的层序遍历 我们使用队列对二叉树进行层序遍历的核心思想有两个 1. 我们用队列 记录二叉树每一层的…

240908-结合DBGPT与Ollama实现RAG本地知识检索增强

A. 最终效果 B. 背景说明 DBGPT在0.5.6版本中开始支持Ollama&#xff1a;v0.5.6 版本更新 网友对其Web端及界面端的设置进行了分享&#xff1a; feat(model): support ollama as an optional llm & embedding proxy by GITHUBear Pull Request #1475 eosphoros-ai/DB-G…

【新手必看】Windows 上安装 Minio及简单使用

一&#xff0c;minio是什么&#xff1f; MinIO 是一个高性能、分布式的对象存储系统&#xff0c;专门用于存储大量非结构化数据&#xff0c;例如图片、视频、日志文件、备份等&#xff0c;且一个对象文件可以是任意大小&#xff0c;从几kb到最大5T不等。Minio是一个非常轻量的服…

【数学建模】2024年国赛成绩公布时间预测

经过三天三夜的奋战&#xff0c;2024年数学建模国赛也宣告结束&#xff0c;相信这几天超高强度的比赛也让大家精疲力竭了&#xff0c;所以经过几天的调整&#xff0c;大家都恢复过来了吧。能够在高强度的压力下坚持这么久&#xff0c;大家都超级厉害的&#xff01; 当然完整提交…