在16年3月30號微軟的全球開發者大會Build上發布了Bot Framework,微軟認為下一個big thing是Conversation as a Platform,簡稱CaaP,中文應該叫做"對話即平台"。在我們的下個時代,我們將會處在對話即平台的時代,不管是一個屏幕,一個桌子,一個冰箱,甚至是人,都是一個app,都是一個對話的窗口,所有的交互都通過對話來完成。起床,你用自然語言喚起梳妝台的鏡子顯示今日的天氣,還有新聞。家里的小娜(Cortana)提醒你要趕緊出門,路上因為限號4,9,根據歷史的預測,會提早堵車,需要提前20分鍾出發。
那這個時代,將是如何實現的呢?人工智能不是簡單一個團隊,一小段時間就能完成的,需要經過大量的科研人員,進行大量的研究才能實現的。那怎么樣才能實現物物智能,智能眾生的構想呢?微軟將微軟亞太研究院多年的研究技術開放出來,讓各個開發者,不管是大公司,小公司甚至是個人都可以借助"智能"的"洪荒之力",實現智能對話平台的未來。
打造這樣的智能服務需要涉及到微軟的兩個技術,Bot Framework和Cognitive Services(認知服務)。
Bot Framework就是幫你快速搭建智能服務的后端,快速在各種終端和服務上提供服務。包括三大組件。
Bot Builder SDKs:
這個是Bot的生成器,快速生成一個ASP.NET和Node.js的后端服務,提供了像Dialog、FormFlow幫你管理與用戶的會話。
Bot Connector:
這是個Bot的Channel,幫你把你的服務快速發布到各個渠道,比如說Skype,Facebook Messager等等。這樣用戶就可以在Skype等Channel上使用你的服務了。
Bot Directory:
這個算是Bot 的商店,在這里可以找到各個bot,你也可以把自己的Bot發布出來,從而大家都可以看到你的Bot。
Cognitive Services(認知服務)的前身是Project Oxford(牛津計划),正式發布的時候更名的。這是微軟將研究院研究的技術以API和SDK的形式開放給開發者的一系列智能化服務。
主要包括5大類的服務:視覺、語言、語言、知識和搜索。
其實就包括我們今天要講的"語言理解(Language Understanding Intelligent Service,簡稱LUIS)"。
我們今天以一個例子舉例,來詳細介紹怎么利用Bot Framework和LUIS("擼以si")打造一個智能陪護機器人。
一、下載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,請參考:
-
右鍵你的C#項目,選擇"Manage NuGet Packages".
-
在"Browse"的tab頁,輸入"Microsoft.Bot.Builder".
-
點擊"Install"的按鈕.
如果你使用的是Node.js,請使用以下命令:
npm install botbuilder
二、在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兩個參數,后面會用到。
三、准備你的機器人后端服務代碼
從我的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啦。
四、新建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字符串了。
四、在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