W ostatnim odcinku zbudowaliśmy prostą aplikację w Wit.ai do obsługi inteligentnego domu. Na tę chwilę potrafi ona rozpoznać np. polecenie otwarcia lub zamknięcia garażu. Dzisiaj rozbudujemy aplikację o obsługę encji oraz pokażę, jak tworzyć rozgałęzienia w ramach aplikacji Wit.ai.
Polecenie z encjami
Pierwszym krokiem będzie utworzenie nowej historii – w ramach przykładu będzie to polecenie ustawienia temperatury w danym pokoju:
Wpisujemy przykładowe polecenie, a następnie zaznaczamy nazwę pokoju i klikamy na link Create an entity for… aby utworzyć nową encję na danym słowie. Operację powtarzamy także dla przykładowej temperatury. Dodajemy przykładową odpowiedź bota, zapisujemy i testujemy czy bot poprawnie rozumie polecenie (naciskając tyldę).
Zanim przejdziemy dalej, do dodania wywołania funkcji i omówienia rozgałęzień chciałbym poruszyć jeden problem:
Odmiana rzeczowników
Polski jest niestety językiem w którym rzeczowniki się odmienia. Powoduje to niemałe problemy z ich użyciem w ramach przetwarzania języka naturalnego. W podanym przykładzie naturalnym jest napisanie „ustaw temperaturę w łazience” – to, co Wit.ai rozpozna jako encję to dokładne słowo „łazience” – a z punktu widzenia programu oczekiwalibyśmy raczej słowa w mianowniku – „łazienka”. Niestety nie udało mi się znaleźć żadnej sensownej biblioteki do przekształcania polskich rzeczowników do mianownika, jednak w języku polskim zazwyczaj w rzeczownikach odmieniają się końcówki, więc dość skuteczną metodą wydaje się być szukanie najdłuższego wspólnego prefixu słowa podanego przez użytkownika oraz słowa w mianowniku – nie jest to może najwydajniejsze, ale z moich obserwacji wynika, że jest to dość skuteczne – algorytm ten sprawdza się np. w SmogBocie do wyszukiwania miast.
Rozgałęzienia
Rozgałęzienia w aplikacjach Wit.ai pozwalają na realizowanie osobnej logiki w zależności od wyniku wywołania funkcji, a konkretniej – od tego jakie klucze są ustawione w ramach kontekstu.
Dodanie wywołania funkcji w aplikacji Wit.ai wiąże się z kilkoma efektami:
- Funkcja taka otrzymuje wynik przetwarzania przez Wit.ai, czyli rezultat pasowania intent oraz encji.
- Program, który obsługuje zapytania do Wit.ai utrzymuje także kontekst rozmowy (oraz session id, ale to w tym momencie nieistotne) do którego wywoływana funkcja ma dostęp.
- Funkcja w ramach swojego wywołania może modyfikować kontekst poprzez ustawienie lub usunięcie poszczególnych kluczy.
- Zaktualizowany kontekst jest przesyłany wraz z następnym zapytaniem do Wit.ai.
- Dzięki temu Wit.ai może podjąć decyzję co do dalszego przebiegu programu.
W przypadku naszej prostej aplikacji funkcja setTemperature otrzymuje w wyniku poprawnego przetworzenia encje: room oraz temperature. Aby program Wit.ai mógł kroczyć dalej optymistyczną ścieżką funkcja powinna zaktualizować kontekst o klucze room oraz temperature. Należy jednak rozpatrzeć także wariant pesymistyczny, czyli taki, w którym brakuje niektórych informacji. W tej sytuacji omawiana funkcja powinna ustawić w kontekście klucz roomMissing lub temperatureMissing.
Istotną funkcjonalnością o której należy także wspomnieć w kontekście rozgałęzień są zakładki oraz operacja jump, która pozwala przeskakiwać do innych części aplikacji Wit.ai – aby np. zrealizować proste pętle pytające o brakujące informacje – jej przykład pokaże poniżej.
Reasumując, przykładowa implementacja aplikacji Wit.ai prezentuje się następująco – poniżej wariant optymistyczny:
Gałąź pytająca o brakujący pokój – zwróćcie uwagę na skok po odpowiedzi użytkownika z powrotem do zakładki setTemperature:
Oraz gałąź pytająco o brakującą temperaturę:
Oczywiście możemy testować (acz tylko do pewnego stopnia) cały mechanizm wybierając ręcznie, które klucze kontekstu funkcja „ustawiła”:
Nasza aplikacja umie coraz więcej – zrealizowaliśmy zarówno proste rozumienie jak i parsowanie encji wraz z dopytywaniem o brakujące informacje – na bazie powyższego możemy powoli myśleć o budowie aplikacji klienckiej :)
W następnych częściach…
… przejdziemy do kodu i integracji aplikacji z Wit.ai :)
Pokażę mojego klienta do Wit.ai, który ładnie opakowuje kwestie połączenia, zapytań a także obsługi session id i kontekstu.
Aby nie przegapić kolejnych wpisów zapraszam do śledzenia tego bloga, czy to przez kanał RSS, czy też poprzez stronę na Facebooku.
Dodaj komentarz