多年来,人工智能以各种形式盛行——从Alexa等虚拟助手到客户服务聊天机器人——但随着ChatGPT的推出,人工智能迎来了关键时刻。这款人工智能应用程序不仅吸引了数百万人的想象力,还成为我们今天正在经历的人工智能革命的催化剂。最近的估计显示,ChatGPT 的用户群超过 1.8 亿,它不仅是最受欢迎的人工智能应用程序,而且是全球使用最广泛的应用程序之一。它还获得了历史上增长最快的消费者应用程序的称号。
尽管 ChatGPT 具有非凡的功能,或者更具体地说是 GPT(为其提供支持的生成式预训练 Transformer 模型)仍具有某些局限性,尤其是在商业环境中应用时。
了解 GPT 在商业应用中的局限性
GPT 的第一个限制是缺乏专业知识。正如预期的那样,一个在庞大但通用的数据上训练的模型不可能知道一切,尤其是考虑到人类知识的快速扩展。此外,GPT 的知识是静态的,当训练结束时就会终止。例如,最新的 GPT-4-o 模型的知识库在 2023 年 10 月结束。
另一个重大限制涉及专有或机密数据的使用。GPT 可能无法完全理解组织的独特数据格式或用户特定请求,从而导致专业任务的效果不佳。此外,还有数据隐私方面的担忧。OpenAI 利用输入 GPT 的数据来训练未来的模型,这意味着使用敏感数据的组织可能会无意中共享机密信息,从而可能违反数据隐私法规。
尽管如此,生成式 AI 的变革潜力(提高生产力和成本效率)已促使组织寻求将 GPT 等 LLM 集成到其专业工作流程中并安全地整合专有数据的方法。这就是微调发挥作用的地方。
微调:根据您的特定需求定制 GPT
微调是采用预先训练好的语言模型,并在针对特定任务或知识领域的专用数据集上进一步训练它的过程。初始预训练阶段涉及向模型提供来自不同来源的大量非结构化数据。相比之下,微调利用针对目标领域或任务的较小、更精心策划和标记的数据集。
在本指南中,我们将引导您逐步了解针对对话数据微调 GPT 的过程。这包括访问 OpenAI 的界面、上传适当的数据集、选择正确的模型、对其进行微调、监控进度以及进行必要的调整。
步骤 1:设置开发环境
首先,您需要安装 OpenAI SDK 来设置开发环境。我们将在本指南中使用 Python SDK 作为示例,但它也可以在 Node.js 和 .NET 中使用。此外,您还需要安装python-dotenv来管理环境变量。
pip install openai python-dotenv
# For Python 3 and above
pip3 install openai python-dotenv
接下来,导入 OpenAI 类并创建一个客户端对象来与 OpenAI 接口交互,该接口充当各种 API 调用的包装器。
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ['OPENAI_API_KEY'],
)
要访问 OpenAI 的 API,您需要一个 API 密钥,该密钥可通过在 OpenAI 开发者平台上注册获得。API 密钥安全地存储在一个.env文件中,可以使用os模块访问该文件,如上所示。
第 2 步:选择正确的模型进行微调
设置好环境后,下一步是选择要微调的模型。OpenAI 目前提供了几种微调模型:
davinci-002
babbage-002
GPT-4-o-mini-2024-07-18
GPT-3.5-turbo
在研究OpenAI 的定价时,您会注意到,尽管最新模型 GPT-4-o-mini 是上下文长度最长的最新模型,但价格相对便宜,仅次于 babbage-002。成本较低的原因是 GPT-4-o-mini 是 GPT 的缩小版,参数更少,从而降低了计算需求。相比之下,GPT-3.5-turbo 和 davinci-002 是更大的模型,具有更多参数和更复杂的架构,这反映在它们更高的训练成本上。最终,您选择的模型应该符合您的特定对话需求和预算限制。
步骤 3:准备微调数据集
选择模型后,下一个关键步骤是准备微调数据。在本指南中,我们将使用My_Custom_Conversational_DataHuggingFace 上提供的数据集,这是一个强大的 AI 开发资源平台,包括数据集。
该数据集非常适合我们的微调场景,因为它包含广泛的对话数据,并且格式化为符合 OpenAI 的聊天完成 API 所需的结构 - 提示完成对,如下所示:
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
此外,该数据集已分为训练和评估子集,省去了我们手动拆分的任务。这种划分对于确保模型在微调和评估期间接触不同的数据至关重要,这有助于防止过度拟合(即模型无法推广到新的、未见过的数据)。
要下载数据集,请使用以下命令从 HuggingFace 克隆其存储库:
git clone https://huggingface.co/datasets/Unified-Language-Model-Alignment/Anthropic_HH_Golden
步骤 4:上传数据集进行微调
准备好数据集后,下一步是使用OpenAI 的文件 API上传它们。下面是如何上传训练和评估数据集的示例,创建将在微调过程中使用的文件对象。
training_dataset = client.files.create(
file=open("training.jsonl", "rb"),
purpose="fine-tune"
)
evaluation_dataset = client.files.create(
file=open("evaluation.jsonl", "rb"),
purpose="fine-tune"
)
上传成功后,返回的文件对象将包含一个id唯一标识该文件的属性。
步骤 5:启动微调过程
上传数据集后,就可以使用微调 API 创建微调作业了。所需的主要参数是模型名称和训练文件的id。如果您还上传了评估数据集,则可以将其包含在微调作业中,如下所示:
ft_job = client.fine_tuning.jobs.create(
model="model_name",
training_file=training_dataset.id,
validation_file=evaluation_dataset.id,
)
您还可以指定超参数,例如 epoch 数、批处理大小和学习率乘数。但是,建议允许 OpenAI 的 API 根据您首次运行的数据集大小自动配置这些设置。如果您希望手动设置这些参数,您的代码将如下所示:
ft_job = client.fine_tuning.jobs.create(
model="model_name",
training_file=training_dataset.id,
validation_file=evaluation_dataset.id,
hyperparameters={
"n_epochs": 5,
"batch_size": 16,
"learning_rate_multiplier": 0.2
}
)
一旦启动,微调作业将返回一个包含 的作业对象id,这对于跟踪作业的进度至关重要。完成后,您将收到一封电子邮件通知,但所需时间将根据模型和数据集大小而有所不同。
步骤 6:监控微调过程
在微调过程中,您可以通过列出与您的作业相关的事件来监控状态。OpenAI 提供了几个训练指标:
训练损失:衡量模型预测值与训练数据中的实际值之间的差异。损失越低,表示性能越好。
训练 token 准确率:训练期间预测正确的 token 的百分比。
验证损失:评估模型在未见数据上的性能,表明其泛化能力。
验证令牌准确度:评估数据集上令牌预测的准确度。
您可以使用以下代码检索这些指标:
client.fine_tuning.jobs.list_events(
fine_tuning_job_id=ft_job.id,
limit=5
)
步骤 7:访问和使用微调模型
微调作业完成后,可能需要一些时间才能完全访问模型。如果模型无法立即使用,则可能仍在加载中。您可以使用其作业检索微调后的模型id:
ft_retrieve = client.fine_tuning.jobs.retrieve(ft_job.id)
print(ft_retrieve)
该fine_tuned_model属性现在将包含您定制的模型的名称,并且该status属性应该指示成功。
您现在可以通过在 GPT-3.5-turbo 和 GPT-4-o-mini 的聊天完成 API 中指定它或通过使用 babbage-002 或 davinci-002 的旧式完成 API 来使用此微调模型:
completion = client.chat.completions.create(
model="your fine-tuned model",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the 2024 World Series?"}
]
)
步骤 8:使用专有数据进行微调:确保隐私和安全
如果您使用专有或机密数据进行微调,则必须采取措施保护这些数据,因为 OpenAI 可能会使用它来训练未来的模型。降低这种风险的一种方法是使用 OpenAI 的非训练端点:
completion = client.chat.completions.create(
model="your fine-tuned model",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the 2024 World Series?"}
],
do_not_train=True
)
另一个有效的策略是采用data on-premises开源开发人员的解决方案,从而实现对数据处理管道的完全控制。
增强你的微调模型
在测试微调模型后,您可能会发现其性能不太符合您的期望,或者不如您所希望的那样一致。在这种情况下,是时候完善和增强您的模型了。OpenAI 提供了几种方法来帮助您改进微调模型,重点关注三个关键领域:
1. 质量:增强微调数据
确保格式正确:仔细检查所有数据点的格式是否正确。结构正确的数据对于模型的学习过程至关重要。
解决弱点:如果您的模型在特定提示上遇到困难,请整合数据点来展示模型应如何应对这些场景。这种有针对性的方法可以显著提高性能。
多样化数据集:确保您的数据集包含各种各样的示例,这些示例可以准确反映您的模型可能遇到的各种提示和响应。多样化的数据集有助于模型在不同场景中更好地泛化。
2. 数量:扩大数据集
复杂任务处理:任务越复杂,所需的数据集就越大。增加数据集大小有助于模型处理更广泛的情况。
边缘案例包含:通过扩展数据集,您更有可能包含非常规数据点或边缘案例。这有助于模型更有效地学习概括,增强其处理意外输入的能力。
防止过度拟合:更大的数据集也可以减轻过度拟合,因为模型有更多不同的数据可供学习,确保它捕捉到真正的底层关系,而不仅仅是记住正确的响应。
3.超参数:微调训练过程
调整微调作业的超参数是另一个关键步骤。以下是如何有效地调整它们:
历元数:
如果出现以下情况则增加:模型在训练和验证数据上的表现均不佳(欠拟合),或者模型的损失正在减少但尚未稳定(收敛缓慢)。
如果:模型在训练数据上表现良好,但在评估数据上表现不佳(过度拟合),或者在初始改进后损失增加(早期收敛),则减少。
学习率乘数:
如果模型收敛缓慢或者您正在处理特别大的数据集,则增加。
如果模型的损失出现大幅波动(振荡)或出现过度拟合的迹象,则减少。
批次大小:
如果出现以下情况则增加:模型微调成功,允许使用更大的批量来加快进程,或者损失正在波动。
如果:模型收敛得不太好,则减少,因为较小的批次可以帮助模型更彻底地学习数据,或者尽管进行了其他调整,过度拟合仍然存在。
结论:微调之旅
微调是一个复杂但强大的过程,如果操作正确,可以显著提高生成式AI应用程序的效率。我们鼓励您通过进一步的实验来加深您的理解和技能。这可能涉及调整不同的超参数、试验各种数据集或尝试 OpenAI 提供的不同模型。