Microsoft Bot Work, LUIS og waterfalling

stemmer
1

Jeg prøver å bygge en bot. Ved første var jeg bruker node.js men det fordi åpenbart at c # var bedre for min klient, så jeg har begynt å skape Bot i C #. Jeg har også opprettet en LUIS søknad.

Nå er tanken bak dette Bot er at det vil spørre deg en rekke spørsmål før du kombinere dine resultater på slutten og plukke ut en løsning basert på dine svar. Problemet jeg har er at jeg har ingen anelse om hvordan jeg kan sette bot opp til å gjøre det. I node, det snakket om waterfalling, men jeg kan ikke se noe sånt i C # versjon. Også er jeg ikke sikker på om det skal være i LUIS hvor jeg skal fokusere min oppmerksomhet.

Som et eksempel, la oss si at jeg vil at brukeren skal velge et objekt, da basert på at objektet be 3 spørsmål som:

  1. Er det lite?
  2. Er det lett?
  3. Hvilken farge foretrekker du?

Og på slutten sier Du vil ha en svart, liten, lett kamera. Jeg kan ikke synes å få det til å fungere. Jeg vet at noen av dere vil si bruke FormFlow men spørsmålene er dynamiske og så er objektet, og det er derfor jeg brukte LUIS.

Vet noen hvor jeg kan finne en god artikkel om hvordan du bruker LUIS å skape en flyt som ligner på det?

Publisert på 14/11/2016 klokken 16:19
kilden bruker
På andre språk...                            


2 svar

stemmer
1

Hvis FormFlow er for restriktiv, bør du vurdere å bruke Dialoger. De tillater for en mye mer åpen samtale.

Jeg ville gjøre følgende:

1) Be brukeren om å velge en kategori.

Hvis mulig, gi brukeren en liste over kategorier å velge mellom, ved hjelp av knappene. Dette betyr at du ikke trenger å be LUIS for kategorien valgt av brukeren.

Ellers tillater brukeren å skrive inn en kategori, og gi det til LUIS. Responsen fra LUIS vil inneholde en enhet. The Entity vil holde navnet på kategorien.

2) Videre å Dialog for at kategori

Avhengig av Entity returnert fra LUIS, frem til den aktuelle Dialog som vil være ansvarlig for å stille neste spørsmål

[LuisIntent("AskQuestionAboutCategory")]
    public async Task AskQuestion(IDialogContext context, LuisResult result)
    {
       //get Entity from LUIS response
        string category = result.Entities.FirstOrDefault(e => e.Type == "Category")?.Entity;

        switch (category)
        {
            case "Category 1":

                //forward to Dialog for Category1

                await
                    context.Forward(new Category1Dialog(), ResumeAfter,
                        new Activity {Text = result.Query}, CancellationToken.None);
                break;

            case "Category 2":

                //forward to Dialog for Category2

                await
                    context.Forward(new Category2Dialog(), ResumeAfter,
                        new Activity {Text = result.Query}, CancellationToken.None);
                break;

        }
    }

    private async Task ResumeAfter(IDialogContext context, IAwaitable<object> result)
    {
        context.Wait(MessageReceived);
    }

3) Still spørsmål inne Dialog

Inne i Dialog, bruk en PromptDialog å spørre Spørsmål 1. Bruk en bryter på svar på spørsmål 1, for å finne ut hva du spør etter Spørsmål 2. Fortsett samtalen som dette.

[Serializable]
public class Category1Dialog : IDialog<object>
{
    public async Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);
    }

    public virtual async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
    {

        var prompt = "what is the answer to question 1 ?";

        //ASK QUESTION 1
        PromptDialog.Text(context, ResumeAfterQuestion1, prompt);
    }

    private async Task ResumeAfterQuestion1(IDialogContext context, IAwaitable<string> result)
    {
        var input = await result;

        switch (input)
        {
            //ASK QUESTION 2, DEPENDING ON WHAT WAS ANSWERED FOR QUESTION 1
            case "Answer A":
                PromptDialog.Text(context, ResumeAfterQuestion2, "what is the answer to question 2 ?");
                break;
            case "Answer B":
                PromptDialog.Text(context, ResumeAfterQuestion2, "what is the answer to question 2 ?");
                break;
        }
    }


    private async Task ResumeAfterQuestion2(IDialogContext context, IAwaitable<string> result)
    {
        var input = await result;

        switch (input)
        {
            //ASK QUESTION 3
            case "Answer C":
                PromptDialog.Text(context, ResumeAfterQuestion3, "what is the answer to next question after Answer C ?");
        break;
            case "Answer D":
                PromptDialog.Text(context, ResumeAfterQuestion3, "what is the answer to next question after Answer D ?");
        break;
    }
    }

Det ser ut som du må bruke bryteren uttalelser for å finne ut hva spørsmål å stille neste.

Klikk her for mer info om Dialoger

Svarte 15/11/2016 kl. 06:13
kilden bruker

stemmer
1

Her er et annet alternativ, hvis du ønsker å håndtere dette manuelt, kan du angi forskjellige context.Wait metoder for hver av dine spørsmål, ha slags Foss tilnærming.

Så la oss si du har en LuisDialog med ChooseCategory hensikt. I denne metoden vil du finne kategorien og base på noen tilpassede logikken du vil stille et nytt spørsmål.

Det kan gjøres med: en PromptDialog / ResumeAfter eller en manuell context.PostAsync / context.Wait (som i utgangspunktet definerer metode som vil lytte etter neste melding).

Jeg vet ikke hvordan er din tilpassede logikken, men du bør være i stand til å dynamisk bestemme hvilken som er den neste metoden som vil lytte til den kommende meldingen.

[LuisIntent("Choose category")]
public async Task ChooseCategory(IDialogContext context, LuisResult result)
{
    // get category logic..

    await context.PostAsync("This is my first question?");
    context.Wait(CaptureFirstQuestionAnswerAsync);
}

public async Task CaptureFirstQuestionAnswerAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
    IMessageActivity message = await argument;
    switch (message.Text.ToLower())
    {
        case "answer 1":
            // do something
            break;
        case "answer 2":
           // do something different
            break;
        default:
           // do something ...
            break;
    }

    await context.PostAsync($"This is my second question?");

    context.Wait(CaptureSecondQuestionAnswerAsync);
}

public async Task CaptureSecondQuestionAnswerAsync(IDialogContext context, IAwaitable<IMessageActivity> argument)
{
  //...
}
Svarte 14/11/2016 kl. 20:38
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more