最近ChatGPT AI實在太紅而且是真的挺好用的(不但可以把它當作顧問,還可以請他產生程式碼、幫我添加註解等等一大堆事情),也因此萌生一個想法:如果把ChatGPT導入企業內作為QA問答機器人,使他可以理解企業產品的操作流程、條件、甚至細一點的欄位功能描述等等的,這樣的好處是未來有新人進來,有任何不會的地方就可以請他詢問ChatGPT,當然我不是老闆也沒有試過這樣的方式到底可不可行拉XD,Open AI針對有此項需求的人提供了「Fine-tuning微調」的服務,不過截至2023年3月14日可以微調的只有基礎模型:「davinci」「curie」「babbage」「ada」,這幾個都是「GPT3」的基本模型哦【點我前往】。



另外Open AI也在2023年3月1號開始也有更改數據使用和保留政策【點我前往】,雖然Open AI這樣說但到底是不是真的不會拿來用我也不知道,所以有疑慮的話就不要訓練太過機密的資訊上去比較好XD




事前準備

首先我們要先準備幾樣工具:

  1. ChatGPT:我們要靠他生成一些假數據
  2. Docker Desktop:如果電腦沒有Python環境或是懶的安裝Python環境的話,可以選擇使用Docker Desktop並且Run一個「Jupyter」的Container【點我前往
  3. Python:就是Python XD

由於我是懶人,而且我也沒有Python環境架設的經驗,因此我是直接選擇使用Jupyter,這個對我來說是最方便的XD,我們直接用Docker Desktop將容器執行起來,進入Logs裡面點擊Url即可開啟Jupyter的界面




準備微調數據前要先知道一些數據規則:
  1. 每個訓練示例都包含一個輸入(prompt = "提示")及其關聯的輸出(completion = "完成")
  2. 每個提示都應以固定分隔符結尾,以在提示結束和完成開始時通知模型,這裡我們使用" ->"
  3. 每個完成都應該以空格開頭,它用前面的空格標記大多數單詞
  4. 每次完成都應以固定的停止序列結束,以在完成結束時通知模型。停止序列可以是\n、###或任何其他未出現在任何完成中的標記,這裡我們使用"END"

規則知道後就可以來準備訓練數據,由於我手上沒有現成的數據可以使用,所以我打算請ChatGPT幫我捏造假的資料和數據出來(TMomoObject這到底什麼奇怪的物件XD),我使用的是這組ChatGPT咒語(提示工程):

接下來的輸出結果請以Excel的csv格式呈現,開頭請用prompt,completion,
每個promp的結尾請加上" ->",
每個completion的開頭都要有空格,
每個completion的結尾都要加"END",
不用解釋,直接輸出結果即可,
輸出結果用程式碼區塊包起來讓我方便複製,請用繁體中文

主題是TMomoObject物件,該物件為產品,語言是TypeScript,請隨機產生介紹TMomoObject物件、使用方式、規則、詢問用法、語法,程式範例等等。

範例:
prompt,completion
什麼是TMomoObject物件? ->, TMomoObject物件是..... END
介紹TMomoObject物件 ->, 可以用做..... END

請使用以上規則輸出100筆請不要重複
💡 建議是100筆以上的資料,資料太少的話微調後可能會得不到期望的結果XD。本篇的範例是70筆的訓練量


產生完資料後直接貼進txt檔案然後改成.csv的副檔名,再用Excel打開做調整,最後把這個csv上傳到Jupyter裡面就完成了!


如果不想自己產生可以直接clone我的專案【點我前往

Fine-tuning微調

準備好數據就可以開始微調我們要的模型,首先在Jupyter打開一個「Terminal」,安裝Open AI的CLI
pip install --upgrade openai


設定OPEN API KEY的環境變數
export OPENAI_API_KEY="你的API KEY"
💡 API KEY可以在View API Keys的頁面產生


接著需要準備訓練用的檔案,官方說明文件有提到訓練的數據要求是「JSONL」的檔案格式【點我前往


Open AI提供一個工具API替我們轉換如:「CSV」「TSV」「JSON」等等格式的檔案到JSONL,使用以下命令來轉換,轉換過程API也會幫你檢查你的訓練數量和缺少的東西,這部分就看需求調整即可,轉換完成後就會產生一個prepared的JSONL檔案囉!
openai tools fine_tunes.prepare_data -f 你的csv檔案名稱



有了訓練資料後就可以建立微調模型,因價格的考量,在微調模型上我選擇「curie」,davinci雖然比較強大但真的貴了點QQ,接著使用以下命令就可以開始微調:
openai api fine_tunes.create -t 訓練用的JSONL檔案 -m curie
💡 訓練時間應該是跟訓練的資料量以及選用的模型成正比


訓練時間通常會比較久這裡就耐心等待吧!中途也可以使用以下指令來查看訓練的進度
openai api fine_tunes.follow -i 微調訓練的ID
💡 訓練完成後也會顯示此次微調總共需要多少錢,範例花費$0.12美金,大約是臺幣4塊錢左右




使用微調後的模型

接著我們到Open AI API的Palyground來試試剛才微調過的模型

右手邊有一些AI的參數設定可以依照你要的情況去調整如:回傳的Token數量、Temperature等等,我的話只調整兩個地方
  1. Model:這裡要改成剛剛Fine-tuning微調建立出來的模型名稱
  2. Stop sequences:這裡要填入我們數據的completion的結尾「END」「 END」
其餘的都直接使用預設值
💡 其餘的設定大家可以自行調整玩玩看,相關參數功能可以【點我參考


接著我們就可以開始跟模型對話了,首先使用訓練資料有的prompt來問看看
💡 這裡記得要在提問的最後面加上固定分隔符結尾 -> 哦!

訓練資料是TypeScript而回答卻是JavaScript,有待加強但是還可以接受XD

這個回答就有點勉強了XD


目前的回答都勉強可以接受(畢竟這是70筆訓練資料而已XD)再來問問其它問題試試看

這次回答就算是精準了XD

同樣問題再問一次這次回答就直接回覆訓練資料的completion



接著來問一個訓練資料沒有但是「有一點關聯性」的問題看看它會怎麼回覆我吧!
回答的有模有樣,但是回覆還是JavaScript而不是一開始指定的TypeScript XD
💡 可以發現AI回答的程式碼,其實就是我給的訓練資料內所有程式碼學習後加以延伸所生出來的結果

檢查後確定這個提問是訓練資料沒有的!


最後問一個完全不相關的問題看看
秀逗了XD



從以上所有範例可以得知以「70筆的訓練資料(Token不知道多少)」「約4塊錢臺幣」的AI來說,如果提問的問題在訓練資料的範圍內或是有一點相關聯性都還算是及格,當然只要訓練資料量以及提問和回答的質量數量夠,我相信要訓練出一個有模有樣的AI絕對不是問題哦!


題外話:在這個範例來說,AI回答的結果我可以給「60」分,畢竟70筆資料和4元臺幣訓練出能理解憑空生成的奇怪物件的AI,可以算是經濟又實惠吧?XD,但是真要作為一個QA機器人可能還是稍嫌不足,加上如果使用的模型是「davinci」,訓練下來的費用可能會很可觀哦!