剛剛!OpenAI 開(kāi)放 GPT-3.5 微調(diào) API,手把手教你打造專屬 ChatGPT
大數(shù)據(jù)文摘出品
剛剛!OpenAI宣布,開(kāi)放GPT-3.5微調(diào)的API。
這意味著,每個(gè)人都可以基于GPT-3.5微調(diào)自己的模型。
換句話說(shuō),之前用戶在結(jié)合業(yè)務(wù)用例構(gòu)建專屬ChatGPT時(shí)候,需要使用大量的Propmt調(diào)教模型進(jìn)行上下文學(xué)習(xí)?,F(xiàn)在只需要四步即可打造自己的專屬模型:準(zhǔn)備數(shù)據(jù)→上傳文件→創(chuàng)建微調(diào)工作→使用微調(diào)模型。
圖片
據(jù)OpenAI介紹,微調(diào)后的GPT-3.5,在某些特定任務(wù)上可以超越GPT-4。不過(guò),GPT-4的微調(diào) API 也將在今年秋季推出。同時(shí),他們也提到,微調(diào)API傳送的所有數(shù)據(jù)都是客戶的私有資料,OpenAI或其他任何機(jī)構(gòu)都不會(huì)用它來(lái)訓(xùn)練其他模型。
OpenAI的這次開(kāi)放微調(diào)API的操作,文摘菌認(rèn)為是是對(duì)Meta開(kāi)源大模型的應(yīng)對(duì),大模型賽道上,對(duì)那些利用Llama 2開(kāi)源框架將AI微調(diào)部署到下游行業(yè)(例如法律、醫(yī)療等)的企業(yè)而言,將會(huì)有一定程度上的沖擊。賽道上的這些選手將面臨嚴(yán)峻的考驗(yàn)。
微調(diào)后的大模型,有哪些提升?
OpenAI在博客中,提到自GPT-3.5 Turbo面世以來(lái),開(kāi)發(fā)者和各大企業(yè)一直希望能夠?qū)δP瓦M(jìn)行個(gè)性化定制,以便用戶能使用更為獨(dú)特和差異化的體驗(yàn)?,F(xiàn)在,開(kāi)發(fā)者可以通過(guò)有監(jiān)督的微調(diào)技術(shù),讓模型更適合自己的特定需求。
在封閉測(cè)試中,采用微調(diào)的用戶已成功在多個(gè)常用場(chǎng)景下顯著提升了模型的表現(xiàn)。例如:
提高指令遵從性:通過(guò)微調(diào)讓模型更準(zhǔn)確地執(zhí)行指令,無(wú)論是簡(jiǎn)潔地輸出信息,還是始終用指定的語(yǔ)言回應(yīng)。例如開(kāi)發(fā)者可以設(shè)置模型在被要求使用德語(yǔ)時(shí),一律用德語(yǔ)進(jìn)行回應(yīng)。
統(tǒng)一輸出格式:微調(diào)還增強(qiáng)了模型在輸出格式上的一致性,這一點(diǎn)對(duì)需要特定輸出格式的應(yīng)用,顯的尤為重要,如代碼自動(dòng)補(bǔ)全或API調(diào)用生成,開(kāi)發(fā)者可以通過(guò)微調(diào)確保模型可將用戶的輸入準(zhǔn)確轉(zhuǎn)化為與自己系統(tǒng)兼容的高質(zhì)量JSON代碼段。
調(diào)整輸出語(yǔ)氣:微調(diào)還能讓模型的輸出更貼近企業(yè)的品牌語(yǔ)氣。具有明確品牌調(diào)性的企業(yè)可以通過(guò)微調(diào),使模型的輸出與其品牌風(fēng)格更加吻合。
除了性能提升外,微調(diào)還允許用戶在不犧牲性能的前提下,簡(jiǎn)化其使用的提示語(yǔ)。并且,與GPT-3.5 Turbo微調(diào)過(guò)的模型能處理多達(dá)4000個(gè)token,是以前模型的兩倍。有的早期測(cè)試者甚至通過(guò)將指令直接嵌入模型,減少了90%的prompt的浪費(fèi),從而加快API調(diào)用速度并降低成本。
微調(diào)使用指南
目前僅有三款模型支持微調(diào)功能,包括gpt-3.5-turbo-0613、babbage-002、davinci-002。強(qiáng)烈推薦gpt-3.5-turbo,因?yàn)樗谛阅芎筒僮鞅憷陨隙急憩F(xiàn)得相當(dāng)出色。
微調(diào)技術(shù)在以下幾個(gè)常見(jiàn)應(yīng)用場(chǎng)景中具有顯著的效果:
1、設(shè)定具體的輸出風(fēng)格、語(yǔ)調(diào)、格式或其他感性因素;
2、增強(qiáng)模型在生成輸出時(shí)的靠譜性;
3、解決模型對(duì)復(fù)雜Prompt不敏感或無(wú)法準(zhǔn)確響應(yīng)的問(wèn)題;
4、針對(duì)特定場(chǎng)景的邊緣情況進(jìn)行特別處理;
5、用于難以用簡(jiǎn)單Prompt明確描述的新技能或任務(wù)。
因此,從更高的維度上觀察,上述場(chǎng)景僅僅通過(guò)文字或語(yǔ)言指示(即“講解”)可能不足以讓模型達(dá)到最佳性能。相反,通過(guò)實(shí)際的“示范”或樣本(比如微調(diào)中使用的具體數(shù)據(jù)集)來(lái)訓(xùn)練模型,可能會(huì)更有效。
舉個(gè)例子,如果想讓模型生成符合特定風(fēng)格和語(yǔ)氣的文本,僅僅通過(guò)命令或提示很難準(zhǔn)確地傳達(dá)需求。但如果能提供一系列符合這種風(fēng)格和語(yǔ)氣的實(shí)例文本,然后用這些文本來(lái)微調(diào)模型,模型就更容易理解并生成符合要求的內(nèi)容。
一、準(zhǔn)備數(shù)據(jù)
當(dāng)確認(rèn)微調(diào)是解決模型缺陷的有效手段后,接下來(lái)的任務(wù)就是準(zhǔn)備用于訓(xùn)練的數(shù)據(jù)。在這一階段,需要構(gòu)造一組樣例對(duì)話,這些對(duì)話不僅要多樣化,還要與模型在實(shí)際應(yīng)用中可能遇到的情景高度相似,以便提高模型在真實(shí)場(chǎng)景下的推理準(zhǔn)確性。
為了確保數(shù)據(jù)集的有效性,每一個(gè)樣例對(duì)話都應(yīng)遵循特定格式。具體來(lái)說(shuō),每個(gè)樣例都應(yīng)是一個(gè)消息列表,列表中的每條消息都應(yīng)明確標(biāo)注發(fā)送者的角色、消息內(nèi)容,以及可選的發(fā)送者名稱。更重要的是,數(shù)據(jù)集應(yīng)包含一些專門(mén)用來(lái)解決模型當(dāng)前表現(xiàn)不佳的問(wèn)題的樣例。這些特定樣例的回應(yīng)應(yīng)該是期望模型未來(lái)能輸出的理想答案。
舉個(gè)例子,假如創(chuàng)建一個(gè)偶爾會(huì)給出諷刺回應(yīng)的聊天機(jī)器人,下面是為數(shù)據(jù)集創(chuàng)建的三個(gè)訓(xùn)練示例:
{"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,400 kilometers. Give or take a few, like that really matters."}]}
提一嘴,目前還不支持函數(shù)調(diào)用,OpenAI還在努力開(kāi)發(fā)。
如果要用微調(diào)gpt-3.5-turbo模型,使用對(duì)話式聊天的格式是必要的。至于babbage-002和davinci-002模型,可以用傳統(tǒng)微調(diào)的提示和完成配對(duì)格式。
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
設(shè)計(jì) Prompts。一般來(lái)說(shuō),建議用在微調(diào)之前效果最好的各種指令和輸入prompt,并將它們納入到每一個(gè)訓(xùn)練樣例中。這樣,尤其當(dāng)訓(xùn)練樣例不多(比如少于一百個(gè))的時(shí)候,可以實(shí)現(xiàn)最佳應(yīng)用效果。此外,由于模型是完全通過(guò)觀察示例來(lái)學(xué)習(xí),而沒(méi)有明確的指導(dǎo)步驟,因此要達(dá)到良好的效果可能需要更多的訓(xùn)練樣例。
推薦的樣本數(shù)量。要對(duì)一個(gè)模型進(jìn)行微調(diào),需要最少10個(gè)樣本。通常,使用gpt-3.5-turbo在50到100個(gè)訓(xùn)練樣本上進(jìn)行微調(diào)會(huì)帶來(lái)明顯的效果提升,但具體需要多少樣本則要根據(jù)不同應(yīng)用場(chǎng)景來(lái)定。
建議從50個(gè)精選的訓(xùn)練樣本開(kāi)始,然后觀察微調(diào)后模型表現(xiàn)是否有所提升。如果有所改進(jìn),那么即使模型還未達(dá)到可用于生產(chǎn)的標(biāo)準(zhǔn),也表明通過(guò)增加更多訓(xùn)練數(shù)據(jù)可以進(jìn)一步優(yōu)化模型。相反,如果性能沒(méi)有顯著提升,可能需要在增加更多樣本之前,重新考慮模型的任務(wù)設(shè)置或?qū)ΜF(xiàn)有數(shù)據(jù)進(jìn)行優(yōu)化。
劃分訓(xùn)練數(shù)據(jù)集與測(cè)試數(shù)據(jù)集。在收集完初始數(shù)據(jù)集之后,建議將其分為兩部分:一部分用于訓(xùn)練,另一部分用于測(cè)試。提交微調(diào)任務(wù)時(shí),如果提供了這兩種類型的文件,將在訓(xùn)練過(guò)程中給出這兩個(gè)數(shù)據(jù)部分的統(tǒng)計(jì)信息。這些統(tǒng)計(jì)結(jié)果是評(píng)估模型性能是否得到提升的初步指標(biāo)。此外,提前準(zhǔn)備好測(cè)試集不僅能幫助在訓(xùn)練結(jié)束后更容易地評(píng)價(jià)模型性能,還可以通過(guò)在該測(cè)試集上生成樣本進(jìn)行更細(xì)致的分析。
計(jì)數(shù)token:
https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb
openai.File.create(
file=open("mydata.jsonl", "rb"),
purpose='fine-tune'
)
驗(yàn)證完數(shù)據(jù)后,就需要上傳這個(gè)文件,以進(jìn)行微調(diào)工作?。
二、創(chuàng)建微調(diào)模型
通過(guò)OpenAI SDK開(kāi)始微調(diào)任務(wù):
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.FineTuningJob.create(training_file="file-abc123", model="gpt-3.5-turbo")
上述代碼,model選項(xiàng)能選擇一個(gè)基礎(chǔ)模型進(jìn)行微調(diào),比如gpt-3.5-turbo、babbage-002或davinci-002。還可以通過(guò)設(shè)置后綴參數(shù)來(lái)給微調(diào)模型起個(gè)名字。
任務(wù)啟動(dòng)后,完成可能需要一段時(shí)間,因?yàn)槿蝿?wù)可能需要排隊(duì)等待。根據(jù)所選模型和數(shù)據(jù)集的大小,這個(gè)過(guò)程可能需要從幾分鐘到幾小時(shí)不等。
除此之外,還可以查看當(dāng)前的微調(diào)任務(wù)列表,查詢?nèi)蝿?wù)進(jìn)度或者取消已有任務(wù)。
# List 10 fine-tuning jobs
openai.FineTuningJob.list(limit=10)
# Retrieve the state of a fine-tune
openai.FineTuningJob.retrieve("ft-abc123")
# 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")
三、使用微調(diào)模型
當(dāng)成功完成微調(diào)任務(wù)并查看任務(wù)的詳細(xì)信息,會(huì)注意到“fine_tuned_model”字段已經(jīng)填入了新模型的名字。這意味著現(xiàn)在可以立刻將這個(gè)新模型用在聊天自動(dòng)補(bǔ)全(適用于gpt-3.5-turbo)或在舊版補(bǔ)全API(適用于babbage-002和davinci-002)上。當(dāng)然,也可以在OpenAI的Playground中對(duì)其進(jìn)行測(cè)試。
然而,雖然理論上模型應(yīng)當(dāng)立即可用,實(shí)際操作中可能需要幾分鐘的準(zhǔn)備時(shí)間。如果遇到請(qǐng)求超時(shí)或無(wú)法找到模型的情況,很可能是因?yàn)槟P驼诩虞d過(guò)程中。這時(shí),稍等幾分鐘后再進(jìn)行嘗試通常是個(gè)好辦法。
import os
import openai
openai.api_key = os.getenv("OPENAI_API_KEY")
completion = openai.ChatCompletion.create(
model="ft:gpt-3.5-turbo:my-org:custom_suffix:id",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Hello!"}
]
)
print(completion.choices[0].message)
按照上面的示例和GPT使用指南,可以開(kāi)始通過(guò)模型名稱發(fā)起各種請(qǐng)求。
四、分析微調(diào)模型
提供了一系列在訓(xùn)練中得到的關(guān)鍵指標(biāo),包括訓(xùn)練損失和準(zhǔn)確率,以及測(cè)試損失和準(zhǔn)確率。這些數(shù)據(jù)可以幫助了解訓(xùn)練是否成功(理論上,損失應(yīng)減小,準(zhǔn)確率應(yīng)提高)。
但實(shí)際上,最能反映模型質(zhì)量的是從微調(diào)模型中生成的樣本。建議在測(cè)試集上用原始模型和微調(diào)模型各生成一些樣本,并將兩者進(jìn)行對(duì)比。這個(gè)測(cè)試集最好包括所有可能向模型輸入的數(shù)據(jù)類型。如果手動(dòng)評(píng)估不現(xiàn)實(shí),也可以用OpenAI的Evals庫(kù),通過(guò)GPT-4進(jìn)行自動(dòng)評(píng)估。
優(yōu)化數(shù)據(jù)質(zhì)量。如果微調(diào)的效果沒(méi)有達(dá)到預(yù)期,以下幾個(gè)建議可能有助于調(diào)整訓(xùn)練數(shù)據(jù):
1、補(bǔ)充針對(duì)模型弱點(diǎn)的訓(xùn)練數(shù)據(jù):如果模型在某些方面的表現(xiàn)不佳,加入更多具有針對(duì)性的示例來(lái)改善。
2、仔細(xì)審查已有的數(shù)據(jù):如果模型出現(xiàn)語(yǔ)法、邏輯或風(fēng)格問(wèn)題,檢查訓(xùn)練數(shù)據(jù)中是否有相應(yīng)的不足或錯(cuò)誤。
3、平衡和多樣化數(shù)據(jù):如果大多數(shù)訓(xùn)練數(shù)據(jù)的回應(yīng)都是“我不能回答這個(gè)問(wèn)題”,但實(shí)際應(yīng)用中這種回應(yīng)應(yīng)少見(jiàn),那么模型很可能會(huì)產(chǎn)生過(guò)多的拒絕回應(yīng)。
4、完備性檢查:確保每一個(gè)訓(xùn)練示例都包含生成正確回應(yīng)所需的所有信息。
5、保證數(shù)據(jù)一致性:如果訓(xùn)練數(shù)據(jù)由多人創(chuàng)建,確保數(shù)據(jù)間有良好的一致性,以避免影響模型性能。
6、格式統(tǒng)一:確保所有訓(xùn)練數(shù)據(jù)都是以推斷所需的格式存在。
對(duì)數(shù)據(jù)量進(jìn)行優(yōu)化和調(diào)整。一旦數(shù)據(jù)示例的質(zhì)量和分布都比較理想,可以考慮擴(kuò)大訓(xùn)練數(shù)據(jù)的規(guī)模。這樣做通常能讓模型更全面地掌握任務(wù),尤其在處理一些不太常見(jiàn)但又很關(guān)鍵的“邊緣情況”時(shí)。預(yù)計(jì)每次將訓(xùn)練數(shù)據(jù)數(shù)量加倍,模型的性能都會(huì)有相應(yīng)程度的提升。為了估算增加數(shù)據(jù)量能帶來(lái)多大的性能提升,可以:
- 在完整的當(dāng)前數(shù)據(jù)集上做一次微調(diào)
- 再在只有一半數(shù)據(jù)的數(shù)據(jù)集上做一次微調(diào)
- 比較這兩次微調(diào)后模型性能的差異
總的來(lái)說(shuō),如果需要在數(shù)據(jù)量和數(shù)據(jù)質(zhì)量之間做出選擇,那么少量但高質(zhì)量的數(shù)據(jù)通常會(huì)比大量但低質(zhì)量的數(shù)據(jù)更有用。
進(jìn)行超參數(shù)的迭代調(diào)整。建議最初不要指定迭代次數(shù),系統(tǒng)會(huì)根據(jù)數(shù)據(jù)集大小選擇一個(gè)默認(rèn)值。然后,如果觀察到以下情況,可進(jìn)行相應(yīng)調(diào)整:
- 若模型對(duì)訓(xùn)練數(shù)據(jù)的適應(yīng)度不達(dá)標(biāo),考慮增加1或2個(gè)迭代次數(shù)。這種調(diào)整通常適用于具有唯一或少數(shù)幾個(gè)理想結(jié)果的任務(wù),比如分類、實(shí)體抽取或結(jié)構(gòu)化解析任務(wù)。在這些任務(wù)中,往往可以根據(jù)標(biāo)準(zhǔn)答案來(lái)計(jì)算模型的準(zhǔn)確率。
- 若觀察到模型的輸出結(jié)果多樣性減少,可以減少1或2個(gè)迭代次數(shù)。這種情況多出現(xiàn)在那些有多種有效完成方式的任務(wù)中。
關(guān)于價(jià)格
圖片
GPT-3.5的費(fèi)用是這樣計(jì)算的:如果用它來(lái)訓(xùn)練模型,每1000個(gè)token的費(fèi)用是0.0080美元。對(duì)于輸入的數(shù)據(jù),每1000個(gè)token的成本是0.0120美元。同樣地,輸出的每1000個(gè)token也要收費(fèi)0.0120美元。
以gpt-3.5-turbo微調(diào)任務(wù)為例,如果訓(xùn)練文件包含100,000個(gè)token,并且要訓(xùn)練3輪(epochs),那么預(yù)計(jì)的總費(fèi)用將是2.40美元。