使用GTP 3.5 Turbo来进行Fine Tuning(微调)

GPT 3.5 Turbo 的微调功能已经上线有一段时间了。本文我们将讨论如何开始进行微调,包括使用场景和示例。

使用GTP 3.5 Turbo来进行Fine Tuning(微调)

GPT 3.5 Turbo 的微调功能已经上线有一段时间了。本文我们将讨论如何开始进行微调,包括使用场景和示例。

Fine Tuning(微调)的概念是通过提供包含模型输出的训练示例,您可以针对特定的使用场景改进模型的表现。正如 OpenAI 所强调的那样:

Early tests have shown a fine-tuned version of GPT-3.5 Turbo can match, or even outperform, base GPT-4-level capabilities on certain narrow tasks.

OpenAI提到, 通过早期测试结果发现,经过微调的 GPT-3.5 Turbo 在某些特定任务上可以达到甚至超过基础版 GPT-4 的性能水平。

接下来,我们将详细讨论什么是微调、微调的使用场景和示例,以及如何开始自己的微调项目。

  • 什么是 GPT 3.5 Turbo 微调?
  • GPT 3.5 Turbo 微调是如何工作的?
  • GPT 3.5 Turbo 微调的使用场景?
  • 如何开始进行 GPT 3.5 Turbo 微调?

什么是 GPT 3.5 Turbo 微调?

微调是指用特定于您使用场景的示例来进一步优化一个已经预训练的大型语言模型(如 GPT 3.5 Turbo)的过程。您可能知道,GPT 模型是通过几乎整个互联网的文本数据进行训练的。

虽然这些模型本身已经非常出色,但通过微调,您可以根据特定任务对模型进行定制,从而生成更可靠的输出。

微调是指在一个新的、更小的定制数据集上对已经预训练的模型进行训练的过程,以使其适应特定任务或表现出特定的行为。

例如,品牌可能希望对 GPT 3.5 Turbo 进行微调,以匹配一致的语调,提供具有特定格式的更可靠输出等。

微调最成功的应用之一来自 OpenAI 自身(当然),他们通过 Function Calling 功能展现了这一点。在这种情况下,他们对 gpt-3.5-turbo-0613 和 gpt-4–0613 模型进行了微调,使其能够智能地选择输出包含调用函数参数的 JSON 对象。

总之,OpenAI 强调,微调提供了以下几个好处:

  1. 更高质量的结果:相比直接提示,微调能够产生更高质量的输出。
  2. 能够训练更多示例:微调允许使用比单个提示中所能容纳的更多的示例进行训练。
  3. 节省 Token:由于提示更短,微调能够节省 Token 的使用。
  4. 降低延迟:微调可以减少请求的延迟。

GPT 3.5 Turbo 微调的示例和使用场景

正如前面提到的,微调可以改善模型在特定任务上的表现。以下是一些微调的实际应用示例:

改善的引导能力

引导能力是指通过指令将模型的响应引导到特定方向或结果的能力。

示例:一个经过引导能力微调的聊天机器人导师可以调整其回答,使之适应五年级学生的水平,而不是提供复杂的大学水平解释。

可靠的输出格式

确保模型的响应具有一致且预期的结构。

示例:一家软件开发公司可以通过带有格式化代码的数据集对 GPT-3.5 Turbo 进行微调,确保用户在编写 Python 或 JavaScript 时,模型能够建议符合语法的补全。

定制语调

调整模型以反映特定品牌或语调。

示例:Old Spice 品牌通过微调 GPT-3.5 Turbo 开发一个聊天机器人,该机器人以幽默和古怪的方式回应,反映出他们独特的品牌语调。

成本效益输出

调整模型以提供简洁的输出,从而节省 API 成本。

示例:一家媒体公司通过微调 GPT-3.5 Turbo 提供简短的新闻摘要,确保更快的 API 调用和减少高流量移动应用程序的成本。

正如你所看到的,微调的使用场景非常广泛,几乎适用于任何认真考虑将 GPT 模型集成到其应用程序或业务中的企业。


GPT-3.5 Turbo 微调的定价

微调的成本结构如下:

  • 训练成本:每 1,000 个 Token 收费 $0.008
  • 使用成本
  • 输入:每 1,000 个 Token 收费 $0.012
  • 输出:每 1,000 个 Token 收费 $0.016

例如,如果您使用包含 100,000 个 Token 的训练文件对 GPT-3.5 Turbo 进行微调,并运行 3 个 epoch,预计训练成本约为 $2.40。

逐步指南:如何对 GPT-3.5 Turbo 进行微调

现在我们知道了什么是微调,并且有了一些实际示例,下面是开始使用 GPT-3.5 Turbo 进行微调的详细步骤:

  1. 准备您的数据
  2. 上传文件
  3. 创建一个微调任务
  4. 部署微调后的模型

步骤 1:准备您的数据

与以往的 GPT 微调不同,使用 3.5 Turbo 我们需要按照对话流程来结构化训练,引导模型的行为。为此,我们使用 GPT 3.5 Turbo 的消息输入:

聊天模型将一系列消息作为输入,并返回模型生成的消息作为输出。虽然聊天格式旨在使多轮对话变得简单,但对于没有任何对话的单轮任务同样有用。

总结一下,这里是每个消息角色的作用:

  • 系统消息帮助设置助手的行为。
  • 用户消息提供请求,供助手回应。
  • 助手消息存储先前的聊天响应,并可以用来给出所需行为的示例。

可以看出,为了微调的目的,目标是提供用户输入和期望的助手响应的示例。例如,OpenAI 提供了以下示例,用于微调一个偶尔拼写错误的助手(非常实用,我知道):

{ 
  "messages": [ 
    { "role": "system", "content": "You are an assistant that occasionally misspells words" }, 
    { "role": "user", "content": "Tell me a story." }, 
    { "role": "assistant", "content": "One day a student went to schoool." } 
  ] 
}

这里是他们微调文档中的另一个例子,用于微调既严谨又带点讽刺的助手:

{"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?"}]}

在上面的例子中,我们可以看到有三个训练示例(即对话),可以用作训练集。现在,问题是…

对于 GPT-3.5-turbo 的微调,您应该提供多少训练示例?

OpenAI 建议至少提供 10 个训练示例,尽管正如他们强调的那样:

通常情况下,使用 gpt-3.5-turbo 进行微调,在 50 到 100 个训练示例上通常会看到明显的改善,但正确的数量会根据具体的使用案例而有很大变化。

根据我以往的微调经验,我通常会使用至少 100 个示例来获得最佳结果,有时甚至会使用超过 10,000 个训练示例。

好了,当我们有了训练示例后,我们需要将其保存在一个 JSONL 文件中。在这个演示例子中,我将测试这个既严谨又带点讽刺的助手,并创建 7 个类似的示例,以达到至少 10 个的最低要求。

在创建微调任务之前,我们还可以使用数据格式化脚本来确保我们的格式正确。

好的,看起来不错,现在进入下一步,上传我们的 JSONL 文件。

步骤 2:上传文件

接下来,我们需要使用 OpenAI 的 API 上传我们的结构化数据,如下所示,请注意在运行之前您需要设置您的 OpenAI API 密钥:

openai.File.create( 
  file=open("/content/fine_tuning_data.jsonl", "rb"), 
  purpose='fine-tune' 
)

步骤 3:创建微调任务

在上传我们的训练数据之后,现在让我们按照以下步骤创建一个微调任务,您只需更新 file-abc123,将其替换为前一步生成的文件 ID:

openai.api_key = os.getenv("OPENAI_API_KEY") 
openai.FineTuningJob.create(training_file="file-abc123", model="gpt-3.5-turbo")

现在我们可以看到状态已创建,只需等待几分钟完成,我们也可以按以下方式检查状态:

openai.FineTuningJob.retrieve("ft-abc123")

步骤 4:使用微调后的模型

现在微调任务已完成,让我们按以下步骤进行测试,注意您需要更新此处的 OpenAI 组织编号以及微调任务的自定义 IDft:gpt-3.5-turbo:my-org:custom_suffix:id:

completion = openai.ChatCompletion.create( 
  model="ft:gpt-3.5-turbo:my-org:custom_suffix:id", 
  messages=[ 
    {"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, 
    {"role": "user", "content": "What's the capital of France?"} 
  ] 
) 
 
print(completion.choices[0].message)

现在很难说是微调还是系统消息导致了这个响应,因为我们只提供了 10 个示例,所以需要进行更深入的实验,这将在未来的指南中进行讨论。


总结:GPT 3.5 Turbo 微调

虽然微调是提示工程师工具包中的一个强大工具,但需要注意的是,在试图提高模型性能时,通常不应总是将微调作为第一选择。相反,我建议先从一些基本的提示工程开始(例如通过 few shot 学习提供几个示例),以建立一个基准,然后再尝试微调,看看改进效果如何显著。

尽管如此,考虑到微调可以使 3.5 Turbo 的性能达到类似于 GPT-4 的水平,如果您运行的是大规模应用程序,微调的成本节约肯定会累积起来。

本文中我们只是初步介绍了微调的潜力,因此在未来的指南中,我们将提供更多展示如何利用这一新能力的实际示例。


参考:

Getting Started with GPT 3.5 Turbo Fine Tuning
GPT 3.5 Turbo fine tuning has arrived. In this guide we discuss how to get started with fine tuning, including use…
ChatGPT-4o,OpenAI的一小步,人類「AI助理」的一大步
科幻電影「Her」的劇情正在成為現實。