Запрашивать у пользователя пропущенные объекты, пока они находятся в намерении, и ждать, пока они ответят - PullRequest
0 голосов
/ 18 октября 2018

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

У меня есть очень простое намерение Луиса:

[LuisIntent("xxx")]
public async Task xxx(IDialogContext context, LuisResult result)
{
    var entities = new List<EntityRecommendation>(result.Entities);
    //do stuff eg. Prompt.Text(contenxt, "Enter your name");
    //await prompt
    //store new response into the variable
}

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

Чего мне не хватает в этом?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Я думаю, что самый простой способ для вас - использовать форму для сбора данных от пользователя заранее.Это будет иметь следующие преимущества: 1) Вы получите все обязательные данные заранее, что дает вам сильный контроль над беседой. 2) Количество ваших звонков в приложение LUIS будет меньше по сравнению с тем, что вы в конечном итоге будете делать, если вы запросите.Пользователь может добавлять сущность каждый раз, когда ему это не хватает.Пожалуйста, поверьте мне, сохранение количества LUIS в конечном итоге сэкономит вам немного денег.Так что используйте поток форм для сбора данных от пользователя, прежде чем руки.Я добавил следующие ссылки, чтобы помочь вам ознакомиться с концепцией потока форм

https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-formflow-advanced?view=azure-bot-service-3.0
https://docs.microsoft.com/en-us/azure/bot-service/dotnet/bot-builder-dotnet-formflow?view=azure-bot-service-3.0 https://www.c -sharpcorner.com / article / formflow-in-bot-основа /

0 голосов
/ 21 октября 2018

Вам нужно вызвать новый диалог, чтобы запросить остальные объекты.Я бы использовал диалог FormFlow, основанный на всех сущностях, которые вы пытаетесь захватить.По сути, вы хотите предположить, что ни одна из ваших сущностей не прошла через намерение Луиса, таким образом вы можете запросить у пользователя все.Таким образом, с помощью FormFlow вы можете указать начальное состояние FromFlow.Для этого создайте экземпляр и заполните свойства теми полученными вами объектами.FormFlow пропустит шаги для любого из полей, которые уже заполнены.При желании, когда вы запускаете FormDialog, вы можете передать FormOptions.PromptFieldsWithValues.Это сообщит диалоговому окну, что все равно будет запрашивать у пользователя ВСЕ значения, но будет использовать введенное значение в качестве значения по умолчанию.Вы бы сделали это, если бы хотели дать пользователю возможность что-то изменить.

Вот базовый пример, который я взял из github.

Это класс, который определяет ваше состояние.Вы бы построили это на основе сущностей, которые вы хотите получить

public class SampleQuestion
{
    public string FavoriteColor;
    public string FavoritePizza;
}

Это универсальный метод диалога, но он будет выглядеть так, как бы выглядел ваш метод намерения

    async Task StartAsync(IDialogContext context)
    {
        var question = new SampleQuestion();

        // Pre-populate a field. This is where you fill in with the entities you got from LUIS
        question.FavoriteColor = "blue";

       //Now call FormBuilder to ask the user for the remaining entities
        context.Call<SampleQuestion>(new FormDialog<SampleQuestion>(question), OnSampleQuestionAnswered);
    }

    //this is the return from you FormBuilder. This is where you get back into you LUIS dialog and continue processing with, hopefully, all the entities you need now
    public async Task OnSampleQuestionAnswered(IDialogContext context, IAwaitable<SampleQuestion> sampleQuestion)
    {
        var result = await sampleQuestion;
    }

Надеждаэто помогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...