luktom.net
  • blog
  • kontakt
  • english





Anatomia chatbota – część 6: PromptDialog

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

W ostatnim odcinku poruszyłem temat przejść między dialogami, niejako przy okazji wynikła nowa rzecz w postaci „gotowca” do pobierania danych oferowanego przez Bot Buildera. W tym wpisie przyjrzymy się dokładniej co oferuje nam klasa PromptDialog :)

Mówiąc krótko – oferuje nam wygodę i pozwala na oszczędzenie pisania nudnego kodu do pobierania danych.

Przypomnijmy sobie kod, którego używaliśmy w części 4 do zbierania danych od użytkownika:

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);
}

Powyższy kod możemy nieco uprościć, wykorzystując gotową klasę PromptDialog w następujący sposób:

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    await result;
    PromptDialog.Text(context, OnNameProvided, "Jak masz na imię?");
}

private async Task OnNameProvided(IDialogContext context, IAwaitable<string> result)
{
    _name = await result;
    PromptDialog.Text(context, OnCityProvided, "W jakim mieście mieszkasz?");
}

private async Task OnCityProvided(IDialogContext context, IAwaitable<string> result)
{
    _city = await result;
    await context.PostAsync($"Witaj {_name} z miasta {_city}!");
}

W analogiczny sposób możemy pytać użytkownika o liczby (double i long) – wystarczy użyć PromptDialog.Number. W tym przypadku PromptDialog zweryfikuje czy podany tekst jest prawidłową liczbą (możemy określić ilość prób w parametrze attemps) a jeśli takowe pobranie się nie powiedzie to otrzymamy wyjątek.

Przy prostym pobieraniu tekstu lub liczb korzyści ze stosowania PromptDialog są, ale stosunkowo niewielkie.

PromptDialog znacznie praktyczniejszy jest w przypadku bardziej złożonych operacji, zwłaszcza takich, które wykorzystują rozszerzenia poszczególnych kanałów typu przyciski konwersacji.

PromptDialog i przyciski w kanale konwersacji

PromptDialog oferuje dwie metody, które wykorzystują możliwości niektórych kanałów (np. Skype, Facebook Messenger) do wyświetlania przycisków konwersacji, które użytkownik może kliknąć zamiast wpisywania treści odpowiedzi. Pierwsza z nich – metoda Confirm – służy do zapytania o potwierdzenie, używamy jej tak:

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    await result;
    PromptDialog.Confirm(context, OnConfirmed, "Czy chcesz złożyć zamówienie?");
}

private async Task OnConfirmed(IDialogContext context, IAwaitable<bool> result)
{
    var confirmed = await result;
    await context.PostAsync(confirmed ? "Zamówienie zostało złożone." : "Zamówienie anulowane.");
}

Efekt jest następujący:

Na pierwszy plan pojawia się pewna wada tego rozwiązania – jeśli tworzymy na rynek polski, to będziemy zawiedzeni, że teksty są po angielsku (i wcale nie jest oczywiste jak to zlokalizować na język polski). Poza tym, nawet jeśli się uda to i tak tracimy jeden fajny ficzer, mianowicie:

Tak – PromptDialog jest inteligenty i jest w stanie zrozumieć odpowiedzi inne niż hardcodowane na przyciskach – możemy więc na pytanie o potwierdzenie odpowiedzieć „yes”, jak również „sure”, „ok”, „nope” i inne – a PromptDialog będzie je w stanie dopasować :) (oczywiście nie po polsku :P)

Drugi mechanizm wykorzystujący przyciski to metoda Choice, której implementacja wygląda tak:

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result)
{
    await result;
    PromptDialog.Choice(context, OnChosen, new[] { "Telefon", "Poczta elektroniczna", "Skype", "Facebook Messenger" }, "Preferowana forma kontaktu");
}

private async Task OnChosen(IDialogContext context, IAwaitable<string> result)
{
    var contactForm = await result;
    await context.PostAsync($"Wybrałeś formę kontaktu: {contactForm}.");
}

A efekt prezentuje się następująco:

Tutaj również do pewnego stopnia działa „inteligencja” i jeśli wpiszemy np. tylko „facebook” to PromptDialog będzie w stanie dopasować odpowiedź.

W następnych częściach…

… poruszymy problem serializacji dialogów w kontekście wstrzykiwania zależności.

Następnie 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

  • SmogBot – ostatnia prosta :)

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

  • SmogBot – zamknięcie projektu

  • Chatboty i sztuczna inteligencja – część 3: budujemy aplikację

  • 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