Почему экспериментальный адаптивный corebot C# образца SetProperty () не сохраняет бот-фреймы для сохранения сущностей, возвращаемых LUIS? - PullRequest
1 голос
/ 12 марта 2020

Я пытаюсь заставить работать следующий пример бота.

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

Я могу запустить его и подключиться к нему с помощью эмулятора Bot Framework.

Работает следующий разговор:

Забронировать рейс

  • Какой у вас город отправления?
    Майами
  • Куда бы вы хотели поехать в ?
    Даллас
  • Какова дата вашего отъезда?
    завтра
  • Это звучит правильно для вас? Я отправляюсь в Даллас из Майами: 2020-03-13
    да
  • Я забронировал вас в Даллас из Майами 2020-03-13.

Проблема в том, что когда я пытаюсь забронировать рейс И одновременно указать город

"забронировать рейс из Майами" - Какой у вас город вылета?

Насколько я понимаю, бот должен распознайте сущность Майами как город отправления, а затем спросите город назначения.

Я считаю, что файл RootDialog.cs (я использую прямо из образца) использует SetProperty () в намерении Book_flight для достижения sh this.

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()}

Это НЕ должно запрашивать город отправления, если он уже был предоставлен / сохранен.

Я также посмотрел на результаты, возвращенные из LUIS с использованием трассировки LUIS в эмуляторе Bot Framework. LUIS, кажется, правильно идентифицирует намерение Book_flight И сущность fromCity как miami

{
  "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 () можно удалить, и бот по-прежнему работает так же. Этот пример бот работает для других людей? Чего мне не хватает?

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 12 марта 2020

Похоже, что распознанные объекты хранятся в массиве, и к ним необходимо обращаться через длинную форму в выражении значения действия 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"

и flightDate

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

Эти изменения позволяют сохранять сущности и НЕ запрашивать, указаны ли они в исходном сообщении. Например,

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

(Майами хранится как вылет и используется позже, город назначения является подсказкой для)

Я не могу сказать, что это будет работать во всех ситуациях, так как я не уверен в модели данных, но, похоже, он исправляет пример, который, вероятно, следует обновить.

btw - Botframework Dialog Debugger действительно помогает с отладкой.

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

...