W ostatnim odcinku zbudowaliśmy model w Wit.ai obsługujący rozgałęzienia oraz „dopytywanie” użytkownika o brakujące informacje. Po dłuższej przerwie spowodowanej urlopem, dzisiaj zajmiemy się integracją kodu z Wit.ai, przy czym samego kodu w tym odcinku nie będzie :P – poruszę natomiast kwestie jak taką integrację wykonać dobrze i podzielę się kilkoma odkryciami i dobrymi praktykami w tym zakresie.
Komunikacja z Wit.ai
Z Wit.ai komunikujemy się po prostu za pomocą HTTPS. Tutaj warto zwrócić uwagę na kilka rzeczy:
- Zapytania są typu POST.
- W parametrach zapytania HTTP przesyłamy session id oraz tekst wprowadzony przez użytkownika.
- W body zapytania HTTP przesyłamy zserializowany kontekst (jako application/json).
- Zapytania należy uwierzytelnić przy użyciu bearer authentication, token pozyskujemy ręcznie ze strony ustawień aplikacji Wit.ai.
Pętla zapytań
W wyniku pojedynczego zapytania Wit.ai może wykonać kilka akcji (np. „wywołać” kilka funkcji lub odpowiedzieć tekstem do użytkownika w kilku osobnych wiadomościach). Konieczne jest zatem zaimplementowanie pętli zapytań, która będzie:
- Odpytywać Wit.ai zapytaniem HTTP
- Przetwarzać wynik otrzymany z Wit.ai
- W zależności od rezultatu zapytania wypisać coś do użytkownika (akcje typu msg) lub wywołać funkcję w kodzie użytkownika (akcje typu action).
- Jeśli w rezultacie otrzyma akcję typu stop to należy zaprzestać dalszego przetwarzania.
Brzmi całkiem prosto, jednak dochodzi tutaj kilka problemów:
- Należy obsługiwać resety konwersacji – Wit.ai bazuje na modelu z kontekstem i session_id – powinniśmy je resetować tuż po wykryciu końca konwersacji (logicznego, a nie tego w wyniku akcji typu stop) lub po wykryciu zmiany tematu (intent) konwersacji – w praktyce polecam w ramach projektowania historii w Wit.ai zawsze ręcznie wywoływać funkcję odpowiedzialną za reset konwersacji.
- W przypadku zmiany tematu konwersacji pożądanym jest (a przynajmniej tak wynika z moich obserwacji), aby dokonać powyższego resetu konwersacji i odpytać usługę ponownie – czyli nie kontynuujemy przetwarzania rezultatu zapytania, zamiast tego porzucamy je, resetujemy stan i zaczynamy od nowa – taki mechanizm zauważalnie poprawia dokładność przetwarzania Wit.ai.
- Czasami Wit.ai nie zwraca intent w rezultacie zapytania – tutaj nie udało mi się określić dokładnej reguły kiedy to następuje, jednakże to się zdarza i jeśli chcemy na tym bazować to należy to obsłużyć. W modelu, który zaprezentuję w przyszłych wpisach polegam na posiadaniu zawsze ustawionego intent do określania jaka klasa ma obsłużyć daną akcję, a więc w moim przypadku okazało się to bardzo istotne, aby mieć zawsze ustawiony intent.
- Ponieważ aplikacja Wit.ai jest tworzona w pewien sposób niezależnie od kodu, który z nią współpracuje należy szczególnie zwrócić uwagę na obsługę fallbacków – np. gdy kod z nową funkcją nie trafił jeszcze na produkcję, a aplikacja w Wit.ai odwołuje się do tej nowej funkcji – nie powinno to zepsuć przetwarzania, a tym bardziej stanu konwersacji.
Te i inne problemy rozwiązałem w bibliotece o której opowiem więcej następnym razem. Dzisiaj jeszcze poruszę jeden temat, mianowicie:
Kontekst i persystencja
Projektując integrację z Wit.ai musimy zwrócić uwagę na jeszcze jeden aspekt: nietrwałość kontekstu. Z moich obserwacji wynika, że aplikacje Wit.ai działają najlepiej jeśli kontekst jest ściśle powiązany z danym intent oraz konkretną historią, a co za tym idzie – jest on bytem z natury krótkotrwałym.
Tworząc chatbota chcemy jednak niektóre informacje przechowywać na dłużej, celem ich wykorzystania w przyszłości. Powstaje więc potrzeba wdrożenia jakiegoś mechanizmu, który pozwoli zapamiętywać informacje z kontekstu oraz przywracać je do kontekstu jeśli tylko zajdzie taka potrzeba.
Na tę chwilę tylko notyfikuję problem, przykład jego rozwiązania podam w kolejnych wpisach.
W następnych częściach…
… zaczniemy rozwiązywać wspomniane wyżej problemy oraz zapoznawać się z moją biblioteką, którą na te potrzeby stworzyłem.
Aby nie przegapić kolejnych wpisów zapraszam do śledzenia tego bloga, czy to przez kanał RSS, czy też poprzez stronę na Facebooku.
Dodaj komentarz