在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,請參考:
若是你使用的是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