五星上将麦克阿瑟曾经说过:“在懂微调的测试工程师面前,我就是个弟弟”
Fine-tuning (微调) 是一个可以有效让ChatGPT 输出符合我们预期的方法。最近OpenAI 发表了GPT-3.5 模型的微调功能。在这一篇介绍文中,我们会先介绍微调的概念,接着讲解接口如何训练使用,最后会有实际的范例来讲解可以如何做好微调这件事。
一、什么是微调(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 时会用到的。
import requests
import os
url = "https:///v1/files"
headers = {
"Authorization": f"Bearer {os.environ['你的key']}"
}
data = {
"purpose": "fine-tune",
}
files = [
('file', open('/path/to/your/file', 'rb'))
]
response = requests.request("POST", url, headers=headers, data=data, files=files)
print(response.text)
接着你要先创建微调任务,然后用训练资料来微调基底模型。可以透过OpenAI 的CLI 做到。下方的TRAIN_FILE_ID_OR_PATH 就是刚刚上面上传档案后拿到的id ,然后BASE_MODEL 是要用的模型。前面提到目前gpt-3.5 与gpt-4 还没开放,所以目前BASE_MODEL 有的选择包含ada、babbage、 curie 或davinci
import requests
import os
import json
url = "https:///v1/fine_tuning/jobs"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {os.environ['你的key']}"
}
data = {
"training_file": "TRAINING_FILE_ID",
"model": "gpt-3.5-turbo-0613",
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.text)
在 完成上述步骤后,需要等OpenAI 那边帮你微调,等微调完成后,就可以使用了。用法跟一般在用ChatGPT API 一样,只是这边要加上org_id
。
import requests
import os
import json
url = "https:///v1/chat/completions"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {os.environ['你的key']}"
}
data = {
"model": "ft:gpt-3.5-turbo:org_id",
"messages": [
{
"role": "system",
"content": "你是白云機場的智慧助手,你擅長回答任何機場相關的問題與規定"
},
{
"role": "user",
"content": "你好,我有一些入境相關的問題"
}
]
}
response = requests.post(url, headers=headers, data=json.dumps(data))
print(response.text)
因为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 则是让你可以不断即时加入新的资料。事实上两者不冲突,可以一起用。但最终要判断的还是这样的效益值不值得你花那些成本了。
因此我们的建议是,先小范围的测试,在成本与效益之间做好的比较与分析,确保真的值得再大规模微调。
扫码关注微信公众号,会有持续的AI最新消息分享与学习资料,一起来学习吧
如果你还有什么疑问,请从下方留言吧~