qBlog Quadina w świecie PHP

21kwi/101

Inteligentny rozmówca – teoria

Coraz częściej pojawiają się w Internecie automaty do rozmów z klientami, które odpowiednio analizują zadawane pytanie i odpowiednio na nie odpowiadają. W dzisiejszym artykule zastanowimy się w jaki sposób taki bot jest skonstruowany. Nie jest tutaj używana jak większość myśli żadna sztuczna inteligencja, a jedynie suche algorytmy przetwarzające dane. Boty dalekie są też od inteligencji czy też uczenia się czegokolwiek, można je w bardzo prosty sposób oszukać w taki sposób, że nie będą wiedziały za bardzo co odpowiedzieć. Otrzymamy w odpowiedzi tylko jakiś bełkot napisany przez twórcę programu tak, aby bot wydawał się aroganckim chłopcem/dziewczyną.

Chatboty nie mają za dużo wspólnego z sztuczną inteligencją tak jak mi to wyperswadował mój przyjaciel Damian, zatem nie będę używał w moim artykule nic co sugerowało by inteligencję programu. Automat do odpowiadania bowiem, nie myśli, a nawet nie dobiera zmyślnie odpowiedzi, tylko porównuje zasoby swojej bazy danych.

Jak do tej pory żadna z mądrych maszyn odpowiadających i udających prawdziwe postacie nie przeszła testu Turinga. Test Turinga to nic innego jak zamknięcie w oddzielnych pokojach sędziego zadającego pytania w jednym pokoju, oraz w drugim bota i prawdziwego człowieka. Całość testu polega na zadaniu kilku pytań najczęściej w określonym czasie przez sędziego do dwóch postaci: bota i człowieka. Jeżeli sędzia po serii takich pytań nie wie, która z postaci jest botem, a która prawdziwym człowiekiem, to uznaje się, że program przeszedł test Turinga. Na świecie jest wiele konkursów w których w szranki stają najwięksi myśliciele naszych programistycznych czasów. Bezskutecznie jak do tej pory. Możemy się pocieszyć jedynie teorią boto-optymistów głoszącą, że jedynie nasz naturalny język stanowi dla nas barierę między mądrymi programami.

Jak więc skonstruować program udający rozmówcę?

Pomysłów na to ma co najmniej kilka każdy z programistów. My zajmiemy się najpopularniejszym z nich, czyli programem porównującym dwie tablice: specjalistyczną oraz macierzową. Tablice te nie są niczym innym jak zwykłymi bazami danych o dość podobnej konstrukcji. Tablica specjalistyczna składa się z wzoru pytania i wzoru odpowiedzi. Program musi porównać pytanie i odpowiedzieć o ile znajdzie odpowiedni wpis w bazie danych. Tablica macierzowa wchodzi w grę gdy nie znajdziemy odpowiedniego wpisu w tablicy specjalistycznej. Tablica macierzowa zawiera w sobie listę słów kluczy i odpowiedź. Wyszukiwanie odbywa się w taki sposób, że zapytanie do bota dzieli się na oddzielne słowa. Następnie zadaje się pytanie bazie danych wyszukując wpis mający odpowiednie słowa kluczowe zawarte w zapytaniu. Tak znaleziona odpowiedź jest względnie prawidłowa.

„Banalna” konstrukcja załatwia nam bardzo dużo możliwości, ale oczywiście to i tak kropla w morzu wszystkich kombinacji języka. Zwłaszcza języka polskiego, w którym to jedno zdanie może mieć niezliczoną ilość wersji. Kiedy do takiej ilości dodamy jeszcze błędy ortograficzne, literówki i inne błędy stylistyczne dojdziemy do wniosku, że napisanie skutecznego robota odpowiadającego jest niemal niemożliwe.

A jednak postaramy się podjąć tego tematu, dzieląc kolejne problemy na mniejsze i być może dojdziemy do jakiejś określonej skuteczności. Należy pamiętać, że prócz możliwości algorytmicznego tworzenia takiego programu, bot zawsze będzie uzależniony od wiedzy jaką będzie posiadać w pamięci swojej bazy danych.

Problemy, problemiki…

W języku polskim (jak w sumie każdym innym języku) zdarzają się wypowiedzi do siebie niemal identyczne. Spójrzmy na poniższy przykład:

  1. Jestem debilem
  2. Jesteś debilem

Różnica między pierwszym i drugim zdaniem to jedna literka. Raczej głupotą jest porywanie się na tworzenie bazy specjalistycznej czy też macierzowej rozpoznającej każde tego typu zapytanie. A więc podstawowym zadaniem nie będzie znalezienie odpowiedniej odpowiedzi, ale przygotowanie się na każdy rodzaj pytania. W naszym rozwiązaniu zastosujemy prosty sposób na tego typu problem. Wszystkie rekordy w obu tablicach będziemy oznaczać ciągiem typów wedle przykładu:

1 – Ja 4 – My
2 – Ty 5 – Wy
3 – On, Ona, Ono 6 – Oni, One

Tabelka znana nam już z czasów podstawówki. W związku z tym, że nasz przyszły sztuczny pracownik nie skończył żadnej szkoły, będziemy go musieli nauczyć tego co sami zapamiętaliśmy z pierwszych szkolnych zajęć. W moim rozwiązaniu zastosuje rozpoznawanie po najczęściej występujących formach w języku polskim to jest np. „jestem”, „musze”, „jaka/jaki”, „zrobiłem” itd.  Dzięki temu już w pierwszej fazie analizy zdania pytającego będziemy wiedzieć o kogo chodzi. Problemem podmiotu domyślnego zajmiemy się później, przy omawianiu budowania samych baz danych.

Kolejnym problemem jest ustalenie, czy nasz rozmówca to kobieta czy mężczyzna, tak aby odpowiedzi sformułowane przez nasz program nie mijały się z płcią rozmówcy.

Co w wypadku, kiedy rozmówca zada „niewygodne pytanie”, którego za nic w świecie na podstawie wszelkich algorytmów nie jesteśmy w stanie znaleźć w naszej bazie danych? A co ty robisz, jak ktoś Cię pyta o „niewygodny” temat? Najprościej jest zmienić temat rozmowy, zadać jakieś pytanie, tak aby odwrócić rolę, czy też powiedzieć po prostu, że się nie zna odpowiedzi.

Musimy w bazie danych zakodować oczywiście podstawowe informacje o tożsamości wirtualnego rozmówcy takie jak jego wiek, imię, rodziców, czy miejsce jego pobytu. Zajmiemy się też sprytnym sprawdzeniem pogody przez Internet w momencie, gdy ktoś zapyta jaka jest u nas za oknem pogoda.

Dla tych, którzy zastanawiają się nad użyteczniejszymi funkcjami programu można zaimplementować moduły odpowiedzialne za sprawdzanie informacji w wikipedii, obliczanie jakichś zadań matematycznych, sprawdzanie pogody czy też pociągów/autobusów. Wszystko co tylko przyjdzie Wam do głowy można zaimplementować upraszczając pewne rzeczy do takiego stopnia do jakiego upraszcza to nasz mózg.

Teoria teorią, piszemy?

Już  w najbliższych dniach będę powoli zamieszczać różne artykuły z kodami zaimplementowanych przeze mnie rozwiązań podstawowych zadań. Postaram się wykonać je tak, aby w czytelny sposób każdy mógł zorientować się w strukturze skryptu i jego celu. Natomiast od razu zapowiadam, że całego kodu źródłowego nie podam jak na tacy nikomu. Wydaje mi się, że nauka nie polega na oglądaniu gotowych rozwiązań, prawda?

Zakres tematyczny: Programowanie, Projekty Dodaj komentarz
Komentarze (1) Trackbacks (0)
  1. Ciekawy artykuł. Bardzo mnie zainteresował. W sumie to ciekawe, jak to możliwe, że można rozmawiać ze sztucznym rozmówcą. Teraz znam odpowiedź. :) Czekam na dalsze artykuły :) Przybliżasz teorię w tak dobry sposób, że nawet taki laik jak ja jest w stanie to zrozumieć. Pozdrawiam.


Leave a comment

Brak trackbacków.