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