# 擁抱 AI 世界!從0開始玩轉 Hugging Face - 掌握 Hugging Face 生態系統 —— 了解 Transformer 技術,學會模型的尋找與調用方式 - 實作多種 AI model 應用 —— 體驗並運用 Hugging Face 上的文本分析、語音生成、圖像生成 - 整合 AI 能力,解決複合問題 —— 結合多種模型,構建出能夠理解、分析與應答的 AI 客服系統 >[!Important]非常感謝以下參考資料 >https://vocus.cc/article/64ad426cfd89780001f0f010 >https://tw.alphacamp.co/blog/hugging-face ## 什麼是Hugging Face Hugging Face 是開源 AI 平台,被譽為「AI 界的 GitHub」,整合 47 萬個模型與 10 萬個資料集,提供標準化函式庫、API 和 UI 工具(如 Gradio)來降低 AI 開發成本。 其核心特色為 **多樣性、省時、簡便與標準化,開發者可透過 Transformer Library 迅速串接與微調模型。** ,致力於「機器學習大眾化」,推動 AI 技術普及與社群發展。 ## Hugging face 與我有甚麼關係,我又不是機器學習專家 更簡單介紹Hugging face的重要性,我們以"原始人打獵"來舉例: <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/HkHj3CDhyx.jpg" style="width: 80%; border: 2px solid black; padding: 5px;" /> </div> <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/SkPbACP21e.jpg" style="width: 80%; border: 2px solid black; padding: 5px;" /> </div> 其實,現在開發機器學習與應用機器學習也就跟"原始人打獵"一樣: <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/H1W1J1uh1x.jpg" style="width: 80%; border: 2px solid black; padding: 5px;" /> </div> <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/H1VR00P3Je.jpg" style="width: 80%; border: 2px solid black; padding: 5px;" /> </div> 我們如果今天想要實作一些複雜的AI應用,我們一定會用到許多特定目的的AI Model,這時候我們就可以利用Hugging face,快速應用特定Model,以讓我們更能專心的去完成目標。 ## 我知道Hugging face 有超多Model,但我不知道哪個Model在幹嘛 <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/HyNu4yO21e.png" style="width: 100%; border: 2px solid black; padding: 5px;" /> </div> Hugging Face 提供了許多 AI 模型,但如果你不確定每個模型的用途,可以從[Hugging Face 的 "Tasks"](https://huggingface.co/tasks)頁面開始。 這個頁面已經根據不同的應用場景(Task)整理好模型類別,你可以根據自己的需求,找到適合的模型。 <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/Byt1HkOh1l.png" style="width: 100%; border: 2px solid black; padding: 5px;" /> </div> 例如上圖,我現在想要做"翻譯",那就可以點擊"Translation"這個標籤看詳細的資料,而他也會說明"輸入與輸出結果",我們就可以透過他的說明確認是否與我們所需目標相同。 <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/BkT8Sku21e.png" style="width: 100%; border: 2px solid black; padding: 5px;" /> </div> 而在該頁面中,他也會說明如何寫程式碼去驅動所需AI Model。 ## 實際體驗如何使用,進到[Colab](https://colab.research.google.com/drive/1IGxhVZKfev7mWlPcu85kQIbZjENM-Rz4?usp=sharing) ### 先看第一個範例:情感分析 <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/ry35vJd3yl.png" style="width: 100%; border: 2px solid black; padding: 5px;" /> </div> 你會發現,程式碼是不是有點太少了,比之前範例寫的for迴圈判斷還短,==**沒錯**==,hugging face就是這麼強,我們三行就能夠應用一個AI Model了。 你唯一要注意的是這個程式碼: - pipeline : 是 Hugging Face 提供的一個簡單工具,讓你快速調用 AI 模型,不用手動下載或設定。 <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/SyKNdku3yx.png" style="width: 100%; border: 2px solid black; padding: 5px;" /> </div> 這兩句話有一定差異: - 第一句(僅指定 pipeline 的任務類型) : Hugging Face 會自動選擇一個預設的模型,通常是該任務下表現較好的模型。 - 第二句(指定 pipeline 的任務類型 + 明確指定模型ID):Hugging Face 就會直接使用你指定的模型,而不會自動選擇。 而我在第二段程式中我引用的是[這個model](https://huggingface.co/j-hartmann/emotion-english-distilroberta-base) <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/Hy1OFJ_nJg.png" style="width: 100%; border: 2px solid black; padding: 5px;" /> </div> 他會根據所傳資訊分類成這7類,比他原本預設的"正面、中立、負面"還要多種情感標籤。 ### 除了文字,我們還可以玩"Stable Diffusion文生圖" <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/rkVAGeu2Jl.png" style="width: 90%; border: 2px solid black; padding: 5px;" /> </div> 如果你近期有在關注科技新聞,你可能在文生圖這塊會被Stable Diffusion這個名詞洗版,因為他真的很強大。 那我們有了hugging face,我們也能夠在我們的程式中使用[Stable Diffusion這個模型](https://huggingface.co/stabilityai/stable-diffusion-2-1),實際體驗看看文生圖的樂趣。 <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/rydkreuhJe.png" style="width: 80%; border: 2px solid black; padding: 5px;" /> </div> 我們就照著他的Example複製貼上就可以使用了 >[!Warning]請你注意一下Colab環境 >如果你看到範例程式中有出現`pipe = pipe.to("cuda")`,代表這個model是希望你在"GPU"環境下去使用,避免model跑太久。 >那我們這邊可以到Colab中的`執行階段 -> 變更執行階段類型`,並選擇環境"GPU",雖然他會有使用流量限制,但也足夠堪用。 ><div style="text-align: center;"> <img src="https://hackmd.io/_uploads/SkhELgO2ke.png" style="width: 50%; border: 2px solid black; padding: 5px;" /> </div> 而Stable Diffusion的文字敘述就可以在Prompt這個變數當中去調整。 <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/HkUidl_31g.png" style="width: 80%; border: 2px solid black; padding: 5px;" /> </div> 以上圖為範例,我的Prompt是"a photo of an astronaut riding a horse on mars",最終他就會根據我的要求生成。 ### 奇怪,我的Model生出來的結果好差,是不是壞了? <div style="text-align: center;"> <img src="https://hackmd.io/_uploads/Sy8otl_3Jx.png" style="width: 80%; border: 2px solid black; padding: 5px;" /> </div> 如果你剛剛在玩Stable Diffusion的時候,你的Prompt是中文時,他的生成結果通常都很糟,是模型壞了嗎?我們可以看 hugging face 上原作者怎麼說的。 ![image](https://hackmd.io/_uploads/S1Zz9ed3kg.png) 根據原作者這些說明,我們就知道"他只對input是"英文"的時候"才會正確輸出,所以我們要調整輸入方式,例如改用英文 Prompt,以獲得更好的生成效果。 >[!Warning]問題來了 >如果現在我是一個產品開發者,老闆就是想要"中文輸入",我要怎麼辦(不要把這問題想得太複雜,想想看解方) :::spoiler 可能的答案 如果他一定要輸入中文,那我們為何不能多做一步"中翻英"呢? ::: ## 來一次綜合挑戰吧! 如果我現在要做一個客服系統,輸入會是"使用者輸入的文字",之中帶有情緒反應,那我的輸出希望是"AI客服語音回覆,並且如果使用者是憤怒、擔心等反應,需要一定安撫",那我應該怎麼做? >[!Warning]別著急,慢慢想 >現在input與output要求限制很高,要求也不是一個Model就可以解決,那我們就應該將問題拆解成更一小塊一小塊去看 >想想看input到output這段轉換中,有哪先需要被先做,誰後做? >答案就在此區塊當中,但請先思考後再打開來看參考答案 >![image](https://hackmd.io/_uploads/HkX5jbdh1x.png)