如果微调模型未能达到理想效果,请考虑对您的流程进行以下迭代。
迭代数据质量
以下是一些改进训练数据集质量的建议:
- 收集示例以解决剩余问题。
- 如果模型在某些方面表现仍然不佳,请添加训练示例,直接向模型展示如何正确处理这些方面。
- 仔细检查现有示例是否存在问题。
- 如果模型存在语法、逻辑或风格问题,请检查你的数据是否也存在同样的问题。例如,如果模型现在会说“我将为您安排此次会议”(而它本不应该这么说),请查看现有示例是否教导模型说它可以做那些它实际上做不到的新事情。
- 考虑数据的平衡性和多样性。
- 如果数据中有 60% 的助手回复是“我无法回答此问题”,但在实际推理时只有 5% 的回复应该这么说,那么你可能会遇到模型过度拒绝的情况。
- 确保你的训练示例包含响应所需的所有信息。
- 如果我们希望模型根据用户的个人特征来赞美用户,而某个训练示例中的助手赞美了前文对话中未提及的特征,模型可能会学会产生幻觉信息。
- 检查训练示例中的一致性和吻合度。
- 如果由多人创建训练数据,模型的性能很可能受限于人与人之间的一致性和吻合度。例如,在文本提取任务中,如果提取结果的一致性只有 70%,那么模型的表现可能很难超过这个水平。
- 确保你所有的训练示例都采用推理时所期望的相同格式。
迭代数据数量
一旦你对示例的质量和分布感到满意,就可以考虑扩大训练示例的数量。这通常有助于模型更好地学习任务,尤其是应对可能的“边缘情况”。我们预计,每次将训练示例的数量翻倍时,都会获得相近幅度的性能提升。你可以通过以下方式粗略估计增加训练数据量所带来的预期质量提升:
- 在当前完整数据集上进行微调
- 在一半的当前数据集上进行微调
- 观察两者之间的质量差距
通常情况下,如果必须做出权衡,少量高质量数据通常比大量低质量数据更有效。
迭代超参数
超参数控制着训练过程中模型权重的更新方式。几个常见的选项包括:
- 训练轮数:Epoch(训练轮次)是在模型训练期间对整个训练数据集进行的一次完整遍历。你通常会运行多个 Epoch,以便模型能够迭代地优化其权重。
- 学习率乘数:调整对模型已学习参数所做更改的幅度。较大的乘数可以加速训练,而较小的乘数则会使训练变慢但更稳定。
- 批次大小:模型在更新其权重之前,在一次前向和反向传播中处理的样本数量。较大的 Batch 会减慢训练速度,但可能会产生更稳定的结果。
我们建议最初训练时不指定其中任何参数,允许我们根据数据集大小为您选择默认值,然后根据您观察到的情况进行调整:
- 如果模型没有按预期那样高度遵循训练数据,请将 epoch 数增加 1 或 2。
- 这种情况在具有单一理想补全(或一小部分相似的理想补全)的任务中更为常见。一些例子包括分类、实体提取或结构化解析。这些任务通常可以针对参考答案计算出最终的准确率指标。
- 如果模型的多样性低于预期,请将 epoch 数减少 1 或 2。
- 这在具有广泛可能良好补全的任务中更为常见。
- 如果模型似乎没有收敛,请增加学习率倍数。
您可以如下所示设置超参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
from openai import OpenAI
client = OpenAI()
client.fine_tuning.jobs.create(
training_file="file-abc123",
model="gpt-4o-mini-2024-07-18",
method={
"type": "supervised",
"supervised": {
"hyperparameters": {"n_epochs": 2},
},
},
)调整数据集
如果您没有看到理想的微调结果,另一种选择是返回并修改您的训练数据。以下是在收集数据集示例时的一些最佳实践。
训练集与测试集
收集示例后,请将数据集拆分为训练集和测试集。训练集用于微调作业,而测试集用于 评估.
当您同时提交包含训练文件和测试文件的微调作业时,我们会在训练过程中提供两者的统计信息。这些统计信息向您发出了模型改进程度的信号。尽早构建测试集有助于您 在训练后评估模型 通过与测试集基准进行比较。
为训练数据设计提示词
将微调前对模型效果最好的指令和提示词组合起来,并将它们包含在每个训练示例中。这应该能让您获得最好且最普适的结果,尤其是在训练示例相对较少(少于 100 个)的情况下。
您可能想缩短在每个示例中重复的指令或提示词以节省成本。但是,如果没有重复的指令,可能需要更多的训练示例才能达到良好的效果,因为模型必须完全通过示例演示来学习。
训练数据中的多轮对话
为了训练模型学习 多轮对话,包含多个 user and assistant 训练数据每行中 messages 数组的 messages。
使用可选的 weight 键(值设置为 0 或 1)以禁用特定 assistant 消息的微调。以下是一些控制 weight in a chat format:
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}]}Token 限制
Token 限制取决于模型。以下是允许的最大上下文长度概述:
| 模型 | 推理上下文长度 | 示例上下文长度 |
|---|---|---|
gpt-4.1-2025-04-14 | 128,000 token | 65,536 个 token |
gpt-4.1-mini-2025-04-14 | 128,000 token | 65,536 个 token |
gpt-4.1-nano-2025-04-14 | 128,000 token | 65,536 个 token |
gpt-4o-2024-08-06 | 128,000 token | 65,536 个 token |
gpt-4o-mini-2024-07-18 | 128,000 token | 65,536 个 token |
超过默认长度的示例将被截断至最大上下文长度,这会从训练示例的末尾移除 token。为确保整个训练示例都能容纳在上下文中,请保持消息内容中的总 token 数低于该限制。
使用以下方式计算 token 数量 the tokenizer tool 或通过代码进行计算,如本 cookbook 示例所示.
在上传数据之前,您可能需要检查数据格式和潜在的 token 成本 - 关于如何执行此操作的示例可在 cookbook 中找到。
了解微调数据格式化