搭配 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 知識庫。
- 針對新的 Bot,請考慮使用 Azure AI 語言的問題 解答 和 協調流程工作流程 功能。
- 如需 Orchestrator 的詳細資訊,請參閱 Composer 中的 Orchestrator 意圖辨識。
- 如需命令的詳細資訊
bf orchestrator
,請參閱 Bot Framework CLI 讀我檔案。
必要條件
- 用來撰寫 LUIS 應用程式的 luis.ai 帳戶。
- QnA Maker帳戶和現有的 QnA Maker 知識庫。
- C#中具有 Orchestrator 範例的 NLP複本, (封存) 或JavaScript (封存) 。
- Bot 基本概念、LUIS 和 QnA Maker 的知識。
- 安裝命令列 BF CLI。
關於此範例
此範例是以一組預先定義的 LUIS 和 QnA Maker 專案為基礎。 不過,若要在 Bot 中使用 QnA Maker,您需要QnA Maker入口網站中現有的知識庫。 然後,您的 Bot 可以使用知識庫來回答使用者的問題。
針對新的 Bot 開發,請考慮使用 Power Virtual Agents。 如果您需要為 Bot Framework SDK Bot 建立新的知識庫,請參閱下列 Azure AI 服務文章:
系統會針對每個收到的使用者輸入呼叫 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 應用程式
在範例的認知模型目錄中,從HomeAutomation和Weather .lu 檔案建立 LUIS 應用程式。
執行下列命令,將應用程式匯入、定型及發佈至生產環境。
bf luis:build --in CognitiveModels --authoringKey <YOUR-KEY> --botName <YOUR-BOT-NAME>
記錄應用程式識別碼、顯示名稱、撰寫金鑰和位置。
如需詳細資訊,請參閱如何在 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 應用程式。
開啟命令提示字元或終端機視窗,並將目錄變更為範例目錄
請確定您有目前版本的 npm 和 Bot Framework CLI。
npm i -g npm npm i -g @microsoft/botframework-cli
下載 Orchestrator 基底模型檔案
mkdir model bf orchestrator:basemodel:get --out ./model
建立 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
針對下列所示的每個實體,在這些指示中新增您稍早所記錄的值:
"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 連線到 HomeAutomation
和 Weather
SampleQnA
服務。 建構函式會使用您提供的值來連線到這些服務。
BotServices.cs
從 Bot 呼叫服務
針對使用者的每個輸入,Bot 邏輯會將使用者輸入傳入 Orchestrator 辨識器、尋找最上層傳回的意圖,並使用該資訊來呼叫輸入的適當服務。
每當 OnMessageActivityAsync
呼叫 方法時,在DispatchBot.cs檔案中,我們會檢查傳入的使用者訊息,並從 Orchestrator Recognizer 取得最高意圖。 然後, topIntent
我們會將 和 recognizerResult
傳遞至正確的方法,以呼叫服務並傳回結果。
bots\DispatchBot.cs
使用辨識結果
當 Orchestrator 辨識器產生結果時,它會指出哪些服務最能適當地處理語句。 此 Bot 中的程式碼會將要求路由傳送至對應的服務,然後概述來自所呼叫服務的回應。 根據 Orchestrator 傳回的 意圖 ,此程式碼會使用傳回的意圖來路由傳送至正確的 LUIS 模型或 QnA 服務。
bots\DispatchBot.cs
ProcessHomeAutomationAsync
和 ProcessWeatherAsync
方法會使用回合內容中包含的使用者輸入,從正確的 LUIS 模型取得最上層意圖和實體。
方法 ProcessSampleQnAAsync
會使用回合內容中包含的使用者輸入,從知識庫產生答案,並將該結果顯示給使用者。
注意
如果這是生產應用程式,就會用此應用程式來將選取的 LUIS 方法連線到其指定服務、傳入使用者輸入及處理傳回的 LUIS 意圖和實體資料。
測試 Bot
使用您的開發環境啟動範例程式碼。 請注意應用程式所開啟瀏覽器視窗網址列中顯示的 localhost 位址:
https://localhost:<Port_Number>
。開啟Bot Framework Emulator,按一下 [開啟 Bot]按鈕。
在 [ 開啟 Bot ] 對話方塊中,輸入您的 Bot 端點 URL,例如
http://localhost:3978/api/messages
。 按一下 [ 連接]。專為 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
將使用者語句路由傳送至 QnA Maker
在模擬器中,輸入文字
hi
並提交語句。 Bot 會將此查詢提交至 Orchestrator,並傳迴響應,指出哪些子應用程式應該取得此語句以進行進一步處理。藉由選取
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 應用程式提出第二個要求。在模擬器記錄中選取該
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