你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

通过 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 中的问答支持的详细信息,请参阅 自然语言理解

注意

语言理解 (LUIS) 将于 2025 年 10 月 1 日停用。 从 2023 年 4 月 1 日开始,将无法创建新的 LUIS 资源。 新版本的语言理解现已作为 Azure AI 语言的一部分提供。

对话语言理解 (CLU) (Azure AI 语言的一项功能)是 LUIS 的更新版本。 有关 Bot Framework SDK 中的语言理解支持的详细信息,请参阅 自然语言理解

如果机器人使用多个 语言理解 (LUIS) 模型和 QnA Maker 知识库,则可以使用 Bot Framework Orchestrator 来确定哪个 LUIS 模型或 QnA Maker 知识库最匹配用户输入。 可以使用 bf orchestrator CLI 命令创建 Orchestrator 快照 文件,然后使用 快照 文件在运行时将用户输入路由到正确的模型。

本文介绍如何将现有的 QnA Maker 知识库与 Orchestrator 配合使用。

先决条件

关于此示例

此示例基于一组预定义的 LUIS 和 QnA Maker 项目。 但是,若要在机器人中使用 QnA Maker,需要在 QnA Maker 门户中拥有现有的知识库。 然后,机器人可以使用知识库来回答用户的问题。

对于新的机器人开发,请考虑使用 Power Virtual Agents。 如果需要为 Bot Framework SDK 机器人创建新的知识库,请参阅以下 Azure AI 服务文章:

C# 类关系图。

每次收到用户输入都会调用 OnMessageActivityAsync。 此模块会查找得分最高的用户意向,并将该结果传递到 DispatchToTopIntentAsync。 而 DispatchToTopIntentAsync 又会调用相应的应用处理程序。

  • ProcessSampleQnAAsync - 机器人常见问题解答。
  • ProcessWeatherAsync - 用于发出天气查询。
  • ProcessHomeAutomationAsync - 用于执行家庭照明命令。

该处理程序调用 LUIS 或 QnA Maker 服务,并将生成的结果返回给用户。

创建 LUIS 应用

在创建业务流程协调程序快照文件之前,需要创建并发布 LUIS 应用和 QnA 知识库。 本文中引用的示例机器人使用以下模型,这些模型包含在 文件夹中的 NLP With Orchestrator 示例中 \CognitiveModels

名称 说明
家庭自动化 一个可以识别包含关联实体数据的家庭自动化意向的 LUIS 应用。
天气 一个可以识别包含位置数据的天气相关意向的 LUIS 应用。
QnAMaker 一个可以为有关机器人的一些简单问题提供答案的 QnA Maker 知识库。

创建 LUIS 应用

从示例认知模型目录中的 HomeAutomationWeather .lu 文件创建 LUIS 应用。

  1. 运行以下命令,导入、训练应用并将其发布到生产环境。

    bf luis:build --in CognitiveModels --authoringKey <YOUR-KEY> --botName <YOUR-BOT-NAME>
    
  2. 记录应用程序 ID、显示名称、创作密钥和位置。

有关详细信息,请参阅如何在 LUIS 门户中创建 LUIS 应用向机器人添加自然语言理解中的获取值以连接到 LUIS 应用以及如何训练应用并将其发布到生产环境的 LUIS 文档。

获取用于将机器人连接到知识库的值

注意

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. 安装最新受支持的 Visual 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>",

请在完成所有更改后,保存此文件。

从机器人连接到服务

若要连接到 LUIS 和 QnA Maker 服务,机器人需从设置文件中提取信息。

在 BotServices.cs 中,包含在配置文件 appsettings.json 中的信息用于将 Orchestrator 机器人连接到 HomeAutomationWeatherSampleQnA 服务。 构造函数使用提供的值连接到这些服务。

BotServices.cs

C# (存档)

从机器人调用服务

对于用户提供的每项输入,机器人逻辑会将用户输入传递给 Orchestrator Recognizer,查找最相关的返回意向,并使用该信息来针对该输入调用相应的服务。

每当在 DispatchBot.cs 文件中调用 OnMessageActivityAsync 方法时,我们都会检查传入的用户消息并从 Orchestrator Recognizer 获取首要意向。 然后, topIntent 我们将 和 recognizerResult 传递到正确的方法,以调用服务并返回结果。

bots\DispatchBot.cs

C# (存档)

处理识别结果

当 Orchestrator Recognizer 生成结果时,它会指示哪个服务最适合用于处理言语。 此机器人中的代码将请求路由到相应的服务,然后汇总被调用服务返回的响应。 根据 Orchestrator 返回的意向,此代码使用返回的意向路由到正确的 LUIS 模型或 QnA 服务。

bots\DispatchBot.cs

C# (存档)

ProcessHomeAutomationAsyncProcessWeatherAsync 方法使用轮次上下文中包含的用户输入从正确的 LUIS 模型获取首要意向和实体。

ProcessSampleQnAAsync 方法使用轮次上下文中包含的用户输入来基于知识库生成回答,并向用户显示该结果。

注意

如果这是一个生产应用程序,则选定的 LUIS 方法将在此上下文中连接到其指定服务、传入用户输入,并处理返回的 LUIS 意向和实体数据。

测试机器人

  1. 使用开发环境启动示例代码。 请注意应用打开的浏览器窗口的地址栏中显示的 localhost 地址: https://localhost:<Port_Number>

  2. 打开 Bot Framework Emulator,单击“打开机器人”按钮。

  3. 在“打开机器人”对话框中,输入机器人终结点 URL,例如 http://localhost:3978/api/messages。 单击 {3}连接{4}修改。

  4. 为便于参考,下面提供了为机器人生成的服务所用的某些问题和命令:

    • 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 并提交言语。 机器人将此查询提交到 Orchestrator 并返回响应,该响应指示哪个子应用应获取该言语以进行进一步处理。

  2. 通过选择 Orchestrator Recognition Trace 日志中的行,可以在模拟器中看到 JSON 响应。 Orchestrator 结果将显示在检查器中。

    {
    "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,因此机器人将发出另一个请求,这一次会将相同言语发送到 QnA Maker 应用。

  3. 选择 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 (存档) ]: (https://github.com/microsoft/BotBuilder-Samples/tree/main/archive/samples/python/14.nlp-with-orchestrator