下一個時代,對話即平臺 —— 開始使用Bot Framework和Cognitive Service來打造你的智能對話服務

在16年3月30號微軟的全球開發者大會Build上發佈了Bot Framework,微軟認爲下一個big thing是Conversation as a Platform,簡稱CaaP,中文應該叫作"對話即平臺"。在咱們的下個時代,咱們將會處在對話即平臺的時代,不論是一個屏幕,一個桌子,一個冰箱,甚至是人,都是一個app,都是一個對話的窗口,全部的交互都經過對話來完成。起牀,你用天然語言喚起梳妝檯的鏡子顯示今日的天氣,還有新聞。家裏的小娜(Cortana)提醒你要趕忙出門,路上由於限號4,9,根據歷史的預測,會提前堵車,須要提早20分鐘出發。html

那這個時代,將是如何實現的呢?人工智能不是簡單一個團隊,一小段時間就能完成的,須要通過大量的科研人員,進行大量的研究才能實現的。那怎麼樣才能實現物物智能,智能衆生的構想呢?微軟將微軟亞太研究院多年的研究技術開放出來,讓各個開發者,不論是大公司,小公司甚至是我的均可以藉助"智能"的"洪荒之力",實現智能對話平臺的將來。git

打造這樣的智能服務須要涉及到微軟的兩個技術,Bot Framework和Cognitive Services(認知服務)。github

Bot Framework就是幫你快速搭建智能服務的後端,快速在各類終端和服務上提供服務。包括三大組件。web

Bot Builder SDKs:正則表達式

這個是Bot的生成器,快速生成一個ASP.NET和Node.js的後端服務,提供了像Dialog、FormFlow幫你管理與用戶的會話。npm

Bot Connector:json

這是個Bot的Channel,幫你把你的服務快速發佈到各個渠道,好比說Skype,Facebook Messager等等。這樣用戶就能夠在Skype等Channel上使用你的服務了。後端

Bot Directory:api

這個算是Bot 的商店,在這裏能夠找到各個bot,你也能夠把本身的Bot發佈出來,從而你們均可以看到你的Bot。app

   

Cognitive Services(認知服務)的前身是Project Oxford(牛津計劃),正式發佈的時候改名的。這是微軟將研究院研究的技術以API和SDK的形式開放給開發者的一系列智能化服務。

主要包括5大類的服務:視覺、語言、語言、知識和搜索。

其實就包括咱們今天要講的"語言理解(Language Understanding Intelligent Service,簡稱LUIS)"。

   

咱們今天以一個例子舉例,來詳細介紹怎麼利用Bot Framework和LUIS("擼以si")打造一個智能陪護機器人。

1、下載Bot Framework的SDK

首先,請下載Bot Framework的SDK,建議下載Bot Framework的Visual Studio的模板Bot Application

下載下來的模板(不用解壓)請直接放置到C:\Users\你的用戶名\Documents\Visual Studio 2015\Templates\ProjectTemplates\Visual C# 下面,這樣你在C#下面就能夠看到有Bot Application的模板了。

若是是使用NuGet來下載SDK,請參考:

  1. 右鍵你的C#項目,選擇"Manage NuGet Packages".
  2. 在"Browse"的tab頁,輸入"Microsoft.Bot.Builder".
  3. 點擊"Install"的按鈕.

若是你使用的是Node.js,請使用如下命令:

npm install botbuilder

2、在Azure上建立bot服務

我們如今建立一個Bot Application的應用。我準備建立一個叫作"萌萌"的機器人。

在Azure上建立Bot服務:搜索bot,選擇"Web App Bot"。

點擊建立,填寫相關的信息:

選擇基本模板便可,其餘默認選項便可。

配置完成後,點擊建立,等待幾分鐘便可建立完成。

建立完成你可看到Bot服務幫你建立了5個相關服務。

點擊第一個Web App Bot服務,便可配置Bot相關服務。

"Name":你的bot的名字,好比個人叫作"萌萌"。

"句柄(Bot Handle)":好比個人寫"mengmeng",其實就是你的Bot的id,記下來。

"Description":你的Bot的描述,會在你的publish以後主頁上顯示。

點擊"信道",其實就是配置各個平臺,裏頭能夠看到"Web Chat",這個是網頁端的channel,已經幫你寫好的一個iframe,我們點擊"Edit"。

生成Web Chat的密鑰以後,把密鑰複製,點擊"I'm done configuring Web Chat"。

 

在資源組中,選擇你建立的資源組,點擊"部署":

請記下APPID和AppSecret兩個參數,後面會用到。

3、準備你的機器人後端服務代碼

從個人GitHub地址下載代碼:https://github.com/cheneyszp/MengmengBot

在你的Web.config裏,填上你的BotId,剛纔建立的App ID和AppSecret。

打開網站的起始頁default.htm

複製如下代碼:

<!DOCTYPE html>

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

<html>

<head>

<title>萌萌</title>

<meta charset="utf-8" />

</head>

<body style="font-family:'Segoe UI'">

<iframe name="myframe" scrolling="auto" width="100%" height="100%"

onload="document.all['myframe'].style.height=myframe.document.body.scrollHeight"

src="https://webchat.botframework.com/embed/你本身的Bot句柄?s=你 自 己 的 Web Chat 密 鑰 " style="height: 502px; max-height: 502px;"></iframe>

</body>

</html>

   

而後右鍵項目工程,點擊"publish",以後你就能夠擁有一個簡單的Bot啦。

4、新建LUIS服務

請先登陸:https://www.luis.ai/ ,這是語言理解服務的portal。若是還沒註冊的話用live id註冊如下就能夠了。

點擊"App"這一欄,我們先點擊"new App"新建一個app。

 

   

新建完成後,點擊應用的名稱,進入編輯這個應用。

咱們先看如下左邊的tab,能夠看到有儀表盤,意圖(Intents),實體(Entities),功能。。。。

   

Intents:就是意圖,好比我們如今要提供天氣查詢的服務,那麼我們就建立一個"查詢天氣"的Intent。

實體裏頭有兩類:

Entities:實體,好比在查詢天氣的時候須要有地理位置信息,須要把用戶的語言裏頭的地點提取出來,這個地點就是這個句子裏頭的實例,我們建立一個"地點"的實例。

Pre-built Entities(預建實體):這個是預置好的實例,好比說時間,數字等等,我加了一個datetime的預置實例。

在功能裏頭會有:

Phrase List(短語列表功能):固定的一些短語,可以直接識別,好比說航空公司的名字等已知信息

Pattern Features(模式功能):正則表達式,能夠匹配出相應的一些字段,好比說航班號。

   

我們如今來建立一個可以識別查詢天氣的語言理解服務。

首先,查詢天氣須要地點信息,我們先建立一個"地點"的實例。

點擊到"實體"裏頭,"添加自定義實體":

 

 添加一個"預建實體" datetime:

 

再建立一個叫作"查詢天氣"的Intent。

 

點擊Done以後,點擊"查詢天氣"會進入如下界面:

輸入幾個例子,好比說"北京天氣怎麼樣",能夠多輸入幾個句子的類型,好比"北京今天有霧霾嗎?"等等,每輸入完一句按一下回車。

若是北京等地點信息沒有顯示標記的話,選中北京兩個字,而後選擇"地點"標註。而後點擊"保存"。

隨手點擊該界面右上角的"Train"按鈕進行訓練。

能夠點擊Test進行測試。

隨手點擊"Publish"的tab頁面,進入到一下界面,點擊"Publish to production slot"

點擊Publish以後,你能夠在Publish的tab頁面底下,能夠看到"Resources and Keys" ,

試用的話會給你自動生成一個Starter Key,右邊的連接就是Publish出來的連接地址啦

如:https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/LUIS_APP_ID?subscription-key=LUIS_subscription-key&timezoneOffset=0.0&verbose=true&q=

 

若是商用的話,須要在Azure Portal建立一個LUIS服務,而後點擊"Add Key",把LUIS的Key添加進來。

url後面加上查詢語句就是API了。

https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/LUIS_APP_ID?subscription-key=LUIS_subscription-key&timezoneOffset=0.0&verbose=true&q=北京今每天氣怎麼樣?

   

把LUIS的ID(就是apps後面那串字符)和subscription-key記下來,後面須要用到。

在URL後面能夠輸入相關的語句,而後回車,就能夠看到返回的json字符串了。

   

4、在Bot中集成LUIS服務

如今咱們就把LUIS集成到你的Web服務裏頭來就能夠了。

我們用Dialog的方式來完成,比較好管理會話。

在MessagesController.cs裏頭的public class MessagesController : ApiController添加MengmengDialog的類。

[LuisModel("你LUIS的ID", "你LUIS的subscription-key ")]

[Serializable]

public class MengmengDialog : LuisDialog<object>

{

public MengmengDialog()

{

}

public MengmengDialog(ILuisService service)

: base(service)

{

}

[LuisIntent("")]

public async Task None(IDialogContext context, LuisResult result)

{

string message = $"萌萌不知道你在說什麼,面壁去。。。我如今只會查詢股票和查詢天氣。。T_T" + string.Join(", ", result.Intents.Select(i => i.Intent));

await context.PostAsync(message);

context.Wait(MessageReceived);

}

public bool TryToFindLocation(LuisResult result, out String location)

{

location = "";

EntityRecommendation title;

if (result.TryFindEntity("地點", out title))

{

location = title.Entity;

}

else

{

location = "";

}

return !location.Equals("");

}

[LuisIntent("查詢天氣")]

public async Task QueryWeather(IDialogContext context, LuisResult result)

{

string location = "";

string replyString = "";

if (TryToFindLocation(result, out location))

{

replyString = await GetWeather(location);

await context.PostAsync(replyString);

context.Wait(MessageReceived);

}

else

{

await context.PostAsync("親你要查詢哪一個地方的天氣信息呢,快把城市的名字發給我吧");

context.Wait(AfterEnterLocation);

}

}

}

   

GetWeather這個函數須要本身實現,調用相關的API返回相應的天氣信息。

而後在Task<HttpResponseMessage> Post([FromBody]Activity activity)下建立MengmengDialog來處理對話的內容。

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)

{

if (activity.Type == ActivityTypes.Message)

{

await Conversation.SendAsync(activity, () => new MengmengDialog());

}

else

{

HandleSystemMessage(activity);

}

var response = Request.CreateResponse(HttpStatusCode.OK);

return response;

}

   

而後發佈,這樣咱們的天氣查詢機器人就完成啦!

測試一下:

換着問法問天氣,發現都沒問題,都可以正確地識別出來。

在LUIS Portal裏頭,點擊"Review endpoint utterances",能夠看到全部調用LUIS API發過來的消息,也就是說,你能夠在這裏看到全部用戶發來的消息。

   

你能夠看看LUIS標註得對不對,若是錯了勾選,而後選擇"從新分配意圖",而後保存,以後LUIS會學習到這個知識,變得愈來愈準。

從新標註以後記得從新train一下而後publish哈。

好比說,輸入"北京如今天氣怎麼樣",發現只識別出來Intent,可是沒有識別出來地點。

從新標註,train,從新publish一下。

發現已經可以正確識別。

試試吧,有問題留言:)

代碼已經發布到GitHub,請參考:https://github.com/cheneyszp/MengmengBot 

相關文章
相關標籤/搜索