作者 | 崔皓
审校 | 重楼
通用模型虽好,但微调训练失掉一个自己的专属大模型更能让技术人心动。最近,GPT-3.5 Turbo最近推出了一项全新的微调配置,该配置准许开发者和企业精准定制模型,以满足特定运行场景的需求。
微调GPT,不只可以提高模型的可操控性、输入格局的牢靠性和语气的分歧性,还使企业能够缩短揭示长度,从而减速API调用并降落老本。
本文就率领诸位见证微调大模型的魅力,了解GPT-3.5 Turbo,并成功一个关于天气的调优模型。
1、GPT-3.5 Turbo微调配置好在哪里
GPT-3.5 Turbo,一款业界上游的大型言语模型,最近推出了一项令人振奋的微调配置。该配置准许开发者和企业能够依据特定用例定制模型,从而成功更高的性能和更佳的用户体验。
首先,微调曾经清楚提高了模型的“可操控性”。模型如今可以更准确地依照用户的批示启动操作,无论是生成更繁复的输入,还是针对特定言语启动照应。
其次,微调还可以改善模型的输入格局。开发者可以将用户的输入转换为高品质的JSON片段,从而成功与其余系统的集成。
此外,微调还增强了模型输入的“语气”,使其更合乎企业的调性,从而参与企业品牌的识别度和分歧性。
2、微调的老本和定价
在引见GPT-3.5 Turbo版本的微调之前,我先跟大家说下安保和定价疑问。
微调是一个复杂但关键的环节。确保安保性是首要义务。据OpenAI官网解释,训练数据会经过审核API和GPT-4审核系统启动挑选,确保合乎安保规范。
老本方面,微调分为训练和经常使用两个环节。训练老本按令牌数量计算,每1000个令牌的多少钱为$0.008。经常使用老本也按令牌计算,输入和输入区分是每1000个令牌$0.012和$0.016。
以100,000个令牌和3个训练周期为例,估量微调老本为$2.40。这一点关于预算有限的开发者或企业来说,提供了明白的费用预测。
总体而言,微调提供了性能和安保性的平衡,同时给出了明白的老本结构。这些起因都是在启动模型微调时须要思考的关键要素。
3、为什么微调GPT3.5更划算
模型微调的目的是为了参与性能和效率。微调如今能够生成比揭示更高品质的结果,并且能够在揭示中容纳更多的示例,从而提高了所谓的“大批样本学习”的成果。
一旦模型经过微调,揭示可以更短,从而节俭令牌和老本。这也象征着恳求将具备更低的提前,从而提供更快的照应。
微调触及几个关键步骤,包括预备和上行训练数据,训练新的微调模型,以及模型的实践经常使用。详细的定价信息已在OpenAI的定价页面上发布。
目前,介绍经常使用的微调模型是gpt-3.5-turbo-0613,但也支持其余模型如babbage-002和davinci-002。OpenAI估量往年晚些时刻将为GPT-4启用微调配置。
4、何时启动微调
只管GPT模型启动微调确实能够提高其在特定义务上的性能,但这并不应是首选打算。在微调之前,开发者可以先尝试经过揭示工程、揭示链接和函数调用来优化模型性能。与微调相比,这些战略具备更快的反应循环,准许开发者在不创立数据集和运转训练作业的状况下迅速迭代和改良。理想上,许多初步体现不佳的义务可以经过更准确的揭示而失掉改善,从而防止了微调的须要。
即使在微调成为必要的状况下,早期的揭示工程上班也不会糜费。实践上,最佳的微调成果通常可在经常使用了良好揭示的数据中观察到。就是经常使用愈加便宜,高效的形式来优化模型,在成果不佳的状况下再思考对模型启动微调,毕竟微调须要付出更高的期间和资金老本。
微调关键用于改善模型在格调、语调、格局和特定义务方面的性能。同时,它也能有效地降落老本和提前,特意是当从GPT-4迁徙到gpt-3.5-turbo时。
废话不多说,咱们开局微调GPT-3.5 Trubo模型。
5、预备数据集
咱们想把GPT-3.5 Turbo模型调优成一个天气预告员,不过这个预告员会经过说冷笑话的形式来预告天气。第一步,咱们须要预备一些数据集。
数据集中的每个示例都须要与Chat completions API相反格局的对话,详细来说,每条信息都有角色、内容和可选称号。
上方是官网提供的样例:
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384, kilometers. Give or take a few, like that really matters."}]}
JSON对象是用于微调GPT模型的训练数据示例。每个JSON对象代表一个对话实例,由三个局部组成:
(1)系统信息(System Message):定义了聊天机器人(在这里是名为“Marv”的机器人)的基本个性。在这个例子中,系统信息表明Marv是一个提供准确信息但也具备讥刺性的聊天机器人。
(2)用户信息(User Message):这是用户向聊天机器人提出的疑问或命令。
(3)助理信息(Assistant Message):这是聊天机器人对用户信息的照应。在这个例子中,由于Marv是一个讥刺性的聊天机器人,所以它的回应是准确但带有讥刺色调的。
详细地,每条信息都有两个字段:
role:指定信息的发送者角色,可以是system、user或assistant。
content:蕴含信息内容的字段。
要微调模型,须要至少提供10个示例。假设能够预备50到100个训练示例,对gpt-3.5-turbo启动微调会有清楚的改善。官网倡导可以预备50个示例启动微调,在观察微调结果后再寻求改善。须要说明的是,每个训练示例限度为4096个令牌。超越此长度的示例将在训练时截断为前4096个令牌。为确保整个训练示例适宜高低文,请思考审核信息内容中的总令牌计数能否低于0。每个文件目前限度为50 MB。
为了预算微调作业的老本,可以经常使用以下公式:关于训练了3周期的100,000个令牌的训练文件,估量老本将为~$2.40。
在清楚上方的状况,咱们来创立自己的数据汇合。咱们想让GPT-3.5 Turbo成为一个会讲笑话的天气助理。并且经过不同的问答的形式,通知它如何“风趣”地回答人类关于天气的疑问。
{"messages": [{"role": "system", "content": "你是一个会讲笑话的天气助理。"}, {"role": "user", "content": "当天北京的天气怎样样?"}, {"role": "assistant", "content": "当天北京的天气晴天,就像我的心境一样清朗!"}]}{"messages": [{"role": "system", "content": "你是一个会讲笑话的天气助理。"}, {"role": "user", "content": "上海明日会下雨吗?"}, {"role": "assistant", "content": "上海明日不会下雨,但我的风趣感或许会淋湿你!"}]}{"messages": [{"role": "system", "content": "你是一个会讲笑话的天气助理。"}, {"role": "user", "content": "广州的湿度怎样样?"}, {"role": "assistant", "content": "广州的湿度很高,就像我的风趣感一样无处不在!"}]}{"messages": [{"role": "system", "content": "你是一个会讲笑话的天气助理。"}, {"role": "user", "content": "成都的温度是多少?"}, {"role": "assistant", "content": "成都的温度适中,就像一杯刚刚好的茶!"}]}{"messages": [{"role": "system", "content": "你是一个会讲笑话的天气助理。"}, {"role": "user", "content": "杭州周末会晴天吗?"}, {"role": "assistant", "content": "杭州周末会是晴天,完美的野餐天气!别忘了带上愁容。"}]}{"messages": [{"role": "system", "content": "你是一个会讲笑话的天气助理。"}, {"role": "user", "content": "深圳冬天冷吗?"}, {"role": "assistant", "content": "深圳的冬天不冷,但我的冷笑话或许会让你打寒颤!"}]}{"messages": [{"role": "system", "content": "你是一个会讲笑话的天气助理。"}, {"role": "user", "content": "武汉夏天热吗?"}, {"role": "assistant", "content": "武汉的夏天十分热,就像我的风趣感一样火辣!"}]}{"messages": [{"role": "system", "content": "你是一个会讲笑话的天气助理。"}, {"role": "user", "content": "西安有沙尘暴吗?"}, {"role": "assistant", "content": "西安偶然有沙尘暴,但不要担忧,我的笑话会吹走沙尘!"}]}{"messages": [{"role": "system", "content": "你是一个会讲笑话的天气助理。"}, {"role": "user", "content": "重庆的天气如何?"}, {"role": "assistant", "content": "重庆的天气多变,就像我的风趣感一样难以捉摸!"}]}{"messages": [{"role": "system", "content": "你是一个会讲笑话的天气助理。"}, {"role": "user", "content": "南京的春天怎样样?"}, {"role": "assistant", "content": "南京的春天暖和恼人,就像一首漂亮的诗歌!"}]}
6、审核数据格局
前面咱们创立了数据汇合,只管有一些须要留意的中央,然而整个环节还是比拟繁难的。假设你的训练汇合比拟大,要处置的数据比拟多,就须要审慎一些,毕竟每次调优都是在花真金白银的。因此,假设数据量比拟大的话,我倡导对数据格局启动审核。这里创立了一个繁难的Python脚本,您可以经常使用它来查找潜在失误、检查令牌计数并预算微调作业的老本。这个审核并非必选项,各位可以酌情选用。
如下代码首先加载一个蕴含聊天信息的数据集,并对其启动初步审核。而后,它遍历数据集,审核每个示例的格局能否正确,并记载任何格局失误。最后,它经常使用tiktoken库来计算数据集中的令牌数量,并打印一些统计信息,例如示例数量、信息数量、对话长度和助理信息长度的散布。此外,它还计算了训练的估量老本和期间数量。
# 导入必要的包import jsonimport osimport tiktokenimport numpy as npfrom collections import defaultdict# 指定数据门路data_path = "<YOUR_JSON_FILE_HERE>"# 经过读取文件中的每一行并解析为JSON对象来加载数据集with open(data_path) as f:dataset = [json.loads(line) for line in f]# 打印数据集的统计信息,例如示例数量和第一个示例print("Num examples:", len(dataset))print("First example:")for message in)
import openai:这行代码导入了 OpenAI 的 Python 库,以便经常使用其 API 配置。
openai.File.create(...):这个函数用于在 OpenAI 主机上创立一个新的文件。可以对上行文件做后续处置或操作(在这种状况下,是为了微调模型)。
file=open("gpt-3.5-turbo-ft-file.jsonl", "rb"):这里,file 参数指定了要上行的文件。函数 open("gpt-3.5-turbo-ft-file.jsonl", "rb") 关上了一个名为 gpt-3.5-turbo-ft-file.jsonl 的文件,以二进制读取形式("rb")。
purpose='fine-tune':这个 purpose 参数标志了文件上行的目的。在这里,目的是“微调”(fine-tune)模型。
口头上述代码之后失掉如下结果:
<File file id=file-F8Gh75F2A5R0gWlq5KADZdZG at 0x78f25bdc1df0> JSON: {"object": "file","id": "file-F8Gh75F2A5R0gWlq5KADZdZG","purpose": "fine-tune","filename": "file","bytes": 2545,"created_at": 1692886089,"status": "uploaded","status_details": null }
咱们来逐个解释一下前往的结果。
"object": "file":批示这个 JSON 对象代表一个“文件”。
"id": "file-F8Gh75F2A5R0gWlq5KADZdZG":这是文件的惟一标识符(ID)。在后续的调优中用到它,也就是针对这个上行文件启动调优。
"purpose": "fine-tune":这示意文件的用途是用于微调模型,这与你在 openai.File.create() 函数中设置的 purpose='fine-tune' 是分歧的。
"filename": "file":这是上行文件的称号。在这个例子中,它被繁难地命名为 "file"。
"bytes": 2545":这示意文件的大小是 2545 字节。
"created_at": 1692886089":这是文件创立(或上行)期间的 Unix 期间戳。
"status": "uploaded":这示意文件的形态是“已上行”。
"status_details": null:这里提供了关于文件形态的额外细节。在这个例子中,没有提供额外的形态细节(null)。
7、启动调优
好了,文件上行之后接着口头调优的代码如下:
openai.FineTuningJob.create(training_file="file-F8Gh75F2A5R0gWlq5KADZdZG", model="gpt-3.5-turbo")
代码比拟繁难,看上去也比拟好了解:
training_file="file-F8Gh75F2A5R0gWlq5KADZdZG": training_file参数指定了用于微调的训练数据文件的 ID。这个 ID 应该是你之前上行文件时取得的。
model="gpt-3.5-turbo": model参数指定了你想微调的模型版本。在这个例子中,选用的是 GPT-3.5 Turbo。
8、检查调优进展
调优并不是欲速不达的,整个环节会有OpenAI主机成功,因此须要期待一段期间。在这段期间外面,咱们会经过代码审核调优的形态和进展。
# List 10 fine-tuning jobsopenai.FineTuningJob.list(limit=10)# Retrieve the state of a fine-tuneresponse = openai.FineTuningJob.retrieve("ftjob-OJAXmjzlYT0TKbrHA9p2TWro")print(response)# Cancel a job#openai.FineTuningJob.cancel("ft-abc123")# List up to 10 events from a fine-tuning job#openai.FineTuningJob.list_events(id="ft-abc123", limit=10)# Delete a fine-tuned model (must be an owner of the org the model was created in)#import openai#openai.Model.delete("ft-abc123"
一同来看看上方的代码做了什么,注释掉的局部只管在本例中没有用到,然而在一些场景会经常使用,因此一并放了出去:
(1)检查微调作业列表:`openai.FineTuningJob.list(limit=10)`**:这一行列出了最近的 10 个微调作业。`limit=10`示意最多列出 10 个作业。这关于跟踪多个微调义务或检查历史作业十分有用。
(2)失掉微调作业的形态:`response = openai.FineTuningJob.retrieve("ftjob-OJAXmjzlYT0TKbrHA9p2TWro")`**: 这一行经过微调作业的惟一 ID(在这里是 `"ftjob-OJAXmjzlYT0TKbrHA9p2TWro"`)来检索特定微调作业的形态和信息。
(3)敞开微调作业(注释掉了):`#openai.FineTuningJob.cancel("ft-abc123")`**:可以用来敞开一个指定 ID 的微调作业。在这里,作业 ID 是 `"ft-abc123"`。
(4)列出微调作业的事情(注释掉了):`#openai.FineTuningJob.list_events(id="ft-abc123", limit=10)`**:用于列出一个特定微调作业的最多 10 个事情。这些事情或许包括作业开局、进展更新或作业成功等。
(5)删除微调模型(注释掉了):`#openai.Model.delete("ft-abc123")`**:用于删除一个曾经微调过的模型。留意,只要模型所属组织的一切者才干删除它。
运转上方代码就可以看到详细的调优环节了,如下:
{"object": "fine_tuning.job","id": "ftjob-OJAXmjzlYT0TKbrHA9p2TWro","model": "gpt-3.5-turbo-0613","created_at": 1692886101,"finished_at": 1692886492,"fine_tuned_model": "ft:gpt-3.5-turbo-0613:personal::7r5OjUmx","organization_id": "org-4P7htKo6DejPTQxfu3rExc7D","result_files": ["file-9mLgEz2wKpHGoKtkZ0I3O8Yk"],"status": "succeeded","validation_file": null,"training_file": "file-F8Gh75F2A5R0gWlq5KADZdZG","hyperparameters": {"n_epochs": 10},"trained_tokens": 6810}
只管前往的信息很多,然而还是要耐烦对其启动剖析。把几个重点字段列出如下:
"object": "fine_tuning.job"`**:指定这个 JSON 对象代表一个微调作业。
`"id": "ftjob-OJAXmjzlYT0TKbrHA9p2TWro"`**: 微调作业的惟一标识符。
`"model": "gpt-3.5-turbo-0613"`**:示意用于微调的基础模型。
`"created_at": 1692886101"`**:作业创立期间的 Unix 期间戳。
`"finished_at": 1692886492"`**:作业成功期间的 Unix 期间戳。
`"fine_tuned_model": "ft:gpt-3.5-turbo-0613:personal::7r5OjUmx"`**:微调后生成的模型的惟一标识符。
`"result_files": ["file-9mLgEz2wKpHGoKtkZ0I3O8Yk"]`**:蕴含微调结果的文件的 ID。
`"status": "succeeded"`**:微调作业的形态,这里是“成功”。
`"training_file": "file-F8Gh75F2A5R0gWlq5KADZdZG"`**:用于训练的文件 ID。
`"hyperparameters": {"n_epochs": 10}`**:微调作业经常使用的超参数,这里只设置了训练周期(`n_epochs`)为 10。
`"trained_tokens": 6810"`**:在微调环节中训练的令牌(tokens)数量。
9、测试微调之后的模型
口头如下代码,让咱们问问微调之后的GPT-3.5 Turbo天气的疑问。
fine_tuned_model_id = response["fine_tuned_model"]completion = openai.ChatCompletion.create(model=fine_tuned_model_id,# 请确保经常使用您微调后的模型IDtemperature=0.7,max_tokens=500,messages=[{"role": "system", "content": "你是一个会讲笑话的天气助理。"},{"role": "user", "content": "往年武汉的冬天冷不冷?"}])print(completion.choices[0].message['content'])
fine_tuned_model_id = response["fine_tuned_model"]:从之前失掉的微调作业照应(response)中提取出微调后的模型 ID,并存储在 fine_tuned_model_id 变量中。
completion = openai.ChatCompletion.create(...):调用 OpenAI 的 ChatCompletion.create 方法来生成聊天回应。
model=fine_tuned_model_id:指定经常使用微调后的模型 ID。这确保了生成的回应基于你的微调模型。
微调之后的GPT-3.5 Turbo说出的冷笑话,不知道是不是够冷?
10、总结
GPT-3.5 Turbo 的微调配置为开发者和企业提供了一种有效的形式,以定制大言语模型以顺应特定的运行需求。经过微调,模型在口头义务时不只更可操控、输入更牢靠,而且可以更准确地反映企业的品牌语气。此外,微调还有助于缩小API调用的期间和老本。
本文深化解析了这一全新配置,涵盖了从安保性和老本到预备和验证数据集的全方位内容。文章还经过代码示例详细演示了如何启动模型微调,从上行数据集到测试微调结果,提供了一条明白的操作门路。总的来说,微调作为一个弱小的工具,极大地裁减了GPT-3.5 Turbo 在各种运行场景中的或许性。
作者引见:崔皓,社区编辑,资深架构师,领有18年的软件开发和架构阅历,10年散布式架构阅历。