隨 MyGO 動畫的播放,各位是否也有在聊天時越來越喜歡使用MyGO圖來替代文字回覆別人(敷衍別人)?為了讓我們這些啞巴傳MyGO圖的過程更加便利,我開發了一個自動推薦MyGO圖的語言模型 - MyGOChat。
MyGOChat 是一個開源的語言模型,能夠自動分析輸入的文字內容,並推薦適合的MyGO圖。你可以串接在自己的聊天機器人上,讓它在與使用者互動時自動用MyGO圖進行回覆。也可以做為與其他人聊天時,增加配圖的貼圖推薦器等…。
這個模型基於 RoBERTa 架構進行微調,模型參數僅 330M,相當輕量。即使如我這台六年前的中階筆電,使用Intel i5 9th cpu也能順暢運行。但要注意的是,初次使用時,模型和資源的加載會稍微延遲,因此首次執行的時間會比較長。
這個模型基於 RoBERTa 架構進行微調,模型參數僅 330M,相當輕量。即使如我這台六年前的中階筆電,使用Intel i5 9th cpu也能順暢運行。但要注意的是,初次使用時,模型和資源的加載會稍微延遲,因此首次執行的時間會比較長。
📢本模型的正確率為 86%,因此在某些情況下可能會出現答非所問或理解偏差的情況。請在使用過程中留意模型的回應,並視需要重新進行微調。此外,模型尚未在真實對話情境中進行測試,因此其實際效果仍有待驗證。
如何使用 MyGOChat:
安裝並使用MyGOChat非常簡單,只需要幾行程式碼:
先在終端機上安裝套件:
建立環境:
安裝所需套件:
執行程式:
輸出說明:
git clone https://github.com/qaz45647/MyGOChat.git |
conda create -n MyGOenv python=3.9 conda activate MyGOenv |
pip install -r requirements.txt |
from mygochat import MyGOChat # 初始化聊天 chat = MyGOChat() # 使用聊天功能 response = chat.chat("輸入你要餵給模型的內容") # 輸出回應 print(f"Quote: {response['quote']}") print(f"Image URL: {response['image_url']}") |
- response['quote']:輸出台詞(str),這是MyGO圖的台詞內容。
- response['image_url']:將輸出圖片的網址(str),可以使用這個網址來顯示對應的MyGO圖。
以下是此模型的訓練過程,沒興趣的可以跳過:
製作資料集
資料集前處理
- 取得MyGO圖
- 我是從這篇文章下載的,感謝提供。
- 從圖包中挑選出適合用於對話情境的圖:共157張。
- 對圖片進行情緒標記。
- 使用LLM對所有Mygo台詞生成一個對話範本。
- 對生成的範本進行人工微調,以提升生成品質。
由於回覆的對象是「圖片」而非純文字,圖片的情境將影響句子的情緒與語義。因此,需針對圖片進行情緒標記,以標註其所表達的情緒、態度、互動方式及語氣,而非直接將台詞轉為對話資料。這樣能確保生成的內容更貼合圖片所傳遞的氛圍與意圖。
此外,為了提升資料集的品質,我為每張圖片建立專屬的對話範本,作為 LLM 生成資料時的參考,以增強其對圖片語境的理解,確保輸出的對話更符合需求。
生成資料集
- 將Mygo台詞、範本、情緒標記給LLM進行資料集生成(共生成50個句子2次)
- 資料清洗:
- 去除相似、不合適、錯誤的對話內容
- 完成資料集
訓練模型(第一階段)
- 使用生成的資料集對RoBERTa模型進行微調,以建立基礎對話能力。
- 採用混合精度訓練與梯度累積技術,提高計算效率並降低 GPU 記憶體使用。
- 設定 Early Stopping,若 5 個 epoch 內驗證損失 (val_loss) 無提升則提前停止訓練。
- 訓練細節:
- 基礎模型:hfl/chinese-roberta-wwm-ext-large(中文 RoBERTa 模型)
- RoBERTa 預訓練模型負責編碼文本。
- 添加分類層 (Linear Layer),透過 softmax 輸出各標籤的機率分佈。
- 資料集劃分:將資料集按 8:2 劃分為訓練集與測試集。
- 訓練方式:
- 優化器:AdamW,學習率 1e-5,搭配 Cosine Annealing 調整學習率。
- 損失函數:Label Smoothing Loss,減少過擬合。
- 梯度裁剪 防止梯度爆炸 (clip_grad_norm_)
- 基礎模型:hfl/chinese-roberta-wwm-ext-large(中文 RoBERTa 模型)
- 訓練設備:在 Colab 上使用 A100 進行訓練
- 訓練時間:約半個小時
- 訓練結果:
- 我沒記錄下來,說個大概的印象:
- 9個回合Early Stopping
- 驗證集正確率:約為60%左右
- 用100篇場外的文章標題進行對話測試,正確率約為70%
- 我沒記錄下來,說個大概的印象:
由於 LLM 生成的資料較為單一,泛化能力較差,因此導入二階段資料增強策略。
- 爬取場外休憩區約 40,000 篇文章的標題。
- 資料清洗:
- 刪除版務公告。
- 刪除大樓串。
- 刪除標題低於5個字的文章。
- 刪除爬蟲沒抓好的標題。
- 去除屬性框
- 標籤預測:
- 使用已訓練模型預測每篇文章標題的前 5 個可能標籤。
- 將文章標題與標籤組成選擇題。
- 選項會包括 A 到 F 六個選項,其中 F 代表「以上選項皆不符合」。
- 使用 GPT-4o-mini 根據選擇題挑選最佳標籤。
- 使用 GPT-4o 驗證選擇題答案是否能形成合理對話並進行過濾。
- 人工逐筆檢查過濾後的選擇題答案。
- 將原始資料集與新對話資料合併,形成更豐富的訓練資料。
訓練模型(第二階段)
- 透過增強後的資料集重新訓練模型,以提升對話能力與準確度。
- 訓練細節與第一階段相同。
- 訓練結果:
- 16個回合 Early Stopping
- 驗證集正確率:53.80%
- 驗證集loss:2.1393
- 儘管相較於第一階段,模型的正確率有所下降,但在對話測試的表現上,反而效果更好,具體情況請參見下文。
評估
- 測試數據:從未參與訓練的文章標題中隨機挑選 300 篇作為測試樣本。
- 人工驗證:
- 人工審查生成的對話是否合理。
- 結果顯示:
- 258 則對話成立。
- 42 則對話不成立。
- 最終正確率達 86%。
- 時間成本:約為1個月
- OpenAI API 費用:6.45 美元
- Colab Pro 訂閱費用:10.49 美元
結語
MyGOChat 的開發過程說長不長,說短不短,期間踩了不少坑,也學到不少東西。最終,模型雖然不是完美的,但已經能做到 86% 的正確率,讓各位在聊天時更輕鬆地傳圖,省去翻圖、找圖的麻煩。
雖然目前還有很多可以改進的地方,像是某些場景下還是會有答非所問的情況,也不知道導入真實對話情境的結果如何,但我相信,它能在大多數情況下順利推薦合適的 MyGO 圖,達成「用圖溝通」的目標。接下來這半年比較忙,再不弄碩論就要岩壁了,但如果有機會,也會試試看製作母雞卡的版本。
雖然目前還有很多可以改進的地方,像是某些場景下還是會有答非所問的情況,也不知道導入真實對話情境的結果如何,但我相信,它能在大多數情況下順利推薦合適的 MyGO 圖,達成「用圖溝通」的目標。接下來這半年比較忙,再不弄碩論就要岩壁了,但如果有機會,也會試試看製作母雞卡的版本。
總之,MyGOChat 已經能用了,歡迎各位試試,讓你的對話變得更輕鬆、更有趣
