什么是微调 (fine-tuning)? 如何微调 GPT-3.5 模型?
2023年8月23日
Fine-tuning (微调) 是一个可以有效让 ChatGPT 输出符合我们预期的方法。最近 OpenAI 发表了 GPT-3.5 模型的微调功能。在这一篇介绍文中,我们会先介绍微调的概念,接着讲解 OpenAI 的 Fine-tuning API 如何使用,最后会有实际的范例来讲解可以如何做好微调这件事。
什么是微调 (Fine-tuning)? 有什么好处?
在机器学习领域当中,微调 (Fine-tuning) 是指在已经训练好的模型基础上,进一步调整,让你模型的输出能够更符合你的预期。透过微调,我们可以不用重新训练一个新的模型,这让我们能够省去训练新模型的高昂成本。
微调的方式很简单,你只需要准备成对的训练资料。然后喂入 Fine-tuning API 就可以完成了。这边指的成对资料,是输入搭配输出,例如「东京奥运的羽球男单金牌是谁?」这个输入,以及在收到这样的输入时,你认为什么样的输出是理想的,例如「东京奥运的羽球男单金牌是丹麦的羽球选手安赛龙」这个输出。
做好微调,能够让我们获得以下的好处: 比起指令 (prompt),若微调的好,输出的成果会更好。 使用更短的指令来获得理想的输出,这会减少 token 使用,进而降低支出成本,同时加快响应的速度。
这样讲可能有点抽象,让我们举个例子进一步说明。假如今天你要做一个桃园机场的机场智慧客服机器人,你希望这个客服机器人根据桃园机场的相关规定来回答问题。只是如果你直接串接 ChatGPT,效果可能不太理想。当今天输入「可以带猪肉制品入境吗?」会收到以下的回覆:
这个问题的答案取决于您所在的国家和您要进入的国家的法律和规定。 通常来说,猪肉制品可能会受到限制或禁止进入某些国家,特别是那些出现猪瘟或其他猪肉疾病的国家。 如果您计划携带猪肉制品进入某个国家,建议您先询问当地的海关或移民局以获得相关信息和规定。 此外,如果您不确定自己是否可以携带某些物品入境,最好不要冒险,以免违反当地法律和法规。
这个回覆其实挺不错的,但是它有点太过于广泛,不是针对桃园机场的规定。假如你想要 ChatGPT 针对桃园机场的规定回答,你会需要在指令中多加描述,例如改成「你现在是名桃园机场相关规范的专家,我要去桃园机场,请问我可以带猪肉制品入境吗?」
但这会出现几个问题,一个是这样做你的指令会变长,因此 token 消耗数会提高;第二个问题是,有时候即使加上更精确的描述,输出的结果可能还是太广泛,这样在企业级的应用场景不太理想。
而微调可以做到的,就是在微调后,你可以直接透过「可以带猪肉制品入境吗?」这个简短指令,就直接获得针对桃园机场规范的输出。 在了解完微调能做到的,相信你已经迫不及待想在你的企业级产品中,透过微调来获得上述的好处。让我们一起来看看可以怎么做到。
如何使用 Fine-tuning API?
我们可以透过 OpenAI 提供的 Fine-tuning API 来进行微调,以下为中文讲解,想了解更多可以参考 OpenAI 的官方文件。
微调可以分成以下三个步骤
- 准备好训练资料
- 训练微调的模型
- 使用微调后的模型
先来看一下如何准备训练资料。目前 Fine-tuning API 接受 JSONL 的格式如下。在你的训练资料中,你需要提供以下格式的问题与回答
{
"messages": [
{ "role": "system", "content": "<放入系统讯息>" },
{ "role": "user", "content": "<放入使用者的问题>" },
{ "role": "assistant", "content": "<放入理想的回答>." }
]
}
以上面的桃园机场例子来说,你可以提供以下的训练资料
"messages": [
{ "role": "system", "content": "你是桃园机场的智慧助手,你擅长回答任何机场相关的问题与规定" },
{ "role": "user", "可以带猪肉制品入境吗?" },
{ "role": "assistant", "content": "依据行政院农业委员会动植物防疫检疫局所订「常见入境旅客携带动植物或其产品检疫规定参考表」规定,旅客携带肉类或加工肉类(含真空包装)入境时,须向防检局申报检疫,如未附输出国动物检疫证明书或经防检局检疫不合格者,不得输入。 " }
]
在备妥训练资料后,你可以透过 OpenAI 提供的 File API 来上传训练资料,并获得档案的 id ,这个 id 是在使用 Fine-tuning API 时会用到的。
curl -https://api.openai.com/v1/files \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F "purpose=fine-tune" \
-F "file=@path_to_your_file"
接着你要先创建微调任务,然后用训练资料来微调基底模型。可以透过 OpenAI 的 CLI 做到。下方的 TRAIN_FILE_ID_OR_PATH 就是刚刚上面上传档案后拿到的 id ,然后 BASE_MODEL 是要用的模型。前面提到目前 gpt-3.5 与 gpt-4 还没开放,所以目前 BASE_MODEL 有的选择包含 ada、babbage、 curie 或 davinci
curl https://api.openai.com/v1/fine_tuning/jobs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"training_file": "TRAINING_FILE_ID",
"model": "gpt-3.5-turbo-0613",
}'
在完成上述步骤后,需要等 OpenAI 那边帮你微调,等微调完成后,就可以使用了。用法跟一般在用 ChatGPT API 一样,只是这边要加上 org_id
。
curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "ft:gpt-3.5-turbo:org_id",
"messages": [
{
"role": "system",
"content": "你是桃园机场的智慧助手,你擅长回答任何机场相关的问题与规定"
},
{
"role": "user",
"content": "你好,我有一些入境相关的问题"
}
]
}'
因为 OpenAI 把 Fine-tuning API 设计的很好,让你只需要准备好微调资料后,就可以很轻松完成微调。不过,在进行微调时,还是有一些细节要注意。让我们在下个段落进一步说明。
使用 Fine-tuning API 的注意事项
微调能带来的好处是让模型的可操控性提高,让模型可以更针对你的需求场景客制化。然而,做这件事有两个成本。第一个是 API 本身的费用,微调的费用加上使用微调模型的费用,跟原本的 GPT-3.5 模型比,成本会增加 6 - 7 倍左右。
第二个成本则是人力成本。以我们过去帮忙企业导入的场景来说。微调这件事会牵扯好几方共同协作,其中包含负责模型的团队、产品团队、业务团队。以大家比较好理解的客服场景来说,会需要有第一线的资深客服,来协助判断那样的回答是好的回答,把整理好的资料给负责模型的团队,然后有产品经理这个角色在其中统筹一切。
这件事往往不是一次到位,而是来回迭代的。假如你在微调后,仍觉得输出成果不如预期,需要团队拉个会议讨论,重新检视的训练资料,然后花时间修正,然后再进行新一轮的微调。从开始专案到能上生产环境,快则一个月,往往至少要一季。这样的时间与人力成本,绝对不容忽略。
虽说微调可能让某些情境下,模型表现比 GPT-4 来得好,但这不是一定。而原本 GPT-3.5 模型成本不到 GPT-4 成本的十分之一,但假如你要微调的话,成本变成只有约三分之一。假如算上微调时的人力成本,微调的 GPT-3.5 版本,可能会更昂贵,因此如果 GPT-3.5 模型微调后效果还不如 GPT-4 加上 embedding 好,那不如用 GPT-4 加 embedding。
有人可能会问,fine-tuning 跟 embedding 要怎么选? 怎么判断哪个比较好? 判断好坏是很看情境的,通常需要对业务比较熟悉的人来判断 (例如客服的场景需要资深客服判断)。总的来说,fine-tuning 是提升模型的可控性,让模型可以更偏向某个你偏好的语气;embedding 则是让你可以不断即时加入新的资料。事实上两者不冲突,可以一起用。但最终要判断的还是这样的效益值不值得你花那些成本了。
因此我们的建议是,先小范围的测试,在成本与效益之间做好的比较与分析,确保真的值得再大规模微调。