轻松打造:基于本地知识库的私有GPT助手定制教程”

news2024/9/20 16:35:24

背景知识

众所周知,目前大模型 LLM 的能力已经非常强大,chatgpt 已经可以很好的解决通用型问题,但是对于垂直专业领域的问题处理的还不够好。如果要利用 LLM 大模型根据已有的特定领域的知识,推理出该领域特定问题的答案,将是一种不错的应用方向。

例如,下面是一个开源医学领域的 GPT 助手:

screenshot-20240109-155757.png

法律领域的助手:

example-03.jpeg

相对于通用大模型如 chatgpt,私有问答助手的专业性要更高。此外,如果是一些私有的领域,通用大模型是没有相关知识的,因此无法回答。

因此我们需要实现自己的私有 GPT 助手。

具体是怎么实现的呢?

可选方案

现在,我们假设自己已经有了所在特定领域的数据集,比如积累或者收集到的医疗数据、金融数据等。

经过调研和测试,现在已知的通常有三种方案。

基于大模型的全参数训练

基于大模型的全参数训练,是将我们自己的数据集和现有LLM大模型数据一起训练,出来一个新的模型。

screenshot-20240109-173637.png

现在很多大模型是不开源的,如 GPT、Bert 等,也有一些开源的大模型如 LLaMa、chatGLM 等。我们可以选择开源的大模型来一起训练。

这种方式是全量训练,需要大量的计算资源如 GPU,显存消耗很大,几十个G的显存是起码的要求。

这种全训练的方式有个问题,如果咱们自己的数据集不大,训练的效果基本是没有的。回答仍然还是原来模型的内容。

基于大模型的微调(fine-tunning)

目前流行的微调方法是 Lora,其基本原理是额外训练一个小模型(小的只有几M大小),叠加在原有大模型的基础上,类似于一个特定领域的补丁:

screenshot-20240109-174030.png

这种微调的方式在特定领域确实有不错的效果。下面是一个基于开源模型 chatGLM,使用《甄嬛传》里的台词脚本训练出的机器人,可以模仿甄嬛的语气来回答问题:

de511cde-8504-44a0-8f68-aff30eaf5a68.png

但是实际测试下来,还是遇到了比较致命的问题:微调出的问答助手会出现遗忘问题,原有大模型的通用能力很多会丧失,很多通用大模型原来能回答的问题,现在的效果都丢失了。

果然,通过这种修修补补的方式还是不行啊~

0122uxbsdk8blyeblp3kxh3235.gif

基于prompt上下文的方式

prompt上下文,也叫做提示词,意思是在要求大模型回答问题时给出一定的要求、语境、提示等,使之得到符合我们要求的答案。

我们可以把这种提示想象成球员身边的教练,有了教练的提示,球员一般也能发挥的更好。

下载.jpg

例如一种角色扮演性质的prompt:

提示:我希望您充当面试官。我将扮演应聘者的角色,您将为我提问与职位相关的面试问题。请您只以面试官的身份回答,不要一次性写下所有对话。我只希望您与我进行面试对话。请像面试官一样一个一个问题地问我,然后等待我的回答。不要进行解释。我的第一句话是"你好"。

一种给定特定领域知识的prompt:

问题:高尔夫球的一部分是试图获得比其他人更高的得分。是或否?
知识:高尔夫球是一项精密的球杆运动,竞争选手(或高尔夫球手)使用许多类型的球杆,用最少的杆数将球打入球场上一系列洞中。目标是以最低的分数完成比赛,该分数是通过将每个洞上所用的杆数相加计算出来的。得分最低的选手赢得比赛。解释和答案是:

有了特定领域知识的提示,问答助手就能更好理解,其实就是一种形式的阅读理解:

screenshot-20240104-160257.png

prompt 提示的限制

通过上面的背景知识,我们了解到,通过将本地的知识以 prompt 的形式喂给大模型,它就能帮我们实现回答特定垂直领域问题的需求。

但是,这种方案有一个比较大的限制,那就是大模型 LLM 一般对输入有长度的限制,比如现在 chatgpt 普遍有 4096 个 token(类似一个英文单词,但还包括词片段等)的限制。如果我们的本地知识文档很大,就无法全部喂给大模型了。

其实,一般本地知识库里内容很多,我们的问题不一定要将所有知识库里的内容都发过去。

这里能想到的方案,就是通过搜索将我们问题中的关键字与本地知识库进行匹配,找到相关度比较高的部分,然后将这些长度有限、相关度高的信息作为大模型的 prompt 就可以了。

基于知识库搜索的 prompt 上下文的方案

如果用图来表示知识库搜索 + prompt 的方案,就如下图所示:

那么问题来了:如何通过问题在本地知识库中搜索出相关知识呢?

我们平时都能通过关键词来搜索文档,来找到关键词相关的信息。这个是我们能想到的一种解决方式。

但是现在我们拿到的是一个问题,如何能提取出关键词呢?

即使我们能提取出问题中的关键词,但是关键词在文档中也不一定能匹配出完全一样的信息,因为我们的问题很可能是与文档中的某些信息在语义上类似,但是字面上不一定一样。

举个例子,比如我们有一个文档,里面介绍了上海各种各样的美食。但是我们的问题是:

上海有什么好吃的?

语义上,好吃的美食 很接近,但是如果以 好吃的 作为关键词去硬性搜索,是找不到信息的。

在语义上寻找相似性,在自然语言处理 NLP 上有一种称为 embedding (中文翻译叫嵌入)的方式。在高纬度的语言层面我们不好比较相似性,那就将语句通过 embedding 转换为低维度的信息,在低维度层面进行比较。

Embedding

在机器学习中,计算机处理的基本都是数字类型。

那如果要训练文本、图像等,就需要一个转换:将高维数据(如文字、图像等)转化为低维数字的过程,这个过程就叫 embedding,翻译是嵌入

可以将嵌入视为一种尝试通过数组成的数组来表示某些东西本质的方法,其特性是 “相似的事物” 由相近的数表示:

screenshot-20231213-192431.png

用 OpenAI 提供的 embedding 模型表示这个过程,如下:

目前流行的词嵌入模型有 word2vec、glove、Deeplearning4j,OpenAI 也提供了自己的词嵌入模型 text-embedding-ada-002,可以直接通过 API 来调用(当然,要收费 O.o)

OpenAI 提供的调用返回的例子如下:

image.png

文本分割

有了 embedding ,我们就可以搜索语义相似的文档信息了。但是在实际搜索前,我们还需要将文档切分成一个个的段落。不论是将文本作为 prompt 提交给 LLM 大模型,还是提交给 embedding 模型计算向量,对于文本的长度都是有限制的。

我们可以通过一个叫做 langchain 的库来加载知识库文档。这个库的功能比较强大,可以加载各种不同的数据。比如:文件夹、Azure 存储、csv 文件、任意文件格式、任意的网页、PDF 文件、Youtube 视频文件等等。

langchain 完成文档的加载之后,就可以对文档进行分割了。

一般分割的标准是通过一些标点符号如句号、分号等来做分割。此外,还有基于 AST 语义分析的文本分割算法。目前常用的分割方式有:

  1. Langchain 的 text_splitter
  2. 阿里达摩院基于语义分割的 AliTextSplitter

由于很多知识库段落中间也会以句号、分号等来做断句,阿里的语义分割在这种情况下能保证段落的完整性,测试下来效果会好一些。

完整流程

现在,对于知识库的处理已经比较清楚了:

首先,是预处理。

  • 先做文本加载
  • 然后文本分割
  • 之后借助 embedding 模型计算分割后的文本段落,将计算出的向量结果存储起来

其次,开始做问答,将问题也发往 embedding 模型,计算其低维度的向量值,之后根据该问题的向量值在我们前面预处理中存储的知识库向量中搜索,找出相似度最高的几条信息。

有了从知识库搜索到的信息,我们就可以将这些信息组织成 prompt 的形式发往 LLM 大模型,后续的答案就交给大模型来帮我们找了。

大模型我们可以选择清华的 ChatGLM 模型或者 chatgpt。

借用开源项目langchain-ChatGLM的一张图来表示这整个流程,如下:

从知识库文档处理的角度来看,流程如下:

上面黄色的部分是搜索出的相关文档(绿色)的前后上下文,综合之后,作为 prompt 效果会更好。

实际测试

目前已经有一些开源项目实现了本地知识库的功能,如:

  • langchain-ChatGLM

  • 闻达 wenda 项目

  • 上面提到的医疗、法律方面的项目

我们使用自己游戏中的数据集,实际测试下来,影响最后实际效果的因素很多,包括:

  1. 知识库本身语料的格式问题。如果有大量的短文本占据一行,这其实没有什么意义,其表示的意思和信息很有限。因此在做本地知识库的时候,如果前后语句的语义是连贯的但又不在一行,我们需要人工将这些段落做一下整理,将短的文本凑到一行。尽量避免多行的短文本。

  2. 文本分割的效果。很多文本分割的处理方式比较粗暴,就是单纯的按照标点如句号、分号来分割,这其实打断了原本比较连贯的文本,效果不一定好。当然,如果多加上前后几句文本,效果可能会有改善,但是这个度不好控制。比较理想的方式是采用语义分割。

  3. Embedding 模型计算向量以及向量间的相似度,选择不同的模型,这个效果肯定会有差异。

  4. 大模型本身的能力,如现在 chatgpt-4 应该是傲视群雄,大模型基本是分为 chatgpt-4 和其他了。当然,使用 chatgpt 本身有信息安全问题以及费用问题。国内清华开源的 chatGLM-6b 是一个效果和性价比尚可的替代。

做了多轮测试之后,我们排除了闻达项目,效果比较差。langchain-ChatGLM 项目效果要好一些,但是也不够理想,原因也在于文本分割、embedding 模型以及大模型本身的能力有限。

为此,我们自己实现了一套简单的测试demo,结合了以下能力:

  1. Langchain 的文档加载
  2. AliTextSplitter 阿里语义分割算法
  3. OpenAI 的 text-embedding-ada-002 embedding 模型
  4. OpenAI 的 chatgpt-4 大模型(通过公司的封装接口,解决安全性及计费问题)

最终这种定制化的效果要更好。

在这里插入图片描述

如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

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

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

相关文章

node.js part1

Node.js Node.js 是一个跨平台JavaScript 运行环境,使开发者可以搭建服务器端的 JavaScript 应用程序。作用:使用Node.js编写服务器端程序 编写数据接口,提供网页资源浏览功能等等 前端工程化:为后续学习Vue和React等框架做铺垫. …

51单片机学习记录-数码管操作

这里实现了静态数码管的显示。51单片机一共有可以显示4个数字&#xff0c;可以通过控制P2(4-2)的端口选择8个数字显示器中的一个显示数字&#xff0c;控制P0端口写入显示的数值信息。将操作的逻辑使用了函数Nixie进行了封装。 #include <8051.h>unsigned char NixieTabl…

PHP汽车保养维修信息管理系统小程序源码

&#x1f697;爱车守护神器&#xff01;揭秘“汽车保养维修信息管理系统”全攻略&#x1f50d; &#x1f525;【开篇揭秘&#xff1a;为何你需要它&#xff1f;】&#x1f525; 在这个快节奏的时代&#xff0c;爱车不仅是代步工具&#xff0c;更是生活品质的象征。但你是否曾…

C++_基本语法笔记_继承和多态

继承 思想与Java差不多 基本语法 语法&#xff1a;class 子类 : 继承方式 父类 继承方式 将访问权限&#xff0c;上升到保护权限&#xff0c;上升到更高的私有权限 继承哪些部分 继承过程中&#xff0c;即使权限不能访问&#xff0c;也会全部继承下来&#xff08;非静…

Liunx搭建Rustdesk远程桌面服务

1、环境准备 Linux&#xff1a;centos7.9 rustdesk server安装包 很多新服务器并没有 wget 和unzip 可以通过yum自行安装下&#xff0c;如果系统中有wget但不能使用&#xff0c;直接卸载重装即可。 yum install wget wget --no-check-certificate https://github.com/rust…

商家福音!阿里巴巴1688又一线下选品中心落地!

7月31日&#xff0c;阿里旗下1688台州选品中心正式开园。后续1688将在核心产业带陆续开设线下选品中心。选品中心的运营模式为“四位一体”&#xff1a;政府搭台&#xff0c;1688提供技术、销售渠道和数字化能力&#xff0c;本地产业链的链主负责运营&#xff0c;本地源头工厂入…

跟着iMeta学做图|ggplot2绘制多个饼图展示菌群物种组成

原始教程链接&#xff1a;https://github.com/iMetaScience/iMetaPlot/tree/main/221017multi-pieplot 写在前面 饼图 (Pie Plot) 在微生物组研究中可以用来展示菌群物种组成&#xff0c;可以起到与堆叠柱状图相同的展示效果。本期我们挑选2022年4月5日刊登在iMeta上的The imp…

浅谈大模型私有化+精调:面向垂直行业与特定场景之需

今天将继续“AI技术”系列&#xff0c;探讨大模型的私有化和精调&#xff0c;以便让预训练的通用模型更好地适应特定的任务或行业需求。 当然&#xff0c;从产品经理的视角出发&#xff0c;我们不会非常深入&#xff08;鄙人能力也有限&#xff09;&#xff0c;而是建立相关的…

HTTP协议和web服务器(Tomcat)

Author&#xff1a;Dawn_T17&#x1f965; 目录 二.请求协议 三.响应协议 四.协议解析 Socket 编程 Servlet介绍 Web服务器 五.Tomcat 简介 HTTP 即超文本传输协议 它是一种应用层协议&#xff0c;用于客户端&#xff08;如浏览器&#xff09;和服务器之间的通信。 为什…

《网络安全自学教程》- Linux安全标识符、身份鉴别、访问控制

《网络安全自学教程》 操作系统有4个安全目标&#xff0c;也就是说想要保证操作系统的安全&#xff0c;就必须实现这4个需求&#xff1a; 标识系统中的用户和进行身份鉴别。依据系统安全策略对用户的操作进行访问控制&#xff0c;防止用户和外来入侵者对计算机资源的非法访问。…

mysql误删数据恢复记录

背景 1、数据库版本 5.7.36&#xff0c;由于误操作删掉了表的所有数据&#xff0c;但是数据库备份每天凌晨进行、只能从备份恢复昨日的全量数据&#xff0c;当日的数据将会丢失 查看binlog配置 尝试恢复 1、找到binlog文件 误删除后立即刷新binlog flush logs 2、binlog转…

OpenAI GPT-2 model use with TensorFlow JS

题意&#xff1a;使用 TensorFlow JS 应用 OpenAI GPT-2 模型 问题背景&#xff1a; Is that possible to generate texts from OpenAI GPT-2 using TensorFlowJS? 是否可以使用 TensorFlowJS 生成 OpenAI GPT-2 的文本&#xff1f; If not what is the limitation, like mo…

010集——按值传递、按引用传递等方法——C#学习笔记

按值传递参数 这是参数传递的默认方式。在这种方式下&#xff0c;当调用一个方法时&#xff0c;会为每个值参数创建一个新的存储位置。 实际参数的值会复制给形参&#xff0c;实参和形参使用的是两个不同内存中的值。所以&#xff0c;当形参的值发生改变时&#xff0c;不会影…

MDK常见概念

&#xff08;1&#xff09;typedef定义结构体类型 typedef struct {uint32_t BaudRate;uint32_t WordLength;uint32_t StopBits;uint32_t Parity;uint32_t Mode;uint32_t HwFlowCtl;uint32_t OverSampling; } UART_InitTypeDef; &#xff08;2&#xff09;寄存器 (3)DMA DMA 是…

2024年第八届计算生物学与生物信息学国际会议 (ICCBB 2024)即将召开!

2024 年第八届计算生物学和生物信息学国际会议&#xff08;ICCBB 2024&#xff09;将于2024年11月28 -30在日本京都召开&#xff0c;ICCBB 2024是展示理论、实验和应用计算生物学和生物信息学领域新进展和研究成果的主要论坛之一。我们相信&#xff0c;通过大家的共同努力&…

【问题】容器部署场景Spring Bean偶尔循环依赖问题

问题描述 在本地开发中不会发生循环依赖问题&#xff0c;但是在容器场景下&#xff0c;制作成镜像启动后异常出现Bean的循环依赖。 问题原因 开发者在代码中使用构造函数注入来引用依赖的 Bean&#xff0c;这种方式可能导致循环依赖问题。虽然 Spring 框架具备循环依赖的处理…

thinkphp漏洞之sql注入漏洞-builder处漏洞

目录 适用版本 环境搭建 文件下载安装 配置文件修改 漏洞分析 适用版本 注&#xff1a;thinkphp版本&#xff1a;5.0.13<ThinkPHP<5.0.15 、 5.1.0<ThinkPHP<5.1.5 环境搭建 文件下载安装 在github上面下载相应版本&#xff0c;下载think文件&#xff0c;…

乳制品企业怎么防止信息泄露?使用加密软件保障数据安全

乳,制品行业使用加密软件主要是为了保障企业的核心数据安全&#xff0c;防止敏感信息泄露&#xff0c;如:产品配方、生产流程、销售数据等&#xff0c;通过使用加密软件&#xff0c;来保护重要的数据.。一、加密软件在乳制品企业的重要性1、保护重要数据:乳制品企业拥有大量敏感…

SQL 变量写法、排序问题 <12>

一、定义变量排序 目的1&#xff1a;合并学生表和分数表&#xff0c;将每个班分别排名 目的2&#xff1a;遇到相同分数&#xff0c;考虑还是不考虑相同分数排名 学生表&#xff08;1000条&#xff09;和分数表&#xff08;6000条&#xff09;分别如下 1、定义变量、简答排序…

datax和datax-web打包成docker运行

概述 datax和datax-web从一台机器迁移到另一台时&#xff0c;要重新搭建一套运行环境&#xff0c;比较麻烦&#xff1b;打包成docker镜像后迁移就方便多了; 因为我的mysql版本是8&#xff0c;需要在datax的read和write中手动添加8的jdbc驱动 所以我先各自下载好了datax和data…