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