什麼是微調 (fine-tuning)? 如何微調 GPT-3.5 模型?

2023年8月23日

ChatGPT 教學專書
不僅教你 ChatGPT 指令,更帶你實作出創新應用!前往了解

Fine-tuning (微調) 是一個可以有效讓 ChatGPT 輸出符合我們預期的方法。最近 OpenAI 發表了 GPT-3.5 模型的微調功能。在這一篇介紹文中,我們會先介紹微調的概念,接著講解 OpenAI 的 Fine-tuning API 如何使用,最後會有實際的範例來講解可以如何做好微調這件事。

什麼是微調 (Fine-tuning)? 有什麼好處?

在機器學習領域當中,微調 (Fine-tuning) 是指在已經訓練好的模型基礎上,進一步調整,讓你模型的輸出能夠更符合你的預期。透過微調,我們可以不用重新訓練一個新的模型,這讓我們能夠省去訓練新模型的高昂成本。

微調的方式很簡單,你只需要準備成對的訓練資料。然後餵入 Fine-tuning API 就可以完成了。這邊指的成對資料,是輸入搭配輸出,例如「東京奧運的羽球男單金牌是誰?」這個輸入,以及在收到這樣的輸入時,你認為什麼樣的輸出是理想的,例如「東京奧運的羽球男單金牌是丹麥的羽球選手安賽龍」這個輸出。

做好微調,能夠讓我們獲得以下的好處: 比起指令 (prompt),若微調的好,輸出的成果會更好。 使用更短的指令來獲得理想的輸出,這會減少 token 使用,進而降低支出成本,同時加快響應的速度。

這樣講可能有點抽象,讓我們舉個例子進一步說明。假如今天你要做一個桃園機場的機場智慧客服機器人,你希望這個客服機器人根據桃園機場的相關規定來回答問題。只是如果你直接串接 ChatGPT,效果可能不太理想。當今天輸入「可以帶豬肉製品入境嗎?」會收到以下的回覆:

這個問題的答案取決於您所在的國家和您要進入的國家的法律和規定。 通常來說,豬肉製品可能會受到限制或禁止進入某些國家,特別是那些出現豬瘟或其他豬肉疾病的國家。 如果您計劃攜帶豬肉製品進入某個國家,建議您先詢問當地的海關或移民局以獲得相關信息和規定。 此外,如果您不確定自己是否可以攜帶某些物品入境,最好不要冒險,以免違反當地法律和法規。

這個回覆其實挺不錯的,但是它有點太過於廣泛,不是針對桃園機場的規定。假如你想要 ChatGPT 針對桃園機場的規定回答,你會需要在指令中多加描述,例如改成「你現在是名桃園機場相關規範的專家,我要去桃園機場,請問我可以帶豬肉製品入境嗎?」

但這會出現幾個問題,一個是這樣做你的指令會變長,因此 token 消耗數會提高;第二個問題是,有時候即使加上更精確的描述,輸出的結果可能還是太廣泛,這樣在企業級的應用場景不太理想。

而微調可以做到的,就是在微調後,你可以直接透過「可以帶豬肉製品入境嗎?」這個簡短指令,就直接獲得針對桃園機場規範的輸出。 在了解完微調能做到的,相信你已經迫不及待想在你的企業級產品中,透過微調來獲得上述的好處。讓我們一起來看看可以怎麼做到。

如何使用 Fine-tuning API?

我們可以透過 OpenAI 提供的 Fine-tuning API 來進行微調,以下為中文講解,想了解更多可以參考 OpenAI 的官方文件

微調可以分成以下三個步驟

  • 準備好訓練資料
  • 訓練微調的模型
  • 使用微調後的模型

先來看一下如何準備訓練資料。目前 Fine-tuning API 接受 JSONL 的格式如下。在你的訓練資料中,你需要提供以下格式的問題與回答

{
  "messages": [
    { "role": "system", "content": "<放入系統訊息>" },
    { "role": "user", "content": "<放入使用者的問題>" },
    { "role": "assistant", "content": "<放入理想的回答>." }
  ]
}

以上面的桃園機場例子來說,你可以提供以下的訓練資料

 "messages": [
    { "role": "system", "content": "你是桃園機場的智慧助手,你擅長回答任何機場相關的問題與規定" },
    { "role": "user", "可以帶豬肉製品入境嗎?" },
    { "role": "assistant", "content": "依據行政院農業委員會動植物防疫檢疫局所訂「常見入境旅客攜帶動植物或其產品檢疫規定參考表」規定,旅客攜帶肉類或加工肉類(含真空包裝)入境時,須向防檢局申報檢疫,如未附輸出國動物檢疫證明書或經防檢局檢疫不合格者,不得輸入。" }
  ]

在備妥訓練資料後,你可以透過 OpenAI 提供的 File API 來上傳訓練資料,並獲得檔案的 id ,這個 id 是在使用 Fine-tuning API 時會用到的。

curl -https://api.openai.com/v1/files \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@path_to_your_file"

接著你要先創建微調任務,然後用訓練資料來微調基底模型。可以透過 OpenAI 的 CLI 做到。下方的 TRAIN_FILE_ID_OR_PATH 就是剛剛上面上傳檔案後拿到的 id ,然後 BASE_MODEL 是要用的模型。前面提到目前 gpt-3.5 與 gpt-4 還沒開放,所以目前 BASE_MODEL 有的選擇包含 ada、babbage、 curie 或 davinci

curl https://api.openai.com/v1/fine_tuning/jobs \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
  "training_file": "TRAINING_FILE_ID",
  "model": "gpt-3.5-turbo-0613",
}'

在完成上述步驟後,需要等 OpenAI 那邊幫你微調,等微調完成後,就可以使用了。用法跟一般在用 ChatGPT API 一樣,只是這邊要加上 org_id

curl https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
  "model": "ft:gpt-3.5-turbo:org_id",
  "messages": [
    {
      "role": "system",
      "content": "你是桃園機場的智慧助手,你擅長回答任何機場相關的問題與規定"
    },
    {
      "role": "user",
      "content": "你好,我有一些入境相關的問題"
    }
  ]
}'

因為 OpenAI 把 Fine-tuning API 設計的很好,讓你只需要準備好微調資料後,就可以很輕鬆完成微調。不過,在進行微調時,還是有一些細節要注意。讓我們在下個段落進一步說明。

使用 Fine-tuning API 的注意事項

微調能帶來的好處是讓模型的可操控性提高,讓模型可以更針對你的需求場景客製化。然而,做這件事有兩個成本。第一個是 API 本身的費用,微調的費用加上使用微調模型的費用,跟原本的 GPT-3.5 模型比,成本會增加 6 - 7 倍左右。

第二個成本則是人力成本。以我們過去幫忙企業導入的場景來說。微調這件事會牽扯好幾方共同協作,其中包含負責模型的團隊、產品團隊、業務團隊。以大家比較好理解的客服場景來說,會需要有第一線的資深客服,來協助判斷那樣的回答是好的回答,把整理好的資料給負責模型的團隊,然後有產品經理這個角色在其中統籌一切。

這件事往往不是一次到位,而是來回迭代的。假如你在微調後,仍覺得輸出成果不如預期,需要團隊拉個會議討論,重新檢視的訓練資料,然後花時間修正,然後再進行新一輪的微調。從開始專案到能上生產環境,快則一個月,往往至少要一季。這樣的時間與人力成本,絕對不容忽略。

雖說微調可能讓某些情境下,模型表現比 GPT-4 來得好,但這不是一定。而原本 GPT-3.5 模型成本不到 GPT-4 成本的十分之一,但假如你要微調的話,成本變成只有約三分之一。假如算上微調時的人力成本,微調的 GPT-3.5 版本,可能會更昂貴,因此如果 GPT-3.5 模型微調後效果還不如 GPT-4 加上 embedding 好,那不如用 GPT-4 加 embedding。

有人可能會問,fine-tuning 跟 embedding 要怎麼選? 怎麼判斷哪個比較好? 判斷好壞是很看情境的,通常需要對業務比較熟悉的人來判斷 (例如客服的場景需要資深客服判斷)。總的來說,fine-tuning 是提升模型的可控性,讓模型可以更偏向某個你偏好的語氣;embedding 則是讓你可以不斷即時加入新的資料。事實上兩者不衝突,可以一起用。但最終要判斷的還是這樣的效益值不值得你花那些成本了。

因此我們的建議是,先小範圍的測試,在成本與效益之間做好的比較與分析,確保真的值得再大規模微調。

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們