讓智能機器人更智能

Microsoft Bot Framework、LUIS、Azure Bot Service 和 Azure Functions 均已推出。最近到處有人在說:智能機器人是新應用。原因之一就是,智能機器人能夠讓你輕鬆、高效地完成常見任務。想一想: 只需讓某種數字助理爲你執行相關操作,即可預訂航班或餐廳餐位,無需從必應或 Google 跳轉到兩三個或更多網站。但應用開發者欣然接受這種趨勢可能還有更加重要的原因: 移動應用的開發成本日益上漲。僅生成一個適用於各種平臺(iOS、Android 和 Windows)的移動應用的費用介於 30,000 至 500,000 美元之間。


確實有一些跨平臺技術(如 Unity 或 Xamarin)可有助於降低開發適用於多個平臺的移動應用的成本。但智能機器人正發展成爲另一選擇方案,通過採用交談界面來改變範例。這種方法利用了人類數千年以來的溝通方式,包括語音和文本(想一想 Skype 或 Messenger)。還可以使用圖像、視頻和傳統控件(如按鈕和卡片操作)增強交談 UI (CUI) 的功能。智能機器人側重於簡約和輸入的自然屬性,而不是使用傳統控件來精心製作 UI。


有何優勢? 由於組織摒棄了爲每個屏幕範例生成不同 UI 的做法,改爲採用適用於所有設備和外形規格(無論是否有屏幕)的交談界面,因此總共可能可以節省數十億美元。例如,我生成了一個 Active Fitness 智能機器人,可以幫助你尋找附近的跑步、騎自行車、徒步、滑雪和其他路線。(若要將此智能機器人添加到 Skype,請訪問 bit.ly/2knZVbr。) 雖然這款應用具有豐富的 UI 和控件,但智能機器人旨在理解交談輸入,如圖 1 所示。


640?wx_fmt=png

圖 1:顯示路線的 Active Fitness 智能機器人


影響力不僅僅侷限於應用開發。智能機器人可以解決網站越來越難以導航的難題,其中許多內容使用舊的或過時的 Web 框架或標準。例如,試着在任意客戶服務網站上完成一個任務,可能要花上半個小時來嘗試導航網站菜單。


智能機器人還有獨特的影響力。設想一下,有一個紙牌遊戲應用(如 Solitaire)。在有智能機器人之前,我不得不生成每個平臺對應的版本。而現在智能機器人則突破了平臺鎖定的困境。突然間,我的基於 Windows 的應用成爲我所有好友的 iPhone 和 Android 手機上的智能機器人。爲什麼會這樣呢? 這是因爲智能機器人適用於以下各種渠道:Skype、Telegram、Facebook、Messenger、Slack 和其他到處可見的應用平臺。


我想使用 Microsoft Bot Framework 生成世界上最受歡迎的遊戲是件很酷的事情。圖 2 展示了我嘗試生成的隨時可以玩的 Solitaire 智能機器人。(若要將此智能機器人添加到 Skype,請訪問 bit.ly/2jrzP7S。)


640?

圖 2:我在 Skype 上的 Solitaire 智能機器人每週處理 500,000 個請求


若要開始創建智能機器人,請轉到 Microsoft Bot Framework 網站 (dev.botframework.com)。可以使用 Microsoft .NET Framework 或 Node.js(以你喜歡使用的技術爲準)生成智能機器人。最近,Microsoft 新增了 Azure Bot Service (bit.ly/2knEtU6),作爲另一種方便使用的智能機器人實現方式。Azure Bot Service 提供基於瀏覽器的體驗,方便你使用易用模板生成智能機器人。此服務使用 Azure Functions,這是一種基於事件的無服務器代碼體系結構,可提供「函數」,方便你節省資金並更好地擴展智能機器人。 


下面介紹了 Azure Functions 的亮點: 開始生成智能機器人時,我意識到,每當需要生成智能機器人時,都不得不新建一個 Web 應用來提供應用容器。如果是一個應用,這沒有關係,但如果有多個智能機器人,每個都需要單獨的基礎結構,情況就不一樣了。相反,使用 Azure Functions,可以在雲中託管小段代碼,而無需考慮整個應用基礎結構。


智能和智能機器人開發

就像應用一樣,智能機器人旨在盡力幫助你完成特定的任務。例如,我的 Solitaire 智能機器人可以和你一起玩紙牌,甚至可以教你遊戲的規則和技巧。它確實不太可能通過圖靈測試(Alan Turing 於 20 世紀 50 年代提出的關於衡量計算機智能的測試),但這對於大多數智能機器人來說都是過分之舉。


同樣,當地車管所的智能機器人應該知道如何提交駕照登記付款,或如何幫助你交罰單或提交駕照延期換證申請。天氣智能機器人需要回答與天氣相關的問題,並還包括能確定地理位置和用戶對特定天氣數據的需求的智能組件。


智能機器人可以通過交談界面自動完成許多任務,但也可以通過圖像、按鈕和其他控件增強功能,使之更方便移動設備用戶使用。只有當對話變得開放時,智能機器人的智能服務才能真正派上用場。使用對話框提供一組預定義的答案是相對容易的標準編程任務。另一方面,響應人類對話意味着智能。幸運的是,Microsoft Bot Framework 提供以下兩項支持: LuisDialogs 支持基於自然語言的對話,而更傳統的控件則支持用戶通過按按鈕、傳送視圖或其他控件來選擇選項。


智能是許多智能機器人採用的交談 UI 的核心,以便能夠與人類用戶進行直觀式交互。藉助越來越多的 Microsoft 認知服務 (bit.ly/2jx1kMQ),可以將智能功能直接引入智能機器人中。這些服務包括但不限於:


  • 構想

  • 語音

  • 語言

  • 知識

  • 搜索

  • 位置


請參閱 Alessandro Del Sole 關於認知服務的精彩文章 (msdn.com/magazine/mt742868)。 


讓智能機器人更智能需要採取下面一些常見措施,這不僅可能會促使其通過圖靈測試,還一定會改進與智能機器人的對話:


  • 對話框、圖像和其他能夠收集規範化數據、傳達消息和簡化對話的方式

  • 本地化

  • 可提高智能機器人基本功能的幫助和對話框管道

  • 讓問題不重複的用戶數據(如地理位置)


你並不想太過雄心勃勃來嘗試創建像 Douglas Adams 描繪的城市大小一般「深思」計算機(出自「銀河系漫遊指南」)的智能機器人。而且,當我開始生成智能機器人時,我僅關注對完成主要任務必不可少的功能(例如,玩紙牌遊戲或建議最佳跑步路線),然後再通過智能組件增強功能。


藉助 LUIS 實現語言智能

要添加到交談界面的首個智能組件是 Microsoft 語言理解智能服務 (LUIS)。此服務的工作方式爲分析你向其發送的對話或句子,然後提取特定於應用的實際意向和實體。若要將 LUIS 對話框添加到智能機器人,只需創建繼承 LuisDialog 的類,在 luis.ai 中註冊 LUIS 應用,然後向對話框提供應用 ID 和密鑰即可:

[LuisModel("<YOUR_LUIS_APP_ID>", "<YOUR_LUIS_APP_KEY>")]
[Serializable]public class IntelligentLanguageDialog : LuisDialog<object>

有關更深入的 LUIS 指南,請查看 Ashish Sahu 在 2017 年 1 月 MSDN 雜誌中發表的文章 (msdn.com/magazine/mt745095)。


在我的 Active Fitness Trails 智能機器人(圖 3)中,我定義了與健身活動相關的意向,我期望用戶在智能的智能機器人對話中提供地理位置和健身活動信息。例如,我希望用戶能夠說出「向我顯示美國科羅拉多州的滑雪路線」,智能機器人應該理解這句話,然後提供一組路線。我的 Active Fitness 應用用戶每天都會查找數百萬條路線,通過查詢 Active Fitness,他們可以映射我的 LUIS 模型中的 GetActivityLocation 意向,這將把地理位置和活動實體返回給智能機器人。

640?

圖 3:LUIS 中的模型


設想一下,我需要編寫多少代碼才能從非規範化用戶輸入中提取所有此類數據! 即使是一個很短的人類句子,往往也很複雜,只有機器學習工具才能理解和處理。添加這一簡單句子的所有可能變體,你會發現智能機器人的智能服務並不是一件容易完成的任務。幸運的是,LUIS 可充當智能對話分析器和提取程序,爲你完成所有苦差事。你只需將此組件添加到智能機器人即可。


定義模型後,我便可以提供有助於 LUIS 瞭解我的意向以及如何爲智能機器人獲取實體的言辭,從而定型模型。爲模型定型我的 GetActivityLocation 意向時,我提供了以下言辭: 「顯示附近的騎自行車路線」、「顯示奧地利最新的滑板滑雪路線」和「美國猶他州最長的滑雪路線在哪裏?」 如圖 4 所示,當 LUIS 處理實體時,它會突出顯示我在模型中指定的實體。如果 LUIS 無法識別實體,該怎麼辦? 在這種情況下,需要通過手動映射實體來定型模型。例如,我需要將我的智能機器人定型爲識別「滑板滑雪」活動。

640?

圖 4:LUIS 中的模型定型


接下來,定義用於處理 LUIS 模型返回的意向的方法。可以定義用於處理模型中的 None 意向或其他任何意向的方法,如圖 5 所示。


圖 5:處理意向


[LuisIntent("None")]
  public async Task NoneIntent(IDialogContext context, LuisResult result)
  {
    await context.PostAsync(
      $"You have reached the none intent. You said: {result.Query}"); //    context.Wait(MessageReceived);
  }
  // Go to https://luis.ai and create a new intent,  // then train/publish your luis app.  // Finally, replace "GetActivityLocation" with the name of your newly  // created intent in the following handler.  [LuisIntent("GetActivityLocation")]
  public async Task GetActivityLocation(IDialogContext context, LuisResult result)
  {
    await context.PostAsync(
      $"You have reached the GetActivityLocation intent. You said:
      {result.Query}"); //    context.Wait(MessageReceived);
  }


每當模型確定輸入與 GetActivityLocation 意向匹配時,都會調用我的智能機器人方法。LUIS 在 LuisResult 對象中返回結果,其中包括地理位置和活動等實體。例如,我想檢查實體是否包含國家/地區。爲此,我使用 LuisResult 對象的 TryFindEntity 方法,查找「builtin.geography.country」類型的實體。LUIS 提供了大量預建實體,這大大簡化了你的工作。有關這些實體的完整列表,請訪問 bit.ly/2kWgCHR。

請注意,builtin.geography 實體包含子實體,例如,國家/地區和城市。包含子實體的實體稱爲複合實體。在此示例中,我特別感興趣的是國家/地區子實體,如圖 6 所示。


圖 6:查找國家/地區


// Go to https://luis.ai and create a new intent, then train/publish your luis app.  // Finally, replace "GetActivityLocation" with the name of your  // newly created intent in the following handler.  [LuisIntent("GetActivityLocation")]
  public async Task GetActivityLocation(IDialogContext context, LuisResult result)
  {
    await context.PostAsync(
      $"You have reached the GetActivityLocation intent. You said:
      {result.Query}"); //    EntityRecommendation country;
    if(result.TryFindEntity("builtin.geography.country", out country))
    {
      await context.PostAsync($"Country: {country.Entity}");
    }
    context.Wait(MessageReceived);
  }



智能機器人實用提示

Microsoft 正在努力推動智能機器人開發取得進展,發佈了語言理解智能服務 (LUIS) 和 Azure Bot Service 等工具,以幫助簡化這一新款軟件的創建和管理。值得慶幸的是,現如今大多數應用都可以輕鬆轉換成智能機器人,其中的交談 UI (CUI) 非常適合多任務、多類型的應用。爲了能夠最有效地開發智能機器人,請注意以下幾點:


以擴大覆蓋面爲目標: 智能機器人最引人注目的一點是,可在所有 PC、平板電腦和智能手機上的渠道(如 Skype、Facebook、Messenger 和 Telegram)中運行。通過向多個渠道發佈智能機器人,最大限度地擴大受衆覆蓋面。此外,利用可用的服務,將智能機器人本地化成多種語言。


注重交談體驗: 充分利用交談界面,它非常適合多任務、多類型的應用。爲了提供最佳體驗,請重點關注交談界面(如聊天、語音和語言),而不是按鈕等傳統 UI 控件。


利用服務: 新推出的 Azure Bot Service 是一個基於雲的平臺,可最大限度地減少基礎結構開銷,並允許你擴展智能機器人項目。此服務的幕後支持技術爲 Azure Functions;使用此技術,開發者可以在雲中託管小段代碼。


以任務爲中心: 生成智能機器人時,以每個智能機器人需要解決的一個或多個特定任務爲中心。不要過於複雜,AI 不一定越多越好。從智能機器人需要解決的主要任務着手,然後再注入智能組件。


開放式對話: 利用 LUIS 中內置的智能組件來支持開放式對話,併爲智能機器人提供輸入。爲了提供最佳體驗,請注意定型 LUIS 模型,以一組簡明的實體和意向爲中心。模型越不「模糊」,AI 的效果就會越好!


當然,我還需要知道活動實體(可以使用 Active Fitness 跟蹤超過 50 個活動,如跑步、騎自行車、滑雪和滑板滑雪)。因此,當我問: 「奧地利最好的滑雪路線在哪裏?」 我期望 Active Fitness 智能機器人返回「滑雪」活動實體,如圖 7所示。

640?

圖 7:使用智能機器人仿真器演示 GetActivityLocation 意向的實際效果


結果就是,我更新了 GetActivityLocation 方法,使其能夠返回活動。請注意,與 builtin.geography.country 不同,活動不是內置實體。不過,我在定型模型時提供了一些言辭,LUIS 能夠相當好地獲取實體,如圖 8 所示。


圖 8:使用言辭定型模型


// Go to https://luis.ai and create a new intent, then train/publish your luis app.  // Finally, replace "GetActivityLocation" with the name of your newly  // created intent in the following handler.  [LuisIntent("GetActivityLocation")]
  public async Task GetActivityLocation(IDialogContext context, LuisResult result)
  {
    await context.PostAsync(
      $"You have reached the GetActivityLocation intent. You said:
      {result.Query}"); //    EntityRecommendation country;
    if(result.TryFindEntity("builtin.geography.country", out country))
    {
      await context.PostAsync($"Country: {country.Entity}");
    }
    EntityRecommendation activity;
    if (result.TryFindEntity("activity", out activity))
    {
      await context.PostAsync($"Activity: {activity.Entity}");
    }
    context.Wait(MessageReceived);
  }



Bot Framework 提供了深入的通用 C# 和 Node.js 代碼示例,網址分別爲 bit.ly/2gHupjg 和 bit.ly/2kWolWx


實現地理位置智能

雖然許多智能機器人根據地理位置進行響應,但編寫地理位置響應代碼可能會很麻煩。在前面的示例中,我使用了 LUIS 智能組件來獲取 LUIS 從對話中解析的內置地理位置實體。幸運的是,Microsoft 必應地理位置控件現在包含在 Bot Framework 中。這樣一來,開發者便可以更輕鬆地收集地理位置數據。


Bot Framework 的地理位置控件還提供包含地圖的直觀界面(見 圖 9)。如果智能機器人需要在 Skype、Facebook 和 Messenger 等渠道中通過易用或本機的界面提供包含郵政編碼、城市、區域和地區數據的地址,這就可能非常方便。

640?

圖 9:使用包含必應地圖的直觀界面的地理位置控件


若要開始使用必應地理位置控件,只需爲 .NET 項目(通過 NuGet)或 Node.js 項目(通過 npm)獲取必應地圖 API 密鑰和地理位置對話框組件,然後在代碼中初始化並調用地理位置對話框的實例即可:


var options = LocationOptions.UseNativeControl | LocationOptions.ReverseGeocode;var requiredFields = LocationRequiredFields.Locality |
                     LocationRequiredFields.Region |
                     LocationRequiredFields.Country;var prompt = "Where are you looking for trails?";var locationDialog = new LocationDialog(
  apiKey, this.channelId, prompt, options, requiredFields);
context.Call(locationDialog, this.ResumeAfterLocationDialogAsync);


LocationDialog 提供用於請求各種地址字段和自定義提示的選項。結果返回時,可以在 Resume 方法中進行處理,如圖 10 所示。


圖 10:在 Resume 方法中處理地理位置結果


private async Task ResumeAfterLocationDialogAsync(
  IDialogContext context, IAwaitable<Place> result)
  {
    var place = await result;
    if (place != null)
    {
      var address = place.GetPostalAddress();
      var formattedAddress = string.Join(", ", new[]
      {
         address.Locality,
         address.Region,
         address.Country
      }.Where(x => !string.IsNullOrEmpty(x)));
      await context.PostAsync(
        "Where are you looking for trails " + formattedAddress);
    }
    context.Done<string>(null);
  }


超越 LUIS

除了 LUIS 之外,認知服務還提供了其他許多 API,可用於賦予智能機器人技能,而開發者個人或企業可能因非常複雜而難以實現這些技能。幸運的是,你不必自行實現它們:


藉助推薦 API,可以添加產品(如經常一起購買的產品)推薦或個性化用戶推薦。

影像 API 向智能機器人賦予高級圖像和視頻技能,以識別對象、人臉、年齡、性別或情緒。

學術知識 API 可以添加學術知識、創建問答,並能向智能機器人賦予特定的知識庫技能。


值得一提的是,智能機器人還支持第三方 API 和服務。可以使用自己的服務和 API,讓你的智能機器人與衆不同,並解決以前從未解決過的問題。Bot Framework 確實通過簡單的交談界面和易用 API 帶來了新的機遇,同時見證了人類知識的進步,並打開了輔助功能的大門。


新增精彩功能

除了針對 .NET Framework 和 Node.js 以及 REST API 定期更新 Bot Framework 之外,Microsoft 最近還新增了功能,讓智能機器人開發更上一層樓。


Bot Framework 最新增添的功能之一是 Azure Bot Service,此服務現在可方便你輕鬆利用雲的便利性和可擴展性來開發智能機器人項目 (bit.ly/2knEtU6)。Bot Service(如圖 11 所示)使用 Azure Functions 和一系列快速啓動模板,以幫助你充分利用智能機器人代碼,並讓智能機器人擴展到任意級別 (bit.ly/2kuo9Bb)。例如,可以選擇基本、表單、主動、LUIS 或問答智能機器人模板,每個模板都可以生成一個隨時都能運行的智能機器人,你可以根據需要對其進行擴展。

640?wx_fmt=png

圖 11:直接在瀏覽器中編輯 Bot Service 代碼


Azure Functions 是 Azure Bot Service 的幕後支持技術,根據無服務器體系結構和按需計算來提供事件驅動的體驗。這確實意味着,不再需要爲每個智能機器人提供昂貴的應用託管基礎結構。相反,可以讓智能機器人更輕量級、更易於擴展,並節省在開發上花費的精力和時間,同時簡化與認知服務的連接。


QnA Maker (qnamaker.ai) 是另一個值得一提的附加服務。QnA Maker 是 Azure Bot Service 提供的模板智能機器人項目,用於十分常見的情景,即智能機器人回答現有知識庫中的典型問題。


總結

使用 Microsoft Bot Framework,可以快速輕鬆地開始生成智能機器人,爲新的和現有的應用或服務提供交談界面。這樣,可以打造全新體驗,通過 Skype、Facebook、Messenger、Telegram 和其他渠道覆蓋數十億用戶。Microsoft 認知服務提供許多智能 API,方便你添加到智能機器人中。


Bot Framework 生態系統正在快速發展。爲了利用這一點,可以添加認知服務附帶的服務或使用第三方提供商的 API,讓智能機器人更智能且能力更強。一切始於非常簡單的智能機器人,你和你的用戶會有許多發現。智能機器人確實是新應用(或現有應用的擴展),並且添加了智能組件,真的是非常強大。此外,智能機器人還減少了在開發上花費的時間、精力和成本。


介紹我的智能機器人

我在過去幾個月裏開發了幾個智能機器人,所以我決定在一個方便訪問的地方(圖 A 中的列表)集中介紹它們。看一看我的智能機器人,看能否激發你開發自己的智能機器人。(單擊提供的鏈接,可以將相應的智能機器人添加到 Skype。)


圖 A:我的一系列智能機器人



智能機器人  說明
Solitaire (bit.ly/2jrzP7S) Solitaire 被認爲是世界上最受歡迎的紙牌遊戲。現在,使用常用的聊天客戶端(如 Skype)即可享受遊戲樂趣,無需啓動應用。
Active Fitness (bit.ly/2knZVbr) 查找世界各地的跑步路線、騎自行車路線、徒步路線或滑雪路線,所有這些都來自全球頂級的健身社交網絡。
UNO (bit.ly/2k4AzyH) 在 Skype、Messenger 或 Telegram 上玩這款世界著名的紙牌遊戲。
Freecell (bit.ly/2l0NM9b) Freecell 是一款很棒且極具挑戰性的紙牌遊戲,有多個難度等級。從簡單等級開始,學學如何玩它。
Crazy Eights (bit.ly/2kY7EdN) 看一看這款易上手的紙牌遊戲。
Card Games Chest (bit.ly/2klXOCV) 學着玩一些最受歡迎的紙牌遊戲,包括 Solitaire、UNO、Crazy Eights、101、Freecell 和 Mau-Mau。



Kevin Ashley (@kashleytwit是 Microsoft 架構技術推廣者。他是《Windows 8 專業編程》(Wrox,2012 年)一書的合著者,而且是最受歡迎的應用、智能機器人和遊戲的開發者之一,其中最著名的應用當屬 Active Fitness (activefitness.co)。他經常參加不同活動、行業演出和網絡廣播,並進行技術方面的演講。他的職責在於,與創業公司和合作夥伴密切合作,並在軟件設計、業務和技術戰略、體系結構和開發方面提供相關建議。你可以訪問他的博客 (kevinashley.com),也可在 Twitter (@kashleytwit) 上關注他。


衷心感謝以下 Microsoft 技術專家對本文的審閱: Mat Velloso


原文地址:https://msdn.microsoft.com/en-us/magazine/mt795186


.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注

640?wx_fmt=jpeg