iT邦幫忙

0

ChatGPT 應用系統開發(二) -- 微調(Fine-tuning)企業專屬的模型

  • 分享至 

  • xImage
  •  

前言

上一篇討論 OpenAI API基本的用法,接著我們利用微調(Fine-tuning)建立企業專屬的模型,作為特定領域的資料庫,讓使用者以 ChatGPT 提問。

『微調』是轉移學習(Transfer Learning)重要的概念,大型語言模型(LLM)是一個基礎模型(Foundation Model),好比是一支萬用的螺絲起子,接上各種插頭,就會有不同的功能,例如情緒分析、Q&A、文本生成...,這個方式就是微調(Fine-tuning)。

https://ithelp.ithome.com.tw/upload/images/20230604/20001976Dw4B9FavQ6.png
圖一. 模型微調(Fine tuning),可實現不同的任務

一般企業會有專有的商品或服務,例如金控公司會有各式的基金、保險、金融商品...,如果向ChatGPT提問相關商品資訊,很難得到正確答案,這時就可以利用『微調』,建立企業專屬的模型,提供客戶或內部使用者查詢。

官網文件說明,『微調』還有以下優點:

  1. 相對於一般提示,微調得到的答案有更高的品質,因為微調模型範圍較聚焦。
  2. 相對於一般提示,微調可提供更多的訓練案例,因為一般提示通常是小樣本學習(Few-shot learning)。
  3. 對微調模型發問,可使用較少的單字或詞(Tokens),因為模型已限定提問範圍。
  4. 回答較迅速,低延遲(Lower latency),因為模型較小,推論自然較快。

微調程序

微調不需要寫程式,步驟如下:

  1. 確定openai套件升級至最新版,並在環境變數OPENAI_API_KEY內設定密碼(Secret)。
  2. 準備資料:最終格式須為JSONL,每一列含一個提示及其答案,範例如下。OpenAI指令可以將CSV、TSV、XLSX、JSON檔案轉換為JSONL格式,並驗證是否正確,所以,只要準備CSV或Excel檔案即可。
    {"prompt": "<提示>", "completion": "<答案>"}
    {"prompt": "<提示>", "completion": "<答案>"}
    {"prompt": "<提示>", "completion": "<答案>"}
    ...

以下進行一個簡單的情緒分析測試,部分資料如下,完整資料可自GitHub sentiment_simple_CN.csv下載:

prompt,completion
這部達文西密碼真棒。,1
這部蝙蝠俠真棒。,1
這部斷背山真棒。,1
這部哈利波特真棒。,1
這部驚魂記真棒。,1
這部星際大戰真棒。,1
這部不可能的任務真棒。,1
這部達文西密碼糟透了。,0
這部蝙蝠俠糟透了。,0
這部斷背山糟透了。,0
這部哈利波特糟透了。,0
這部驚魂記糟透了。,0
這部星際大戰糟透了。,0
這部不可能的任務糟透了。,0
  1. 在終端機或cmd中,執行以下指令,會有一系列的問答,通常使用預設值即可:
    openai tools fine_tunes.prepare_data -f <檔案>

  2. 建立微調模型,在終端機或cmd中,執行以下指令,模型請參考表二:
    openai api fine_tunes.create -t <資料檔> -m <模型>

  3. 微調模型訓練完成後,會產生模型代碼,即可測試模型:
    openai api completions.create -m <模型代碼> -p <提示>
    注意,提示要遵守訓練資料的格式來撰寫。

  4. 也可以使用API或在Playground測試。

目前只限在GPT-3模型進行微調,不支援最新的GPT-3.5或4.0,GPT-3又分為以下模型:
https://ithelp.ithome.com.tw/upload/images/20230604/20001976olm4pMRLsk.png
表二. GPT-3各類模型

Playground測試畫面如下,右邊選單可選擇剛訓練好的模型,要注意其他參數的設定,例如temperature、Maximum length,才能得到正確的回答:
https://ithelp.ithome.com.tw/upload/images/20230604/20001976H1Bkf8z803.png
圖三. Playground

程式撰寫

使用API測試很簡單,只要把模型設定為微調模型代碼即可,例如將以下程式碼存成fine_tune_test.py。

# 載入套件
import openai
    
if len(sys.argv) < 3:
    print("執行方式:python fine_tune_test.py <prompt> <model>")
    exit()

# 呼叫 API    
prompt = sys.argv[1] + '->'
response = openai.Completion.create(
    model=sys.argv[2],
    prompt=prompt,
    temperature=0,
    max_tokens=1,
)

# 顯示回答
print(response.choices[0].text.strip())

執行 python fine_tune_test.py "The movie is great." "curie:ft-digibank-2023-03-14",即可得到答案,最後一個參數為模型代碼,須修改為讀者微調的模型。雖然訓練資料是中文,但輸入英文提示也是可以得到正確答案,而且提示也沒指名哪部電影,也OK。

結語

微調的功能基本上屬於監督式學習,訓練資料必須標註答案,因此,一個問題如果能有各式各樣的提示,訓練出來的模型就愈強大,這可以透過『資料增補』(Data Augmentation)方式,產生更多的訓練資料。除了情緒分析外,也可以應用在問答、分類...等任務。

微調的成本看似低廉,但若使用大量資料訓練,成本還是不低,網路上有人訓練一個模型花了8,000美元,因此,訓練時先小量測試,確定程序及準確性沒問題後,再使用大量訓練資料,避免荷包大失血。

另外還有一種作法『文本嵌入』(Text Embedding),我們下次再來討論嘍。

更詳細的說明可參考拙著OpenAI官網文件

工商廣告:)

影音課程:

開發者必學:OpenAI API應用與開發
開發者必學:OpenAI API應用與開發
ChatGPT企業實踐指南 | 技術透析與整合應用
深度學習PyTorch入門到實戰應用

書籍:

ChatGPT 完整解析:API 實測與企業應用實戰
ChatGPT 完整解析:API 實測與企業應用實戰
Scikit-learn 詳解與企業應用
開發者傳授 PyTorch 秘笈
深度學習 -- 最佳入門邁向 AI 專題實戰


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言