【LangChain学习之旅】—(7) 调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?

【LangChain学习之旅】—(7) 调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?

  • 大语言模型发展史
  • 预训练 + 微调的模式
  • 用 HuggingFace 跑开源模型
  • 申请使用 Meta 的 Llama2 模型
  • 通过 HuggingFace 调用 Llama
  • LangChain 和 HuggingFace 的接口
    • 通过 HuggingFace Hub

Reference:LangChain 实战课

之前的内容讲了提示工程的原理以及 LangChain 中的具体使用方式。今天,我们来着重讨论 Model I/O 中的第二个子模块,LLM。

让我们带着下面的问题来开始这一节课的学习。大语言模型,不止 ChatGPT 一种。调用 OpenAI 的 API,当然方便且高效,不过,如果我就是想用其他的模型(比如说开源的 Llama2 或者 ChatGLM),该怎么做?再进一步,如果我就是想在本机上从头训练出来一个新模型,然后在 LangChain 中使用自己的模型,又该怎么做?

关于大模型的微调(或称精调)、预训练、重新训练、乃至从头训练,这是一个相当大的话题,不仅仅需要足够的知识和经验,还需要大量的语料数据、GPU 硬件和强大的工程能力。别说一节课了,我想两三个专栏也不一定能讲全讲透。不过,我可以提纲挈领地把大模型的训练流程和使用方法给你缕一缕。这样你就能体验到,在 LangChain 中使用自己微调的模型是完全没问题的。

大语言模型发展史

说到语言模型,我们不妨先从其发展史中去了解一些关键信息。

Google 2018 年的论文名篇 Attention is all you need,提出了 Transformer 架构,也给这一次 AI 的腾飞点了火。Transformer 是几乎所有预训练模型的核心底层架构。基于 Transformer 预训练所得的大规模语言模型也被叫做“基础模型”(Foundation Model 或 Base Model)。

在这个过程中,模型学习了词汇、语法、句子结构以及上下文信息等丰富的语言知识。这种在大量数据上学到的知识,为后续的下游任务(如情感分析、文本分类、命名实体识别、问答系统等)提供了一个通用的、丰富的语言表示基础,为解决许多复杂的 NLP 问题提供了可能。

在预训练模型出现的早期,BERT 毫无疑问是最具代表性的,也是影响力最大的模型。BERT 通过同时学习文本的前向和后向上下文信息,实现对句子结构的深入理解。BERT 之后,各种大型预训练模型如雨后春笋般地涌现,自然语言处理(NLP)领域进入了一个新时代。这些模型推动了 NLP 技术的快速发展,解决了许多以前难以应对的问题,比如翻译、文本总结、聊天对话等等,提供了强大的工具。

在这里插入图片描述
当然,现今的预训练模型的趋势是参数越来越多,模型也越来越大,训练一次的费用可达几百万美元。这样大的开销和资源的耗费,只有世界顶级大厂才能够负担得起,普通的学术组织和高等院校很难在这个领域继续引领科技突破,这种现象开始被普通研究人员所诟病。
在这里插入图片描述

预训练 + 微调的模式

不过,话虽如此,大型预训练模型的确是工程师的福音。因为,经过预训练的大模型中所习得的语义信息和所蕴含的语言知识,能够非常容易地向下游任务迁移。NLP 应用人员可以对模型的头部或者部分参数根据自己的需要进行适应性的调整,这通常涉及在相对较小的有标注数据集上进行有监督学习,让模型适应特定任务的需求。

这就是对预训练模型的微调(Fine-tuning)。微调过程相比于从头训练一个模型要快得多,且需要的数据量也要少得多,这使得作为工程师的我们能够更高效地开发和部署各种 NLP 解决方案。

在这里插入图片描述
图中的“具体任务”,其实也可以更换为“具体领域”。那么总结来说:

  • 预训练:在大规模无标注文本数据上进行模型的训练,目标是让模型学习自然语言的基础表达、上下文信息和语义知识,为后续任务提供一个通用的、丰富的语言表示基础。
  • 微调:在预训练模型的基础上,可以根据特定的下游任务对模型进行微调。现在你经常会听到各行各业的人说:我们的优势就是领域知识嘛!我们比不过国内外大模型,我们可以拿开源模型做垂直领域嘛!做垂类模型!—— 啥叫垂类?指的其实就是根据领域数据微调开源模型这件事儿。

这种预训练 + 微调的大模型应用模式优势明显。首先,预训练模型能够将大量的通用语言知识迁移到各种下游任务上,作为应用人员,我们不需要自己寻找语料库,从头开始训练大模型,这减少了训练时间和数据需求;其次,微调过程可以快速地根据特定任务进行优化,简化了模型部署的难度;最后,预训练 + 微调的架构具有很强的可扩展性,可以方便地应用于各种自然语言处理任务,大大提高了 NLP 技术在实际应用中的可用性和普及程度,给我们带来了巨大的便利。

用 HuggingFace 跑开源模型

  1. 第一步,登录 HuggingFace 网站,并拿到专属于你的 Token。
    在这里插入图片描述

  2. 第二步,用pip install transformers安装 HuggingFace Library。详见这里。

  3. 第三步,在命令行中运行 huggingface-cli login,设置你的 API Token。
    在这里插入图片描述

当然,也可以在程序中设置你的 API Token,但是这不如在命令行中设置来得安全。

# 导入HuggingFace API Token
import os
os.environ['HUGGINGFACEHUB_API_TOKEN'] = '你的HuggingFace API Token'

申请使用 Meta 的 Llama2 模型

在 HuggingFace 的 Model 中,找到 meta-llama/Llama-2-7b。注意,各种各样版本的 Llama2 模型多如牛毛,我们这里用的是最小的 7B 版。此外,还有 13b\70b\chat 版以及各种各样的非 Meta 官方版。
在这里插入图片描述

通过 HuggingFace 调用 Llama

好,万事俱备,现在我们可以使用 HuggingFace 的 Transformers 库来调用 Llama 啦!

# 导入必要的库
from transformers import AutoTokenizer, AutoModelForCausalLM# 加载预训练模型的分词器
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf")# 加载预训练的模型
# 使用 device_map 参数将模型自动加载到可用的硬件设备上,例如GPU
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-chat-hf", device_map = 'auto')  # 定义一个提示,希望模型基于此提示生成故事
prompt = "请给我讲个玫瑰的爱情故事?"# 使用分词器将提示转化为模型可以理解的格式,并将其移动到GPU上
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")# 使用模型生成文本,设置最大生成令牌数为2000
outputs = model.generate(inputs["input_ids"], max_new_tokens=2000)# 将生成的令牌解码成文本,并跳过任何特殊的令牌,例如[CLS], [SEP]等
response = tokenizer.decode(outputs[0], skip_special_tokens=True)# 打印生成的响应
print(response)

这段程序是一个很典型的 HuggingFace 的 Transformers 库的用例,该库提供了大量预训练的模型和相关的工具。

  • 导入 AutoTokenizer:这是一个用于自动加载预训练模型的相关分词器的工具。分词器负责将文本转化为模型可以理解的数字格式。
  • 导入 AutoModelForCausalLM:这是用于加载因果语言模型(用于文本生成)的工具。
  • 使用 from_pretrained 方法来加载预训练的分词器和模型。其中,device_map = 'auto' 是为了自动地将模型加载到可用的设备上,例如 GPU。
  • 然后,给定一个提示(prompt):"请给我讲个玫瑰的爱情故事?",并使用分词器将该提示转换为模型可以接受的格式,return_tensors="pt" 表示返回 PyTorch 张量。语句中的 .to("cuda") 是 GPU 设备格式转换,因为我在 GPU 上跑程序,不用这个的话会报错,如果你使用 CPU,可以试一下删掉它。
  • 最后使用模型的.generate()方法生成响应。max_new_tokens=2000 限制生成的文本的长度。使用分词器的.decode()方法将输出的数字转化回文本,并且跳过任何特殊的标记。

LangChain 和 HuggingFace 的接口

如何把 HuggingFace 里面的模型接入 LangChain。

通过 HuggingFace Hub

第一种集成方式,是通过 HuggingFace Hub。HuggingFace Hub 是一个开源模型中心化存储库,主要用于分享、协作和存储预训练模型、数据集以及相关组件。

我们给出一个 HuggingFace Hub 和 LangChain 集成的代码示例。

# 导入HuggingFace API Token
import os
os.environ['HUGGINGFACEHUB_API_TOKEN'] = '你的HuggingFace API Token'# 导入必要的库
from langchain import PromptTemplate, HuggingFaceHub, LLMChain# 初始化HF LLM
llm = HuggingFaceHub(repo_id="google/flan-t5-small",#repo_id="meta-llama/Llama-2-7b-chat-hf",
)# 创建简单的question-answering提示模板
template = """Question: {question}Answer: """# 创建Prompt          
prompt = PromptTemplate(template=template, input_variables=["question"])# 调用LLM Chain --- 我们以后会详细讲LLM Chain
llm_chain = LLMChain(prompt=prompt,llm=llm
)# 准备问题
question = "Rose is which type of flower?"# 调用模型并返回结果
print(llm_chain.run(question))

可以看出,这个集成过程非常简单,只需要在 HuggingFaceHub 类的 repo_id 中指定模型名称,就可以直接下载并使用模型,模型会自动下载到 HuggingFace 的 Cache 目录,并不需要手工下载。

初始化 LLM,创建提示模板,生成提示的过程,你已经很熟悉了。这段代码中有一个新内容是我通过 llm_chain 来调用了 LLM。这段代码也不难理解,有关 Chain 的概念我们以后还会详述。

不过,我尝试使用 meta-llama/Llama-2-7b-chat-hf 这个模型时,出现了错误,因此我只好用比较旧的模型做测试。我随便选择了 google/flan-t5-small,问了它一个很简单的问题,想看看它是否知道玫瑰是哪一种花。

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

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

相关文章

若依在表格中如何将字典的键值转为中文

文章目录 一、需求:二、问题解决步骤1、给需要转换的列绑定formatter属性2、获取字典项3、编写formatter属性绑定的方法 一、需求: 后端有时候返回的是字典的键值,在前端展示时需要转成中文值 后端返回的是dictValue,现在要转换…

【Git】本地仓库文件的创建、修改和删除

目录 一、基本信息设置 1、设置用户名2、设置用户名邮箱 二、Git仓库操作介绍 1、创建一个新的文件夹2、在文件内初始化git仓库(创建git仓库)3、向仓库中添加文件 1.创建一个文件2.将文件添加到暂存区3.将暂存区添加到仓库 4、修改仓库文件 1.修改文件2.…

java中数组

文章目录 java中数组思维导图数组数组概念 数组定义格式详解数组的访问 常见异常数组索引值越界异常:ArrayIndexOutOfBoundsException空指针异常:NullPointerException 案例例一打印A-Z和0-9例二数组转置输出 java中数组 思维导图 数组 数组概念 组就…

Java8常用新特性

目录 简介 1.默认方法 2..Lambda表达式 3.Stream API 4.方法引用 5.Optional类 简介 Java 8是Java编程语言的一个重要版本,引入了许多令人兴奋和强大的新特性。这些特性使得Java程序更加现代化、灵活和高效。让我们一起来探索一些Java 8的常用新特性吧&#…

NestJS 如何自定义中间件以及实际项目基于中间件提升项目开发效率

前言 NestJS 作为一个强大的 Node.js 框架,允许你通过中间件对请求和响应进行处理。中间件的概念在其他许多框架中也存在,它们在请求处理流程的早期执行,因此非常适合执行如日志记录、请求验证、设置响应头等任务。 在这篇教程中&#xff0…

Mac 下载 nvm 后执行nvm -v 命令报错 nvm: command not found

1、问题:Mac 使用命令下载nvm 成功后执行 nvm -v 查看,报错:nvm command not found 2、原因:可能是系统更新后,默认的 shell 是 zsh,所以找不到配置文件 3、解决:可添加编辑.bash_profile 和 …

回归和拟合的关系

在统计学和机器学习中,回归(Regression)和拟合(Fitting)是密切相关的概念,它们通常一起使用来描述如何通过模型来逼近或拟合数据。 回归(Regression): 回归是一种统计学…

Docker 安装部署

1、Docker 安装 ① 卸载docker,清空之前的docker文件 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce…

2021腾讯、华为前端面试题集(基础篇)

Vue 面试题 生命周期函数面试题 1.什么是 vue 生命周期2.vue 生命周期的作用是什么 3.第一次页面加载会触发哪几个钩子 4.简述每个周期具体适合哪些场景 5.created 和 mounted 的区别 6.vue 获取数据在哪个周期函数 7.请详细说下你对 vue 生命周期的理解? **vue 路由…

达梦数据库主备集群

1:服务器硬件需求 按实际业务需求,选择合适的服务器,准备 3 台服务器,一台主库服务器,一台备库服务器,一台监视器服务器,服务器参数建议如下: 硬件要求物理内存>16 GB交换区Swa…

MySQL同步ES的几种方案

MySQL数据同步ES的几种方案 1. 同步双写 与业务耦合深,且业务响应时间长 2. 异步双写 这时可以使用类似MQ这样的中间件,业务主写时向MQ发送一条信息,再由一个聚合服务区消费,最终同步到ES 3. 定时任务 不好配置时间,…

Spring Boot - Application Events 的发布顺序_ContextRefreshedListener

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的,它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

2024年最新软件测试面试题

Part1 1、你的测试职业发展是什么?【文末有面试文档免费领取】 测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做…

Python——猜猜心里的数字(2)

1、数字随机产生,范围1-10 2、有三次机会猜数字通过三层嵌套 3、每次猜不中,提示大小 import random numrandom.randint(1,10) guess_num int(input("请输入您猜测的值:")) if guess_numnum:print("恭喜你,第一次…

【漏洞复现】Office365-Indexs-任意文件读取

漏洞描述 Office 365 Indexs接口存在一个任意文件读取漏洞,攻击者可以通过构造精心设计的请求,成功利用漏洞读取服务器上的任意文件,包括敏感系统文件和应用程序配置文件等。通过利用此漏洞,攻击者可能获得系统内的敏感信息,导致潜在的信息泄露风险 免责声明 技术文章…

LLM之长度外推(二)| Self-Extend:无需微调的自扩展大模型上下文窗口

论文链接:https://simg.baai.ac.cn/paperfile/a34ae7f4-f0ce-4f8f-b8f2-e8e4d84bbee5.pdf 目前大模型基本都采用transformer结构,而transformer中attention机制的计算复杂度与序列长度呈平方关系,因此大模型在训练时候通常会设置固定的上下文…

案例117:基于微信小程序的新闻资讯系统设计与实现

文末获取源码 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder …

NES 模拟器中音画同步问题

背景 模拟器是与游戏和播放器都有相似之处的系统。模拟器与游戏的相似之处,在于都需要一个采集输入–执行逻辑–然后按一定帧率(通常是 60 FPS)把画面显示出来的循环。但是模拟器又需要模拟音频设备,播放音频设备产生的声音样本&…

Ubuntu搭建OpenCV环境(C++)

Ubuntu搭建OpenCV环境(C) 文章目录 Ubuntu搭建OpenCV环境(C)一、环境介绍二、依赖安装三、安装包下载四、opencv安装五、测试 一、环境介绍 虚拟机 :VMware 15.5 OS : Ubuntu 20.04 opencv 版本 : 4.9.0 操作系统安装本文不再赘述&#x…

学习Vue封装的过渡与动画总结

今天学习了Vue封装的过渡与动画&#xff0c;接下来说一下Vue是如何实现的&#xff0c;首先原生的方法是在style元素中给指定元素添加过渡的过渡或动画&#xff0c;但Vue就不需要直接获取到需要过渡或动画的元素&#xff0c;而是使用一个<transition>的标签来包裹住想要过…