luktom.net
  • blog
  • kontakt
  • english





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

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

W ostatnim odcinku pokrótce wprowadziłem Was do systemu Bot Buildera w ramach Bot Frameworka, dzisiaj pokażę jak w praktyce wygląda implementacja konwersacji opartych o system dialogów Bot Buildera. Zapraszam!

Pierwszą rzeczą, jaką musimy zmienić w projekcie, aby korzystać z dialogów jest wywołanie w kontrolerze „punktu wejścia” do systemu dialogów, robi się to tak:

public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.Type == ActivityTypes.Message)
        await Conversation.SendAsync(activity, () => new SampleDialog());
    else
        HandleSystemMessage(activity);
    
    return Request.CreateResponse(HttpStatusCode.OK);
}

Czwarta linijka powoduje przesłanie otrzymanego activity do systemu dialogów. Jednocześnie, jako drugi argument podajemy funkcję tworzącą domyślny dialog, jeśli takowy nie istnieje dla obecnej konwersacji.

Przy tej okazji polecam także implementację wiadomości powitalnej oraz inicjalizację systemu dialogów tuż po otrzymaniu informacji o dołączeniu do rozmowy – dzięki temu unikniemy nieco kłopotliwego przetwarzania pierwszej wiadomości w ramach nowozainicjalizowanego dialogu głównego:

private async Task<Activity> HandleSystemMessage(Activity activity, ConnectorClient connector)
{
    switch (activity.Type)
    {
        // usunięta reszta przykładowego kodu, żeby nie zajmowała miejsca
        
        case ActivityTypes.ConversationUpdate:
            if (activity.MembersAdded.Any() && activity.MembersAdded[0].Name != "Bot")
            {
               await connector.Conversations.ReplyToActivityAsync(activity.CreateReply($"Cześć, {activity.MembersAdded[0].Name}!"));         
               await Conversation.SendAsync(activity, () => new SampleDialog());
            }
            break;
    }

    return null;
}

Każdy dialog musi implementować interfejs IDialog<T> zawierający jedną metodę: Task StartAsync(IDialogContext context) – to do tej metody przekazywana jest kontrola w programie, gdy tylko bot otrzyma nową wiadomość. Minimalny dialog wygląda więc tak:

[Serializable]
public class SampleDialog : IDialog<object>
{
    public Task StartAsync(IDialogContext context)
    {
        throw new NotImplementedException();
    }
}

Atrybut Serializable jest kluczowy do działania, gdyż Bot Builder po przetworzeniu otrzymanej wiadomości serializuje cały dialog stack, aby przy następnej otrzymanej wiadomości go zdeserializować, przywrócić sterowanie w ostatnim miejscu na którym zakończył przetwarzanie oraz przekazać w to miejsce nową wiadomość.

Serializacja dialogów

Oznacza to nie mniej i nie więcej, że możemy spokojnie używać pól oraz properties klasy między kolejnymi wiadomościami – zostaną one automatycznie zachowane. Prześledźmy przykładową implementację, która pyta użytkownika o imię i miasto:

[Serializable]
public class SampleDialog : IDialog<object>
{
    private string _name;
    private string _city;

    public Task StartAsync(IDialogContext context)
    {
        context.Wait(MessageReceivedAsync);

        return Task.CompletedTask;
    }

    private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        await result;

        await context.PostAsync("Jak masz na imię?");

        context.Wait(OnNameProvided);
    }
    
    private async Task OnNameProvided(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        _name = (await result).Text;

        await context.PostAsync("W jakim mieście mieszkasz?");

        context.Wait(OnCityProvided);
    }

    private async Task OnCityProvided(IDialogContext context, IAwaitable<IMessageActivity> result)
    {
        _city = (await result).Text;

        await context.PostAsync($"Witaj {_name} z miasta {_city}!");
    }
}

Powyższa implementacja w rezultacie pozwala na przeprowadzenie następującej rozmowy:

To co jest fajne w tym rozwiązaniu to brak konieczności używania zewnętrznego magazynu na proste dane zbierane w ramach pojedynczego dialogu. Niestety, konieczność serializacji wszystkich dialogów to także problemy, o których pisałem ostatnio.

W następnych częściach…

… pokażę jak wykonywać przejścia między dialogami, dzięki którym możliwe jest m.in. wydzielenie wspólnych komponentów i ich reużywanie w wielu projektach, a także jak rozwiązać kwestię serializacji dialogów w kontekście wstrzykiwania zależności.

A później 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

  • Anatomia chatbota – część 7: IoC i serializacja

  • „Daj się poznać 2017” – podsumowanie

  • SmogBot – zapraszam do korzystania :)

  • Anatomia chatbota – część 2: podstawowe operacje

  • 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