Как передать текст пользователя непосредственно в LUIS при выборе подсказки, для которой опция is не существует - PullRequest
0 голосов
/ 30 апреля 2018

Я работал над платформой Bot, в которой я создал опцию Prompt как Да, Нет, я независимый тип вопроса. Но если я ввожу любой текст, которого не было в опции List, тогда я должен передать пользовательский текст в LUIS для попадания в соответствующий Намерение. Я пробовал это, получая пользовательский текст в блоке Catch, но (ожидая результата) не получая пользовательский текст. введите описание изображения здесь

1 Ответ

0 голосов
/ 30 апреля 2018

Рассмотрим следующую подсказку:

PromptDialog.Choice(context, this.ChoiceReceivedAsync, new List<string>() { "Choice 1", "Choice 2" }, "stuff and things");

в методе возобновления после вы можете применять логику по выбору пользователя, например:

    private Task ChoiceReceivedAsync(IDialogContext context, IAwaitable<string> result)
    {
       Activity a = context.Activity as Activity;
        switch (a.Text)
        {
            case "Choice 1":
                //do stuff
                break;
            case "Choice 2":
                //do stuff
                break;
            default:
                context.Forward(new Luis(), afterLuis, context.Activity, CancellationToken.None);
                break;
        }

        a = a.CreateReply("things");
        context.PostAsync(a);
        return Task.CompletedTask;
    }

Таким образом, если пользователь вводит что-то кроме выбора, он будет отправлен на Luis(), в моем случае это public class Luis : LuisDialog<object> или диалог Luis для обработки вызовов Luis.

Вы могли бы также сделать это, вызывая API LUIS вместо использования диалога LUIS.

    private async Task ChoiceReceivedAsync(IDialogContext context, IAwaitable<string> result)
    {
       Activity a = context.Activity as Activity;
        switch (a.Text)
        {
            case "Choice 1":
                //do stuff
                break;
            case "Choice 2":
                //do stuff
                break;
            default:
                using (HttpClient client = new HttpClient())
                {
                    string RequestURI = "https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/YOUR_MODEL_ID?" +
                                        "subscription-key=YOUR_SUBSCRIPTION_KEY&amp;verbose=true&amp;timezoneOffset=0&amp;q=" +
                                        a.Text;

                    HttpResponseMessage msg = await client.GetAsync(RequestURI);
                    if (msg.IsSuccessStatusCode)
                    {
                        var JsonDataResponse = await msg.Content.ReadAsStringAsync();
                        LUISData luisData = JsonConvert.DeserializeObject<LUISData>(JsonDataResponse);
                    }
                }
                break;
        }
        a = a.CreateReply("things");
        await context.PostAsync(a);
    }

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

    public class LUISData
    {
        public string query { get; set; }
        public LUISIntent[] intents { get; set; }
        public LUISEntity[] entities { get; set; }
    }
    public class LUISEntity
    {
        public string Entity { get; set; }
        public string Type { get; set; }
        public string StartIndex { get; set; }
        public string EndIndex { get; set; }
        public float Score { get; set; }
    }
    public class LUISIntent
    {
        public string Intent { get; set; }
        public float Score { get; set; }
    }
...