Od czego powinieneś zacząć tworzenie chatbota? Cz.2
W pierwszej części artykułu o tym, od czego zacząć tworzenie chatbota, opisałem czym są chatboty, jak działają od środka oraz na jakie wyzwania napotkasz podejmując się stworzenia swojej pierwszej aplikacji tego typu. W drugiej części artykułu pokażę Tobie schematy rozmów, ale też co zrobić, aby bot zrozumiał, co pisze do niego użytkownik.
Michał Pawełczyk. CTO w KODA Bots Front-end i back-end developer. Pasjonat UX, interfejsów i testowania oprogramowania. Łączy kodowanie z kreatywnym spojrzeniem na potrzeby użytkownika. Autor platformy KODA Bots. Tworzył projekty dla McDonald’s, Coty, K-MAG, Wedel czy PayU.
Spis treści
Conversational UI, co muszę wiedzieć?
Chatboty, które znajdziesz w komunikatorach, składają się z elementów: list, wiadomości, przycisków itd., które połączone ze sobą tworzą drzewo decyzyjne. Potrzebujesz takiej struktury, która w działaniu nie zirytuje użytkownika oraz zareaguje odpowiednio na wpisywane wiadomości. Tym zagadnieniem zajmuje Conversational UI.
I tu KISS (Keep It Simple, Stupid) sprawdza się doskonale w tej dziedzinie. Określ główny cel Twojego chatbota i zrób wszystko, aby użytkownik nie wysilał się, by go osiągnąć.
Co zrobić, aby chatbot rozumiał co pisze użytkownik?
Doszliśmy do jednej z najważniejszych spraw. O NLP (Natural Language Processing) napisano niejedną książkę, które najczęściej opisują analizę języka angielskiego i nie omawiają problemu, z którym programiści znad Wisły muszą się zmierzyć. Odmiany!
Są dwa sposoby aby sobie z nimi poradzić, możemy albo w naszej konfiguracji wpisywać wszystkie odmiany, albo zamieniać wszystkie słowa w wypowiedzi użytkownika do bezokolicznika przy pomocy algorytmu. Ciekawy projekt zajmujący się tym problemem znajdziesz tutaj, jednak jest on napisany w C++, więc użycie może być utrudnione (nie skorzystasz w środowiskach tzw. servelles lub np. na heroku).
Możesz podejść na 3 sposoby do przetwarzania języka polskiego w swoim czatbocie:
1. Używając wyrażeń regularnych. Brzmi znajomo? Oczywiście! Być może powiesz, że to nic specjalnego, bo używałeś ich setki razy do walidacji adresu e-mail czy numeru telefonu. Zgodzę się, ale jeśli dobrze zdefiniujesz słowa kluczowe, taki algorytm spełni swoje zadanie.
Pamiętaj o normalizacji wprowadzonego tekstu (przekształcenie do małych liter, zamiana polskich znaków itd.) oraz kontekście rozmowy. Przykładowo słowo “wakacje” może być użyte w zdaniach “Kiedy są wakacje?”, “Dlaczego w te wakacje jest tak drogo?” lub “Czy pojadę w wakacje na urlop?”. Proponuję zdefiniować chmury słów kluczowych i na tej podstawie sprawdzić, jaki blok chcemy wyświetlić użytkownikowi. W tym przypadku będą to:
- kiedy, wakacje
- wakacje, drogo
- pojadę, wakacje, urlop.
Pojawia się z tym algorytmem jeden podstawowy problem. Ciężko wydobyć informacje z wprowadzonego tekstu. Dlatego jeśli potrzebujesz bardziej zaawansowanego rozwiązania, to niestety ślepy zaułek.
2. Korzystając z gotowych rozwiązań. Masz do dyspozycji kilka darmowych platform: Wit.ai (Facebook), Dialogflow (Google), IBM Watson (wersja lite darmowa) czy LUIS. Jednak tylko narzędzie od Facebooka wspiera obecnie język polski, dlatego skupmy się na nim. Zobacz, jak to działa w uproszczeniu:
Wygląda całkiem prosto, nie uważasz? Ale… w podanym przykładzie użytkownik podał wszystkie poprawne informacje. A co jeśli zapomni wskazać nazwy restauracji, albo poda nieprawidłową? Musisz być na to gotowy i w takim przypadku dopytać go o właściwe dane.
Pamiętaj jednak, że samo trenowanie modelu NLP jest bardzo pracochłonne. To żmudna praca, którą trzeba wykonać nie tylko na starcie, a także w ciągu rozwoju bota, kiedy musisz sukcesywnie sprawdzać jakich przypadków nie wziąłeś pod uwagę i dodawać je.
Pobaw się w detektywa, postaraj się przewidzieć, jak użytkownik może sformułować pytanie, jakich słów użyje itd.
3. Implementując swoje rozwiązanie oparte o Machine Learning. Czemu nie, to zawsze fajna sprawa zrozumieć jak coś działa od środka. Mało jest rozwiązań, które radzą sobie dobrze z naszym ojczystym językiem. Stwórz więc coś innowacyjnego.
Obojętnie jaki sposób wybierzesz, bardzo ważne są dane testowe. Dobrze mieć bazę konwersacji i na niej sprawdzić czy na pewno wszystko działa poprawnie. Niemniej każdy przypadek jest inny, stąd inaczej będą wyglądały rozmowy osób z biurem podróży, a inaczej z obsługą klienta dostawcy internetu. Zdobycie takich danych w języku polskim jest wręcz niemożliwe, ale musimy sobie z tym radzić. Nikt nie powiedział, że będzie łatwo.
A jak mój chatbot stanie się popularny, to co mam zrobić, by “nie zamulał”?
Nie ma uniwersalnej reguły. Wszystko zależy od konkretnego przypadku. Jest szereg czynników, które mogą powodować problemy wydajnościowe.
Pamiętaj, że poruszasz się w ekosystemie danego komunikatora więc jeśli zaistnieje w nim problem, obojętnie jak będziemy mieli wydajnie napisanego chatbota, użytkownik może czekać długo na odpowiedź lub w ogóle się nie doczeka, jeśli do aplikacji nie trafi konkretny request. W ostatnim czasie, nawet takie giganty jak Facebook, miały z tym problem.
Z doświadczenia wiem, że wąskim gardłem często bywa baza danych. Każde zapytanie użytkownika wymaga pobrania konfiguracji bota (zaplanuj użycie cache) oraz profilu usera.
Poza tym jeśli korzystasz z Heroku lub funkcji chmurowych (AWS Lambda, Google Cloud Function, Azure Functions itd.) odnotujesz dłuższy czas odpowiedzi po okresie nieaktywności (np. napiszesz do chatbota w nocy). Dochodzi wówczas do hibernacji aplikacji, gdy nie jest użytkowana (każdy redukuje koszty). Łatwo temu zaradzisz wysyłając zapytania do Twojego chatbota co parę minut (nikt nie wie dokładnie jaki to powinien być interwał; jest to tajemnica firmowa dostawcy), aby aplikacja nie weszła w stan uśpienia.
Chatbot idealnie nadaje się do architektury opartej na mikroserwisach (osobna aplikacja do NLP, statystyk itd.). Pamiętaj jednak, że jeśli korzystasz z zapytań http do komunikacji między nimi, narzuca to dodatkowy koszt i odpowiedź chatbota może trwać dłużej.
Jak przetestować, czy wszystko działa?
Aby sprawdzić, czy Twój chatbot działa poprawnie w środowisku docelowym np. w aplikacji Messenger, musi być dostępny publicznie. Spokojnie, nie musisz za każdym razem przy zmianie kodu wgrywać nowej wersji na serwer. Z pomocą przychodzą takie programy jak localtunel, które udostępniają światu Twój lokalny serwer przy pomocy szyfrowanego połączenia. Niemniej za każdym razem, gdy uruchomisz takie narzędzie, zostanie wygenerowany nowy link, który musisz zmienić w ustawieniach chatbota na danej platformie (np. ustawienia aplikacji w developers.facebook.com)
Osobiście jestem wielkim fanem pisania testów, zarówno jednostkowych czy E2E. Ważne, aby chatbot odpowiednio reagował na różne problemy jakie może napotkać. Zachęcam, aby Twoje testy “odpowiedziały” na ważne pytania, w końcu dobrze napisane są najlepszą dokumentacją. Co zrobi aplikacja gdy:
- otrzyma zapytanie z nieznanego źródła (nieznany bot, klucz się nie zgadza itd.)
- nie uda się jej: połączyć z bazą danych, wysłać wiadomości do użytkownika lub pobrać odpowiedzi z modułu NLP.
- zaistnieje dany scenariusz rozmowy. Tutaj zaczyna się największa zabawa. Zdefiniuj różne przypadki interakcji użytkownika z botem. Kod testu może wyglądać następująco:
describe('Bot should', () => { it('if user ask save answer and get correct next block', (done) => { const data: configTestInteraction = { botId: 'bot-123', userId: '1234', platform: 'web', blocks: { 'how_old_are_you': { ask: true, save_answer_as: 'old', type: 'message', fire: 'age', text: 'How old are you?' }, 'not_understand': { type: 'message', text: 'I don't understand you :/' }, 'age': { type: 'message', text: 'Wow, impressive :)' } }, testInteractions: [{ // wyświetl użytkownikowi blok type: 'postback', data: 'how_old_are_you' }, // użytkownik wpisuje swój wiek { type: 'message', data: '85' }] }; testInteraction(data).then((data: any) => { expect(data.block).toEqual({ type: 'message', text: 'Wow, impressive :)' }) data.handler.getAllUserData('1234', 'bot-123').then((profile: any) => { expect(profile.old).toEqual('85'); done(); }); }); }); });
Podsumowanie
Jeśli wiesz już jak działa chatbot i masz komplet informacji do tego, by ruszyć w podróż i napisać swojego pierwszego chatbota, zachęcam do testów. To może być ciekawa odskocznia od pisania setnego CRUD-a, szansa poznania nowych technologii oraz wielka frajda, bo przecież Twój chatbot nie musi być nudnym jak flaki z olejem robotem. Może mieć swoją osobowość, odpowiadać sarkazmem lub być arogantem, któremu nic się nie podoba. Your code, your decision 🙂
Przydatne materiały
Biblioteki:
https://github.com/howdyai/botkit (nodeJS)
https://github.com/botman/botman (PHP)
https://dev.botframework.com/ (Microsoft Bot Framework)
https://botpress.io/ (WordPress dla botów)
Platformy / Komunikatory:
https://developers.facebook.com/docs/messenger-platform (Messenger)
https://aws.amazon.com/documentation/lex/ (Amazon Alexa)
https://dev.skype.com/bots (Skype)
https://api.slack.com/bot-users (Slack)
NLP:
https://wit.ai
https://dialogflow.com/
https://www.luis.ai/
Zdjęcie główne artykułu pochodzi z dialogflow.com.