为什么 botframework 实验性自适应核心机器人 C# 示例 SetProperty() 不保存 LUIS 返回的实体?

Why doesn't botframework experimental adaptive corebot C# sample SetProperty() save entities returned by LUIS?

我正在尝试让以下示例机器人正常工作。

https://github.com/microsoft/BotBuilder-Samples/tree/master/experimental/adaptive-dialog/csharp_dotnetcore/04.core-bot

我可以 运行 它并使用 Bot Framework Emulator 成功连接到它。

以下对话有效:

订机票

问题是当我尝试预订航班并同时提供城市时

"book flight from miami" - 你的出发城市是哪里?

我的理解是机器人应该将实体迈阿密识别为出发城市,然后询问目的地城市。

我相信 RootDialog.cs 文件(我直接使用示例)在 Book_flight 意图中使用 SetProperty() 来完成此操作。

https://github.com/microsoft/BotBuilder-Samples/blob/master/experimental/adaptive-dialog/csharp_dotnetcore/04.core-bot/Dialogs/RootDialog.cs

我认为 SetProperty() 操作会存储实体

Value = "@fromCity.location"

在属性

Property = "conversation.flightBooking.destinationCity"

随后,TextInput 将使用提示符

Prompt = new ActivityTemplate("@{PromptForMissingInformation()}")

读取 RootDialog.lg 文件

https://github.com/microsoft/BotBuilder-Samples/blob/master/experimental/adaptive-dialog/csharp_dotnetcore/04.core-bot/Dialogs/RootDialog.lg

# PromptForMissingInformation
- IF: @{conversation.flightBooking.departureCity == null} 
  - @{PromptForDepartureCity()}
- ELSEIF: @{conversation.flightBooking.destinationCity == null}
  - @{PromptForDestinationCity()}
- ELSEIF: @{conversation.flightBooking.departureDate == null}
  - @{PromptForTravelDate()}
- ELSE: 
  - @{ConfirmBooking()}

如果已经是 provided/stored,则不应提示输入出发城市。

我还在 Bot Framework Emulator 中使用 LUIS 跟踪查看了从 LUIS 返回的结果。 LUIS 似乎正确地将意图 Book_flight 和来自城市的实体识别为迈阿密

{
  "recognizerResult": {
    "alteredText": null,
    "entities": {
      "$instance": {
        "fromCity": [
          {
            "endIndex": 22,
            "startIndex": 17,
            "text": "miami",
            "type": "builtin.geographyV2.city"
          }
        ]
      },
      "fromCity": [
        {
          "location": "miami",
          "type": "city"
        }
      ]
    },
    "intents": {
      "Book_flight": {
        "score": 0.941154063
      }
    },
    "text": "book flight from miami"
  }
}

为什么 SetProperty() 不保存 fromCity 实体信息?可以删除 3 个 SetProperty() 操作,机器人仍然可以正常工作。这个示例机器人是否适用于其他人?我错过了什么?

如有任何帮助,我们将不胜感激。

看来已识别的实体存储在数组中,需要通过 SetProperty() 操作的值表达式中的长格式进行访问。

new SetProperty()
{

     Property = "conversation.flightBooking.departureCity",
     // Value is an expresson. @entityName is short hand to refer to the value of an entity recognized.
     // @xxx is same as turn.recognized.entities.xxx
     //Value = "@fromCity.location"                                
     Value = "turn.recognized.entities.fromCity[0].location"
},

destinationCity 相同

Value = "turn.recognized.entities.toCity[0].location"

和出发日期

Value = "turn.recognized.entities.datetime[0].timex[0]"

如果在原始消息中提供这些更改,则这些更改允许存储实体并且不询问它们。例如,

Book flight from miami
- Where would you like to travel to? 

(迈阿密存储为出发城市,以后使用,目的地城市提示)

我不能说这在所有情况下都有效,因为我不确定数据模型,但它似乎确实修复了示例,可能应该更新它。

顺便说一句 - Botframework 对话框调试器确实有助于调试。

https://marketplace.visualstudio.com/items?itemName=tomlm.vscode-dialog-debugger