第一章、 前言
在現在這時代,最多人使用的通訊軟體就是LINE了。我們想做一些服務或展示,比起生一個APP,使用網頁或者其他軟體內嵌服務可能更快速。而AI能應用的東西很廣,如果有一個可以結合我們上述提到的那些小系統的方案,顯然是個不錯的展示平台。
而我們想到的就是LINE了,LINE提供了一個開發者介面,讓開發者可以將LINE連結自己的API來做一些有趣的應用,而其中一個就是聊天機器人,許多的明星或者公司會利用這個技術做類似客服的LINE帳號。這類機器人通常會對特定的語句做出反應,高階一點的則是語句有些許變化也能容忍──這剛好是我們前面NLP部分的應用。而LINE也有接收聲音、圖片的事件,可以結合智慧音箱和影像辨識。
我們利用Heroku提供的雲端API執行平台,連結Line開發者帳號來嘗試製作一個對話機器人Kotori(吉祥物教阿的日文名字)。
第二章、 前置準備
要將我們設計的機器人架在LINE上面得先做一點準備,第一步,我們先申請一個Heroku帳號,從官方網站https://www.heroku.com/點選右上角的SignUp註冊。
註冊完成後,登入點選右上角的New->Create New App,建立一個自己喜歡的App專案(請記住專案的名稱)。完成之後依以下網址下載Heroku CLI並安裝:https://devcenter.heroku.com/articles/heroku-cli。
第二步,安裝git:https://git-scm.com/downloads。
第三步:申請Line的開發者專案,詳情可以參考https://developers.line.me/en/docs/messaging-api/getting-started/。
以上,先期的準備大致完成,接著進入程式碼撰寫的部分。由於程式本身要在雲端執行,故main裡面和一般的程式寫法有一點差異。另外本程式基於line-bot-sdk開發而成。
第三章、 文字訊息事件
在linebot之中有許多的事件類型,當你需要針對某個類型事件作處理的時候就要先宣告它的接收體,@handler.add幫助各位建立各種不同的接收體,以下我們將為各位說明幾個比較常用的大類
文字訊息是LINE上面最常見的訊息,大致上就是純文字所構成,偶爾可能混一些符號:
這類訊息我們可以使用
@handler.add(MessageEvent, message=TextMessage)
來宣告接收體,並在handle_message(event)中對訊息做處理。處理LINE訊息時,第一個要記起來的物件是event.message.text,如字面翻譯,就是當有人傳訊息給這個機器人時訊息的主體。如上圖,我傳送給教阿後,教阿透過event.message.text取得我傳送的訊息(”C4cat是什麼”,以及”?”),並分析後回應。
而第二個重要的物件是event.reply_token,這個物件決定你收到這條訊息要回應的對象。event.reply_token是一次性的,即使是同一個人,第二次傳訊過來你收到的event.reply_token也不會一樣。
而文字訊息分析我們前面提過幾個方法,比方說全句對應型或者是斷詞後對特定詞作反應:
第1節. 全句符合
包含了全句式的回應(智慧居家管家系統、智慧講桌系統)以及占卜系統(占卜球),占卜球因為強制要求日期格式,劃分至全句符合的區塊。具體內容前面章節皆有說明,不再贅述。
第2節. 關鍵詞符合
包含股票查詢系統和WikiQA系統,股票查詢系統利用twstock函式庫取得資料,要求有股票關鍵字,以及上市代號或名稱。
twstock在本系統主要利用它的幾個功能:即時交易價查詢、最高最低點查詢(前二皆為twstock.realtime.get取得)以及四大買賣點分析(BestFourPoint)。
WikiQA系統則需要有5W(什麼、誰、哪裡之類)疑問詞,以及最好有介系詞(是、在之類)來幫助教阿利用wikipedia函式庫尋找答案並回答
第3節. 子字串符合
本機器人已經上線一段時間了,觀察使用者使用紀錄以及程式歷程,訊息無法正確回應的一大原因是斷詞系統錯誤,造成以關鍵詞為準的分析無法觸發。
依照此現象,一個想法是將詞的概念去除,單純以子字串作為觸發來做為最後防線。字串物件的find方法可以達成這件事情。
子字串方法由於不受斷詞正確率影響,通常做為檢查的最後手段,注意它雖然不受斷詞干擾,但容易被誤觸發──比方說以上面例子,萬一用戶說的是”這個公式老師沒有教阿!”這種句子就會誤觸發,雖然正常來說作為語尾助詞「阿」應該是選「啊」這個字,但很遺憾的是,其實LINE用戶在打字時選字是很隨便的。
第四章、 貼圖訊息事件
在LINE上第二多的應該算是貼圖訊息,某些人在好友群組甚至可以光依靠貼圖就完成對話和意見交流。因此我們也會稍微對貼圖訊息做處理,但LineBot本身只能回應前4組Line內建的普通貼圖。
第一件事情當然是建立貼圖的接收器,和文字訊息類似,使用@handler.add(MessageEvent, message=StickerMessage)宣告接收器,再從之後的handle_sticker_message(event)編寫對應。
貼圖在LINE之中是以兩組號碼代表,第一組號碼是該貼圖屬於那個系列的貼圖,在event物件中為event.message.package_id,第二組號碼是該貼圖在系列中的第幾張,為event.message.sticker_id物件。因為版權問題,此處不方便截圖說明建立的貼圖,但可以藉由自行發送貼圖給Line機器人,再請它回傳的方式得到這些號碼。
第五章、 PostBack事件
PostBack事件是一種比較特殊的事件,用戶不會因為打字或傳送什麼東西而觸發它,比較常見的觸發方法是用了LINE提供的內建選單,像底下這種:
這種清單當你按下按鈕,有可能是傳回PostBack到LINE Bot的伺服器,LINE Bot再根據PostBack做回應,類似我們一般程式傳變數的感覺。我們將在回應部分說明如何生出這種選單式的LINE訊息。
而要接收PostBack使用的是@handler.add(PostbackEvent),一樣使用後面的handle_postback(event)定義接收到的反應。
我們的系統中,PostBack基本上只對列表或按鈕做出反應,而其中包含了兩個列表:說明文件和IoT列表。原理相同都是分析PostBack傳回的變數。
第六章、 回應
回應部分雖然分為四片,但實質上就只是更動一些物件及變數,主要方法並沒有變更,故合併一起說明。
回應的基本函式都是基於以下函式:
line_bot_api.reply_message(event.reply_token, message)
差別只在message的種類差別。
第1節. 文字訊息
TextSendMessage(text=message)
最常見的回應,單純回一個文字字串回去:
第2節. 貼圖訊息
StickerSendMessage(
package_id=event.message.package_id,
sticker_id=event.message.sticker_id)
參考前面有關貼圖事件,發送一樣也是兩個id組成。前面也提到過只能使用前四組普通貼圖,很無聊就不示範了
第3節. 圖形訊息
message = ImageSendMessage(
original_content_url=’https://i.imgur.com/Hn6lBtg.jpg’,
preview_image_url=’https://i.imgur.com/Hn6lBtg.jpg’)
圖形訊息必須從url傳送,且格式限制為jpg。程式接受自己製作縮圖,縮圖和原圖的大小有其限制(請參考line-sdk)。
預防各種版權問題,這邊不呈現運作結果。
第4節. Template訊息
Template訊息可以視為是Line的互動功能,按下列表會有特定反應,也可以讓點列表的用戶說出特定訊息:
在電腦版上不能顯示列表時就是顯示替代文字:
其他部分對應程式碼大略可以推出是哪部分的參數,比較麻煩的是actions部分。actions有許多種類,PostbackTemplateAction可以在點選之後傳一個Postback,觸發我們前面提到的Postback事件。另外也有MessageTemplateAction事件,點選之後使用者會發出選單指定的訊息──再使用一般文字訊息事件做回應。
第七章、 發佈
最後就是架到雲端執行的部分。如果各位還記得我們開始寫程式前的步驟(申請帳號等等),那些都是為了現在所做的前期工作。
開啟聊天機器人python檔放置之資料夾,並在路徑列輸入cmd:
就會直接開啟命令提示字元,在底下依序輸入指令:
heroku login
git config –global user.name 你的名字
git config –global user.email 你的信箱
git init
heroku git:remote -a 前面步驟你為APP取的專案名稱
git add .
git commit -m “任意名字” 以後更新程式時下最後這三行藍字指令即可
git push heroku master
上傳完成,可以到Line添加你的開發者專案產生的機器人好友,開始測試。