---
# System prepended metadata

title: 擁抱 AI 世界！從0開始玩轉 Hugging Face
tags: [AI工具]

---

# 擁抱 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)

