將自然語言理解新增至您的 Bot

適用于: SDK v4

注意

Language Understanding (LUIS) 將于 2025 年 10 月 1 日淘汰。 從 2023 年 4 月 1 日起,您將無法建立新的 LUIS 資源。 新版的語言理解現在已提供作為 Azure AI 語言的一部分。

對話式語言理解(CLU)是 Azure AI 語言的一項功能,是 LUIS 的更新版本。 如需 Bot Framework SDK 中語言理解支援的詳細資訊,請參閱 自然語言理解

瞭解使用者在交談和內容上的意義的能力可能是一項困難的工作,但可以提供 Bot 更自然的對話感覺。 Language Understanding (LUIS) 是一種雲端式 API 服務,可讓您執行此動作,讓您的 Bot 能夠辨識使用者訊息的意圖、允許使用者使用更自然的語言,以及更妥善地引導對話流程。

本主題會逐步引導您將 LUIS 新增至正式發行前小眾測試版預約應用程式,以辨識使用者輸入中包含的不同意圖和實體。

注意

Bot Framework JavaScript、C# 和 Python SDK 將會繼續受到支援,不過,JAVA SDK 即將淘汰,最終長期支援將于 2023 年 11 月結束。 只會執行此存放庫中的重要安全性和錯誤修正。

使用 JAVA SDK 建置的現有 Bot 將繼續運作。

針對新的 Bot 建置,請考慮使用 Power Virtual Agents ,並閱讀 選擇正確的聊天機器人解決方案

如需詳細資訊,請參閱 Bot 建置 的未來。

必要條件

關於此範例

此核心 Bot 範例顯示機場航班預訂應用程式的範例。 它會使用 LUIS 服務來辨識使用者輸入,並傳回最上層可辨識的 LUIS 意圖。

語言模型包含三個意圖: Book FlightCancelNone 。 LUIS 會使用這些意圖來瞭解使用者傳送訊息給 Bot 時的意義。 語言模型也會定義 LUIS 可以從使用者的輸入擷取的實體,例如來源或目的地機場。

在每次處理使用者輸入之後, DialogBot 儲存 和 ConversationStateUserState 目前狀態。 收集所有必要的資訊之後,程式碼撰寫範例會建立示範航班預約保留。 在本文中,我們將涵蓋此範例的 LUIS 層面。 不過,範例的一般流程如下:

  • OnMembersAddedAsync 當新的使用者連線並顯示歡迎卡片時,就會呼叫 。
  • OnMessageActivityAsync 會針對收到的每個使用者輸入呼叫 。

Class diagram outlining the structure of the C# sample.

模組 OnMessageActivityAsync 會透過 Run 對話方塊擴充方法執行適當的對話方塊。 然後,主要對話方塊會呼叫 LUIS 協助程式,以尋找評分最高的使用者意圖。 如果使用者輸入的最上層意圖傳回 「BookFlight」,協助程式會從 LUIS 傳回的使用者填寫資訊。 之後,主要對話方塊會啟動 BookingDialog ,這會視需要從使用者取得其他資訊,例如:

  • Origin 原始城市
  • TravelDate 預訂航班的日期
  • Destination 目的地城市

本文涵蓋如何將 LUIS 新增至 Bot。 如需使用對話方塊或狀態的相關資訊,請參閱如何使用 對話方塊提示 收集使用者輸入,或 分別儲存使用者和交談資料

在 LUIS 入口網站中建立 LUIS 應用程式

  1. 登入 LUIS 入口網站 ,並視需要 建立帳戶 撰寫資源
  2. 在 LUIS 的 [ 交談應用程式 ] 頁面上,選取 [匯 入],然後 選取 [匯入為 JSON ]。
  3. 在 [ 匯入新的應用程式 ] 對話方塊中:
    1. 範例的 CognitiveModels 資料夾中,選擇 FlightBooking.json 檔案。
    2. 輸入 FlightBooking 作為應用程式的選擇性名稱,然後選取 [ 完成 ]。
  4. 網站可能會顯示 如何建立有效的 LUIS 應用程式和 升級複合實體 對話方塊。 您可以關閉這些對話方塊並繼續。
  5. 訓練您的應用程式,然後將您的應用程式發佈至 生產 環境。 如需詳細資訊,請參閱 LUIS 檔, 以瞭解如何定型 發佈 應用程式。

為何使用實體

LUIS 實體可讓 Bot 瞭解超出標準意圖的事件。 這可讓您從使用者收集其他資訊,讓 Bot 可以提出問題並更聰明地回應。 除了三個 LUIS 意圖 'Book Flight'、'Cancel' 和 'None' 的定義,FlightBooking.json 檔案也包含一組實體,例如 'From.Airport' 和 'To.Airport'。 這些實體可讓 LUIS 在要求新的旅行預約時,偵測並傳回使用者原始輸入內含的其他資訊。

取得值以連線到 LUIS 應用程式

發佈 LUIS 應用程式之後,您可以從 Bot 存取它。 您必須記錄數個值,才能從 Bot 記憶體取 LUIS 應用程式。 您可以使用 LUIS 入口網站來擷取該資訊。

從 LUIS.ai 入口網站擷取應用程式資訊

設定檔案 ( appsettings.json.envconfig.py ) 會作為一個位置將所有服務參考結合在一起的位置。 您擷取的資訊將會在下一節中新增至此檔案。

  1. luis.ai 選取已發佈的 LUIS 應用程式。

  2. 開啟已發佈的 LUIS 應用程式後,選取 [ 管理] 索引標籤。

  3. 選取左側的 [設定] 索引標籤,並將 [ 應用程式識別碼 ] 顯示的值記錄為 < [YOUR_APP_ID > ]。

    Screenshot of the Manage page displaying your application ID.

  4. 選取 [Azure 資源 ],然後 選取 [預測資源 ]。 將 [位置] 的值 記錄為 < YOUR_REGION > ,並將 [主鍵 ] 記錄為 < [YOUR_AUTHORING_KEY > ]。

    Screenshot of the Manage page displaying your location and primary key.

    或者,您可以針對撰寫資源使用區域和主鍵。

更新設定檔案

將存取 LUIS 應用程式所需的資訊,包括應用程式識別碼、撰寫金鑰和區域新增至 appsettings.json 檔案。 在上一個步驟中,您已從已發佈的 LUIS 應用程式擷取這些值。 API 主機名稱的格式 <your region>.api.cognitive.microsoft.com 應為 。

appsetting.json

{
  "MicrosoftAppType": "",
  "MicrosoftAppId": "",
  "MicrosoftAppPassword": "",
  "MicrosoftAppTenantId": "",
  "LuisAppId": "",
  "LuisAPIKey": "",
  "LuisAPIHostName": ""
}

設定 Bot 以使用 LUIS 應用程式

請確定 已為您的專案安裝 Microsoft.Bot.Builder.AI.Luis NuGet 套件。

若要連線到 LUIS 服務,Bot 會提取您新增至 appsetting.json 檔案的資訊。 類別 FlightBookingRecognizer 包含來自 appsetting.json 檔案之設定的程式碼,並藉由呼叫 RecognizeAsync 方法來查詢 LUIS 服務。

FlightBookingRecognizer.cs

public class FlightBookingRecognizer : IRecognizer
{
    private readonly LuisRecognizer _recognizer;

    public FlightBookingRecognizer(IConfiguration configuration)
    {
        var luisIsConfigured = !string.IsNullOrEmpty(configuration["LuisAppId"]) && !string.IsNullOrEmpty(configuration["LuisAPIKey"]) && !string.IsNullOrEmpty(configuration["LuisAPIHostName"]);
        if (luisIsConfigured)
        {
            var luisApplication = new LuisApplication(
                configuration["LuisAppId"],
                configuration["LuisAPIKey"],
                "https://" + configuration["LuisAPIHostName"]);
            // Set the recognizer options depending on which endpoint version you want to use.
            // More details can be found in https://docs.microsoft.com/en-gb/azure/cognitive-services/luis/luis-migration-api-v3
            var recognizerOptions = new LuisRecognizerOptionsV3(luisApplication)
            {
                PredictionOptions = new Bot.Builder.AI.LuisV3.LuisPredictionOptions
                {
                    IncludeInstanceData = true,
                }
            };

            _recognizer = new LuisRecognizer(recognizerOptions);
        }
    }

    // Returns true if luis is configured in the appsettings.json and initialized.
    public virtual bool IsConfigured => _recognizer != null;

    public virtual async Task<RecognizerResult> RecognizeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
        => await _recognizer.RecognizeAsync(turnContext, cancellationToken);

    public virtual async Task<T> RecognizeAsync<T>(ITurnContext turnContext, CancellationToken cancellationToken)
        where T : IRecognizerConvert, new()
        => await _recognizer.RecognizeAsync<T>(turnContext, cancellationToken);
}

FlightBookingEx.cs包含擷取 From To TravelDate 的邏輯;它會擴充從 呼叫 FlightBookingRecognizer.RecognizeAsync<FlightBooking>MainDialog.cs 時用來儲存 LUIS 結果的部分類別 FlightBooking.cs

CognitiveModels\FlightBookingEx.cs

// Extends the partial FlightBooking class with methods and properties that simplify accessing entities in the luis results
public partial class FlightBooking
{
    public (string From, string Airport) FromEntities
    {
        get
        {
            var fromValue = Entities?._instance?.From?.FirstOrDefault()?.Text;
            var fromAirportValue = Entities?.From?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (fromValue, fromAirportValue);
        }
    }

    public (string To, string Airport) ToEntities
    {
        get
        {
            var toValue = Entities?._instance?.To?.FirstOrDefault()?.Text;
            var toAirportValue = Entities?.To?.FirstOrDefault()?.Airport?.FirstOrDefault()?.FirstOrDefault();
            return (toValue, toAirportValue);
        }
    }

    // This value will be a TIMEX. And we are only interested in a Date so grab the first result and drop the Time part.
    // TIMEX is a format that represents DateTime expressions that include some ambiguity. e.g. missing a Year.
    public string TravelDate
        => Entities.datetime?.FirstOrDefault()?.Expressions.FirstOrDefault()?.Split('T')[0];
}

LUIS 現在已為您的 Bot 設定並聯機。

測試聊天機器人

下載並安裝最新的 Bot Framework 模擬器

  1. 在本機電腦上執行範例。 如果您需要指示,請參閱 README C# 範例、 JS 範例 Python 範例 的 檔案。

  2. 在模擬器中,輸入訊息,例如「前往巴黎」或「從巴黎前往柏林」。 使用 FlightBooking.json 檔案中找到的任何語句來定型意圖「預訂正式發行前小眾測試版」。

如果 LUIS 傳回的最上層意圖解析為「預訂正式發行前小眾測試版」,您的 Bot 會詢問更多問題,直到其儲存足夠的資訊來建立旅行預約為止。 此時,它會將此預約資訊傳回給使用者。

此時,程式碼 Bot 邏輯將會重設,您可以繼續建立更多預約。

其他資訊

如需 LUIS 的詳細資訊,請參閱 LUIS 檔:

提示

SDK 的不同部分會定義不同的 實體 類別或元素。 如需訊息實體,請參閱 實體和活動類型