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


在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,請參考:

  1. 右鍵你的C#項目,選擇"Manage NuGet Packages".
  2. 在"Browse"的tab頁,輸入"Microsoft.Bot.Builder".
  3. 點擊"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 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM