{
"requests": [
"Initialize a new Git repository in the current directory.",
"Clone the repository from GitHub to my local machine.",
"Create a new branch called 'feature-login'.",
...
"Show the differences between the working directory and the staging area.",
"Stage all modified and deleted files for commit.",
]
}技术支持
defgenerate_responses():withopen(JSON_PATH,'r')asfile:
user_messages = json.load(file)for sentence in user_messages['requests']:# Call the OpenAI model gpt-4o-mini and store the response
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role":"system","content": system_prompt},{"role":"user","content": sentence
},],
store=True,
metadata={"task":"git"})
generate_responses()技术支持
完成后,我们将再次使用步骤 3 的代码,这一次把微调后的模型作为 model 参数。微调模型的名称会在微调页面显示为“Output model”。
defgenerate_responses():withopen(JSON_PATH,'r')asfile:
user_messages = json.load(file)for sentence in user_messages['requests']:# Call the OpenAI model gpt-4o-mini and store the response
response = client.chat.completions.create(
model="ft:gpt-4o-mini-2024-07-18:personal:git:AF7QSF0m",
messages=[{"role":"system","content": system_prompt},{"role":"user","content": sentence
},],
store=True,
metadata={"task":"git"})
generate_responses()技术支持
我试用了 OpenAI 的全新 模型蒸馏工具——它几乎不需要编码,就能在同一平台上完成从生成数据集到微调模型与评估其性能的整个蒸馏流程。
在本教程中,我将带您上手 OpenAI 的模型蒸馏工具。我们先回顾模型蒸馏的基础,然后使用OpenAI 的 API做一个蒸馏项目演示。
什么是模型蒸馏?
想象一位学识渊博、经验丰富的老师,将自己的思维过程与知识传授给学生。这就是模型蒸馏的基本工作原理。
在这种技术中,“老师”是一个大型的预训练模型,“学生”是一个较小的模型,它学习去复现老师的输出。这样,学生模型就能以更少的资源,在特定任务上达到与老师相当的水平。
模型蒸馏有多种形式,各自方法与目标不同。有时我们只需要学生模仿大模型的输出;有时我们希望将老师的解题思路灌输进小模型。最终目标是用高效的模型承接大模型的能力。
知识蒸馏
一种常见的“老师”向“学生”传递知识的方法,是用由老师生成的输入及其对应输出构成的数据集,对学生进行微调。
在这个监督学习过程中,学生模型会在遇到相似输入时,学习复现老师的回答。
模型蒸馏的优势
蒸馏过程带来诸多好处:
若想深入了解蒸馏,您可以阅读这篇文章:LLM 蒸馏详解。
如何使用 OpenAI API 实现模型蒸馏
本节我们将基于 OpenAI 平台演示一个模型蒸馏示例。我们的核心任务是根据用户请求生成 Git 命令。
我们首先用 OpenAI 的小型 GPT-4o mini(学生)创建一个数据集,并对输出进行评估。
接着,我们用 GPT-4o(老师)翻译同样的句子,并用老师生成的数据集对学生模型进行微调。
最后,我们需要评估学生模型并检验改进情况。
总结一下,我们将依次完成以下步骤:
步骤 1:选择老师与学生模型
模型蒸馏的第一步是选择老师与学生,这取决于目标任务以及您的算力预算。
在使用开源模型时,您可以选择不同能力与规模的多种 LLM。在 OpenAI 的平台上,可选项更有限。
在我们的示例中,我们选择 GPT-4o mini 作为较小的学生模型,GPT-4o 作为老师模型。
GPT-4o-mini 相对较小,很适合作为学生;GPT-4o 相对更大、能力更强,可以成为高效的老师。
当然还有其他选择,若更换模型,对我们的蒸馏项目来说只需极少改动。
步骤 2:准备数据集
针对这一任务,您的数据集应对学生模型具有足够挑战性,但对老师不至于太难。优质数据集的特性(如多样性、代表性、准确性)在模型蒸馏中同样重要。
数据集的规模也很关键,要足以对学生模型产生影响。关于“蒸馏数据集需要多大?”并无标准答案,这取决于目标任务的复杂度以及所选的老师与学生模型。
根据 OpenAI 文档,几百条样本可能已足够,而更为多样化的数千条样本有时能带来更好的结果。
本文中的数据集由 386 条用户请求构成,存储在一个JSON 文件中(也可以用 Python 列表来存)。
步骤 3:为学生生成输入/输出对(可选)
目前我们的数据集只有输入,因此还需要生成输出。学生的输出并非蒸馏所必需,但我们需要它来获得学生模型准确率的基线(步骤 4)。
我们使用下面的代码遍历输入数据集,并为每条输入生成一个输出:
请注意,我们在调用 OpenAI 模型时使用了
store=True。该参数会将输入/输出对保存到 OpenAI 控制台,因此无需用代码手动存储输出。为便于后续识别和筛选这些对话补全,请在调用
client.chat.completions.create函数时添加 metadata。其参数内容可自定义。生成的输出可以在 OpenAI 控制台的 Chat Completions 区域查看。
步骤 4:评估学生表现(可选)
OpenAI 的另一款对模型蒸馏很有帮助的工具是 Evaluations。我们用它在训练前评估学生模型的性能,作为基线指标;稍后也会用它来评估微调后的学生模型。
在筛选出上一步的对话补全后,点击Evaluate 按钮。接下来需要添加测试标准。
评估输入/输出对的方法有多种。请注意,我们当前的数据集由 OpenAI 的对话补全自动生成,仅包含输入与输出。然而,其中一些标准还需要一个参考答案用于对比。
该参考可以是更强模型(如 GPT-4o 或 o1-preview)生成的输出。由于自动将对话存储到 OpenAI 的方式无法提供此类参考,我们只能使用Criteria match 或Custom prompt 这两种仅需输入与输出的方法。
如果您需要使用其他方法,就不能采用 OpenAI 的对话补全自动存储方式,而必须通过代码自行创建JSON 文件。虽然并不复杂,但本文不展开。
运行评估后,您很快就会收到结果。
步骤 5:为老师生成输入/输出对
要微调学生模型,我们需要由老师生成的高质量数据集。此步骤与步骤 3 基本相同——您只需将
model参数从gpt-4o-mini 改为 gpt-4o。步骤 6:微调学生模型
再次进入 Chat Completions,根据老师模型与 metadata 筛选。然后选择Distill 按钮。OpenAI 的“蒸馏”本质上就是微调工具。
基础模型选择学生模型。超参数需要通过实验来获得最佳效果——可先设为自动。最后点击Create 并等待微调完成。
步骤 7:评估微调后的模型
完成后,我们将再次使用步骤 3 的代码,这一次把微调后的模型作为
model参数。微调模型的名称会在微调页面显示为“Output model”。生成输出后,使用评估工具来衡量新模型在这些输入上的能力。
结语
OpenAI 的蒸馏流程简单明晰。它的优势在于您无需亲自操心模型微调或用代码评估结果。
OpenAI 的模型(包括小模型)本身已相当强大。在微调之前务必对超参数进行试验,为老师与学生都准备足够且有挑战性的提示,并将微调后的评估结果与基线进行对比。
在您亲自动手进行模型蒸馏之前,建议先阅读这两份 OpenAI 资源:OpenAI API 中的模型蒸馏 与 模型蒸馏文档。