2016 年 12 月

第 31 卷,第 13 期

本文章是由機器翻譯。

Microsoft Bot Framework - 隨時隨地都能使用 Bot Framework 存取應用程式資料

Srikantan Sankaran

我在上一期導入 Microsoft Bot 架構中,並討論如何使用它符合一項挑戰,許多組織面臨今日,也就是讓客戶互動式存取其服務,透過語音和文字的利用 (msdn.com/magazine/mt788623)。文件中所述的商務案例牽涉到不同的特定業務應用程式部署在保險公司組織的資訊合併使用像是 Microsoft 流程和 Azure 邏輯應用程式的技術。使用 Azure 搜尋服務,並可供取用的用戶端應用程式,會建立索引的內容,其中包含結構化和非結構化資料。

[圖 1,這也是出現在前一篇文章,說明實作案例的解決方案的架構。

方案的架構
[圖 1 解決方案架構

在本文中我要建置和部署 bot 應用程式可使用透過 Azure 搜尋服務所收集的資訊。Bot 應用程式會部署為 Azure Web 應用程式,並透過 Microsoft Bot Framework 連接器服務發行。透過連接器服務,可存取 Bot 應用程式從 Skype 通道,它會讓取用者存取他們的保險原則要求的狀態,讓他們可以下載的發行的原則文件、 排程站台檢查造訪,依此類推。取用者將能夠向保險原則,套用時註冊與使用 Microsoft 帳戶的 bot 識別其身分,而且可以使用 Skype 用戶端上的其中一個訊息或語音命令來與程式互動。Bot 應用程式整合與 LUIS 服務,其中一個 Azure 認知服務,才能在 Azure 搜尋服務上執行查詢解譯的取用者對話中所提供的數個服務。

以下列順序說明建置此方案所需的步驟。程式碼片段是取自 Visual Studio 2015 方案中,您可以下載與此發行項。以下是如果您一直跟著您應該執行的動作︰

  • 建立並發行 LUIS 模型,來擷取需要支援 bot,使用 LUIS 服務所提供的 UI 中的不同交談。
  • 使用 Visual Studio 2015 範本建立新的 bot 應用程式。您可以接著從本文中,提供方案中加入程式碼區塊或遵循本文其餘部分參考下載的方案檔案。MessageController.cs 檔案是 bot 應用程式,也就是一種特殊類型的.NET MVC 應用程式的進入點。
  • LUIS 功能內嵌到 bot,使用 Bot Framework SDK 中提供 [LUIS] 對話方塊。這被實作 PolicyInfoDialog.cs 檔案中的方案。
  • 使用 Azure 搜尋服務 SDK,實作會叫用 Azure 搜尋服務 Api 的程式碼,以及執行解譯 LUIS 服務搜尋要求。這被實作 SearchService.cs 檔案中的方案。
  • 實作 FormFlow 對話方塊,以擷取使用者的 Microsoft 帳戶,在 Skype 通道,以互動方式,,當使用者要求時第一次。這被實作 SigninForm.cs 檔案中所附的方案。
  • 您可以使用 Azure 搜尋服務 SDK 來擷取使用者第一次存取 bot 時擷取的 Microsoft 帳戶為基礎的使用者設定檔資訊。這也被實作在 SearchService.cs
  • 若要保留使用者設定檔資訊使用 Bot 狀態服務。排程站台檢查,請瀏覽時,會使用 bot 使用者的地址及連絡資訊,儲存 Bot 狀態服務中。這也會實作 PolicyInfoDialog.cs 檔案中。
  • 用來評估使用者與服務互動的 Bot Framework 通道模擬器並測試 bot 應用程式本機上執行此服務為您的開發電腦上。
  • 在測試本機 bot 應用程式部署至正確的 Azure 中的 Web 應用程式 Visual Studio。
  • Microsoft Bot Framework 連接器服務中註冊 bot 應用程式,並設定它的 bot 應用程式部署至 Azure URL。
  • 新增 bot 應用程式名稱、 應用程式識別碼和密碼到 Visual Studio 方案的 bot 註冊期間取得的資訊,並將它重新發行至 Azure。
  • 啟用存取 bot 應用程式從 Skype 等寬限時間 bot 開發人員入口網站中的通道。

您可以下載 bot 應用程式,並從 GitHub 儲存機制,在此應用程式中使用的 LUIS 模型的檔案匯出的 Visual Studio 2015 解決方案bit.ly/2cOfANh

建立及定型 LUIS 模型針對不同使用案例的案例

[圖 2顯示我對應方式如何使用者可能會進行交談 (透過 LUIS utterance) bot 和如何解譯這做為特定的 LUIS 意圖或透過 Azure 搜尋服務,來執行的動作以及如何擷取關鍵字 (LUIS 實體) 從 LUIS utterance,做為查詢參數執行搜尋時使用。

[圖 2 對應 Utterances 和對應方式

Utterances 或交談 對應的對應方式或動作 限定詞或參數
指 LUIS 無法解譯 (或不受過訓練的)。 無 (預設值) 不適用
Get (或顯示) 我所有的原則要求。 GetPolicyRequests 登入的 bot 使用者而言,隱含的
我有原則要求的應用程式,是核准原則要求嗎? GetPendingPolicyRequests 隱含的原則要求以外的其他位置已核准狀態
取得原則要求數目 VehPolicy001 的詳細資料。 GetPolicyRequestDetails 原則要求識別碼 – VehPolicy001
取得我人壽保險原則要求的狀態。 GetPolicyRequestStatusByType 原則要求類型 – 生命
取得原則文件編號 Policy0101 發出今年。 GetPolicyDocument 檔案名稱 – Policy0101 和 lastmoddate – 目前的年份
排程站台檢查,請造訪明天。 ScheduleSiteVisit 檢查日期 – 明天

LUIS 服務提供 Web 應用程式在 luis.ai LUIS 應用程式模型可以建立此以視覺方式手邊的問題。[圖 3會顯示此案例中設定 LUIS 模型。

我的案例 LUIS 模型
圖 3 LUIS 模型的 [我的案例

 對應方式、 實體和上一個步驟中所識別的 utterances 可以可建立所有 LUIS 應用程式中。使用對應方式] 功能表新增對應方式,以及 [實體] 功能表建立實體。請注意,有兩種特殊的實體︰

  • 階層式實體︰ 在此情況下,「 保險原則 」 建立的階層式實體的父系、 與各種類型,生活中,Vehicle,首頁等等,建立做為子系。
  • 預先建立的實體︰ 我使用了稱為 Datetime 的預先建置,提供 LUIS 實體。輸入的參數,例如原則文件所產生,或站台檢查請瀏覽的日期排程,將會對應至這些預先建置的實體型別 LUIS 引擎的年份。

「 關鍵字 」 將會用來在 Azure 搜尋服務中的原則文件索引中執行全文檢索搜尋的名稱與實體。

現在,選取新 utterances] 索引標籤和建立 utterances 每個交談識別之前,並將其標記。

針對每個 utterance,找出或加上標籤的意圖,而且相關聯的實體。例如,在**[圖 3**,我意圖"GetPolicyRequestStatusByType,「 對應 utterance,「 取得我的生活保險原則要求,狀態 」,而 「 保險︰ 生命。 」 的階層式實體對應 」 人壽保險 」 的文字

重複此步驟,新增其他變化,例如,當原則類型是車輛、 首頁或一般。此外,請考慮以不同方式可以提出相同要求的變化。不過,您不必擷取每個排列,並且可能傳達組合的方法相同的訊息。例如,當我將與片語,[顯示狀態...」 中所示的新 utterance [圖 4,LUIS 無法正確地訂定解譯的 variant 型別上的一個使用 「 取得我狀態...」 LUIS 進行正確的建議和相關聯的實體,即使以不同方式來詢問問題。

標記 LUIS Utterances 並處理差異
[圖 4 標記 LUIS Utterances 並處理差異

擷取每個 utterance 後,LUIS 應用程式提供的選項來定型模型。這會導致 AI 中的引擎 LUIS 產生則由用戶端應用程式的最佳化的模型。每當新 utterances 會加上標籤,或對現有的變更,應該重複此步驟。

發行 LUIS 模型可讓用戶端應用程式叫用它,使用 REST API。應用程式中的 [發行] 對話方塊也可讓您測試模型,請確定其如預期般運作。[圖 5示範如何快速測試 LUIS 模型傳入交談片語,並在瀏覽器中檢視輸出。(為了方便起見, [圖 5並排顯示三個不同的引動過程的 utterances 以及對應的結果從快照集。)

測試 LUIS 模型
[圖 5 測試 LUIS 模型

請注意,建議 LUIS 意圖具有最大機率值指派給它,會出現在清單中第一個。擷取自片語的實體也會在回應中傳回。如果有多個實體中 utterance 識別他們所傳回,以及。您可以看到 LUIS 模型解譯"今年 」 等詞彙 utterance 片語中、 將它對應至預先建立的實體"Datetime"和傳回值"2016,"也可以直接使用用戶端應用程式的方式。

建立 Bot 應用程式

既然 LUIS 模型已準備就緒,它可以用於 bot 應用程式。下載 Visual Studio 2015 範本從aka.ms/bf bc-vstemplate建立應用程式。(請造訪bit.ly/2dYrwyW若要了解基本的應用程式,以及如何使用 bot 模擬器來建置及測試在本機的 bot 建置 bot。)

使用此範本所建立的專案是 MVC 專案中的變數。專案的進入點是 MessageController.cs 處理內送訊息從通道 Skype 等寬限時間,然後送回回應。

Bot framework LUISDialog 用來以隱含方式將訊息從 bot 傳遞至 LUIS 模型。針對每個實作 LUIS 模型中對應方式,實作對應方法,可以直接 bot 應用程式執行時呼叫。這不需要自訂程式碼會呼叫 LUIS REST Api 來解譯交談,以及識別的意圖和實體。

LUIS 應用程式識別碼和密碼的值用來裝飾類別層級屬性,也就是 LuisModel。LuisIntent 屬性適用於該目的發生在使用者要求時提供的實作方法。這是需要以取得在 bot LUIS 整合。[圖 6說明此程式碼中的實作方式。

[圖 6 實作 LUIS 整合

[LuisModel("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 
  "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")]
[Serializable]
  public class PolicyInfoDialogs : LuisDialog<object>
  {
    [LuisIntent("")]
    public async Task None(IDialogContext context, LuisResult result)
    {
      // Called when the incoming utterance is not recognized (default bin)
    }
    [LuisIntent("GetPolicyRequests")]
    public async Task GetPolicyRequests(IDialogContext context, LuisResult result)
    {
      //
    }
        ----------------------
      }

此時,每個方法的實作可以是很簡單。我可以只傳回識別 LuisIntent 實作已叫用的訊息。

在 MessageController.cs,新增下列程式碼片段來擷取 bot 使用者傳入的訊息和遞交給 LuisDialog:

if (activity.Type == ActivityTypes.Message)
  {
    await Conversation.SendAsync(activity, () => new PolicyInfoDialog());
  }

執行 bot 應用程式啟動 Bot Framework 通道模擬器,您可以從下載aka.ms/bf bc-模擬器。輸入您稍早訓練 LUIS 模型 utterances,並確保回應訊息,表示對應至 LUIS 意圖的正確方法叫用。

搜尋整合

現在我要新增適用於.NET 的 Azure 搜尋服務 SDK,Visual Studio 方案使用 NuGet 封裝管理員。在方案中的 SearchService.cs 檔案會使用此 SDK,並封裝與 Azure 搜尋服務的所有整合。它會實作方法,以在 Azure 搜尋服務上執行查詢,傳回客戶的使用者設定檔,並擷取 PolicyRequests 和 PolicyDocuments。

使用 Lucene 的查詢語法,實作 PolicyInfoDialog.cs 檔案中建立搜尋命令,針對不同的案例。這裡列出一些範例: 

擷取所有 bot 使用者交談中的原則要求︰

command += "CustomerId:(" + msftid + ")";
Retrieve all policy requests for the bot user that haven’t yet been approved:
command += "CustomerId:(" + msftid + ") -PolicyStatus:(Approved)";
Query policy requests for the bot user based on the policy request Id:
public async Task GetPolicyRequestDetails(IDialogContext context, LuisResult result)
  {
    ----------------------
      string  command += "CustomerId:(" + msftid + ") AND PolicyRequestId:(" +
        result.Entities[0].Entity + ")";
    ----------------------
  }

上述程式碼片段顯示如何 PolicyRequestId 實體 (若要執行搜尋查詢的輸入參數) 傳遞 LUIS 引擎透過 LuisResult (結果)。

[圖 7示範如何實作屬性為基礎的搜尋和全文檢索搜尋文件。

請注意,您可以指向我前一篇文章,以便與相關的屬性名稱和值**[圖 7**程式碼。此外,您可以下載本文使用提供的連結後面的章節中所附的資料庫中使用的所有資料表的結構描述。 

[圖 7 實作屬性為基礎的搜尋和全文檢索搜尋文件

foreach (EntityRecommendation curEntity in request.Entities)
  {
    switch (curEntity.Type)
      {
        case "PolicyNumber": // Look for documents with this filename
          {
            command += " filename:(" + request.Entities[0].Entity + ") ";
            break;
          }
        case "keyword": // Search within documents for this keyword expression
          {
            command += " " + request.Entities[0].Entity + " ";
            break;
          }
        case "builtin.datetime.date":
        // Retrieve based on the year a document was generated
          {
            char[] delimiterChars = { '.', ':' };
        List<string> allvalues = curEntity.Resolution.Values.ToList<string>();
             string val = allvalues[0];
             string[] vals = val.Split(delimiterChars);
             command += " lastmoddate:(" + vals[0] + ") ";
             break;
          }
        default:
          {
            break;
          }
        }
    }

格式化的回應給使用者

您可以格式化樣式,將超連結或媒體內容等 bot 所傳回的回應訊息中的文字。這有助於使 bot 更方便使用的應用程式。以下是幾個例子...

若要將字型設定為粗體,僅適用於 Azure 搜尋服務,從傳回的動態資料包裝內 double 星號 (*)︰

foreach (SearchResult<PolicyRequest> result in eachGroup)
  {
    searchResponse += (counter) + ". **" + result.Document.PolicyRequestId + "**" +
      " on the insured :**" + result.Document.InsuredIdentifier + "**
      for an amount of :**" +
    result.Document.Currency + " " + result.Document.AssessedValue + "**
      has status: **" +
    result.Document.PolicyStatus + "**\n\n";
    counter++;
  }

若要將超連結加入至 Azure 搜尋服務所傳回的原則文件,加入連結屬性的文件的 url:

foreach (SearchResult<PolicyDocument> result in results)
 {
   searchResponse += counter + ". Link: [" + result.Document.filename + "](" +
     result.Document.fileurl + ") \n";
   counter++;
 }

識別 Bot 使用者

Bot 架構提供使用者的通道識別碼和顯示名稱從交談內容,但並不提供用來登入通道,例如 Skype 使用者名稱。因此,這項資訊應該明確地取得當使用者啟動 bot 與互動。稍早所述的 FormFlow 對話方塊用來提示使用者提供此資訊。從 Azure 搜尋服務的帳戶名稱為基礎,擷取使用者設定檔資訊。

若要確定使用者互動 bot FormDialog 中共用的 Microsoft 帳戶名稱的擁有者,您可以整合到 Microsoft 帳戶登入頁面,互動式登入,並只在驗證之後,驗證 bot 能存取。這已超出本文的範圍。相反地,您只是提示使用者輸入的帳戶名稱,使用 [SigninForm] 對話方塊,並假設使用者是宣稱他︰

public static IForm<SigninForm> BuildForm()
  {
    return new FormBuilder<SigninForm>()
      .Message("I would need some information before we get started.")
      .Field(nameof(MicrosoftAccount))
      .Build();
  }

將使用者設定檔儲存在 Bot 狀態

一旦 bot 交談開始時用來識別使用者,從 Azure 搜尋服務,擷取使用者設定檔物件。這項資訊會儲存在要使用,例如,當使用者要求排程站台檢查,請瀏覽的 bot 狀態。檢查造訪確認被驗證使用者的地址及連絡號碼。

Bot 架構中所示,提供 API,以將此資訊儲存在 privateConversationData 內容中,每個使用者和交談, [圖 8

[圖 8 儲存使用者設定檔

private async Task SignUpComplete(IDialogContext context, IAwaitable<SigninForm> result)
  {
----------------------------------------------
----------------------------------------------
  UserProfile profile =
    await LoadBotUserState(profileIdentityForm.MicrosoftAccount);
  if (profile == null)
  {
  message = $"Sorry, I could not locate your profile in our system.
    Please retry with the right Microsoft Account";
  }
  else
  {
    context.PrivateConversationData.SetValue<bool>("ProfileComplete", true);
    context.PrivateConversationData.SetValue<string>(
      "FirstName", profile.FirstName);
    context.PrivateConversationData.SetValue<string>("LastName", profile.LastName);
    context.PrivateConversationData.SetValue<string>("Address", profile.Address);
    context.PrivateConversationData.SetValue<string>("Phone", profile.Phone);
    context.PrivateConversationData.SetValue<string>(
      "CustomerId", profile.CustomerId);
    message = $"Thanks {profile.LastName},{profile.FirstName}
      for identifying yourself! \n\n
      Let me know how I could assist you.";
  }
    await context.PostAsync(message);
  }
    context.Wait(MessageReceived);
  }

為每個要求,bot 應用程式會檢查與 bot 狀態,以確保在驗證發出要求的使用者身分識別,並有可用的使用者設定檔資訊。

在本機使用 Bot 通道模擬器

Bot 應用程式需要 Azure 搜尋服務命名空間、 便捷鍵和索引名稱,以用來從使用者執行的要求。這些參數儲存在 SearchParameters.cs 檔案中,以及 bot 應用程式執行時的值設定 web.config 檔案中。現在您可以執行 Visual Studio 方案。

啟動 Bot 通道模擬器,並輸入訓練 LUIS 模型的交談。一般使用者互動的案例中擷取**[圖 9**。一旦 bot 應用程式順利執行在本機環境中,可以將它發行至 Azure Web 應用程式。

從模擬器執行 Bot
[圖 9 Bot 執行模擬器

Bot 部署至 Azure

在 Azure 入口網站中,從 Azure 中建立 Web 應用程式,然後在應用程式設定中,加入 Visual Studio 方案中的 web.config 檔案中的 appSetting 索引鍵和值。

Bot 應用至 Azure Web 應用程式發行之前,您必須註冊在此 bot dev.botframework.com/bots/new。此程序會產生 Bot ID、 Microsoft 應用程式識別碼和密碼。將這些值加入至 Visual Studio 2015,bot 應用程式的 web.config,並重新發行此應用程式至 Azure。

在註冊過程中,重新導向 URL 參數,在 Azure 中使用 bot 應用程式啟用 SSL 的 URL 和尾碼,以"/ api/訊息 」。

啟用 Bot 跨通道

Bot 登錄dev.botframework.com/bots,您可以啟用其他頻道 bot。[圖 10顯示 bot 應用程式啟用跨 Skype 與 Slack 通道。啟用 Slack 的 bot 應用程式需要一些額外的步驟。當您選擇將 bot 加入至這個通道,引導您完成適當的步驟時,就會啟動精靈。

註冊多個通道上的 Bot
[圖 10 註冊多個通道上的 Bot

[圖 11 bot 會顯示從 Skype 存取時的應用程式。

從 Skype 存取 Bot
[圖 11 從 Skype 存取 Bot

總結

Microsoft Bot 架構和其他支援的技術,像是 LUIS 和 Azure 搜尋服務會提供正確的基礎來建置直覺 bot 讓客戶的應用程式與您的特定業務應用程式互動。可以成熟或改善獨立於其他個別的元件,可確保每一個服務納入解決方案的整體架構的方式。例如,可以強制 LUIS 模型支援多個使用者可以利用互動 bot 不 entailing 核心 bot 應用程式或 Azure 搜尋服務中的內容上的任何變更時的 utterances。一旦部署,bot 應用程式可以不需要任何額外的程式碼變更,能讓您存取來自各種不同的通道,並可以加入更多的通道,經過一段時間,以提高存取和使用 bot 應用程式。


Srikantan Sankaran是印度班加羅爾以外 DX 小組的技術推廣者。 他會使用許多 Isv 在印度,並且可幫助他們設計和部署他們在 Microsoft Azure 上的解決方案。與他連絡sansri@microsoft.com

感謝下列 Microsoft 技術專家來檢閱這份文件︰ Sandeep Alur 和 Hemanth Kathuria
Sandeep Alur 是導致推廣 DX 印度的並且根據 Bangalore 中。

Hemanth Kathuria 是印度服務小組的資深顧問