Chatbot:

 

講清了一些最最基本的概念ios

Intents(意圖)Entities(關鍵字)git

基於意圖(Intent-based)的對話 基於流程(Flow-based)的對話 github

 

聊天機器人教學:使用Dialogflow (API.AI)開發 iOS Chatbot App

 

imageweb

隨著蘋果Core ML的最新版本發佈,開發人員更容易構建人工智能應用程式,除了圖像識別和文本檢測是利用AI建置APP的好例子,另外一種善於展示機器學習Power的應用程式類型則是chatbots。在本教程中,咱們將使用Google的Dialogflow(之前稱爲API.AI)構建在iOS上運行的chatbot應用程式!算法

聽起來很酷吧!接下來開始進入本教程的重點。編程

Intents(意圖)和Entities(關鍵字)快速概覽

在開始以前,我先解釋Dialogflow和chatbots的通常基本知識。 在構建chatbots時,你必須知道兩個術語:Intents(意圖)Entities(關鍵字)swift

An entity represents a term or object in the user’s input that provides clarification or specific context for a particular intent. (entity表示用戶輸入中的術語或對象,爲intent提供說明或使用情境。) An intent, on the other hand, represents something that the user wants to do. If intents represent verbs, then entities represent nouns. (另外一方面,intent表明用戶想要作的事情,若是intent表明動詞,則entities表明名詞。)api

來看一個例子,在咱們的項目中,可能會告訴咱們的機器人如下聲明:網絡

「Book me a room at the La Grande Hotel」(替我在La Grande Hotel訂一間房)閉包

在這句話中,咱們的intent(意圖)是」預約一個房間」,entity(關鍵字)是」La Grande Hotel」,如今,天然語言處理(NLP)算法能夠計算兩種不一樣類型的對話內容。

  1. 基於意圖(Intent-based)的對話:這是當NLP算法使用intents和entities進行對話時,經過識別用戶聲明中的名詞和動詞,而後與它的dictionary交叉引用,讓bot能夠執行有效的操做,這種類型的對話是Dialogflow使用的。
  2. 基於流程(Flow-based)的對話:基於流程的對話是智能通訊的下一個級別。在這裏,咱們會給予兩我的之間對話的許多不一樣樣本的RNN(循環神經網絡),建立的機器人將根據你訓練的ML模型進行響應。Wit.ai是在這個領域取得巨大進展的少數網站之一,不用擔憂,咱們不須要作到這個程度。

注意:若是想了解更多有關Intent-based和Flow-based的對話信息,能夠查看這篇文章

在本教程中,咱們將建立一個可幫助你預訂hotel的機器人。

One of the most important rules when developing a chatbot is that it MUST have a personna. This means that it must behave like a real person. Therefore, let’s name out bot – Chip! (開發chatbot最重要的規則之一,就是它必須有一個personna,意味著它必須像真人同樣行事。 所以,讓咱們來替bot命名 – Chip!)

接下來,就進入本文重點!

熟悉Dialogflow

進入到Dialogflow,在右上角點擊」Go to Console(前往控制檯)」。

 

Dialogflow

系統會要求你使用Google賬戶登陸,並受權使用Dialogflow在Google雲端平臺服務中查看和管理你的資訊,接受條款,你應該看到一個初始啟動頁面。

 

Dialogflow-console

觀看介紹影片可讓你更快速瞭解Dialogflow,但若是你不想花時間看也沒關係!點擊」Create Agent」按鈕,在Dialogflow中,一個agent(代理)意味著iOS應用將使用chatbot經過無線方式進行通信以接收回應。

填寫代理名稱(好比Chip),而後點擊Create按鈕進行下一步,Dialogflow將爲你建立agent。如今,讓咱們來確認一下,你應該有2個預設intents:」Default Welcome Intent」和」Default Fallback Intent」。在左側欄位中,你應該能夠看到Intents和Entities的tabs(選項)。

 

Create Agent in Dialogflow

咱們也會在下方看到其餘tabs。如今,該開始建立機器人了!

添加Entities

首先,讓咱們開始添加entities,若是你還記得,entities就像NLP算法能夠理解的名詞,拿出一個可能常常用於咱們機器人的entities名單,我已經把我整理的list放在下面,而且隨時能夠添加它。

  • Hotel
  • Room
  • Payment

選擇entities選項,而後點擊」Create Entity」按鈕。並將這個entity命名爲」Hotel」,並點擊第一行,輸入」Hotel」當作參考值,當用戶使用你的機器人時,他們可能會使用Hotel之外的其餘名稱。 所以,應該輸入關鍵字的一些同義詞,即便用戶使用」Hotel」之外的字,機器人仍然能夠理解用戶在說什麼,看下面的圖片,我使用了一些同義詞。

 

Dialogflow-add-entity

如今,儲存你的entity,並按照剛纔建置Hotel entity的步驟建立如下的entities。

 

Dialogflow-entity-payment

 

Dialogflow-entity-room

小建議:要查找單詞的同義詞,只需Google搜尋」synonyms of [word]」。

如今咱們已經建立了entities,接著來討論intents。

添加Intents

進入Intents頁面並點擊Default Welcome Intent,這個intent就是咱們機器人在第一次啟動時會抓取的東西,你應該看到網頁呈現以下:

 

Dialogflow-intent

咱們能夠制定用戶應該說出哪一個字去觸發intent。在本頁面的最底部,咱們也能夠制定迴應的文本內容,因爲這是一個Welcome intent,用戶可能會說」Hello!」或」How’s it going?」 所以,讓咱們將這些短語(和任何相似的同義詞)添加到’User says’部分,如下是一些範例,你能夠隨意地添加更多的訊息,設定你的用戶可能會對機器人說的字彙。

 

Dialogflow-welcome-intent

若是向下滾動,會找到* Response *部分。intent帶有一些內置的迴應,咱們添加一個follow up question(關聯性問題):」What can I do for you?」,咱們最終Welcome intent應該是這樣的:

 

Dialogflow-welcome-intent-response

在咱們開始建立下一個intent以前,若是你想在任什麼時候候測試你的agent,請查看右側欄位,你能夠輸入想要的任何內容,而後查看你的agent是否迴應。輸入」Hello」,而後檢查agent是否迴應了預期的迴應。

到目前爲止,agent只有一個intent,因爲咱們的機器人是爲處理預訂hotel而設計的,所以咱們必須建立另外一個處理intent這些查詢,用戶可能會問:「能替我預訂一家旅館嗎?」 或相似的問句。

讓咱們建立一個新的intent,並將其命名Begin Order。在User says欄位中,添加上面的表達式而後按下enter。一旦你輸入了這個表達式,將會看到agent已經在該語句中識別了一個@Hotel關鍵字。與entities相似,用戶不會只用這個問句來表達預訂酒店的需求。因此這裏添加一些變化,以agent理能夠了解用戶的意思,增長的變化越多,agent也就越聰明,如下是一個範例展現。

 

Dialogflow Begin Order Intent

agent應該作的下一件事是搜索附近的hotel,並詢問用戶他/她須要幾間房。可是,若是咱們要真正搜尋附近的酒店,則須要調用API並使用JavaScript將webhook與api.ai整合在一塊兒,這超出了本教程的範圍,因此讓咱們在Response欄位建立一些虛擬酒店,這是我建立的迴應內容:

 

Dialogflow-begin-order-response

儲存intent並返回到主頁面,在右側欄位中測試你的agent,到目前爲止,若是讀者有跟著前面的步驟,它應該按預期工做!正如你所看到的,沒必要提出確切的問題,Dialogflow將從你的陳述中學習並理解變化。

 

test-agent

如今,咱們來添加一些follow-up intent,將鼠標移動在你剛建立的intent上,你應該看到一個選項」Add follow-up intent」,選擇它並點擊Custom,將產生一個新的intent,並顯示」Begin Order – custom」,讓咱們編輯這個intent!

 

Dialogflow-add-follow-intent

請記住,咱們agent對咱們說的最後一件事情是」How many rooms do we want?」,用戶可能會回覆一個數字,他/她可能會說:」I would like 1 room」或簡單地回答」4″,你應該要預測用戶會說什麼,並填寫全部可能的答案,請參考如下我填寫的範例:

 

begin-order-followup-intent

正如你所看到的,Dialogflow有一個內置的數字entity,無論你輸入一個數字仍是一個單詞,它都可以處理它並理解它的含義。

接下來,咱們要讓機器人迴應確認價格總額,並詢問用戶喜歡什麼付款方式。一樣的,於這些是hotel虛擬資料,咱們能夠在機器人的反應中添加虛擬的價格。

 

begin-order-followup-response

保存這個intent,如今給讀者一個挑戰,建立最後一個intent,即詢問用戶使用何種付款方式付款,這應該是很是簡單的,由於咱們已經作了兩次!

因此咱們將回到intent的主頁面,而後點擊Create Intent。

注意: 沒有建立另外一個follow-up intent,由於當機器人第一次觸發時,用戶不太可能會說出付款方式的名稱,這就是爲何我要創造一個normal intent,就像咱們在剛開始時所作的。

將這個intent命名爲Payment並添加用戶可能會說的內容,這是咱們的Payment關鍵字(entity)使用的地方!

 

Dialogflow-payment-intent

最後,讓機器人迴應一些確認訊息。如下是一些範例:

  • Done! You have rent the rooms!
  • Success! We received your payment.

就是這樣!請記住保存Payment意圖,Chip如今可使用了,在咱們轉到本教程的iOS端以前,你能夠在右側欄位中對其進行測試。

還有幾件事

在開始真正的編程以前,讓我花點時間來解釋Dialogflow控制檯左側欄位中的其餘tabs,在Entities下,有一個名爲Training的tab,若是點擊此選項,你將收到全部發送給agent的回覆訊息以及agent回覆的內容,若是你告訴你的agent一些迴應文本,但它迴應你不喜歡的輸出,這就很是有用,若你稍後意識到忘記了某個關鍵字的同義詞,而且用戶正在使用這個關鍵字,那麼也可能會有所幫助,能夠去告訴你的代理在這種狀況下應該作什麼。

在Training下方,你能夠看到Integrations。在這裏,能夠管理你的agent去串接不一樣的服務,例如Google Assistant,Twitter,Slack,Messenger,Cortana,Alexa等等。Integrations以後,還有Analytics,基本上用來顯示建議名稱,以後還有Fulfillment,若是你要調用一個API並實現一個webhook,這就是你會須要來的地方。

 

Dialogflow-integration

最後兩個選項功能很是簡單,但頗有用。第一個是Prebuilt Agents,在這裏,你能夠import一個預先存在的代理框架,有不少例子,如食物傳遞機器人,音樂機器人,甚至(抱歉,但你真的須要知道這個)hotel預訂機器人! 最後一個選項是Small Talk,若是你將代理設計爲像Siri或Google Assistant這樣的每日夥伴(daily companion),這個選項很是有用,Small Talk容許你添加常見問題的答案,咱們都喜歡問咱們的機器人,如」你幾歲?」或」你住哪裏?」,以及更熱門的問題」你願意嫁給我嗎?」

如今你已經知道Dialogflow是什麼,而且對於如何操做有很好的觀念了,如今是時候移動到另外一端,開始編寫Swift代碼!

使用API.AI SDK鏈接到Dialogflow

如今咱們移動到本教程Swift的部分,首先[下載初始項目](https://github.com/appcoda/ChatbotHotel/raw/master/ChatbotStarter.zip),我已經構建了基本的UI並綁定了API.AI SDK。若是你從頭構建應用程序,則可使用CocoaPods安裝API.AI SDK(這是用於鏈接到Dialogflow的SDK),只需在Podfile中添加如下訊息:

pod  'ApiAI'

一旦你unzip初始項目,確保你打開了Chatbot Starter Project.xcworkspace文件。進入Main.storyboard,已經有一個UILabelUIButtonUITextField,它們的outlets也鏈接到ViewController.swift

 

demo-app-main-storyboard

先來看看AppDelegate.swift,咱們須要讓APP鏈接到Dialogflow的servers,在import UIKit的正下方,輸入如下代碼來導入framework:

import  ApiAI

如今,須要使用client access token來初始化咱們的配置,請參照下面範例更新didFinishLaunchingWithOptions方法:

func  application(_  application:  UIApplication,  didFinishLaunchingWithOptions launchOptions:  [UIApplicationLaunchOptionsKey:  Any]?)  ->  Bool  {

    let  configuration  =  AIDefaultConfiguration()

    configuration.clientAccessToken  =  "YOUR_CLIENT_ACCESS_TOKEN"

    let  apiai  =  ApiAI.shared()

    apiai?.configuration  =  configuration

    return  true

}

將字符串」YOUR_CLIENT_ACCESS_TOKEN」替換你本身的機器人的client access token,若是你不知道在哪裏能夠找到,請移動到Dialogflow中的chatbot settings。 在」General」選項下,你應該在」API keys欄位下找到client access token。

 

Dialogflow-api-key

如今,當咱們的應用程式啟動時,它將使用client access token鏈接到Chip bot。

讓裝置開始說話

前往ViewController.swift,而且在import UIKit之下,import ApiAI和AVFoundation框架:

import  ApiAI

import  AVFoundation

咱們須要導入AVFoundation框架,由於咱們須要bot與用戶交談,該框架附帶了可以從文本轉爲合成語音的「AVSpeechSynthesizer」類別,爲了讓裝置與咱們的用戶交談,在ViewController類中插入如下幾行代碼:

let  speechSynthesizer  =  AVSpeechSynthesizer()

func  speechAndText(text:  String)  {

    let  speechUtterance  =  AVSpeechUtterance(string:  text)

    speechSynthesizer.speak(speechUtterance)

    UIView.animate(withDuration:  1.0,  delay:  0.0,  options:  .curveEaseInOut,  animations:  {

        self.chipResponse.text  =  text

    },  completion:  nil)

}

讓我告訴你上面的代碼作了哪些事。首先,咱們定義一個常數speechSynthesizer,並初始化一個 AVSpeechSynthesizer的實例。AVSpeechSynthesizer是一個提供自文本轉換爲語音的object,並容許存取控制正在進行的訪問,而後建立一個新的函數speechAndText(text: String),根據用戶輸入的內容執行更改。

在函數內部,咱們建立一個AVSpeechUtterance的實例,最簡單的說,它是一個將被宣讀的文本塊。而後,咱們要求裝置讀出這段文字,同時,咱們想向用戶展現機器人的response,這就是爲何咱們將label的text設置爲機器人的response。

我使用UIView.animate方法爲label轉換爲微妙的動畫,當你正在開發本身的應用程式,但不具有建立高品質的動畫知識,則這種方法能夠實現這一效果。

發送請求

咱們只剩下最後一部分,當用戶點擊按鈕時,應發送request給咱們的代理,讓咱們看看咱們該怎麼作!在sendMessage操做方法中插入如下幾行代碼:

let  request  =  ApiAI.shared().textRequest()

if  let  text  =  self.messageField.text,  text  !=  ""  {

    request?.query  =  text

}  else  {

    return

}

這段code是至關基本的,可是可能部分讀者不太理解這段代碼,仍是讓我解釋一下。基本上,咱們以用戶提供的query條件來準備API.AI文本請求,從messageField中檢索文本並執行基本驗證,確保文本字段不是空白,一旦咱們獲得了這段text,就將它丟給request的query屬性。

好的,文本request已經準備好了,下一步是發起請求併發送給機器人。固然,咱們須要處理API.AI代理迴應的任何內容,有兩種可能性:successfailure,若是代理程序返回成功訊息,那麼咱們但願應用程式說出迴應並將其顯示在螢幕上,若是出現失敗訊息,那麼應用程式只是打印錯誤到控制檯,咱們能夠經過使用下面的代碼來實現:

request?.setMappedCompletionBlockSuccess({  (request,  response)  in

    let  response  =  response as!  AIResponse

    if  let  textResponse  =  response.result.fulfillment.speech  {

        self.speechAndText(text:  textResponse)

    }

},  failure:  {  (request,  error)  in

    print(error!)

})

request執行完成後,應用程式須要作什麼,你能夠調用setMappedCompletionBlockSuccess方法並在閉包中指定動做,一旦請求完成,完成處理程序將被調用,並將迴應做爲參數傳遞,在閉包中,咱們調用前面建立的speechAndText(text: )方法來講出並顯示迴應內容,若是response顯示失敗,咱們只需將其打印到logs便可。

剩下最後一件事,咱們尚未發起對API.AI的request,爲此,咱們調用enqueue函數並放入指定request,這能夠經過使用下面代碼來完成:

ApiAI.shared().enqueue(request)

messageField.text  =  ""

咱們將請求發送到API.AI並清除textfield中的文字,你的整個sendMessage方法應該以下所示

@IBAction func  sendMessage(_  sender:  Any)  {

    let  request  =  ApiAI.shared().textRequest()

    if  let  text  =  self.messageField.text,  text  !=  ""  {

        request?.query  =  text

    }  else  {

        return

    }

    request?.setMappedCompletionBlockSuccess({  (request,  response)  in

        let  response  =  response as!  AIResponse

        if  let  textResponse  =  response.result.fulfillment.speech  {

            self.speechAndText(text:  textResponse)

        }

    },  failure:  {  (request,  error)  in

        print(error!)

    })

    ApiAI.shared().enqueue(request)

    messageField.text  =  ""

}

是時候了!如今運行應用程式(在iPhone X上),一切都應該按預期工做!

 

chatbot-demo-hotel-booking

下一步是什麼

本教程包含不少的資訊,但願對讀者會是很是有益的,那麼,接下來你應該作什麼?我會建議你繼續擴展這個機器人,甚至建立你本身的機器人,期待你分享如何建立本身的機器人,歡迎發表在下面的評論!

以供參考,你能夠在Github下載完成的項目

關於Dialogflow的更多資訊,你你能夠參考他們的documentation

勇敢大膽的嘗試吧!你能夠在Dialogflow上建立本身的聊天機器人,並把它放在Google Assistant上。若是你想嘗試一下,請查看這個影片,能夠打開Google Assistant並透過」Talk to Max the Programmer」來測試我用Dialogflow製做的聊天機器人!鼓勵你們繼續研究Dialogflow,由於你能夠在Google Assistant,Alexa,Twitter,Cortana,Facebook Messenger,Telegram等平臺部署聊天機器人!

原文Building a Chatbot App for iOS with Dialogflow (API.AI) and Text-to-Speech

簡寶玉寫做羣日更打卡第 29 天

相關文章
相關標籤/搜索