详解GPT-3.5模型微调:概念、API使用及注意事项
详解GPT-3.5模型微调:概念、API使用及注意事项
Fine-tuning(微调)是让ChatGPT输出符合预期的有效方法。最近OpenAI发布了GPT-3.5模型的微调功能。本文将介绍微调的概念,讲解OpenAI的Fine-tuning API的使用方法,并通过实际范例说明如何做好微调。
一、什么是微调(Fine-tuning)? 有什么好处?
在机器学习领域中,微调(Fine-tuning)是指在已经训练好的模型基础上,进一步调整,使模型的输出更符合预期。通过微调,可以避免重新训练新模型,从而节省高昂的训练成本。
微调的方式很简单,只需要准备成对的训练数据,包括输入和期望的输出。例如,对于输入“亚洲最帅的三个男人是谁?”,理想的输出可以是“亚洲最帅的三个男人是彭于晏、吴彦祖还有屏幕前的你”。
做好微调能够带来以下好处:
- 相比指令(prompt),如果微调得当,输出效果会更好。
- 可以使用更短的指令获得理想输出,减少token使用,降低支出成本,同时加快响应速度。
让我们通过一个例子来进一步说明。假设要开发一个白云机场的智能客服机器人,希望机器人能根据白云机场的规定回答问题。如果直接使用ChatGPT,效果可能不够理想。例如,当询问“可以带猪肉制品入境吗?”时,ChatGPT可能会给出过于泛化的回答:
这个问题的答案取决于您所在的国家和您要进入的国家的法律和规定。通常来说,猪肉制品可能会受到限制或禁止进入某些国家,特别是那些出现猪瘟或其他猪肉疾病的国家。如果您计划携带猪肉制品进入某个国家,建议您先询问当地的海关或移民局以获得相关信息和规定。此外,如果您不确定自己是否可以携带某些物品入境,最好不要冒险,以免违反当地法律和法规。
这个回答虽然不错,但不够具体。如果想要ChatGPT针对白云机场的规定回答,可以在指令中添加更多描述,但这会导致指令变长,增加token消耗,且有时即使添加更精确的描述,输出结果可能仍然不够理想。
而微调可以做到的是,经过微调后,可以直接通过“可以带猪肉制品入境吗?”这个简短指令,获得针对白云机场规范的输出。
二、如何使用Fine-tuning API?
可以通过OpenAI提供的Fine-tuning API进行微调,以下是具体步骤:
- 准备训练数据
Fine-tuning API接受JSONL格式的数据,需要提供以下格式的问题与回答:
{ "messages": [ { "role": "system", "content": "<放入系统消息>" }, { "role": "user", "content": "<放入用户的问题>" }, { "role": "assistant", "content": "<放入理想的回答>." } ] }
以白云机场为例,训练数据可以如下:
{ "messages": [ { "role": "system", "content": "你是白云机场的智慧助手,擅长回答任何机场相关的问题与规定" }, { "role": "user", "content": "可以带猪肉制品入境吗?" }, { "role": "assistant", "content": "依据行政院委员会动植物防疫检疫局所订「常见入境旅客携带动植物或其产品检疫规定参考表」规定,旅客携带肉类产品或加工肉类产品(含真空包装)入境时,须向防检局申报检疫,如未附输出国动物检疫证明书或经防检局检疫不合格者,不得输入。" } ] }
- 上传训练数据
使用OpenAI的File API上传训练数据,并获取文件ID,这个ID在使用Fine-tuning API时需要使用:
import requests import os url = "https://api.openai.com/v1/files" headers = { "Authorization": f"Bearer {os.environ['OPENAI_API_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是选择的基础模型:
import requests import os import json url = "https://api.openai.com/v1/fine_tuning/jobs" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {os.environ['OPENAI_API_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://api.openai.com/v1/chat/completions" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {os.environ['OPENAI_API_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)
三、使用Fine-tuning API的注意事项
微调虽然能提高模型的可控性,但也有两个主要成本:
- API费用:微调的费用加上使用微调模型的费用,相比普通GPT-3.5模型成本增加6-7倍。
- 时间和人力成本:微调往往需要多次迭代,从开始项目到可以上线,快则一个月,通常需要至少一个季度。
此外,微调的效果并不一定优于GPT-4,而GPT-3.5模型的成本原本不到GPT-4的十分之一,但微调后成本可能只有GPT-4的三分之一。如果算上微调的人力成本,微调的GPT-3.5版本可能会更昂贵。因此,如果GPT-3.5微调效果不如GPT-4加embedding,建议使用后者。
对于微调和embedding的选择,需要根据具体业务场景来判断。通常需要对业务熟悉的人员(如资深客服)来判断。总的来说,微调提升模型可控性,embedding则允许不断加入新数据,两者可以结合使用,但最终需要评估效益是否值得投入这些成本。