How to create Google DialogFlow chatbot in10 minutes
前言
隨著Machine Learning的技術越來越成熟, 越來越多的雲端大廠也開始提供自家的AI solution給大眾使用, 如 Google DialogFlow, MS Luis, FB Wit, Amazon Alexa...
DialogFlow 是Google 提供的自然語言處理服務, 能夠將文字轉換成電腦看得懂的結構性資料, 再傳遞給後端介接的Web Service處理, 現在的聊天機器人大多都是使用這種架構
DialogFlow response 的簡單範例,
{ "queryResult": { "queryText": "find some hotel in taipei", "parameters": { "geo-city": "Taipei" }, "intent": { "displayName": "FindHotel" }, "intentDetectionConfidence": 1, "languageCode": "en" } }
parameter 則是語句當中的關鍵字, chatbot可以用這些關鍵字當成查詢資料庫的條件, 最後再將答案反饋給使用者
Integration
作為輸入的來源, DialogFlow 目前支援自家的Google Assistant, 還有其他頻道像是 Line, Skype, Facebook ..., 也就是說使用DialogFlow開發的機器人, 不一定只能用在Google Assistant上, 還可以串到Skype, 臉書,,,等等以下教學, 如何快速建立一個聊天機器人
Agent
首先, 建立一個訂飯店機器人 HotelBot AgentIntent
開發chatbot時最有可能會遇到問題是, 同一個意思的說話方式可能百百種,
find a hotel for me in Taipei
search a hotel in Taipei
i'm looking for a hotel in Taipei
我們不可能在後端寫一大堆很複雜的Regular Expression 去解析這些句子, 所以我們需要NLP引擎將相似句子對應到同一個類上(也就是意圖)然後再處理
建立一個FindHotel的意圖
將相關的對話都映射到這個意圖上
DialogFlow 背後的NLP引擎, 會將我們剛剛定義的相關語句訓練出一個模型, 當未來有類似的句子時, 就會分析出FindHotel的意圖出來
建立action
透過這個action, 當使用者沒有特別表明目的地的時候呢, action就會被執行起來反問使用者 where are you looking for
建立回復的句子, 回答使用者的問題
基本上, 做到這一步, 機器人已經算是成型了,
可以透過右方的功能進行簡單的測試
Webhook
實務上, 我們開發的機器人不可能完全依賴於DialogFlow上定義的Respone來滿足使用者的需求, 有些商務邏輯必須要在後端動態地處理, 列如處理訂單, 查詢飯店房間等等...
Webhook就是一個能夠讓我們後端程式跟DialogFlow介接的橋樑
基本上需要是一個HTTPS 的REST API
var express = require('express');
var bodyParser = require('body-parser'); //parse POST request for text/json/query string var app = express(); app.use( bodyParser.urlencoded({ extended: true }) ) app.use( bodyParser.json() ) app.get("/",function(req,res){ res.send({ message: 'welcome' }); }) app.post("/webhook", function(req,res){ console.log(JSON.stringify(req.body, null, 2)) var intent = req.body.queryResult.intent.displayName; var entityCity = req.body.queryResult.parameters["geo-city"]; if(intent === 'FindHotel') { return res.json({ fulfillmentText: `I found some hotel in ${entityCity}` }); } else { return res.json({ fulfillmentText: `sorry i am not sure` }); } }) app.listen(process.env.PORT || 1337, function(){ console.log('server start ...'); })
部屬
接下來教大家如何將Node Application部屬在Azure App Service上Step 1. 建立資源群組
az group create --name NodeResourceGroup --location "West US"
Step 2. 建立Service planaz appservice plan create --name NodeAppPlan --resource-group NodeResourceGroup --sku F1
Step 3. 建立web 應用程式az webapp create --resource-group NodeResourceGroup --plan nodeappplan --name DialogFlowHotelBot --runtime "NODE|6.9"Step 4. 建立Deployment credential
az webapp deployment user set --user-name andylai --password 12345Step 5. 設定部屬方式
az webapp deployment source config-local-git --name DialogFlowHotelBot --resource-group NodeResourceGroup指令成功後會得到Repository Url
{ "url": "https://erggw1234@dialog1234azure.net/DialogFlowHotelBot.git" }
Step 6.
git remote add azure https://erggw1234@dialog1234azure.net/DialogFlowHotelBot.gitStep 7.
git add -A
git commit
git push azure master
設定Webhook
選擇啟動Webhook
Url 的欄位內填入我們web api的位址
(記得在右下方點擊Save保存以上的設定)
有了webhook之後, 我們需要回到剛剛建立的FindHotel Intent的頁面, 選擇Enable webhook call for this intent
抱歉 請問大大
回覆刪除在這段「將Node Application部屬在Azure App Service上」的段落裡面 那些指令要在哪邊輸入啊?
你可以在azure portal上敲指令,或是在本機端安裝az cli 請參考 https://andy51002000.blogspot.com/2018/04/azure-nodejs.html
刪除感謝你!!
刪除你好,我在找一个research assistant帮我用google dialogflow做一个chatbot。请你有兴趣吗?请邮件详谈。谢谢!
回覆刪除airescc@gmail.com
刪除你好,请问机器人可以植入到网站,facebook,wechat吗
回覆刪除可以部屬到Heroku嗎?
回覆刪除