共用方式為


搭配 Orchestrator 使用多個 LUIS 和 QnA 模型

適用于: SDK v4

注意

Azure AI QnA Maker 將于 2025 年 3 月 31 日淘汰。 從 2022 年 10 月 1 日開始,您將無法建立新的 QnA Maker 資源或知識庫。 現在,Azure AI 語言提供較新版本的問題和答案功能。

自訂問題解答是 Azure AI 語言的一項功能,是 QnA Maker 服務的更新版本。 如需 Bot Framework SDK 中問答支援的詳細資訊,請參閱 自然語言理解

注意

Language Understanding (LUIS) 將于 2025 年 10 月 1 日淘汰。 從 2023 年 4 月 1 日開始,您將無法建立新的 LUIS 資源。 新版的語言理解現在可做為 Azure AI 語言的一部分使用。

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

如果 Bot 使用多個LANGUAGE UNDERSTANDING (LUIS) 模型和 QnA Maker 知識庫,您可以使用 Bot Framework Orchestrator 來判斷哪些 LUIS 模型或 QnA Maker 知識庫最符合使用者輸入。 您可以使用 bf orchestrator CLI 命令來建立 Orchestrator 快照集檔案,然後使用快照集檔案在執行時間將使用者輸入路由傳送至正確的模型。

本文說明如何搭配 Orchestrator 使用現有的QnA Maker 知識庫。

必要條件

關於此範例

此範例是以一組預先定義的 LUIS 和 QnA Maker 專案為基礎。 不過,若要在 Bot 中使用 QnA Maker,您需要QnA Maker入口網站中現有的知識庫。 然後,您的 Bot 可以使用知識庫來回答使用者的問題。

針對新的 Bot 開發,請考慮使用 Power Virtual Agents。 如果您需要為 Bot Framework SDK Bot 建立新的知識庫,請參閱下列 Azure AI 服務文章:

C# 類別圖表。

系統會針對每個收到的使用者輸入呼叫 OnMessageActivityAsync。 此模組會尋找評分最高的使用者意圖,並將該結果傳遞至 DispatchToTopIntentAsync。 DispatchToTopIntentAsync 接著會呼叫適當的應用程式處理常式。

  • ProcessSampleQnAAsync - 適用于 Bot 常見問題。
  • ProcessWeatherAsync - 適用於天氣查詢。
  • ProcessHomeAutomationAsync - 適用於家用光源命令。

處理常式會呼叫 LUIS 或 QnA Maker 服務,並將產生的結果傳回給使用者。

建立 LUIS 應用程式

您必須先建立併發布 LUIS 應用程式和 QnA 知識庫,才能建立 Orchestrator 快照集檔案。 本文中參考的範例 Bot 會使用下列模型,隨附于 資料夾中的 NLP With Orchestrator 範例 \CognitiveModels

名稱 描述
HomeAutomation 使用相關聯的實體資料,辨識住家自動化意圖的 LUIS 應用程式。
Weather 使用位置資料辨識天氣相關意圖的 LUIS 應用程式。
QnAMaker 提供聊天機器人相關簡單問題解答的 QnA Maker 知識庫。

建立 LUIS 應用程式

在範例的認知模型目錄中,從HomeAutomationWeather .lu 檔案建立 LUIS 應用程式。

  1. 執行下列命令,將應用程式匯入、定型及發佈至生產環境。

    bf luis:build --in CognitiveModels --authoringKey <YOUR-KEY> --botName <YOUR-BOT-NAME>
    
  2. 記錄應用程式識別碼、顯示名稱、撰寫金鑰和位置。

如需詳細資訊,請參閱如何在 LUIS 入口網站 中建立 LUIS 應用程式取得值,以自然語言理解新增至 Bot,以及如何將應用程式 型和 發佈 至生產環境的 LUIS 檔。

取得值,將您的 Bot 連線到知識庫

注意

Azure AI QnA Maker 將于 2025 年 3 月 31 日淘汰。 從 2022 年 10 月 1 日開始,您將無法建立新的 QnA Maker 資源或知識庫。 現在,Azure AI 語言提供較新版本的問題和答案功能。

自訂問題解答是 Azure AI 語言的一項功能,是 QnA Maker 服務的更新版本。 如需 Bot Framework SDK 中問答支援的詳細資訊,請參閱 自然語言理解

您需要現有的知識庫和 QnA Maker 主機名稱和端點金鑰。

提示

QnA Maker 檔提供如何建立、定型及發佈知識庫的指示。

建立 Orchestrator 快照集檔案

Orchestrator 工具的 CLI 介面會建立 Orchestrator 快照集檔案,以在執行時間路由至正確的 LUIS 或 QnA Maker 應用程式。

  1. 安裝最新支援的 C++ 可轉散發套件 套件版本

  2. 開啟命令提示字元或終端機視窗,並將目錄變更為範例目錄

  3. 請確定您有目前版本的 npm 和 Bot Framework CLI。

    npm i -g npm
    npm i -g @microsoft/botframework-cli
    
  4. 下載 Orchestrator 基底模型檔案

    mkdir model
    bf orchestrator:basemodel:get --out ./model
    
  5. 建立 Orchestrator 快照集檔案

    mkdir generated
    bf orchestrator:create --hierarchical --in ./CognitiveModels --out ./generated --model ./model
    

安裝套件

第一次執行此應用程式之前,請先確認您已安裝數個 NuGet 套件:

  • Microsoft.Bot.Builder
  • Microsoft.Bot.Builder.AI.Luis
  • Microsoft.Bot.Builder.AI.QnA
  • Microsoft.Bot.Builder.AI.Orchestrator

手動更新 appsettings.json 檔案

建立所有服務應用程式後,每個服務應用程式的資訊都必須新增至 'appsettings.json' 檔案。 C# (封存) 程式碼的初始範例包含空的 appsettings.json 檔案:

appsettings.json

C# (封存)

針對下列所示的每個實體,在這些指示中新增您稍早所記錄的值:

"QnAKnowledgebaseId": "<knowledge-base-id>",
"QnAEndpointKey": "<qna-maker-resource-key>",
"QnAEndpointHostName": "<your-hostname>",

"LuisHomeAutomationAppId": "<app-id-for-home-automation-app>",
"LuisWeatherAppId": "<app-id-for-weather-app>",
"LuisAPIKey": "<your-luis-endpoint-key>",
"LuisAPIHostName": "<your-dispatch-app-region>",

完成所有變更時,儲存這個檔案。

從 Bot 連線到服務

若要連線到 LUIS 和 QnA Maker 服務,您的 Bot 會從設定檔提取資訊。

BotServices.cs中,組態檔 appsettings.json 中包含的資訊是用來將 Orchestrator Bot 連線到 HomeAutomationWeatherSampleQnA 服務。 建構函式會使用您提供的值來連線到這些服務。

BotServices.cs

C# (封存)

從 Bot 呼叫服務

針對使用者的每個輸入,Bot 邏輯會將使用者輸入傳入 Orchestrator 辨識器、尋找最上層傳回的意圖,並使用該資訊來呼叫輸入的適當服務。

每當 OnMessageActivityAsync 呼叫 方法時,在DispatchBot.cs檔案中,我們會檢查傳入的使用者訊息,並從 Orchestrator Recognizer 取得最高意圖。 然後, topIntent 我們會將 和 recognizerResult 傳遞至正確的方法,以呼叫服務並傳回結果。

bots\DispatchBot.cs

C# (封存)

使用辨識結果

當 Orchestrator 辨識器產生結果時,它會指出哪些服務最能適當地處理語句。 此 Bot 中的程式碼會將要求路由傳送至對應的服務,然後概述來自所呼叫服務的回應。 根據 Orchestrator 傳回的 意圖 ,此程式碼會使用傳回的意圖來路由傳送至正確的 LUIS 模型或 QnA 服務。

bots\DispatchBot.cs

C# (封存)

ProcessHomeAutomationAsyncProcessWeatherAsync 方法會使用回合內容中包含的使用者輸入,從正確的 LUIS 模型取得最上層意圖和實體。

方法 ProcessSampleQnAAsync 會使用回合內容中包含的使用者輸入,從知識庫產生答案,並將該結果顯示給使用者。

注意

如果這是生產應用程式,就會用此應用程式來將選取的 LUIS 方法連線到其指定服務、傳入使用者輸入及處理傳回的 LUIS 意圖和實體資料。

測試 Bot

  1. 使用您的開發環境啟動範例程式碼。 請注意應用程式所開啟瀏覽器視窗網址列中顯示的 localhost 位址: https://localhost:<Port_Number>

  2. 開啟Bot Framework Emulator,按一下 [開啟 Bot]按鈕。

  3. 在 [ 開啟 Bot ] 對話方塊中,輸入您的 Bot 端點 URL,例如 http://localhost:3978/api/messages 。 按一下 [ 連接]。

  4. 專為 Bot 所建置的服務涵蓋以下一些問題和命令,供您參考:

    • QnA Maker
      • hi, good morning
      • what are you, what do you do
    • LUIS (住家自動化)
      • turn on bedroom light
      • turn off bedroom light
      • make some coffee
    • LUIS (天氣)
      • whats the weather in redmond washington
      • what's the forecast for london
      • show me the forecast for nebraska

將使用者語句路由傳送至 QnA Maker

  1. 在模擬器中,輸入文字 hi 並提交語句。 Bot 會將此查詢提交至 Orchestrator,並傳迴響應,指出哪些子應用程式應該取得此語句以進行進一步處理。

  2. 藉由選取 Orchestrator Recognition Trace 記錄中的行,您可以在模擬器中看到 JSON 回應。 Orchestrator 結果會顯示在 Inspector 中。

    {
    "type": "trace",
    "timestamp": "2021-05-01T06:26:04.067Z",
    "serviceUrl": "http://localhost:58895",
    "channelId": "emulator",
    "from": {
      "id": "36b2a460-aa43-11eb-920f-7da472b36492",
      "name": "Bot",
      "role": "bot"
    },
    "conversation": {
      "id": "17ef3f40-aa46-11eb-920f-7da472b36492|livechat"
    },
    "recipient": {
      "id": "5f8c6123-2596-45df-928c-566d44426556",
      "role": "user"
    },
    "locale": "en-US",
    "replyToId": "1a3f70d0-aa46-11eb-8b97-2b2a779de581",
    "label": "Orchestrator Recognition",
    "valueType": "OrchestratorRecognizer",
    "value": {
      "text": "hi",
      "alteredText": null,
      "intents": {
        "QnAMaker": {
          "score": 0.9987310956576168
        },
        "HomeAutomation": {
          "score": 0.3402091165577196
        },
        "Weather": {
          "score": 0.24092200496795158
        }
      },
      "entities": {},
      "result": [
        {
          "Label": {
            "Type": 1,
            "Name": "QnAMaker",
            "Span": {
              "Offset": 0,
              "Length": 2
            }
          },
          "Score": 0.9987310956576168,
          "ClosestText": "hi"
        },
        {
          "Label": {
            "Type": 1,
            "Name": "HomeAutomation",
            "Span": {
              "Offset": 0,
              "Length": 2
            }
          },
          "Score": 0.3402091165577196,
          "ClosestText": "make some coffee"
        },
        {
          "Label": {
            "Type": 1,
            "Name": "Weather",
            "Span": {
              "Offset": 0,
              "Length": 2
            }
          },
          "Score": 0.24092200496795158,
          "ClosestText": "soliciting today's weather"
        }
      ]
    },
    "name": "OrchestratorRecognizerResult",
    "id": "1ae65f30-aa46-11eb-8b97-2b2a779de581",
    "localTimestamp": "2021-04-30T23:26:04-07:00"
    }
    

    由於語句是 hi Orchestrator QnAMaker 意圖的一部分,而且已選取為 topScoringIntent ,因此 Bot 會發出第二個要求,這次會使用相同的語句對 QnA Maker 應用程式提出第二個要求。

  3. 在模擬器記錄中選取該 QnAMaker Trace 行。 QnA Maker 結果會顯示在偵測器中。

    {
        "questions": [
            "hi",
            "greetings",
            "good morning",
            "good evening"
        ],
        "answer": "Hello!",
        "score": 1,
        "id": 96,
        "source": "QnAMaker.tsv",
        "metadata": [],
        "context": {
            "isContextOnly": false,
            "prompts": []
        }
    }
    

[Python (封存) ]: (https://github.com/microsoft/BotBuilder-Samples/tree/main/archive/samples/python/14.nlp-with-orchestrator