微调大型语言模型(一):为什么要微调(Why finetune)?
今天我们来学习Deeplearning.ai的在线课程 微调大型语言模型(一)的第一课:为什么要微调(Why finetune)。
我们知道像GPT-3.5这样的大型语言模型(LLM)它所学到的知识截止到2021年9月,那么如果我们向ChatGPT询问2022年以后发生的事情,它可能会产生“幻觉”从而给出错误的答案,再比如我们有一些关于企业的某些产品的业务数据,但是由于ChatGPT没有学习过这些数据,因此它也无法正确回答出关于这些产品的问题。为了扩大LLM的知识面,让LLM能够更好的学习并掌握新知识从而更好的为用户服务,因此我们需要对LLM进行微调(Finetuning)。
由于常见的开源LLM都有较大的体积,在微调LLM时它对机器的配置有较高的要求,通常要求机器有较大的内存和GPU显存,比如64 GB内存,32G GPU 显存等。因此一般的家用PC很难满足要求,所以我们一般会通过第三方的托管平台的API来实现对开源LLM进行访问和微调,由于本课程使用的是 lamini.ai 平台的API来实现对开源大模型Llama-2-7b模型的访问和微调,因此我们需要去lamini.ai 注册一个账号(可以通过gmail账号直接登录),然后获取免费赠送的Credits(用完后可购买)和 API Key
API Key 设置
我们首先需要在代码中设置 production.key,该key就是我们在注册账号时获取到的Activate API Tokens:
# pip install lamini
from llama import LLMEnginellm = LLMEngine(id="example_llm",config={"production.key": "xxxxxxxxx"})
比较微调与非微调模型
为了让大家更好的理解微调模型和非微调模型的差异,我们需要对两者产生的结果进行比较,也就是我们需要对两种模型提出相同的问题,然后比较它们各自产生的结果。
测试非微调模型
首先我们会对非微调模型Llama-2-7b-hf进行测试,我们会问它几个问题,然后观察它的回答,这里我们对Llama-2-7b-hf 提出这样一个问题:“告诉我如何训练我的狗学会坐下”,由于Llama-2模型目前并不支持中文,所以我们需要使用英语来进行提问:
from llama import BasicModelRunner#加载非微调模型
non_finetuned = BasicModelRunner("meta-llama/Llama-2-7b-hf")#问题:告诉我如何训练我的狗学会坐下
non_finetuned_output = non_finetuned("Tell me how to train my dog to sit")print(non_finetuned_output)
从上面的结果中我们看到Llama-2-7b-hf并没有正确回答问题,它似乎是根据用户的问题,然后用用户的口气又编造了很多重复的问题,这样的回复看上去完全是文不对题,完全不符合要求。下面我们把llm的回复翻译成中文,这样便于大家更好的理解:
#问题:你觉得火星怎么样?
print(non_finetuned("What do you think of Mars?"))
#问题:Twitter的老板是谁?
print(non_finetuned("Who is the boss of Twitter?"))
下面我们来模拟一个代理和客户之间的问题流程,首先代理问候客户->客户提问->代理回答->客户提问->(需要llm回答)
print(non_finetuned("""Agent: I'm here to help you with your Amazon deliver order.
Customer: I didn't get my item
Agent: I'm sorry to hear that. Which item was it?
Customer: the blanket
Agent:"""))
这里我们可以直观的感觉到Llama-2-7b-hf模型在回答用户问题时,往往会不停的重复用户的问题或者重复自己的回复,因此这样的模型完全不能正常的使用(感觉像患上了精神病)。
与微调模型进行比较
下面我们使用微调模型 Llama-2-7b-chat-hf 看看它如何来回答先前那些问题:
#加载微调模型Llama-2-7b-chat-hf
finetuned_model = BasicModelRunner("meta-llama/Llama-2-7b-chat-hf")#问题:告诉我如何训练我的狗学会坐下
finetuned_output = finetuned_model("Tell me how to train my dog to sit")print(finetuned_output)
从上面的结果看,微调模型Llama-2-7b-chat-hf似乎给出了非常正确合理的答案,我们将这个回答翻译成中文,这样方便大家更好的理解:
结果虽然符合我们的要求,但是美中不足的时在返回的结果中在文本的开头位置出现了和问题无关的内容,比如在答案的开头出现了“on command.” 这样的语句,为此我们可以在向LLM提出问题的时候,在问题的头尾两端的位置插入指令提示符合“[INST]”和“[/INST]”,这样就可以避免LLM返回的结果中出现和问题无关的内容:
print(finetuned_model("[INST]Tell me how to train my dog to sit[/INST]"))
从上面的结果中我们看到llm已经过滤掉了和问题无关的内容比如:“on command.”, 但是我们也发现Llama-2-7b-chat-hf回答的结果似乎并不完整,因为第7点的内容并没有出现,这可能是因为llm的tokens数量限制所导致的,这有待后续进一步验证。
下面我们给非微调模型Llama-2-7b-hf加上指令提示符看看会怎么样:
print(non_finetuned("[INST]Tell me how to train my dog to sit[/INST]"))
我们看到非微调模型Llama-2-7b-hf并不能识别指令提示符,它将指令提示符当成了问题组成部分,仍然在不停的重复着用户的问题。
接下来我们继续让微调模型Llama-2-7b-chat-hf回答之前剩下的问题:
#问题:你觉得火星怎么样?
print(finetuned_model("What do you think of Mars?"))
这里我们发现llm的回答又出现了内容不完整的情况,这可能是因为token数量超出限制,所以内容被截断了。
#问题:Twitter的老板是谁?
print(finetuned_model("Who is the boss of Twitter?"))
从上面的结果来看,似乎LLM并不知道 伊隆·马斯克 已经收购了Twitter,而成为了Twitter的新老板,看来它的知识储备量仍然有限,下面我们加上指令提示符看看结果会怎么样:
#问题:Twitter的老板是谁?
print(finetuned_model("[INST]Who is the boss of Twitter?[/INST]"))
从上面的结果我们看到虽然LLM仍然不知道伊隆·马斯克是Twitter的新老板,但是LLM的回答比之前没有加指令提示符的结果更加合理,逻辑更加清晰,内容更加丰富。
接下来我们继续后续的问题:
print(finetuned_model("""Agent: I'm here to help you with your Amazon deliver order.
Customer: I didn't get my item
Agent: I'm sorry to hear that. Which item was it?
Customer: the blanket
Agent:"""))
从上面的结果中我们看到,LLM仍然模拟了多轮的agent-customer之间的对话,从内容上看感觉非常的真实,并且在最后LLM做了总结还评价了agent的表现(感觉是即当球员又当裁判)。
与ChatGPT的比较
接下来我们让ChatGPT来回答之前的第一个关于训练狗的问题,我们来看看ChatGPT的回答与微调模型Llama-2-7b-chat-hf的回答有什么不同:
chatgpt = BasicModelRunner("chat-gpt")#问题:告诉我如何训练我的狗学会坐下
print(chatgpt("Tell me how to train my dog to sit"))
x
下面我们将ChatGPT的回答也翻译成中文,这样便于大家更好的理解:
我们将与之前使用指令提示符的微调模型的结果做一下比对,下面是微调模型Llama-2-7b-chat-hf的结果:
我们发现微调模型Llama-2-7b-chat-hf的结果与ChatGPT3.5模型的结果从质量上来说已经非常的接近了,这似乎说明Llama-2-7b-chat-hf在某些应用场景下存在可以替代ChatGPT3.5的可能性。
总结
今天我们学习了如何使用lamini.ai的API接口来分析开源大模型Llama-2的原始版本和微调版本之间的差异,我们分别加载了原始模型和微调模型,对于相同的问题原始模型表现非常的糟糕,微调模型的表现相对较好,当我们使用指令提示符后微调模型表现的更加优秀,同时我们也发现了微调模型的输出结果不完整的情况, 这可能是由于token数量限制被截断造成的,这有待后续进一步验证,最后我们还比较了ChatGPT和Llama-2微调模型的结果,我们发现Llama-2微调模型的结果的质量非常接近ChatGPT,因此可以认为Llama-2是目前开源LLM中较为优秀的模型。
参考资料
https://lamini-ai.github.io/
DLAI - Learning Platform Beta
相关文章:

微调大型语言模型(一):为什么要微调(Why finetune)?
今天我们来学习Deeplearning.ai的在线课程 微调大型语言模型(一)的第一课:为什么要微调(Why finetune)。 我们知道像GPT-3.5这样的大型语言模型(LLM)它所学到的知识截止到2021年9月,那么如果我们向ChatGPT询问2022年以后发生的事情,它可能会…...
【GO】网络请求例子
post请求;multipart/form-data类型 // 构建请求参数requestData : map[string]interface{}{"gb": "","code": "","reMemberInfo": map[string]interface{}{"shi": "","…...

泡泡玛特海外布局动作不断,开启东南亚潮玩盛会
近日,泡泡玛特海外布局动作不断,9月8日至10日,泡泡玛特2023 PTS潮流玩具展(下简称新加坡PTS)在新加坡滨海湾金沙成功举办,现场人气爆棚,三天吸引了超过2万观众入场,这也是泡泡玛特首…...

uniappAndroid平台签名证书(.keystore)生成
一、安装JRE环境 https://www.oracle.com/java/technologies/downloads/#java8 记住下载默认安装地址。ps:我都默认安装地址C:\Program Files\Java\jdk-1.8 二、安装成功后配置环境变量 系统变量配置 AVA_HOME 放到环境变量去 %JAVA_HOME%\bin 三、生成签名证书…...

Gateway学习和源码解析
文章目录 什么是网关?搭建实验项目demo-servicegateway-service尝试简单上手 路由(Route)断言(Predicate)和断言工厂(Predicate Factory)gateway自带的断言工厂After(请求必须在某个…...

移动机器人运动规划 --- 基于图搜索的Dijkstra算法
移动机器人运动规划 --- 基于图搜索的Dijkstra算法 Dijkstra 算法Dijkstra 算法 伪代码流程Dijkstra 算法步骤示例Dijkstra算法的优劣分析 Dijkstra 算法 Dijkstra 算法与BFS算法的区别就是 : 从容器中弹出接下来要访问的节点的规则不同 BFS 弹出: 层级最浅的原则,…...

Mybatis SQL构建器
上一篇我们介绍了在Mybatis映射器中使用SelectProvider、InsertProvider、UpdateProvider、DeleteProvider进行对数据的增删改查操作;本篇我们介绍如何使用SQL构建器在Provider中优雅的构建SQL语句。 如果您对在Mybatis映射器中使用SelectProvider、InsertProvider…...

怎么将几张图片做成pdf合在一起
怎么将几张图片做成pdf合在一起?在我们平时的工作中,图片和pdf都是非常重要的电脑文件,使用也非常频繁,图片能够更为直观的展示内容,而pdf则更加的正规,很多重要文件大多会做成pdf格式的。在职场人的日常工…...

关于JPA +SpringBoot 遇到的一些问题及解决方法
关于JPA SpringBoot 遇到的一些问题及解决方法(可能会有你正在遇到的) 一、JpaRepository相关 1.1 org.springframework.dao.InvalidDataAccessResourceUsageException: Named parameter not bound : id; nested exception is org.hibernate.QueryEx…...

全国馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许
全国馆藏《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作——2023学生开学季辉少许...

linux升级glibc-2.28
1.准备工作 1.1升级gcc到gcc8 # 安装devtoolset-8-gcc yum install centos-release-scl yum install devtoolset-8 scl enable devtoolset-8 -- bash# 启用工具 source /opt/rh/devtoolset-8/enable # 安装GCC-8 yum install -y devtoolset-8-gcc devtoolset-8-gcc-c devtoolse…...

[Go疑难杂症]为什么nil不等于nil
现象 在日常开发中,可能一不小心就会掉进 Go 语言的某些陷阱里,而本文要介绍的 nil ≠ nil 问题,便是其中一个,初看起来会让人觉得很诡异,摸不着头脑。 先来看个例子: type CustomizedError struct {Err…...
C#60个常见的问题和答案
在本文中,我将帮助你准备好在下一次面试中解决这些与C# 编程语言相关的问题。同时,你可能想练习一些C# 项目。这 60 个基本的 C#面试问题和答案将帮助你了解该语言的技术概念。 目录 什么是 C#? 1.什么是类? 2.面向对象编程的主要概念是什么?...

11:STM32---spl通信
目录 一:SPL通信 1:简历 2:硬件电路 3:移动数据图 4:SPI时序基本单元 A : 开/ 终条件 B:SPI时序基本单元 A:模式0 B:模式1 C:模式2 D:模式3 C:SPl时序 A:发送指令 B: 指定地址写 C:指定地址读 二: W25Q64 1:简历 2: 硬件电路 3:W25Q64框图 4: Flash操作注意…...

kafka的 ack 应答机制
目录 一 ack 应答机制 二 ISR 集合 一 ack 应答机制 kafka 为用户提供了三种应答级别: all,leader,0 acks :0 这一操作提供了一个最低的延迟,partition的leader接收到消息还没有写入磁盘就已经返回ack&#x…...

Django系列:Django开发环境配置与第一个Django项目
Django系列 Django开发环境配置与第一个Django项目 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/1328…...

iPad协议/微信协议最新版
一、了解微信的协议 在开发微信协议之前,需要先了解微信的协议。微信的协议包括登录协议、消息传输协议、文件传输协议、数据同步协议等。其中,登录协议是最重要的协议之一,包括登录验证、登录认证等。消息传输协议则是微信最核心的功能之一…...
URL字符解码
将网页编码文字还原: 例如:https%3A%2F%2Fwww.example.com%2F%3Fparam%3Dvalue%26key%3D%E4%B8%AD%E6%96%87 解码: https: // www.example.com/?paramvalue&key中文 代码: char hexValue(char ch) {if (isdigit(ch)){re…...
uni-app进行表单效验
Uni-app内置了一些表单验证方法,可以帮助我们对表单进行有效的验证。以下是一些常用的验证方法: 非空验证: if(!this.formData.name){uni.showToast({title: 请输入姓名,icon: none});return false; }手机号码验证: const phon…...
IO流内容总结
IO流作用 对文件或者网络中的数据进行读写操作。 简单记:输入流读数据,输出流写数据。 Java的输出流主要以OutputStream和Writer作为基类,输入流主要是以InputStream和Reader作为基类。 按处理数据单元分类 字节流 字节输入流ÿ…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...