(二)為 Chatbot 增加 NLP 功能

第一篇文章回聲 Chatbot 已經完成了,接下來我們可以透過 NLP 服務,讓 Chatbot 根據使用者不同的訊息做回答,這樣就變成更加人性化的聊天機器人囉!

嘗試過 Microsoft LUISGoogle Dialog Flow,它們都沒有預設的中文語音對話模組,都要自己提供語料自己 train。最後選擇用 OLAMI Open API,它是威盛電子旗下的智能語音互動平台,裡面的 IDS 模組只要 Chatbot 串接完 就可以得到許多技能,包含聊天、問天氣、股市、音樂、百科、食譜、算數學。雖然 NLP 的作法是 Rule-based,但現階段是很成熟的 Solution。這一篇講怎麼把 OLAMI Open API 整合進 Telegram Bot 中。

使用的工具及服務:

  1. Python 3(for develop)
  2. pipenv(for dependency management)
  3. OLAMI(for NLP)
  4. ngrok(for testing)

Step 5. Add NLP feature for chatbot

先註冊 OLAMI 帳號,在 OLAMI 我的應用介面建立新應用,得到 App Key 及 App Secret,把它們填入專案目錄中的 config.ini 檔案

[OLAMI]
APP_KEY = your_app_key
APP_SECRET = your_app_secret

對應用點選變更設定 => 對話系統模組,勾選所有模組 => 儲存設定

回到專案目錄,新增資料夾,名字叫做 nlp

$ mkdir nlp

進入 nlp 資料夾,新增兩個檔案, __init__.pyolami.py

$ cd nlp
$ touch __init__.py
$ touch olami.py

做完上述動作後的專案目錄結構

Project Directory
├── nlp
| ├── __init__.py
| └── olami.py
├── config.ini
├── main.py
├── Pipfile
└── Pipfile.lock

新增 __init__.py 是為了讓 main.py import nlp 的時候認定 nlp 是一個 Module。

編輯 nlp/__init__.py

編輯 olami.py

olami.py 主要在實作 request OLAMI NLI API 的 method。request OLAMI NLI API 時需要利用 App Key 及 App Secret 生成一組 sign,放入 url parameter 才能通過 OLAMI API Server 的驗證。

sign 生成方法 Document
OLAMI NLI API Document

完成後,回到專案目錄,編輯 main.py,import nlp module,並將原來 reply_handler method 中直接回傳使用者訊息的邏輯,改為先將使用者訊息傳給 OLAMI NLI API,再把結果回傳給使用者。

修改後的完整 main.py

對 Telegram Bot 進行測試,它已經可以回應詢問天氣、算數、股價等問題。

但有些問題的回答有點奇怪,似乎只回覆片段訊息,為什麼會這樣呢?

原來 OLAMI 不同的 IDS 對話模組回傳的 Data Structure 不一樣(參考說明文件)我們需要根據不同 Intent 的訊息處理回傳內容。

Step 6. Intent detection

Intent detection 是 Chatbot 的重要核心,從使用者的訊息判斷他的意圖與期望獲得的資訊。若意圖不夠明確,Chatbot 可以藉由更進一步的問題抽絲剝繭出使用者明確的需求。例如:

使用者:「今天天氣如何?」

Chatbot:「請問您詢問的是哪裡的天氣?」

使用者:「台北」

Chatbot:「台北今天陰,多雲,最高溫度 30.2℃,最低溫度 26.9℃,南西風輕風。」

使用者:「告訴我今日新聞」

Chatbot:「以下幾則新聞,請問您想知道哪一則的詳細內容?

  1. 27 歲被酸「一把年紀還沒人愛」!Kiwebaby 聽到卻笑了
  2. 鍾文榮/拼經濟靠女性 口紅是最後買的起的奢侈品?
  3. 李沃牆/美中貿易戰劍拔弩張 新興市場股匯失血崩跌
  4. 損失 350 億!南韓最大虛擬貨幣平台 Bithumb 遭駭 全面中斷交易
  5. 侯友宜文大宿舍爭議 段宜康:該由政風啟動調查的是新北市府」

使用者:「4」

Chatbot:「南韓虛擬貨幣交易所 Bithumb 於 20 日爆出駭客入侵消息,市值350 億韓元(約新台幣 95.3 億元)的虛擬貨幣遭竊。這是南韓 2018 年以來發生的第 2 起虛擬貨幣平台駭客事件,韓國網路振興院(KISA)稍早已經獲報並著手調查。」

幸好這些 OLAMI 的 IDS 對話模組都有 handle!程式只要處理不同模組回傳的 Data Structure 即可。

編輯 nlp/olami.py,新增 intent_detection method,原本程式是將 OLAMI NLI API response 的結果取 result 的值回傳(第 10 行);改成先判斷 Intent 的 type(第 28 及 32~40 行),再根據 type 取不同的值做回傳。

修改後的完整 olami.py

再一次測試 Telegram Bot

現在,Telegram Bot 可以查人物、說笑話、甚至連多段式對話(選擇有興趣的新聞)都可以做出回應了。

範例是將所有 OLAMI IDS 對話模組全部實作,你也可以只實作需要的模組。

但如果想要的對話功能 OLAMI IDS 對話模組沒有怎麼辦?例如我希望 Chatbot 幫我找動漫歌曲

下一篇文章再跟大家介紹如何為 Chatbot 添加新的技能。

範例完整程式碼
如果想要把現階段的 Chatbot 部署上 production 環境,步驟可以參考最後一篇文章的 Step 9. Deployment