# Head First ChatBot
Speaker: Jie-Han Chen (jielite)
Introduction
------------
今年,Bot 如雨後春筍般的迸出!
各大軟體公司都建立了自己聊天機器人的平台
- Facebook
- LINE
- Telegram
- Slack
目前知名的聊天機器人:Siri, Amazon Echo, Google Allo
多數人認為 Bot 的出現,在未來將取代 app。
下面是一段 Facebook Messenger Bot 的 Demo片段 (1m40s開始):
{%youtube EOYnFUJyOlQ %}
[Q] 為什麼各大公司都建立自己的 Bot 平台? Bot 真的有辦法取代 App 嗎? 你平常都怎麼使用 App ?
現在 bot 的平台的是利用手動輸入來詢問 bot,對於電腦的使用者或許還算習慣,但是目前的潮流已經往行動裝置移動了,未來還會有各種的穿戴式裝置。在這種情況下, bot 要怎麼取得優勢?
### 參考文章
- [2015/9 -- Forget Apps, Now The Bots Take Over](https://techcrunch.com/2015/09/29/forget-apps-now-the-bots-take-over/)
- [2016/4 -- 所有網路科技公司都在研究的「Bot」是什麼?](http://technews.tw/2016/04/19/everything-you-should-know-about-bots/)
- [2016/9 -- 即將席捲世界的AI,聊天機器人Chatbot 將回答你所有問題!](https://buzzorange.com/techorange/2016/09/02/chatbot-the-new-era-of-information-economics/)
- [SkyScanner Messenger Bot, Demo 訂機票](https://www.youtube.com/watch?v=A3r72C4PM1s)
Prerequisite 先備知識
-------------------
如果你知道以下東西,在這次的 Talk 中會吸收的比較好,但是沒有也沒關係 :)
- Basic Programming
- 簡單的 Backend Knowledge
- HTTP (post, get)
- Database
- URL routing
- JSON format
如果你對 Backend Programming 不熟悉,這裡有一份很好的資源可以學習:
[Udacity: Intro to Backend](https://www.udacity.com/course/intro-to-backend--ud171)
Process 建構流程
---------------
- 選擇一個 Bot 平台
- Build A HTTP service, 跟你普通在寫後端一樣
- 建立 HTTPS 憑證(可略)
- 串接平台與你的 Server
[如何建立一個 HTTPS Server?](https://server-side-note.hackpad.com/-https-server-7PHvOgg6v72)
使用的程式語言 -- Golang
---------------------
Why Golang ?

因為 gopher 很可愛 (圖片取自 [Golang Taiwan](https://www.facebook.com/groups/269001993248363/))
~~看看 python ??~~

所以 Let it GO!!!

> 但是平心而論,Python 在 ==自然語言的處理 / AI== 方面有比較完善的資源。
使用平台 -- LINE
--------------
這次的 Talk, 我們選擇用 LINE 平台來搭建我們的聊天機器人。
### Why LINE Platform?
簡單易上手,功能不複雜,可以很容易的讓你的朋友使用
Facebook 的 Messenger Bot 要建立粉絲團,在這之前的驗證會比較繁瑣,有機會我們可以之後再介紹。
LINE Chatbot
------------
LINE ChatBot 架構原理:

要建立 Line Chatbot, 我們是利用 ==[LINE Messaging API](https://developers.line.me/messaging-api/overview)== 的功能
LINE Messaging API 可以讓我們接收來自使用者的訊息,也可以傳輸訊息給使用者,這中間就是由 LINE Server 處理。我們要建構的系統,就是圖上的右邊部分。(Messaging Servers + Database)
- Messaging Server:
處理使用者訊息,包含解讀與回應
- Database:
顧名思義用來儲存資料,例如將使用者需要的資料儲存在資料庫中,避免多次查訪需要的耗損的時間。
Get Started ! 讓我們正式開始吧!
----------------------------
首先到 [LINE Messaging API - Getting Started](https://developers.line.me/messaging-api/getting-started) 頁面,按照上面的步驟申請 LINE@ 帳號,然後開始使用 Messaging API

進入 LINE@Manager 後,要設定
- 使用 Messging API
- 允許 Webhook 傳訊息 (帳號設定 > Bot設定)

Go developers!
-------------
接下來進入開發者頁面 ==LINE Developers==

在這個頁面需要設定的資訊是:
- Webhook URL
- IP Whitelists
**Webhook** 在這裡簡單來說就是,當使用者的訊息傳送到 LINE Server 的時侯,會觸發額外要執行的事情。是一種 Event 的概念。Webhook URL, 也常稱做 Callback URL。(觸發我們的 Messaging Server 去 Handle 這些訊息)
在我們寫 backend programming 的時候,會為特定格式的 url 提供特定的 function。我們在這邊做 Bot 的時候,就是要實作這個 function。
[Webhook 是什麼?](https://www.mokoversity.com/post/mBaas%EF%BC%9A%E6%94%B9%E8%AE%8A%E9%96%8B%E7%99%BC%E7%94%9F%E6%85%8B%E3%80%81%E4%B9%9F%E5%89%B5%E9%80%A0%E6%96%B0%E7%9A%84%20Business%20%E6%80%9D%E6%83%9F)
**IP Whitelists** 是用來設定,這個 Bot 允許哪些 IP來源 可以回應訊息。
<br>
我們再看看 LINE Developers 頁面還有什麼資訊?
- Channel Secret
- Channel Access Token
這兩個 Channel 資訊,主要是讓 LINE Server 驗證我們發送的訊息是不是合法的。必須夾帶在 Request Header 中。同時,也用來驗證是不是真的是 LINE Server 發送的 HTTP request。
Coding
------
講了這麼多,要怎麼開發呢?

訊息的收發流程:
1. LINE Server --- message ---> Our Server
設定 callback url 等待 LINE Server 發送 HTTP request 到我們的 Server
2. LINE Server <--- message --- Our Server
我們的 Server 要發送 HTTP request 給 LINE Server,為了讓 LINE Server 知道我們是合法的人,所以必須在 Header 上。
### 實作方法
- 土炮法!!利用 HTTP request package(library) + 自幹 HTTP request header
- 使用 SDK (Software Development Kit)
- 選好開發語言
- RTFM: SDK document
LINE Echo bot
--------------
接著,我們來看看 LINE Messaging API 提供了哪些 Event 吧
[Webhook event object](https://devdocs.line.me/en/#webhook-event-object)

要怎麼知道我們製作的 Bot 是可以運行的呢?通常大家會先製作到讓他可以 echo.
### 怎麼 Echo?
- Receive
- 判別接收到的訊息類型(事件)
- 訊息的內容是否能夠正確解讀(decode)
- Reply
- 發送到的人是不是正確的?
以下是 Echo bot 的 source code
- [CCS: golang echo bot](https://github.com/NCKU-CCS/Linebot-Echo-golang)
- [CCS: python echo bot](https://github.com/NCKU-CCS/line_echobot)
語意分析
-------
做一個聊天機器人,首要面對的問題就是 --- 知道使用者的意圖到底是什麼 (辨別 Intent)?
這類的問題有個專有名詞:[Nature Language Processing 自然語言處理](https://en.wikipedia.org/wiki/Natural_language_processing)(NLP)。
NLP 的處理手法:
- Rule-Based System: 由一大堆 if-then 組成。在 LISP 中很常見。MIT AI Course
- 建立 Rule 很傷腦筋
- Rule 定義得不夠嚴謹會有邏輯漏洞
- 要擴充的時候,看起來很雜亂
- 不透過 web 傳輸,不用耗損頻寬,速度可能較快。
掌蚊人 - 聊天機器人第一版:[部分 Rule](https://gist.github.com/JIElite/666356be6db69e563def947df86149d0)
開放課程: [Rule-Based System -- MIT AI Course](https://www.youtube.com/watch?v=iusTmgQyZ44)
- Config with Markup Language: [AIML](https://www.tutorialspoint.com/aiml/)
- 回答較單一,適合固定的回答
- 回覆具有結構性,容易維護,外人也可以上手
- 擴充性不佳
- 具有 state 標籤,也許可以實作 state machine
- AI engine (其實我也不太確定確切名詞)
- Luis.ai -- Microsoft
- API.ai -- 被 Google 收購
- Wit.ai -- 被 Facebook 收購
- 需要 training, training 必須要有嚴謹的方式,最好有專業背景。
- 便於辨別 Intent (使用者意圖)
- [Python NLTK](http://www.nltk.org/) 也是不錯的工具
- 斷詞
- 建立語法樹
- ...
LUIS AI Engine
--------------
LUIS 的介面如下:

介面常用的部分是:
- Intents
辨別使用者意圖
- Entities
這裡我理解的是一句話包含的元素,像是時間,地點都可以當做是 entities。另外要注意的是 Luis.ai 一個 application 只允許 10 個 entities。
Demo LUIS Training
-----------------
因為沒有錄影,只好拿 Microsoft 的影片XD
{%youtube 39L0Gv2EcSk%}
Bot Demo
--------
額外資源
-------
[自己动手做聊天机器人教程](https://github.com/warmheartli/ChatBotCourse)