查看原文
其他

原创| GPT微调,万字保姆级教程+实操案例

风清徐徐来 AI变现研习社
2024-08-22

你好,我是清风徐来

这是《ChatGPT ,从入门到精通》 系列第 86篇原创文章。

前两天,AI 大模型微调行业 迎来巨变!

OpenAI 宣布,正式开放 GPT3.5 微调 API,并承诺 2023 年内推出 GPT-4 微调 API。

这意味着,所有开发者、企业都可以基于 GPT 这个排名全球第一的通用 AI,结合自己的专有数据,对其进行个性化微调训练。更低成本,打造自己的个性化的专属 GPT 模型。

本公众号第一时间做了报道,详见《OPENAI推出GPT3.5微调模型,允许商业公司开展数据训练

OPENAI 甚至称:初步结果表明,微调后的 GPT-3.5 Turbo,提高了可控性,拥有更可靠的输出格式,还可以自定义语调,提示更短、相同性能,在细分领域任务中,性能与 GPT-4 实力相当,甚至反超 GPT-4。

下面,我们讲讲,GPT微调对行业的影响和实测案例。

文章很长,建议先保存,慢慢学

一、对行业的影响

目前,LLM 大模型应用分为四个领域,“提示词工程”(Prompt Engineering)、“知识库”、“智能体(Agent)”、“微调(fine tuning)”

GPT 微调版发布后,对“提示词工程”影响不大,对其他三者影响很大:

「对“知识库”领域」

原来各个企业做知识库,只能在“开源通用 AI” 上外挂一些数据集,来满足企业的知识管理、客服等的需求,

但是对于一些复杂、细分的领域,这种外挂方式,效果不太好。

OPEN AI 称,在细分领域,GPT3.5 微调后可以达到 GPT4 的水平

如果是这样,可以让企业知识库水平,更有实用价值,上一层楼

「对 Egent」

Egent 是基于大模型,针对某种场景、流程设计的 AI 程序

如果大模型本身通过微调,提高了在专业领域的水平,Egent 的质量也会进一步提升。可以在垂直领域达到专家水平。

「对微调领域」

现有大模型微调,主要基于开源的 llama,几十万到上百万不等;本次 GPT3.5 微调推出,将极大降低微调的成本。GPT 这个底座是超越 llamma 的,在 GPT 微调,会降低微调成本,改变生态。

允许用户对 GPT 微调,标志着 OpenAI 开启了 AI 商业应用的新纪元,也是企业知识库最快商业化的一种方式,这将是有史以来最大的 LoRA 云服务。预计将有一大堆新应用从各行各业涌现出来,包括内部知识管理、算命、情感、销售客服等场景。

二、理论篇

「(一)什么是大语言模型?」

GPT-3.5 是 OpenAI 发布的一款强大的自然语言生成模型,是一种很聪明的电脑程序,它可以学习和使用人类说的话。它们就像一个超级大的字典,里面有很多很多的单词和句子,还有它们的意思和用法。它们可以从这些单词和句子中找出规律和关系,然后用它们来回答问题、写文章、讲故事等等。

见《CHATGPT,从入门到精通「常识篇」

「(二)什么是通用大语言模型?」

GPT 属于通用 AI,通用的大语言模型还包括 谷歌 PaLM 2,Meta 的 LLaMA,

通用指,这个 AI 适用于各种场景,

GPT 的优势在于它已经过大量的数据训练,从而具有广泛的通用知识和语言能力。

「(三)什么是“微调”?」

通用 AI 的缺点是,并没有针对某一个细分场景进行训练。

对于一些特定的应用场景或任务,GPT 可能无法满足用户的需求或期望,例如生成特定风格、格式或内容的文本。给用户的回答可能是正确的废话或无法落地的泛泛而谈,不符合用户场景。

为了解决这个问题,OpenAI 前两天提供了微调 API,让用户可以对 GPT-3.5 进行微调(fine-tuning),即使用自己的数据来调整模型的参数,使其更适应特定的目标。

简单说,微调就是你将某个场景下实际发生的业务数据提交给 GPT,让它学习,然后让 AI 在这个场景下工作。

打个比方,通用 AI 就像一个新入职的职业经理人,他业务熟练、管理经验丰富,但是他对你公司所在的本地市场、业务现状、明潜规则不熟悉;你需要在他到公司上班头两天,带他熟悉各个部门,介绍下公司现状,让尽快熟悉公司。这个职业经理人,才能结合他的专业和管理知识,发挥最大的工作效能。

这种方式,对新员工,叫入职培训,对通用 AI,就叫“微调”。

相对微调,还有一个名词 嵌入(Embedding),意思是你没时间带这个职业经理人,你就写几个 tips,备忘录、锦囊,让他碰到什么时候就翻翻 备忘录,打开锦囊。


「(四)什么是“提示词工程”」

提示工程,就是你公司内部的作业手册,告诉新员工应该做什么事情 同时为了让新员工能圆满完成任务,还需要告诉他很多背景信息,然后员工借助自己的以往工作经验和推理能力,理解工作要求,自主安排、完成工作。

「(五)什么是“智能体 AGENT”」

职业经理人到位后,有些需要更专业人来做,比如电脑坏了,需要出具法律分析,广告设计,职业经理人需要 找 网管、律所、广告公司来承担这些专业的工作。

这些网管、律所、广告公司,就叫智能体 AGENT。

「(六)GPT 微调和 LLaMA 微调的比较」

GPT 微调是通过 OpenAI 的平台进行的,用户需要将自己的数据上传到 OpenAI 的服务器,并通过 OpenAI 的 API 来创建、训练和使用微调模型。

LLaMA 是 meta 公司不久前开源的一款 LLM,用户可以在自己的本地或云端环境中使用。

AI 性能、微调成本上,GPT 更胜一筹;数据安全性上,理论上 LLmama 更好一些。

OPENAI 公司是世界第一的 AI 企业,无数双眼睛盯着的。我个人建议中小企业,可以信赖 OPENAI 公司。

确实资金充足的金融、ZF 企业,可以考虑自建 LLaMA 微调。

三、微调案例

「(一)相关网址」

  • 官方教程:

https://platform.openai.com/docs/guides/fine-tuning/fine-tuning-examples

  • 官方微调网址:

https://platform.openai.com/playground

上述网址已经收录到 AI 工具网站 www.91aitools.cn 中

点击左下角“阅读原文”可达。

「(二)工具准备」

  • 开通 GPT 官方账号

目前可以进行微调的模型包括:gpt-3.5-turbo-0613(推荐)、babbage-002 和 davinci-002。

你需要开通一个官方 OPENAI 账号,如何开通看这里,《ChatGPT 保姆级注册教程(上)原生版

  • 本机安装 python 编程工具,如 vscode,pycharm 等

微调是在 OPEN AI 的服务器上进行,但是需要通过 python 语言(不复杂,不超过 10 行代码),将数据集提交到服务器。

  • 准备数据集

数据集可以手工整理,也可以让 AI 模拟,还可以在数据集上,用程序语言随机抽取。下面演示中,我会让 AI 模拟。

  • 沉浸式翻译

使用 chrome 浏览器插件“沉浸式翻译”,快速学习官方教程。

  • 邀请 AI 助阵。

我将使用地表最强 AI GPT4 ,帮助解决微调中碰到的问题。没有 GPT4,你可以使用 GPT3.5 或者 newbing、perplexity 等其他 AI

「(三)微调步骤」

首先,先判断是否需要微调,因为微调比较花时间和成本。

OPEN AI 公司建议首先尝试通过提示工程、提示分解(将复杂的任务分解为多个提示)和函数调用,优化与 AI 对话结果。确实达不到要求,再进行微调。

如果确定要微调,按以下步骤开展:

「1、第一步“准备训练数据”」

(1)数据的格式要求

当你确定微调是正确的解决方案,将需要准备训练模型的数据。

训练的数据就是一组一组的数据。类似于你有上万张猫咪的图片,AI 自然就清楚猫咪是什么,当你拿第 1 万零 1 张 小猫照片给 AI,AI 也认得出来这是猫咪。

一组数据 类似于一张猫咪的照片

gpt-3.5-turbo 要求使用聊天格式提供每一组数据。

官方给出数据格式示例如下:

{"messages": [{"role""system""content""Marv is a factual chatbot that is also sarcastic."}, {"role""user""content""What's the capital of France?"}, {"role""assistant""content""Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role""system""content""Marv is a factual chatbot that is also sarcastic."}, {"role""user""content""Who wrote 'Romeo and Juliet'?"}, {"role""assistant""content""Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role""system""content""Marv is a factual chatbot that is also sarcastic."}, {"role""user""content""How far is the Moon from Earth?"}, {"role""assistant""content""Around 384,400 kilometers. Give or take a few, like that really matters."}]}

这是段 json 格式的文字。我懒得人工分析,登录 chat.openai.com,请出 GPT4,上传前述 json 格式示例

向AI提问:“帮我分析这段编码”

AI 回答:


这些编码是一些 JSON 格式的数据,代表了不同的对话内容。每段对话都由三部分组成:系统消息、用户消息和助手消息。这里是它们的简要分析:

1. **第一段对话**:
   - **系统**: "Marv is a factual chatbot that is also sarcastic."
   - **用户**: "What's the capital of France?"
   - **助手**: "Paris, as if everyone doesn't know that already."

2. **第二段对话**:
   - **系统**: "Marv is a factual chatbot that is also sarcastic."
   - **用户**: "Who wrote 'Romeo and Juliet'?"
   - **助手**: "Oh, just some guy named William Shakespeare. Ever heard of him?"

3. **第三段对话**:
   - **系统**: "Marv is a factual chatbot that is also sarcastic."
   - **用户**: "How far is the Moon from Earth?"
   - **助手**: "Around 384,400 kilometers. Give or take a few, like that really matters."

从上面的对话中,我们可以看出以下几点:
- **系统消息**描述了一个名为 Marv 的聊天机器人,它既是基于事实的,又带有讽刺意味。
- **用户消息**是对 Marv 的一些基本问题。
- **助手消息**(即 Marv 的回答)在提供正确答案的同时,还带有讽刺的语气。

这些对话似乎是为了展示 Marv 聊天机器人的功能和特点而设计的。

没看太懂,继续

向AI提问:“我不太理解三者之间的关系,能再解释一下么?”

AI 回答:

当然可以。这些 JSON 数据描述了一个虚构的聊天机器人 "Marv" 的对话模式。让我们分步解释三者之间的关系。

1. **系统消息 (system)**:
   这是每段对话的开头。它为对话设定了一个背景或情境。在这里,系统消息告诉我们这个聊天机器人的特点:Marv 既是基于事实的,也是讽刺的。这意味着 Marv 在回答问题时会提供正确的答案,但也可能会用讽刺的语气来回答。

2. **用户消息 (user)**:
   这部分是模拟用户向 Marv 提问的内容。用户提出了一个基本的问题,期望得到一个答案。

3. **助手消息 (assistant)**:
   这是 Marv 的回答。从上述示例中可以看出,Marv 的回答在提供正确答案的同时,还带有讽刺的语气。

将这三部分结合起来,每一段对话描述了以下的流程:
- 系统先介绍 Marv 的特点。
- 用户向 Marv 提出一个问题。
- Marv 以其特有的、带有讽刺意味的方式回答用户的问题。

这些对话可能是为了测试或展示 Marv 聊天机器人的功能和特点而设计的。

大概听懂了,继续

向AI提问:为什么“Marv is a factual chatbot that is also sarcastic”这句要重复三次呢?

AI 回答:


"Marv is a factual chatbot that is also sarcastic" 这句话在每段对话中都被重复是因为它为每段对话设定了一个背景或情境。这样的设计有几个可能的原因:

1. **上下文设定**:对于那些可能只看到单独一段对话的人来说,这句话为他们提供了必要的背景。这意味着,无论某人看到哪一段对话,他们都能够理解 Marv 的特点。

2. **格式一致性**:在每段对话中都包含这样的系统消息可以确保对话的格式和结构保持一致。这使得数据更容易处理和分析,特别是在自动化处理这种数据的场景中。

3. **强调**:重复这句话可以强调 Marv 的特点,确保用户不会忘记 Marv 是基于事实的,同时也是讽刺的。

然而,从数据冗余的角度看,这样的设计可能不是最有效的。在实际应用中,这种重复可能是不必要的,特别是当数据被用于持续的对话或在一个已知的上下文中时。但是,对于展示或测试 Marv 的功能和特点,这种设计可能是有意为之的。

从上述 GPT 的回答中,我们可以进一步理解微调需要的文件格式。

(2)数据的数量要求

要微调模型,按 OPENAI 的要求,需要提供至少 10 个示例。

OPENAI 建议“从 50 个精心制作的训练示例开始,看看模型在微调后是否显示出改进的迹象。在某些情况下,这可能就足够了,但即使模型尚未达到生产质量,明显的改进也是一个好兆头,表明提供更多数据将继续改进模型。没有改进表明,在扩展到有限的示例集之外之前,您可能需要重新考虑如何为模型设置任务或重构数据。”

每个训练示例限制为 4096 个 token。训练时,超过此限制的示例将被截断为前 4096 个令牌。

每个文件目前限制为 50 MB。

(3)数据的注意事项

向AI提问:" 官方教程中‘在微调之前采用你认为最适合模型的一组说明和提示,并将它们包含在每个训练示例中'是什么意思?”

AI 回答:

当然可以。让我们使用一个简化的例子来说明这一点。

假设你正在训练一个聊天机器人模型,你发现当你给模型一个特定的指令,比如 "回答以下问题,并保持礼貌:",模型的输出会更加友好和礼貌。

### 未进行微调前的训练数据
1. 回答以下问题,并保持礼貌:太阳是什么?
   - 答:太阳是一个恒星,位于我们的太阳系中心。

2. 回答以下问题,并保持礼貌:水是什么?
   - 答:水是一个化合物,其化学式为H2O。

现在,你想对模型进行微调,以使其更好地回答关于植物的问题。你有以下训练样本:

1. 什么是玫瑰?
2. 为什么植物是绿色的?

### 微调时的建议
根据上述建议,你应该在每个微调训练样本中都包含 "回答以下问题,并保持礼貌:" 这个指令:

1. 回答以下问题,并保持礼貌:什么是玫瑰?
   - 答:玫瑰是一种常见的花卉,经常用于表示爱情和友谊。

2. 回答以下问题,并保持礼貌:为什么植物是绿色的?
   - 答:植物是绿色的是因为它们含有叫做叶绿素的色素,这种色素帮助植物进行光合作用。

通过这种方式,模型在微调过程中将始终接受到相同的指导,即保持友好和礼貌的指令。这将使模型更加稳定地产生所期望的输出,特别是当你的训练样本相对较少时。
  • 统一性

向AI提问:"官方教程中‘如果在微调过程中对模型使用了重复的指令,并且后来试图简化或删除这些指令,那么模型可能仍会按照这些指令的指导行为'是什么意思?”

AI 回答:

如果你不希望模型在未来的使用中继续遵循这些指令,你应该谨慎地考虑在微调过程中如何使用它们。
如果你决定减少或删除某些在微调时使用的指令,要知道模型可能仍然会按照那些原先的指令行为。
要更改已经“烙印”到模型中的指令,可能需要进行额外的微调或使用更多的训练数据。

-- AI 学习是靠观察

向AI提问:" 官方教程中‘AI模型是通过观察和学习训练数据中的示例来学习的,而不是通过明确的规则或算法'是什么意思?”

AI 回答:

这句话描述了深度学习模型如何学习和工作,尤其是与传统的基于规则的编程方法相对比。我们可以更深入地分析这个概念:

1. **基于规则的编程**:
   在传统的编程中,开发人员会为特定的任务或问题编写明确的规则和算法。例如,如果我们想要创建一个检查数字是否为偶数的程序,我们可能会编写一个规则,检查数字是否可以被2整除。

2. **深度学习模型**:
   与基于规则的方法不同,深度学习模型不依赖于开发人员预先定义的规则。相反,它们从大量的数据中“学习”规律和模式。这意味着,如果我们想要训练一个模型来识别图像中的猫,我们不会告诉模型猫的具体特征(例如,它们有尖耳、毛茸茸的尾巴等)。而是会向模型展示大量的猫的图片和非猫的图片,并告诉模型哪些是猫,哪些不是。通过这种方式,模型会自己“学习”如何识别猫。

3. **观察和学习训练数据中的示例**:
   这意味着模型通过查看训练数据来调整其内部参数,使其能够更好地执行特定的任务。这是一个迭代过程,模型会多次查看数据,每次都尝试改进其预测。

所以,当说“模型是通过观察和学习训练数据中的示例来学习的,而不是通过明确的规则或算法”,这意味着深度学习模型的学习方式是基于数据的,而不是基于人为定义的硬编码规则。

我们可以让 AI 按照格式模拟 15 组数据,

向AI提问:“按刚才提供的JSON格式,直接模拟 15组微调数据 ,内容是推销床垫,假设消费者会从 舒适度、环保、价格、安装难易程度 几个方面 进行提问。要求整理为 mydata.jsonl 文件并提供下载链接” 

GPT4 按要求完成模拟并提供了下载链接

「2、第二步“上传训练文件”」

这一步,我们将上传训练文件到 OPENAI 微调平台

打开 python 的编程软件 pycharm

(1)安装 openai 库

python 是胶水编程语言,它通过“库”来实现对很多外部资源的调用,

要连接 openai,首先要安装 openai 库。

打开 PyCharm, 在底部,您应该看到一个 "Terminal" 选项。点击它以打开内置的终端, 在终端中,输入以下命令并按回车:

 pip install openai

(2)上传训练文件、取得微调 ID

本地新建一个名叫 data.py 的文件,将前述的 mydata.jsonl 文件 拷贝到 data.py 同一目录下

在 data.py 中 输入以下代码

# 本文件用于上传文件,并取得微调ID

# 导入库
import os
import openai

# 导入API KEY
openai.api_key = "sk-XXXX"


# 上传训练文件
training_file = openai.File.create(
  file = open("mydata.jsonl","rb"),
  purpose="fine-tune"
)

# 打印微调ID
print(training_file.id)

运行后,你得到一个微调 ID,如下

请务必保存好这个 ID

「3、第三步“创建微调任务”」

确保数据集的数量和结构正确并上传文件后,下一步是创建微调作业。

(1)创建作业文件

本地新建一个 finetuning.py 文件,输入以下代码

# 本文件用于执行微调
import os
import openai
openai.api_key = "sk-XXXX"
openai.FineTuningJob.create(training_file="更换为你的微调ID", model="gpt-3.5-turbo")

(2)运行作业文件

运行后,在本机 pycharm 看不到提示,但是这段代码让 OPENAI 平台 开始执行微调

根据 OPEN AI 官方教程:

“开始微调工作后,可能需要一些时间才能完成。您的作业可能排在我们系统中的其他作业后面,训练模型可能需要几分钟或几小时,具体取决于模型和数据集大小。模型训练完成后,创建微调作业的用户将收到一封确认电子邮件(你的注册邮箱)。”

注意,OPEN AI 限制一个用户只能同时运行一个 job;1 天只能运行 12 次

你可以在账号的“Rate limits”中查看你的所有权限。

(3)运行完成

运行时间,取决于你的训练数据集的大小和排队人数,

我这次大概大概等了 10 分钟,收到邮件如下:

上面红框中名称,就是使用你的私有数据训练好的一个基于 GPT3.5 的专有模型的名称。保存备用。

「4、第四步“使用微调模型”」

(1)创建使用模型的 python 文件

本地新建一个 runmodel.py

将代码中的 model 名称替换成你的用户名和专有模型名称:

# 执行专有模型

import os
import openai
openai.api_key = "sk-XXXX"

completion = openai.ChatCompletion.create(
  model="更换为你的专用模型名称",
  messages=[
    {"role""system""content""You are a helpful assistant."},
    {"role""user""content""Hello!"}
  ]
)

print(completion.choices[0].message)

在 pycharm 中运行后,出现以下结果表示运行成功

(2)在官方微调平台使用

  • 网址:platform.openai.com/playground

登陆后,在右侧模型处,选择专有模型,就是我们刚才微调后的模型

输入你的问题,点确定

可以看到,AI 的回复,包括通用常识和训练集里面的信息(如保修期 10 年)

四、微调成本

微调 GPT-3.5 的注意事项有以下几点:

  • 微调 GPT-3.5 需要付费:OpenAI 对微调作业和使用微调模型都收取费用。具体费用取决于使用的基础模型、训练数据量、训练参数、输入令牌数和输出令牌数等因素。

微调 GPT-3.5 的成本可以分为两部分:数据集成本、初始训练成本和使用成本。 使用微调模型成本,比日常使用GPT API要高一些

训练:0.008 美元/1K token

使用输入:0.012 美元/1K token

使用输出:0.016 美元/1K token

调用微调模型的成本是 使用原生 GPT3.5 的 8-9 倍

例如,一个 gpt-3.5-turbo 微调任务的训练文件为 100,000 个 token(约 75,000 个英文单词;5 万个中文),那么训练 3 个 epoch 的预期成本为 2.40 美元。

epoch 是机器学习和深度学习训练中的一个常用术语。在训练模型时,一个 epoch 指的是整个训练数据集完整地经过一次训练过程。同一组数据跑 10 次,就是 10 个 epoch。

好啦,今天的分享就到这里

今天主要讲了 GPT 微调的意义、相关理论和初步实操案例。

为了让大家理解技术原理,理论部分较多。

下一步,随着 GPT 微调更多案例和周边工具出现,将继续和大家分享实践经验。

请大家关注、收藏、点赞、分享 哦!以便第一时间收到更多更好玩儿的 ChatGPT 技巧分享哦。

「礼包 1」 本公众号历史文章 搞快收藏!宝藏公众号 AI 类文章合集索引

「礼包 2」 只需在本公众号内回复“AI”,即可免费获得我们为您精心准备的学习大礼包。

「礼包 3 学习群」 如果你想学习 AI 知识,欢迎加入我们的学习群。




继续滑动看下一个
AI变现研习社
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存