微调

微调模型以获得更好的结果和效率。

通过提供以下功能,Fine-tuning 允许您从 API 提供的模型中获得更多收益:source

  • 比提示更高质量的结果
  • 能够训练比提示所能容纳的更多示例
  • 由于提示时间更短而节省的代币
  • 更低的延迟请求

OpenAI 的文本生成模型已经在大量文本上进行了预训练。为了有效地使用这些模型,我们在提示符中包含说明,有时还包括几个示例。使用演示来展示如何执行任务通常称为 “小样本学习”。source

Fine-tuning 通过训练比提示中容纳更多的示例来改进 Few-shot 学习,从而让您在大量任务上获得更好的结果。微调模型后,您无需在提示中提供尽可能多的示例。这样可以节省成本并实现低延迟请求。source

概括地说,微调包括以下步骤:source

  1. 准备和上传训练数据
  2. 训练新的微调模型
  3. 评估结果并根据需要返回步骤 1
  4. 使用微调后的模型

请访问我们的定价页面,详细了解微调模型训练和使用量的计费方式。source

哪些模型可以微调?

微调目前适用于以下型号:source

  • gpt-4o-2024-08-06
  • gpt-4o-mini-2024-07-18
  • gpt-4-0613
  • gpt-3.5-turbo-0125
  • gpt-3.5-turbo-1106
  • gpt-3.5-turbo-0613

您还可以微调微调后的模型,如果您获取其他数据并且不想重复前面的训练步骤,这将非常有用。source

我们期望gpt-4o-mini在性能、成本和易用性方面成为大多数用户的正确模型。source

何时使用微调

微调 OpenAI 文本生成模型可以使它们更适合特定应用程序,但这需要仔细投入时间和精力。我们建议首先尝试通过提示词工程、提示链接(将复杂任务分解为多个提示)和函数调用来获得良好的结果,主要原因是:source

  • 在许多任务中,我们的模型最初可能表现不佳,但可以通过正确的提示来改进结果 - 因此可能不需要微调
  • 迭代提示和其他策略的反馈循环比迭代微调要快得多,后者需要创建数据集和运行训练作业
  • 在仍然需要微调的情况下,初始的提示词工程工作不会浪费 - 在微调数据中使用好的提示(或将提示链接/工具使用与微调相结合)时,我们通常会看到最佳结果

我们的提示词工程指南提供了一些最有效的策略和战术的背景,这些策略和战术无需微调即可获得更好的性能。您可能会发现在我们的 Playground 中快速迭代提示很有帮助。source

常见用例

微调可以改善结果的一些常见用例:source

  • 设置样式、语气、格式或其他定性方面
  • 提高生产所需输出的可靠性
  • 更正失败以遵循复杂的提示
  • 以特定方式处理许多边缘情况
  • 执行难以在提示中阐明的新技能或任务

考虑这些情况的一种高级方法是 “展示,而不是讲述” 更容易。在接下来的部分中,我们将探讨如何设置数据以进行微调,以及微调可以提高基线模型性能的各种示例。source

微调有效的另一种情况是通过替换更昂贵的模型(如gpt-4o带有微调gpt-4o-mini型。如果您可以使用gpt-4o,您通常可以通过微调gpt-4o-mini模型,在gpt-4ocompletions,可能带有缩短的 INSTRUCTION 提示。source

准备数据集

一旦您确定微调是正确的解决方案(即您已经尽可能优化了提示并确定了模型仍然存在的问题),您就需要准备用于训练模型的数据。您应该创建一组多样化的演示对话,这些对话类似于您在生产中的推理时要求模型响应的对话。source

数据集中的每个示例都应该是与我们的 Chat Completions API 格式相同的对话,特别是一条消息列表,其中每条消息都有一个角色、内容和可选名称。至少一些训练示例应该直接针对提示模型未按预期运行的情况,并且数据中提供的助手消息应该是您希望模型提供的理想响应。source

示例格式

在此示例中,我们的目标是创建一个偶尔会给出讽刺性响应的聊天机器人,以下是我们可以为数据集创建的三个训练示例(对话):source

1
2
3
{"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."}]}

多轮次聊天示例

聊天格式中的示例可以包含多条具有 Assistant 角色的消息。微调期间的默认行为是针对单个示例中的所有 Assistant 消息进行训练。要跳过对特定 Assistant 消息的微调,请使用weight键可以添加对该消息的 Disable 微调,从而允许您控制学习哪些 Assistant 消息。允许的值weight当前为 0 或 1。一些使用weight对于聊天格式,请参见下文。source

1
2
3
{"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", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"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": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

制作提示

我们通常建议在微调之前采用您认为最适合模型的一组说明和提示,并将它们包含在每个训练示例中。这应该可以让您获得最佳和最通用的结果,尤其是在您的训练示例相对较少(例如少于 100 个)的情况下。source

如果您想缩短每个示例中重复的指令或提示以节省成本,请记住,模型的行为可能会像包含这些指令一样,并且可能很难让模型在推理时忽略这些“内置”指令。source

可能需要更多的训练示例才能获得良好的结果,因为模型必须完全通过演示来学习,而无需指导。source

示例计数建议

要微调模型,您需要提供至少 10 个示例。我们通常会看到对 50 到 100 个训练示例进行微调的明显改进gpt-4o-minigpt-3.5-turbo,但正确的数字会因确切的用例而有很大差异。source

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

训练和测试拆分

收集初始数据集后,我们建议将其拆分为训练和测试部分。在提交包含训练和测试文件的微调作业时,我们将在训练过程中提供有关两者的统计信息。这些统计数据将是模型改进程度的初始信号。此外,尽早构建测试集将有助于确保您能够在训练后通过在测试集上生成样本来评估模型。source

令牌限制

令牌限制取决于您选择的模型。以下是最大推理上下文长度和训练示例上下文长度的概述gpt-4o-minigpt-3.5-turbo模型:source

MODEL推理上下文长度训练示例上下文长度
gpt-4o-2024-08-06128,000 个代币65,536 个代币 (128k 即将推出)
gpt-4o-mini-2024-07-18128,000 个代币65,536 个代币 (128k 即将推出)
gpt-3.5-turbo-012516,385 个代币16,385 个代币
gpt-3.5-turbo-110616,385 个代币16,385 个代币
gpt-3.5-turbo-061316,385 个代币4,096 个代币

长于默认值的示例将被截断为最大上下文长度,从而从训练示例的末尾删除标记。要确保您的整个训练示例适合上下文,请考虑检查消息内容中的总令牌计数是否低于限制。source

您可以使用 OpenAI 说明书中的计数令牌笔记本来计算令牌计数。source

估算成本

有关训练成本的详细定价,以及已部署的微调模型的输入和输出成本,请访问我们的定价页面。请注意,我们不对用于训练验证的令牌收费。要估算特定微调训练作业的成本,请使用以下公式:source

(每 1M 输入标记的基本训练成本 ÷ 1M)×输入文件中的标记数 × 训练的纪元数source

对于在 3 个 epoch 中训练了 100,000 个令牌的训练文件,预期成本为:source

  • ~$0.90 美元gpt-4o-mini-2024-07-18免费期于 2024 年 10 月 31 日结束后。
  • ~$2.40 美元gpt-3.5-turbo-0125.

检查数据格式

编译数据集后,在创建微调作业之前,检查数据格式非常重要。为此,我们创建了一个简单的 Python 脚本,您可以使用它来查找潜在错误、查看令牌计数并估算微调作业的成本。source

上传训练文件

验证数据后,需要使用 Files API 上传文件,以便与微调作业一起使用:source

1
2
3
4
5
6
7
from openai import OpenAI
client = OpenAI()

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

上传文件后,可能需要一些时间来处理。在处理文件时,您仍然可以创建微调作业,但在文件处理完成之前,它不会启动。source

最大文件上传大小为 1 GB,但我们不建议使用该数据量进行微调,因为您不太可能需要那么大的数据量才能看到改进。source

视觉微调source

还可以对 JSONL 文件中的图像进行微调。就像您可以将一个或多个图像输入发送到聊天补全一样,您也可以在训练数据中包含这些相同的消息类型。图像可以作为 HTTP URL 或包含 base64 编码图像的数据 URL 提供。source

以下是 JSONL 文件一行上的图像消息示例。下面,为了便于阅读,JSON 对象进行了扩展,但通常此 JSON 会显示在数据文件中的一行上:source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
  "messages": [
    { "role": "system", "content": "You are an assistant that identifies uncommon cheeses." },
    { "role": "user", "content": "What is this cheese?" },
    { "role": "user", "content": [
        {
          "type": "image_url",
          "image_url": {
            "url": "https://upload.wikimedia.org/wikipedia/commons/3/36/Danbo_Cheese.jpg"
          }
        }
      ]
    },
    { "role": "assistant", "content": "Danbo" }
  ]
}

图像数据集要求

大小

  • 您的训练文件最多可以包含 50000 个包含图像的示例(不包括文本示例)。
  • 每个示例最多可以有 10 张图像。
  • 每张图片最大为 10 MB。

格式

  • 图片必须为 JPEG、PNG 或 WEBP 格式。
  • 您的图像必须处于 RGB 或 RGBA 图像模式。
  • 您不能将图像作为消息的输出包含在内,并且assistant角色。

内容审核策略

我们会在训练前扫描您的图像,以确保它们符合我们的使用政策。这可能会在微调开始之前导致文件验证延迟。source

包含以下内容的图像将从您的数据集中排除,并且不会用于训练:source

  • 面临
  • 孩子
  • CAPTCHA 验证码

帮助

如果图片被跳过怎么办

您的图像可能会被跳过,原因如下:source

  • 包含 CAPTCHA包含人物包含人脸包含儿童
    • 删除图像。目前,我们无法使用包含这些实体的图像来微调模型。
  • 无法访问的 URL
    • 确保图像 URL 可公开访问。
  • 图像太大
  • 图像格式无效

如何上传大文件

  • 您的训练文件可能会变得非常大。您可以使用 Uploads API 分多个部分上传最大 8 GB 的文件,而 Files API 只允许上传最大 512 MB 的文件。

降低培训成本

如果将detail参数将图像更改为low,则图像的大小将调整为 512 x 512 像素,并且仅由 85 个标记表示,无论其大小如何。这将降低培训成本。有关更多信息,请参阅此处。source

1
2
3
4
5
6
7
{
    "type": "image_url",
    "image_url": {
        "url": "https://upload.wikimedia.org/wikipedia/commons/3/36/Danbo_Cheese.jpg",
        "detail": "low"
    }
}

视力微调的其他注意事项

  • 要控制图像理解的保真度,请将detail参数image_urllow,highauto对于每个图像。这也将影响模型在训练期间看到的每张图像的标记数,并影响训练成本。有关更多信息,请参阅此处。

创建微调模型

在确保数据集具有正确的数量和结构并上传文件后,下一步是创建微调作业。我们支持通过微调 UI 或以编程方式创建微调作业。source

要使用 OpenAI SDK 启动微调作业,请执行以下作:source

1
2
3
4
5
6
7
from openai import OpenAI
client = OpenAI()

client.fine_tuning.jobs.create(
  training_file="file-abc123",
  model="gpt-4o-mini-2024-07-18"
)

在此示例中,model是要微调的模型的名称。请注意,只有特定的模型快照(如gpt-4o-mini-2024-07-18在这种情况下)可用于此参数,如我们支持的模型中所述。这training_fileparameter 是将训练文件上传到 OpenAI API 时返回的文件 ID。您可以使用 suffix 参数自定义微调模型的名称。source

要设置其他微调参数(如validation_filehyperparameters,请参考 API 规范进行微调source

开始微调作业后,可能需要一些时间才能完成。您的作业可能会排在我们系统中的其他作业之后,训练模型可能需要几分钟或几小时,具体取决于模型和数据集大小。模型训练完成后,创建微调任务的用户将收到一封确认邮件。source

除了创建微调作业之外,您还可以列出现有作业、检索作业状态或取消作业。source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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("ftjob-abc123")

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

# List up to 10 events from a fine-tuning job
client.fine_tuning.jobs.list_events(fine_tuning_job_id="ftjob-abc123", 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:acemeco:suffix:abc123")

使用微调模型

作业成功后,您将看到fine_tuned_model字段,当您检索作业详细信息时,填充了模型的名称。现在,您可以在 Chat Completions API 中将此模型指定为参数,并使用 Playground 向其发出请求。source

作业完成后,模型应立即可用于推理。在某些情况下,您的模型可能需要几分钟才能准备好处理请求。如果对模型的请求超时或找不到模型名称,则可能是因为您的模型仍在加载中。如果发生这种情况,请在几分钟内重试。source

1
2
3
4
5
6
7
8
9
10
11
from openai import OpenAI
client = OpenAI()

completion = client.chat.completions.create(
  model="ft:gpt-4o-mini:my-org:custom_suffix:id",
  messages=[
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Hello!"}
  ]
)
print(completion.choices[0].message)

您可以通过传递模型名称来开始发出请求,如上所示和我们的 GPT 指南中所示。source

使用检查点模型

除了在每个微调作业结束时创建最终的微调模型外,OpenAI 还将在每个训练周期结束时为您创建一个完整的模型检查点。这些检查点本身就是完整的模型,可以在我们的 completions 和 chat-completions 端点中使用。检查点非常有用,因为它们可能会提供微调模型在经历过拟合之前的版本。source

要访问这些检查点,source

  1. 等待作业成功,您可以通过查询作业的状态来验证。
  2. 使用微调作业 ID 查询检查点终端节点,以访问微调作业的模型检查点列表。

对于每个 checkpoint 对象,您将看到fine_tuned_model_checkpoint字段填充了模型检查点的名称。您现在可以像使用最终的微调模型一样使用此模型。source

1
2
3
4
5
6
7
8
9
10
11
12
{
    "object": "fine_tuning.job.checkpoint",
    "id": "ftckpt_zc4Q7MP6XxulcVzj4MZdwsAB",
    "created_at": 1519129973,
    "fine_tuned_model_checkpoint": "ft:gpt-3.5-turbo-0125:my-org:custom-suffix:96olL566:ckpt-step-2000",
    "metrics": {
        "full_valid_loss": 0.134,
        "full_valid_mean_token_accuracy": 0.874
    },
    "fine_tuning_job_id": "ftjob-abc123",
    "step_number": 2000
}

每个检查点将指定其:source

  • step_number:创建检查点的步骤(其中每个纪元是训练集中的步骤数除以批量大小)
  • metrics:一个对象,其中包含在创建检查点时的步骤中微调作业的指标。

目前,仅保存作业最后 3 个 epoch 的检查点并可供使用。我们计划在不久的将来发布更复杂、更灵活的 checkpointing 策略。source

分析微调后的模型

我们提供在训练过程中计算的以下训练指标:source

  • 训练损失
  • 训练标记准确性
  • 有效损失
  • 有效的令牌准确性

有效损失和有效令牌准确性以两种不同的方式计算 - 在每个步骤中的小批量数据上,以及在每个 epoch 结束时的完全有效拆分上。完全有效损失和完全有效令牌准确性指标是跟踪模型整体性能的最准确指标。这些统计数据旨在提供训练是否顺利的健全性检查(损失应该减少,令牌准确性应该提高)。当活动的微调作业正在运行时,您可以查看包含一些有用指标的事件对象:source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
    "object": "fine_tuning.job.event",
    "id": "ftevent-abc-123",
    "created_at": 1693582679,
    "level": "info",
    "message": "Step 300/300: training loss=0.15, validation loss=0.27, full validation loss=0.40",
    "data": {
        "step": 300,
        "train_loss": 0.14991648495197296,
        "valid_loss": 0.26569826706596045,
        "total_steps": 300,
        "full_valid_loss": 0.4032616495084362,
        "train_mean_token_accuracy": 0.9444444179534912,
        "valid_mean_token_accuracy": 0.9565217391304348,
        "full_valid_mean_token_accuracy": 0.9089635854341737
    },
    "type": "metrics"
}

微调作业完成后,您还可以通过查询微调作业、从result_files,然后检索该文件内容。每个结果 CSV 文件都包含以下列:step,train_loss,train_accuracy,valid_lossvalid_mean_token_accuracy.source

1
2
3
4
5
6
step,train_loss,train_accuracy,valid_loss,valid_mean_token_accuracy
1,1.52347,0.0,,
2,0.57719,0.0,,
3,3.63525,0.0,,
4,1.72257,0.0,,
5,1.52379,0.0,,

虽然指标可能有所帮助,但评估微调模型中的样本可提供最相关的模型质量感。我们建议在测试集上从基本模型和微调模型生成样本,并并排比较样本。理想情况下,测试集应包括您在生产使用案例中可能发送到模型的输入的完整分布。如果手动评估太耗时,请考虑使用我们的 Evals 库来自动进行未来的评估。source

迭代数据质量

如果微调作业的结果不如预期,请考虑以下方法来调整训练数据集:source

  • 收集示例以解决剩余问题
    • 如果模型在某些方面仍然不擅长,请添加训练示例,直接向模型展示如何正确执行这些方面
  • 仔细检查现有示例以查找问题
    • 如果您的模型存在语法、逻辑或样式问题,请检查您的数据是否存在任何相同的问题。例如,如果模型现在说“我将为您安排这次会议”(当它不应该这样做时),看看现有示例是否教会了模型说它可以做它不能做的新事情
  • 考虑数据的平衡和多样性
    • 如果数据中 60% 的助理回复说“我无法回答这个问题”,但在推断时只有 5% 的回复应该这么说,那么你可能会得到过多的拒绝
  • 确保您的训练示例包含响应所需的所有信息
    • 如果我们希望模型根据用户的个人特征来赞美用户,并且训练示例包括对上一个对话中未找到的特征的助手赞美,则模型可能会学习产生幻觉信息
  • 查看训练示例中的一致性/一致性
    • 如果多人创建了训练数据,则模型性能可能会受到人员之间协议/一致性水平的限制。例如,在文本提取任务中,如果人们只同意 70% 的提取片段,那么模型可能无法做得更好
  • 确保您的所有训练示例都采用与推理预期相同的格式

迭代数据数量

一旦您对样本的质量和分布感到满意,就可以考虑增加训练样本的数量。这往往有助于模型更好地学习任务,尤其是在可能的 “边缘情况” 时。我们预计每次将训练示例的数量增加一倍时,都会有类似的改进。您可以通过以下方式粗略估计增加训练数据大小的预期质量增益:source

  • 对当前数据集进行微调
  • 对当前数据集的一半进行微调
  • 观察两者之间的质量差距

通常,如果必须进行权衡,则少量的高质量数据通常比大量低质量数据更有效。source

迭代超参数

我们允许您指定以下超参数:source

  • 时代
  • 学习率乘数
  • 批量大小

我们建议在最初训练时不指定任何这些内容,这样我们就可以根据数据集大小为你选择一个默认值,然后根据你观察到以下情况进行调整:source

  • 如果模型没有像预期的那样遵循训练数据,请将 epoch 数增加 1 或 2
    • 对于只有一个理想完成(或一小组类似的理想完成)的任务,这种情况更为常见。一些示例包括分类、实体提取或结构化解析。这些任务通常是您可以根据参考答案计算最终准确性指标的任务。
  • 如果模型的多样性低于预期,请将 epoch 数减少 1 或 2
    • 这对于有大量可能的良好完成的任务更为常见
  • 如果模型似乎没有收敛,请增加学习率乘数

您可以设置超参数,如下所示:source

1
2
3
4
5
6
7
8
9
10
from openai import OpenAI
client = OpenAI()

client.fine_tuning.jobs.create(
  training_file="file-abc123",
  model="gpt-4o-mini-2024-07-18",
  hyperparameters={
    "n_epochs":2
  }
)

微调示例

现在我们已经探索了微调 API 的基础知识,让我们看看几个不同用例的微调生命周期。source

微调集成

OpenAI 使您能够通过我们的集成框架将微调作业与第三方集成。集成通常允许您跟踪 第三方系统中的作业状态、状态、指标、超参数和其他与作业相关的信息。您还可以使用集成根据作业状态更改在第三方系统中触发作。目前,唯一受支持的集成是 Weights 和 Biases,但即将推出更多集成。source

权重和偏差集成

权重和偏差 (W&B) 是跟踪机器学习实验的常用工具。您可以使用 OpenAI 与 W&B 的集成来跟踪您在 W&B 中的微调工作。此集成会自动将指标、超参数和其他与作业相关的信息记录到您指定的 W&B 项目中。source

要将你的微调工作与W&B集成,你需要source

  1. 向 OpenAI 提供 Weights and Biases 帐户的身份验证凭证
  2. 在创建新的微调作业时配置 W&B 集成

使用 OpenAI 验证您的 Weights and Biases 帐户

通过向OpenAI提交有效的W&B API密钥来完成身份验证。目前,这只能通过 Account Dashboard 完成,并且只能由账户管理员完成。您的 W&B API 密钥将在 OpenAI 中加密存储,并允许 OpenAI 在您的微调作业运行时代表您向 W&B 发布指标和元数据。尝试在微调作业上启用W&B集成,而未首先使用WandB验证您的OpenAI组织将导致错误。source

启用 Weights and Biases 集成

创建新的微调作业时,您可以通过包含新的"wandb"集成在integrations字段。此集成允许您指定您希望新创建的W&B运行显示在其下的W&B项目。source

以下是在创建新的微调作业时如何启用 W&B 集成的示例:source

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
curl -X POST \\
    -H "Content-Type: application/json" \\
    -H "Authorization: Bearer $OPENAI_API_KEY" \\
    -d '{
    "model": "gpt-4o-mini-2024-07-18",
    "training_file": "file-ABC123",
    "validation_file": "file-DEF456",
    "integrations": [
        {
            "type": "wandb",
            "wandb": {
                "project": "custom-wandb-project",
                "tags": ["project:tag", "lineage"]
            }
        }
    ]
}' https://api.openai.com/v1/fine_tuning/jobs

默认情况下,Run ID (运行标识) 和 Run display name (运行显示名称) 是微调作业的 ID(例如ftjob-abc123).您可以通过包含"name"字段中的wandb对象。您还可以添加"tags"字段中的wandb对象向 W&B Run 添加标签(标签必须为 <= 64 个字符的字符串,并且最多有 50 个标签)。source

有时,将 W&B 实体显式设置为与运行关联会很方便。为此,您可以包含一个"entity"字段中的wandb对象。如果您不包含"entity"字段中,W&B 实体将默认为与您之前注册的 API 密钥关联的默认 W&B 实体。source

集成的完整规范可以在我们的微调作业创建文档中找到。source

在 Weights and Biases 中查看您的微调作业

在启用了 W&B 集成的情况下创建了微调作业后,您可以通过导航到您在作业创建请求中指定的 W&B 项目来查看 W&B 中的作业。您的运行应位于 URL:https://wandb.ai/<WANDB-ENTITY>/<WANDB-PROJECT>/runs/ftjob-ABCDEF.source

您应该会看到一个新运行,其中包含您在任务创建请求中指定的名称和标签。Run Config 将包含相关的作业元数据,例如:source

  • model:您正在微调的模型
  • training_file:训练文件的 ID
  • validation_file:验证文件的 ID
  • hyperparameters:用于作业的超参数(例如n_epochs,learning_rate_multiplier,batch_size)
  • seed:用于作业的随机种子

同样,OpenAI 将在运行时设置一些默认标签,以便您更轻松地进行搜索和过滤。这些标签将以"openai/"并将包括:source

  • openai/fine-tuning: 标记,让您知道此运行是一项微调作业
  • openai/ft-abc123:微调作业的 ID
  • openai/gpt-4o-mini:您正在微调的模型

从 OpenAI 微调作业生成的 W&B 运行示例如下所示:source

微调作业的每个步骤的指标将记录到W&B运行中。这些指标与微调作业事件对象中提供的指标相同,并且与您可以通过 OpenAI 微调控制面板查看的指标相同。您可以使用 W&B 的可视化工具来跟踪微调作业的进度,并将其与您运行的其他微调作业进行比较。source

记录到 W&B 运行的指标示例如下所示:source

常见问题

我什么时候应该使用微调与嵌入/检索增强生成?

Embeddings with retrieval 最适合于需要具有相关上下文和信息的大型文档数据库的情况。source

默认情况下,OpenAI 的模型被训练为有用的通才助手。微调可用于制作一个聚焦较窄的模型,并表现出特定的根深蒂固的行为模式。检索策略可用于通过在生成响应之前为模型提供相关上下文来使模型可以使用新信息。检索策略不是微调的替代方案,实际上可以作为微调的补充。source

您可以在此 Developer Day 演讲中进一步探讨这些选项之间的差异:source

如何知道我的微调模型是否真的比基本模型更好?

我们建议在一组测试聊天对话中从基本模型和微调模型生成样本,并并排比较样本。要进行更全面的评估,请考虑使用 OpenAI 评估框架创建特定于您的使用案例的评估。source

我可以继续微调已经微调的模型吗?

是的,您可以将微调模型的名称传递到model参数。这将使用微调后的模型作为起点启动新的微调作业。source

如何估算微调模型的成本?

请参阅上面的估算成本部分。source

我可以同时运行多少个微调作业?

请参阅我们的速率限制页面,了解有关限制的最新信息。source

速率限制在微调模型上如何运作?

微调模型从与其所基于的模型相同的共享速率限制中提取。例如,如果您在给定时间段内使用标准gpt-4o-minimodel,您从中微调的任何模型gpt-4o-mini将只能访问 TPM 速率限制的剩余一半,因为容量在同一类型的所有型号之间共享。source

换句话说,从总吞吐量的角度来看,拥有微调的模型并不会为您提供更多使用我们的模型的能力。source