跳至主要内容

微调 OpenAI GPT-4:分步指南

本分步教程深入讲解如何充分发挥 GPT-4 的能力,并通过微调提升其在特定任务上的表现。
· 10分钟 阅读

使用 AI 探索

OpenAI 最先进的模型 Generative Pre-trained Transformer 4(GPT-4) 于 2023 年 3 月发布,在人工智能领域实现了重大飞跃,为 AI 能力树立了新标杆。通过 ChatGPT Plus、OpenAI API 和 Microsoft Copilot 均可使用。GPT-4 以其多模态能力脱颖而出,尤其是通过 GPT-4V,能够同时处理图像与文本,为各领域的创新应用铺平道路。

GPT-4 进步的核心在于其基于 Transformer 的框架,先在来自互联网与授权来源的海量数据上进行预训练,再结合人类反馈与 AI 驱动的强化学习进行微调。这一独特方法旨在提升模型对人类伦理标准与政策合规性的对齐程度。

尽管 GPT-4 较其前代 GPT-3 有所提升,但也继承了后者的一些局限性,凸显了大语言模型与生成式 AI 的复杂挑战。其中部分挑战可通过名为“微调(Fine-tuning)”的过程来应对,这正是本教程的主题。本文目标包括:

  • 理解什么是微调以及何时使用
  • 微调的常见用例
  • 在 Python 中分步实现 OpenAI 微调 API。

需要注意的是,GPT-4 微调目前仅处于实验性访问阶段,符合条件的开发者可通过 微调界面申请访问。话虽如此,本文介绍的微调技术适用于所有 GPT 模型。

什么是微调?

微调是一个精细化过程,它在预训练模型(如 GPT-4)的基础上,面向特定任务或领域进行优化,充分利用模型在多样化数据集上初始训练所获得的广泛基础知识。其核心是基于任务特定数据调整模型参数,从而提升性能,使其能以更高的精度与效率处理特定应用。

微调影响的一个典型例子是提升模型对专业化问题的回答质量。例如,预训练模型可能在回答“天空为何呈蓝色”时给出基础解释;经微调后,该回答可加入更详细的科学背景,更契合如教育平台等专业应用场景。

微调方法从指令微调(使用展示期望响应的特定示例来训练模型)到参数高效微调(PEFT,仅读取并更新模型参数的子集以节省算力并避免灾难性遗忘)不等。

相比之下,检索增强生成(RAG)是一种不同思路。RAG 将基于检索与生成式模型的要素结合,在生成过程中引入外部来源信息,以提升生成内容的质量。

微调侧重于针对特定任务优化已有模型,而 RAG 则通过整合外部知识来丰富内容生成过程。

在微调与 RAG 之间进行选择,取决于应用的具体需求,包括是否需要最新信息、可用计算资源以及所需的任务专业化程度。微调为将预训练模型的庞大知识库直接用于特定任务提供了途径,而 RAG 则以动态方式确保模型所用信息的相关性与准确性。

何时使用微调?

微调OpenAI 的文本生成模型能够强有力地贴合特定需求,但也需要投入可观的时间与资源。在着手微调之前,建议先通过提示工程、提示链(将复杂任务拆分为更简单的顺序提示)以及使用函数来尽量提升模型性能。之所以推荐这样做,原因包括:

  • 模型起初或许难以处理某些任务,但通过设计合适的提示,往往能显著改善效果,在许多情况下无需微调。
  • 调整提示、使用如提示链或函数调用能获得即时反馈,便于快速迭代;相比之下,微调需要构建数据集并训练模型,耗时更长。
  • 即使最终需要微调,先前进行的提示工程工作也不会浪费。将精心设计的提示纳入微调过程,或与微调技术结合,通常能取得最佳效果。

微调的常见用例

微调在以下情形尤其有用:

  • 定制输出特性。当您需要模型遵循特定风格、语气、格式或其他质量要求时,微调可据此塑造其响应。
  • 提升可靠性。对于必须持续产出目标类型输出的应用,微调可提高一致性与可依赖性。
  • 应对复杂提示。如果模型无法很好地遵循复杂指令,微调可帮助其更有效地理解与执行此类提示。
  • 处理边界情况。微调可使模型以特定、预设的方式处理大量边缘案例,从而增强通用性。
  • 学习新技能或任务。当要引入难以通过提示完全表达的新技能或任务时,微调可赋予模型所需能力。

使用 Python 微调 OpenAI GPT 模型的分步指南

鉴于 OpenAI 模型的专有性质,如需微调任一 OpenAI 模型,必须使用 OpenAI 提供的微调 API。该过程需要将您的数据上传至 OpenAI 服务器以进行训练。

目前,仅以下模型支持通过 API 微调:

  • gpt-3.5-turbo-0125,
  • gpt-3.5-turbo-1106,
  • gpt-3.5-turbo-0613,
  • babbage-002,
  • davinci-002

GPT-4 微调处于实验性访问阶段,符合条件的开发者可通过 微调界面申请访问。无论使用哪种模型,微调流程与本教程中的代码均不变。

微调 OpenAI GPT 模型的 6 个步骤

1. 准备训练数据

这是最重要的一步。微调后模型的质量直接取决于您用于微调的数据质量。对于 OpenAI API,数据必须采用 jsonl 格式存储。

JSONL 是一种文本格式,每一行都是一个独立的 JSON 对象,便于逐行处理大规模数据集。该格式特别适用于在不破坏结构的情况下将数据轻松划分为单条记录的场景。

示例:

{"prompt": "<prompt text>", "completion": "<ideal generated text>"}

{"prompt": "<prompt text>", "completion": "<ideal generated text>"}

{"prompt": "<prompt text>", "completion": "<ideal generated text>"}

在本教程中,我仅创建了包含五个示例的样例数据。数据由机器学习各主题的问题与以莎士比亚风格作答的答案构成。

本教程所用的样例数据:

{"messages": [{"role": "system", "content": "You are teaching assistant for Machine Learning. You should help to user to answer on his question."}, {"role": "user", "content": "What is machine learning?"}, {"role": "assistant", "content": "'Tis but the art of teaching machines to think, to learn from data most fine, and decisions to link."}]}

{"messages": [{"role": "system", "content": "You are teaching assistant for Machine Learning. You should help to user to answer on his question."}, {"role": "user", "content": "How doth neural networks work?"}, {"role": "assistant", "content": "They're like the brains of yon digital beast, with layers many, and nodes that cease."}]}

2. 安装 openai 库并设置 API 令牌

使用 OpenAI API 创建微调任务的第一步是上传文件。要使用该 API,您必须在 Python 中安装 openai 库。

!pip install openai

现在登录您的 platform.openai.com 账户并生成一个 API 令牌:

Screenshot of create a new secret key OpenAI platform

然后,您可以使用 os 库将该令牌设置为环境变量。

import os


# Set the OPENAI_API_KEY environment variable
os.environ['OPENAI_API_KEY'] = '...'

3. 上传训练文件

您的训练文件必须为 jsonl 格式。文件上传后,处理可能需要一段时间。文件上传的最大大小为 1 GB。将文件上传到 OpenAI 服务器:

from openai import OpenAI
client = OpenAI()


client.files.create(
  file=open("train.jsonl", "rb"),
  purpose="fine-tune"
)

输出:

FileObject(id='file-rIua39sJX1O64gzxTYfpvJx7', bytes=11165, created_at=1709499930, filename='train.jsonl', object='file', purpose='fine-tune', status='processed', status_details=None)

4. 创建微调模型

在确认文件成功上传后,下一步是创建微调任务。training_file 是上传训练文件至 OpenAI API 时返回的文件 ID。开始一个微调任务:

from openai import OpenAI
client = OpenAI()


client.fine_tuning.jobs.create(
  training_file="file-rIua39sJX1O64gzxTYfpvJx7",
  model="gpt-3.5-turbo" #change to gpt-4-0613 if you have access
)

如需配置更多微调设置,例如验证文件或超参数,请查看微调的 API 文档。

微调任务的完成时间因模型与数据集大小而异,从几分钟到数小时不等。例如,我们在 train.jsonl 数据集中仅有 50 个示例,且使用 gpt-3.5-turbo 模型,任务仅用 7 分钟就完成了。

任务完成后,您还会收到邮件确认。

除了创建微调任务,您还可以查看任务列表、检查特定任务状态或取消任务。

from openai import OpenAI
client = OpenAI()


# List 10 fine-tuning jobs
client.fine_tuning.jobs.list(limit=10)


# Retrieve the state of a fine-tune
client.fine_tuning.jobs.retrieve("...")


# Cancel a job
client.fine_tuning.jobs.cancel("...")


# List up to 10 events from a fine-tuning job
client.fine_tuning.jobs.list_events(fine_tuning_job_id="...", limit=10)


# Delete a fine-tuned model (must be an owner of the org the model was created in)
client.models.delete("ft:gpt-3.5-turbo:xxx:xxx")\

5. 分析微调后的模型

OpenAI 提供关键训练指标,如训练损失、训练 Token 准确率、测试损失与测试 Token 准确率。这些指标有助于确保训练按预期推进,即损失下降、Token 准确率提升。您可在微调任务运行时于事件对象中查看这些有用指标。

{
    "object": "fine_tuning.job.event",
    "id": "ftjob-Na7BnF5y91wwGJ4EgxtzVyDD",
    "created_at": 1693582679,
    "level": "info",
    "message": "Step 100/100: training loss=0.00",
    "data": {
        "step": 100,
        "train_loss": 1.805623287509661e-5,
        "train_mean_token_accuracy": 1.0
    },
    "type": "metrics"
}

您也可以在 UI 中查看这些信息。

Screen shot of OpenAI platform fine-tuning UI

6. 使用微调后的模型

当任务成功完成后,任务详情中会包含 fine_tuned_model 字段,显示模型名称。您可以对该模型发起 API 调用,获得我们刚刚微调过的模型的响应。

from openai import OpenAI
client = OpenAI()


completion = client.chat.completions.create(
  model="ft:gpt-3.5-turbo-0613:personal::8k01tfYd",
  messages=[
    {"role": "system", "content": "You are a teaching assistant for Machine Learning. You should help to user to answer on his question."},
    {"role": "user", "content": "What is a loss function?"}
  ]
)
print(completion.choices[0].message)

输出:

ChatCompletionMessage(content="To measure how far we falter, it guides our way, our hope's defaulter.", role='assistant', function_call=None, tool_calls=None)

结语

本教程带您完成了微调 OpenAI GPT 模型的流程,这是一项将大语言模型强大能力用于特定领域应用的进阶步骤。通过微调,我们能够优化语言模型的回答,使其在处理特定任务、风格或领域时更为精确高效。

本教程使用 OpenAI Python API 对模型进行微调。若您希望通过 UI 在无需编写任何代码的情况下完成同样操作,可查看 Datacamp 上的如何微调 GPT 3.5教程。

由于 GPT 不是开源模型,微调过程相对简单,仅需发起一次 API 调用。这与微调开源模型(如 llama-2、Mistral、Stable Diffusion 等)有很大不同。如果您有兴趣了解如何微调各类开源模型,欢迎查看 DataCamp 上的以下博客:

如需更多面向初学者的 LLM 微调资源,请查看 Datacamp 上的LLM 微调入门指南。

主题