iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0
生成式 AI

《AI 新手到職場應用:深度學習 30 天實戰》系列 第 28

職場專案實戰 - 客服常見問題自動分類系統

  • 分享至 

  • xImage
  •  

在現代的許多企業中,客服每天都會處理成千上萬條訊息,
但這些問題往往非常相似,例如:

我忘記密碼了
可以退貨嗎?
我的包裹寄到了嗎?
太陽餅裡面有太陽嗎
冷凍的魚可以放生嗎?

如果在傳統上,這些訊息就需要人工閱讀與判斷,再手動轉交到不同部門做分類。
但這樣不僅浪費人力,也會很容易發生問題,被老闆罵臭頭。

而如果能讓電腦自動判斷每個問題的「類別」,
例如「帳號問題」、「退貨問題」、「出貨查詢」、「白癡問題」等等,
那麼客服系統就能自動分配工單,大幅提升效率。

這就是今天的主題:「客服常見問題自動分類系統」。

我們將用 自然語言處理(NLP) 技術訓練一個模型,
讓它能「讀懂問題的意思」並自動判斷該屬於哪個分類。

那就讓我們直接開始吧!!!


什麼是「問題分類」(Intent Classification)

問題分類(Question Classification 或 Intent Detection)是 NLP 的一個經典任務。
它的目標是讓電腦理解「使用者想做什麼」,
並幫助系統做出正確回應。

我也用chatGPT幫我生成了一個解釋的表格,讓大家可以看得更明白:

https://ithelp.ithome.com.tw/upload/images/20251010/20169196jIUP3TB6nb.png

當我可以妥善使用這種分類後就可以幫助像是
客服系統自動將問題分配給不同部門
商業分析系統統計各類問題比例」等等問題,
讓效率提高的同時辦事更輕鬆。

參考資料:
https://research.aimultiple.com/intent-classification/


什麼是 Zero-Shot Learning(零樣本學習)

一般來說,要讓模型學會分類,必須先收集大量訓練資料。
但現實中,我們常常沒有足夠的客服資料集可用。

這時候就可以使用 Zero-Shot Learning(零樣本學習)
它的概念是:
即使模型沒看過這個任務的訓練資料,也能根據語意去推測最合理的分類

因此我們只要提供一些「候選類別」標籤,
模型就能利用語言理解能力去預測哪一類最符合,
減少我們收集資料的時間。


XLM-R 模型介紹

過去我們可能使用 BERT 或 DistilBERT 進行情感或分類任務,但這些模型多以英文為主。
而客服訊息往往是「中英夾雜」或多語言的,例如:「我想退貨,Please help me!」之類的。
這時候,傳統英文模型的表現就會不理想。

而我們今天要使用的 XLM-R(XLM-RoBERTa) 是由 Facebook AI 提出的多語言預訓練模型,
就支援超過 100 種語言,其中就包含中文,同時也保留了 RoBERTa 的強大語言理解能力。
因此它在跨語言任務(如情感分析、文本分類、翻譯對齊)上表現相當優異,
也是我們今天選擇它的原因。

參考資料:
https://mkh800.medium.com/%E8%AB%96%E6%96%87%E9%96%B1%E8%AE%80-xlm%E4%BB%A5%E5%8F%8Axlm-r-39aca43baf8d


實作環節

以下是完整的 Colab 實作版本,使用的是
Hugging Face Transformers 提供的 pipeline() 工具,
而這一版本我們就會使用剛剛說到的 XLM-R 基礎模型,
並且讓它可以在 Colab 環境直接執行。

接著我們就直接來看程式碼吧!!

# 安裝套件(只需在第一次執行時執行)
!pip install transformers torch --quiet

# 匯入 pipeline
from transformers import pipeline

# 使用多語言的 XLM-R 模型進行 Zero-shot Classification
classifier = pipeline("zero-shot-classification", model="joeddav/xlm-roberta-large-xnli")

# 定義候選分類標籤
candidate_labels = ["退款問題", "帳號問題", "商品問題", "服務問題"]

# 測試輸入文本
texts = [
    "我想退貨,請問流程是什麼?",
    "我登入帳號一直顯示錯誤。",
    "客服都沒回覆我,太誇張了!",
    "這件衣服收到時破掉了。"
]

# 執行分類
for t in texts:
    result = classifier(t, candidate_labels)
    print(f"問題:{t}")
    print(f"預測分類:{result['labels'][0]}(信心分數:{round(result['scores'][0], 3)})\n")

針對這段程式我想主要可以介紹幾個大重點:

1. pipeline() 建立分類器

在這一行中,它會自動幫你載入 XLM-R 模型與對應的 tokenizer,
並建立一個「零樣本分類」任務環境,達到減少收集資料的需求。

2. candidate_labels 設定分類類別

而在這段程式碼中,我們則是去手動定義可能的客服類別,
例如像是退款帳號商品服務等等。
而模型就會根據語意去判斷哪一個最接近輸入內容。

3. classifier(t, candidate_labels)

而最後這段,其實才是這份程式碼的核心:
模型會對每一句話與所有標籤做「語意比對」,計算出每個標籤的相似度分數。

如此我們就可以透過相似度分數來判斷它的信心程度,以此來看看他是不是分對了。


最後,我們就來看看輸出的結果:

https://ithelp.ithome.com.tw/upload/images/20251010/20169196FyLK7uXdah.png

可以看到信心程度都達到了至少93%,實際驗證後的答案也都沒有錯,
代表我們今天的實作,大.成.功!


以上就是今天的內容了,明日會繼續帶來程式內容,敬請期待。


上一篇
模型部署入門:用 Flask打造小型 API
系列文
《AI 新手到職場應用:深度學習 30 天實戰》28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言