搭配 Orchestrator 使用多個 LUIS 和 QnA 模型
適用於: SDK v4
注意
Azure AI QnA Maker 將於 2025 年 3 月 31 日淘汰。 從 2022 年 10 月起,您將無法建立新的 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 語言的一項功能,是 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 開發,請考慮使用 Copilot Studio。 如果您需要為 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 應用程式,可辨識家庭自動化意圖與相關聯的實體數據。 |
天氣 | LUIS 應用程式,可辨識具有位置數據的天氣相關意圖。 |
QnAMaker | QnA Maker 知識庫,提供 Bot 相關簡單問題的解答。 |
建立 LUIS 應用程式
在範例的認知模型目錄中, 從 HomeAutomation 和 Weather .lu 檔案建立 LUIS 應用程式。
執行下列命令,將應用程式匯入、定型和發佈至生產環境。
bf luis:build --in CognitiveModels --authoringKey <YOUR-KEY> --botName <YOUR-BOT-NAME>
記錄應用程式識別碼、顯示名稱、撰寫金鑰和位置。
如需詳細資訊,請參閱如何在 LUIS 入口網站中建立 LUIS 應用程式和取得值,以將自然語言理解新增至 Bot 中的 LUIS 應用程式,以及有關如何將應用程式定型和發布至生產環境的 LUIS 檔。
取得值,以將 Bot 連線至 知識庫
注意
Azure AI QnA Maker 將於 2025 年 3 月 31 日淘汰。 從 2022 年 10 月起,您將無法建立新的 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# (archived) 程式代碼的初始範例包含空的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 取得最上層意圖。 接著,我們會將 和 recognizerResult
傳遞給topIntent
正確的 方法,以呼叫服務並傳回結果。
bots\DispatchBot.cs
使用辨識結果
當 Orchestrator 辨識器產生結果時,它會指出哪一個服務最適當地處理語句。 此 Bot 中的程式代碼會將要求路由傳送至對應的服務,然後摘要說明來自所呼叫服務的回應。 根據 Orchestrator 傳回的 意圖 ,此程式代碼會使用傳回的意圖,路由傳送至正確的 LUIS 模型或 QnA 服務。
bots\DispatchBot.cs
ProcessHomeAutomationAsync
和 ProcessWeatherAsync
方法會使用回合內容中包含的使用者輸入,從正確的 LUIS 模型取得最上層意圖和實體。
方法ProcessSampleQnAAsync
會使用回合內容中包含的使用者輸入,從 知識庫 產生答案,並將該結果顯示給使用者。
注意
如果這是生產應用程式,這就是選取的 LUIS 方法會連線到其指定的服務、傳入使用者輸入,以及處理傳回的 LUIS 意圖和實體數據的位置。
測試您的機器人
使用您的開發環境,啟動範例程序代碼。 請注意 app 開啟之瀏覽器視窗網址列中顯示的 localhost 位址:
https://localhost:<Port_Number>
。開啟 Bot Framework 模擬器,按兩下 [ 開啟 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 結果會顯示在 Inspector 中。{ "questions": [ "hi", "greetings", "good morning", "good evening" ], "answer": "Hello!", "score": 1, "id": 96, "source": "QnAMaker.tsv", "metadata": [], "context": { "isContextOnly": false, "prompts": [] } }
[Python (archived)]: (https://github.com/microsoft/BotBuilder-Samples/tree/main/archive/samples/python/14.nlp-with-orchestrator