Интеграция LUIS с FormFlow

Я создал бота, в котором есть FormFlow. Теперь, если вы наберете «Я хочу запустить продукт», LUIS сообщит, к какому диалоговому окну он должен перейти:

    internal static IDialog<AssesmentHelper> CreateProduct()
            {
                return Chain.From(() => FormDialog.FromForm(AssesmentHelper.BuildForm))
                    .Do(async (context, profileForm) =>
                    {
                        try
                        {
                            var completed = await profileForm;

                        }
                        catch (FormCanceledException<AssesmentHelper> e)
                        {
                            string reply;
                            if (e.InnerException == null)
                            {
                                reply = $"You quit on {e.Last}--maybe you can finish next time!";
                            }
                            else
                            {
                                reply = Responses.ShortCircuit;
                            }
                            await context.PostAsync(reply);
                        }
                    });
            }

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
        { 
stLuis = await LuisHelper.ParseUserInput(activity.Text);
    switch (stLuis.topScoringIntent.intent)
    {

         case "CreateProduct":
              await Conversation.SendAsync(activity, CreateProduct);
              break;

         case "EditProduct":
               await Conversation.SendAsync(activity, EditProduct);
               break;

           case "None":

               break;

            default:
               break;
    }
}

Теперь, когда он входит в диалог, он просит пользователя выбрать числа:

Пожалуйста, выберите номера:

  1. Лазурный
  2. Окна

Теперь, если я отвечу 1,2. Луис возвращает его как «Нет намерения», поэтому мое сообщение не переходит в соответствующий диалог. Он всегда переходит в None.

Код для диалога:

 public static IForm<AssesmentHelper> BuildForm()
        {
            return new FormBuilder<AssesmentHelper>()
                    .Message(Responses.NumberSelection)
                    .Field(nameof(Program))
                    .Field(nameof(Product))
                    .Build();
        }

Enum для программы и продукта:

[Serializable]
    public enum Program
    {
        None = 0,
        A = 1,
     };

        [Serializable]
        public enum Product
        {
            None = 0,
            Azure = 1,
            Windows = 2
        };

Как только я вхожу в этот диалог, он просит меня выбрать номер для выбора программы. Теперь, если я выберу 1,2. Луис возвращает его как «Нет намерения». Итак, случай «Нет» выполняется.

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

Раньше он каким-то образом определял правильные намерения, но сегодня я переиздал свое приложение luis, и оно перестало идентифицироваться.


person Akshay    schedule 15.11.2016    source источник
comment
Луис не может вывести намерение для числа, но без обработки вы можете проанализировать activity.Text, чтобы увидеть, является ли сообщение числом, и, если да, обработать его соответствующим образом.   -  person stuartd    schedule 15.11.2016
comment
Что, если в другом диалоговом окне также есть число в качестве входных данных, то как решить, какой диалог выбрать.   -  person Akshay    schedule 15.11.2016
comment
Вот для чего нужно состояние диалога: вам нужно знать, о чем вы спрашивали, чтобы правильно обработать ответ.   -  person stuartd    schedule 15.11.2016
comment
Можете ли вы опубликовать код своего CreateDialog, например? или диалоговое окно, которое запрашивает у пользователя числа?   -  person Ezequiel Jadib    schedule 15.11.2016
comment
обновил код выше @EzequielJadib   -  person Akshay    schedule 15.11.2016
comment
Я предполагаю, что ваш диалог вызывает в StartAsync вашу форму? Можете ли вы опубликовать полный диалог? Вместо Conversation.SendAsync вы можете попробовать использовать context.Forward? Первый параметр — это экземпляр диалога, второй — обратный вызов возобновления, а затем — сообщение для пересылки (просто выполните context.MakeMessage в вашем случае), а затем Токен отмены. Также убедитесь, что вы используете последнюю версию конструктора.   -  person Ezequiel Jadib    schedule 15.11.2016
comment
@EzequielJadib Я обновил метод диалога. Я не понял, что вы сказали о context.MakeMessage. Надеюсь, мое требование понятно.   -  person Akshay    schedule 15.11.2016
comment
Понятно... есть ли причина, по которой вы не используете диалоги и LuisDialog. Почему вы используете цепочку?   -  person Ezequiel Jadib    schedule 16.11.2016