luktom.net
  • blog
  • kontakt
  • english





Anatomia chatbota – część 5: przejścia między dialogami

21 kw., 2017
Chatboty, Daj się poznać 2017
Brak komentarzy
Odsłony : 3191

W ostatnim wpisie poruszyłem tematy podstawowych operacji w ramach pojedynczego dialogu. Oczywiście umieszczenie całej logiki w ramach jednego dialogu jest mało przejrzyste i nie ułatwia ponownego wykorzystania kodu, stąd nawet przy małych projektach absolutnie konieczne (i bardzo praktyczne) staje się podzielenie konwersacji na poszczególne dialogi.

Przejścia między dialogami są obsługiwane przez następujące metody obiektu context:

  • Call – wywołuje nowy dialog i przekazuje mu kontrolę. Nowy dialog otrzyma następną wiadomość od użytkownika.
  • Forward – wywołuje nowy dialog i przekazuje mu kontrolę, jednocześnie przekazując mu bieżącą wiadomość od użytkownika.
  • Done – kończy dany dialog, zwracając wynik do dialogu nadrzędnego, z którego dany dialog został wywołany.
  • Fail – przekazuje do dialogu nadrzędnego informację o niepowodzeniu danego dialogu.

Zobaczmy jak to działa w praktyce. Poniżej dialog PromptTimeDialog (z mojej paczki nugetowej Tomaszkiewicz.BotFramework zawierającej różne fajne dodatki i rozszerzenia – szczegóły w przyszłych wpisach):

[Serializable]
public class PromptTimeDialog : IDialog<DateTime>
{
    private readonly string _prompt;
    private readonly string _retry;
    private readonly int _attemps;

    public PromptTimeDialog(string prompt, string retry = null, int attemps = 3)
    {
        _prompt = prompt;
        _attemps = attemps;
        _retry = retry;
    }

    public Task StartAsync(IDialogContext context)
    {
        PromptForTime(context);
        return Task.CompletedTask;
    }

    private void PromptForTime(IDialogContext context)
    {
        PromptDialog.Text(context, ValidateTime, _prompt, _retry, _attemps);
    }

    private async Task ValidateTime(IDialogContext context, IAwaitable<string> result)
    {
        var str = await result;
        DateTime time;
        if (DateTime.TryParse(str, out time))
        {
            context.Done(time);
            return;
        }
        PromptForTime(context);
    }
}

Powyższy dialog – jak sama jego nazwa wskazuje – służy do zapytania użytkownika o godzinę. Warto zwrócić uwagę na kilka rzeczy:

  • Dialog implementuje interfejs IDialog<DateTime> co powoduje, że operacja context.Done oczekuje przekazania na wyjściu z dialogu obiektu typu DateTime.
  • Zwrócenie podanej przez użytkownika godziny następuje w linii 32 poprzez wywołanie context.Done(time). Wynik ten zostanie przekazany do dialogu nadrzędnego – zaraz zobaczymy to na przykładzie.
  • W linii 23 mamy nowy element – wywołanie statycznej metody klasy PromptDialog – klasa ta dostarcza kilka gotowych narzędzi do pobierania informacji od użytkownika. O jej możliwościach będzie jeden z kolejnych wpisów.

Przejdźmy do przykładu wywołania tego dialogu:

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

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        await result;
        context.Call(new PromptTimeDialog("Na którą zamówić budzenie ?"), OnTimeProvided);
    }

    private async Task OnTimeProvided(IDialogContext context, IAwaitable<DateTime> result)
    {
        var time = await result;
        await context.PostAsync($"Ok, obudzę Cię o godzinie {time:HH:mm} :)");
    }
}

Linia 13 powoduje przekazanie kontroli do PromptTimeDialog, aby następnie przetworzyć wynik tego dialogu w metodzie OnTimeProvided. Dalej jest już standardowo – awaitujemy result i używamy go dalej w logice aplikacji – w powyższym przykładzie po prostu wysyłamy użytkownikowi potwierdzenie.

W następnych częściach…

… zajmiemy się klasą PromptDialog, aby następnie przejść do problemu serializacji dialogów w kontekście wstrzykiwania zależności.

A w dalszej przyszłości przejdziemy do sztucznej inteligencji w zastosowaniach związanych z chatbotami :)

Aby nie przegapić kolejnych wpisów zapraszam do śledzenia tego bloga, czy to przez kanał RSS, czy też poprzez stronę na Facebooku.



Tagi :   bot builderbot frameworkchatbotydsp2017

Powiązane wpisy

  • Poznaj chatboty – startuję w „Daj się poznać 2017”

  • SmogBot – ostatnia prosta :)

  • SmogBot – stack technologiczny

  • Anatomia chatbota – część 4: system dialogów Bot Buildera w praktyce

  • Dodaj komentarz

    Click here to cancel reply

    You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>





    Łukasz Tomaszkiewicz

    Łukasz Tomaszkiewicz

    Pasjonat chmury, szczególnie AWSa, który nieustannie automatyzuje powtarzające się czynności i optymalizuje procesy, przy okazji wdrażając dobre praktyki dotyczące bezpieczeństwa. Jego szerokie doświadczenie w zakresie tworzenia oprogramowania, projektowania baz danych, a także wirtualizacji serwerów i zarządzania infrastrukturą w chmurze pozwala mu spojrzeć przekrojowo na współczesny stack technologiczny.

    W wolnym czasie fotograf, sporadycznie piszący blogger :) a także regularny prelegent na krakowskich grupach związanych z IT.

    Wyznawca Vim'a :)

    Kategorie

    • Ansible
    • AWS
    • C#
    • Chatboty
    • Cloud
    • Daj się poznać 2017
    • Docker
    • Inne
    • Linux
    • Open source
    • Organizacyjne
    • Prelekcje
    • Sieci komputerowe
    • SQL Server
    • Windows
    • Windows Server
    • Wirtualizacja

    Najczęściej czytane

    • Creating single node VSAN cluster
    • SQL Server – walidacja numerów PESEL i NIP
    • Konfiguracja serwera DHCP na routerach Cisco
    • Aktywacja routingu IP w Windows 7 / Windows Server 2008
    • Konwersja maszyn wirtualnych z ESXi do Hyper-V przy użyciu SCVMM 2012
    • Jak podłączyć program R do SQL Servera?

    Tagi

    .net ai ansible asp.net mvc aws aws cli bot builder bot framework c# centos certyfikaty chatbot chatboty cisco cmd docker dsp2017 esxi hyperv kontenery konteneryzacja linux mvc nlp openvpn plssug pobieranie powershell prelekcje rancher redhat router sieci smogbot sql server ssd ssl vmware vsphere windows windows mobile windows server wirtualizacja wit.ai wrzuta

    Copyright © 2006-2018 by Łukasz Tomaszkiewicz. Wszelkie prawa zastrzeżone