Budowanie bazy wiedzy

Każdy wirtualny rozmówca, aby móc prowadzić konwersację, musi posiadać wiedzę. Wiedza programu konwersacyjnego gromadzona jest w bazie wiedzy. Jest to rozbudowany zbiór powiązanych ze sobą danych dotyczących określonej dziedziny. Od zawartości bazy wiedzy zależy ocena wirtualnego rozmówcy. Im baza jest większa i lepiej dopracowana tym chatterbot uważany jest za bardziej inteligentny i bardziej przypominający człowieka, a rozmowa z nim jest ciekawsza.

Najczęściej baza wiedzy jest zbiorem wzorców i odpowiedzi chatterbota na dany wzorzec. Program konwersacyjny działa wtedy w następujący sposób:

  1. wczytanie wypowiedzi użytkownika,
  2. dopasowanie w bazie wiedzy wzorca, który najbardziej odpowiada wczytanej wypowiedzi,
  3. wyświetlenie odpowiedzi określonej dla dopasowanego wzorca.

Do tworzenia bazy wiedzy doskonale sprawdza się język AIML. Drugim ważnym elementem każdego wirtualnego rozmówcy jest jego interfejs graficzny. Składa się on z awatara, pola do wyświetlania odpowiedzi systemu, pola do wprowadzania tekstu przez użytkownika oraz przycisku służącego do przekazywania wypowiedzi do systemu. Przykład interfejsu graficznego wirtualnego rozmówcy przedstawia rys. 1.

Interfejs graficzny wirtualnego rozmówcy Ewy

BUDOWA BAZY WIEDZY CHATTERBOTA

Poniżej znajduje się prosta baza wiedzy wirtualnego rozmówcy dotycząca inżynierii wiedzy. Ze względu na to, że większości interpreterów nie obsługuje polskich znaków diakrytycznych, zostały one pominięte podczas tworzenia bazy. Bazę stworzono w oprogramowaniu GaitoBot. W poniższej prezentacji bazy pominięto znacznik <aiml>.

Baza wiedzy chatterbota składa się ze zbioru kategorii. Każda kategoria posiada dokładnie jeden wzorzec i jedną odpowiedź. Co zatem zrobić, jeśli chcemy by nasz wirtualny rozmówca na dany wzorzec odpowiedział za każdym razem inaczej? Pomocny w tym wypadku jest znacznik <random>. Zapewnia on losowe wybieranie odpowiedzi chatterbota. Zbiór możliwych odpowiedzi tworzymy za pomocą znacznika <li>.

<category>

<pattern>WITAJ</pattern>

<template>

<random>

<li>Czesc, o czym chcesz ze mna porozmawiac?</li>

<li>Witaj, o czym chcesz ze mna porozmawiac?</li>

<li>Hej, o czym chcesz ze mna porozmawiac?</li>

</random></template>

</category>

Powyższy zapis oznacza, że na wypowiedź użytkownika „Witaj” nasz program konwersacyjny wybierze losowo jedną z następujących odpowiedzi:

  • „Czesc, o czym chcesz ze mna porozmawiac?”,
  •  „Witaj, o czym chcesz ze mna porozmawiac?”,
  • „Hej, o czym chcesz ze mna porozmawiac?”.

Jak już wspomnieliśmy wcześniej każda kategoria może posiadać tylko i wyłącznie jeden wzorzec. Rozwiązaniem tego problemu jest zastosowanie mechanizmu synonimów. Użycie znacznika <srai> umożliwia odwołanie się do wcześniej zdefiniowanego wzorca odpowiedzi, co znacznie skraca bazę wiedzy.

<category>

<pattern>WITAM</pattern>

<template><srai>Witaj</srai></template>

</category>

<category>

<pattern>CZESC</pattern>

<template><srai>Witaj</srai></template>

</category>

Naturalnym oczekiwaniem jest, że nasz wirtualny rozmówca będzie potrafił odpowiedzieć na różne powitania. Dodanie do naszej bazy powyższych kategorii spowoduje, że nasz chatterbot na wypowiedzi użytkownika: „Witam” i „Czesc” odpowie tak samo jak na wypowiedź „Witaj”.

Tworząc bazę wiedzy wirtualnego rozmówcy należy przewidzieć, że nasz chatterbot nie będzie znał odpowiedzi na wszystkie postawione przez użytkownika pytania. Potrzeba zatem zdefiniować uniwersalną kategorię, której wzorcem będzie dowolny ciąg znaków podany przez użytkownika. W AIMLu dowolny ciąg znaków oznacza znak *.

<category>

<pattern>*</pattern>

<template>Przepraszam bardzo nie rozumiem Cie. Czy mozesz zadac pytanie w inny sposob?</template>

</category>

Zatem nasz wirtualny rozmówca na każdą wypowiedź użytkownika, do której nie będzie potrafił dopasować wzorca odpowie: „Przepraszam bardzo nie rozumiem Cie. Czy mozesz zadac pytanie w inny sposob?”.Kolejnym istotnym elementem wbudowanym w język AIML jest redukcja symboliczna. Pozwala ona na rozłożenie złożonych zdań na prostsze przy użyciu znacznika <srai>. Przykład redukcji symbolicznej w naszej bazie znajduje się poniżej.

<category>

<pattern>CZYM JEST CHATTERBOT</pattern>

<template>Chatterbot jest programem komputerowym zaprojektowany do symulacji inteligentnej konwersacji przez metody tekstowe lub werbalne</template>

</category>

<category>

<pattern>CZYM JEST TEST TURINGA</pattern>

<template>Test Turinga jest metoda sprawdzania, czy rozmawiamy z maszyna. Polega ona na prowadzeniu dialogu programu z czlowiekiem przez maszyne w taki sposob, aby rozmowca nie zorientowal sie, ze rozmawia z maszyna.</template>

</category>

<category>

<pattern>CZYM JEST KONKURS LOEBNER</pattern>

<template>Jest ograniczonym testem Turinga.  Ograniczenie to polega na tym, ze kazdy jeden z sedziow bioracych udzial  w tescie, jest zobligowany do zadawania pytan tylko i wylacznie z dziedziny, ktora przedstawil autor programu. </template>

</category>

<category>

<pattern>CZY WIESZ CZYM JEST *</pattern>

<template><srai>Czym jest <star /></srai></template>

</category>

Formuła „Czy wiesz czym jest *” została sprowadzona do formuły „Czym jest *”.  Użytkownik zadając pytanie „Czy wiesz czym jest chatterbot/test Turinga/konkurs Loebnera?” dostanie taką samą odpowiedź jak na pytanie „Czym jest chatterbot/test Turinga/konkurs Loebnera?”.

Innym istotnym elementem języka AIML jest podział. Umożliwia on rozbijanie wzorców na fragmenty, dopasowywanie odpowiedzi do każdej części z wzorca oraz złożenie tych fragmentów w całościową odpowiedź. Przyjrzyjmy się następującym kategoriom naszej bazy wiedzy.

<category>

<pattern>ALICE ZDOBYLA 3 RAZY NAGRODE LOEBNERA</pattern>

<template>tak</template>

</category>

<category>

<pattern>ELIZA ZDOBYLA NAGRODE LOEBNERA</pattern>

<template>nie</template>

</category>

<category>

<pattern>CZY *</pattern>

<template>Sadze, ze <srai><star /></srai></template>

</category>

Pierwsze dwie są kategoriami atomowymi (niepodzielnymi), natomiast ostatnia pozwala na wydzielenie w zdaniu o konstrukcji „Czy ALICE zdobyla 3 razy nagrode Loebnera” słowo „Czy” i dopasować do niego frazę „Sadze, ze”. Natomiast do drugiej części wzorca, dzięki zastosowaniu znacznika <srai> dopasowana zostaje odpowiedz zapisana w pierwszej kategorii. W wyniku użytkownik otrzyma całościową odpowiedź brzmiącą „Sadze, ze tak”.Język AIML umożliwia wykorzystanie słów kluczy. Poniższy fragment bazy wiedzy pokazuje zastosowanie słów kluczowych. Jeżeli w wypowiedzi użytkownika, nie ważne czy na początku, końcu czy w środku, pojawi się słowo klucz – inżynieria wiedzy, chatterbot udzieli takiej samej odpowiedzi jak dla wzorca „Inzynieria wiedzy”.

<category>

<pattern>INZYNIERIA WIEDZY</pattern>

<template>Chcesz sie dowiedziec, czym jest inzynieria wiedzy?</template>

</category>

<category>

<pattern>* INZYNIERIA WIEDZY</pattern>

<template><srai>Inzynieria wiedzy</srai></template>

</category>

<category>

<pattern>* INZYNIERIA WIEDZY *</pattern>

<template><srai>Inzynieria wiedzy</srai></template>

</category>

<category>

<pattern>INZYNIERIA WIEDZY *</pattern>

<template><srai>Inzynieria wiedzy</srai></template>

</category>

Ważnym elementem rozmów jest kontekst. W rozmowie pomiędzy ludźmi od niego zależy wypowiadana odpowiedź. W AIMLu kontekst pozwala na odróżnienie pomiędzy kategoriami w przypadku jednakowego wzorca. Znalazł on zastosowanie w przypadku częstych jednakowych zdań użytkownika posiadających różne znaczenie (z uwagi na różny kontekst). Do definiowania kontekstu służy znacznik <that> umieszczany pomiędzy wzorcem a odpowiedzią. Przykłady użycia kontekstu w bazie wiedzy dotyczącej inżynierii wiedzy znajdują się poniżej.

<category>

<pattern>TAK</pattern>

<that>Chcesz sie dowiedziec, czym jest inzynieria wiedzy?</that>

<template>Inzynieria wiedzy jest nowym dzialem w informatyce. Obszarem jej zainteresowan jest wiedza i systemy inteligentne. Ja jestem przykladem takiego systemu. Jesli chcesz dowiedziec sie wiecej o studiach na tej specjalnosci kliknij <a href="http://www.ue.katowice.pl/?contentid=5481">tutaj</a> </template>

</category>

<category>

<pattern>NIE</pattern>

<that>Chcesz sie dowiedziec, czym jest inzynieria wiedzy?</that>

<template>Przykro mi. O czym porozmawiamy?</template>

</category>

Powyższy fragment bazy wiedzy odpowiada za wyświetlenie odpowiedzi „Przykro mi. O czym porozmawiamy?”. W przypadku gdy odpowiedź użytkownika „Nie” padnie po pytaniu chatterbota „Chcesz sie dowiedziec, czym jest inzynieria wiedzy?”. Wartym uwagi jest fakt, że w AIMLu można stosować znaczniki języka HTML – do formatowania tekstu, czy tak jak w pierwszej kategorii do tworzenia odsyłaczy.

Istotnym elementem języka AIML są predykaty wykorzystywane w sekcji <template> kategorii. Dzięki nim łatwiejsze jest sterowanie przebiegiem konwersacji. Przykład użycia predykatów w bazie wiedzy obrazuje poniższy fragment kodu.

<category>

<pattern>INZYNIERIA WIEDZY NIE JEST NAM POTRZEBNA</pattern>

<template>Dlaczego tak myslisz?</template>

</category>

<category>

<pattern>*</pattern>

<that>Dlaczego tak myslisz?</that>

<template>Nie sadze, zeby <set name="zmienna"><star/></set> bylo wystarczajacym wyjasnieniem. Czy naprawde uwazasz, ze <get name="zmienna"/> wystarczy?</template>

</category>

Użytkownik wypowiada swoją opinię słowami „Inzynieria wiedzy nie jest nam potrzebna”, na co reakcją wirtualnego rozmówcy jest pytanie „Dlaczego tak myslisz?”. Uzasadnienie opinii, przykładowo „Bo tak” zostaje dopasowane przez wzorzec * dzięki użyciu opisanego już kontekstu. Znacznik <set> przypisuje do predykatu o nazwie „zmienna” wartość będącą uzasadnieniem i zwraca jednocześnie jego wartość w miejscu przypisania. W drugim zdaniu odpowiedzi chatterbota pojawia się znacznik <get>. Pobiera on wartość predykatu, w tym przypadku o nazwie „zmienna” i umieszcza w miejscu w którym się znajduje.

Język AIML umożliwia także grupowanie kategorii w tzw. tematy (znacznik <topic>).  Są one innym przykładem wykorzystania kontekstu w bazie wiedzy wirtualnego rozmówcy. Temat dalszej konwersacji z chatterbotem zostaje ustalony w wyniku dopasowania odpowiedniego wzorca. Od tego momentu kategorie z danego tematu mają pierwszeństwo w procesie dopasowywania.

<category>

<pattern>CZYM JEST WIEDZA</pattern>

<template>Chetnie porozmawiam z Toba na tematy zwiazane z  name="topic">wiedza</set></think></template>

</category>

<topic name="wiedza">

<category>

<pattern>*</pattern>

<template>Nie dotyczy to wiedzy. Spytaj ponownie</template>

</category>

<category>

<pattern>NIE CHCE JUZ O TYM ROZMAWIAC</pattern>

<template>Dobrze. Mozemy porozmawiac o czym tylko chcesz <think><set name="topic"><star /></set></think></template>

</category>

<category>

<pattern>JAKIE ZNASZ RODZAJE WIEDZY</pattern>

<template>Wiedze mozemy podzielic na wiedze jawna i wiedze niejawna.</template>

</category>

</topic>

Część kategorii z powyższego fragmentu bazy wiedzy należy do tematu o nazwie „wiedza”. Początkowo dopasowywane są wzorce spoza tego tematu – z tak zwanego tematu standardowego, jego nazwa oznaczana jest jako <star/>. Pytanie użytkownika „Czym jest wiedza” aktywizuje temat o nazwie „wiedza”. Chatterbot odpowie wtedy „Chetnie porozmawiam z Toba na tematy zwiazane z wiedza. Zadaj mi pytanie.” oraz ustawi temat „wiedza” jako temat obowiązujący. Od tego momentu kategorie znajdujące się w tym temacie mają pierwszeństwo przy dopasowywaniu. Warto wyjaśnić w tym miejscu działanie znacznika <think>. Powstrzymuje on program od wypisania na wyjściu pewnych jego działań, w tym wypadku przed wypisaniem na wyjściu nazwy tematu. Wypowiedź użytkownika „Nie chce już o tym rozmawiac” powoduje powrót do tematu ogólnego.

Ostatnim wartym uwagi elementem języka AIML są wyrażenia warunkowe.

<category>

<pattern>DZIEKI</pattern>

<template> Czy jestes zadowolony z moich odpowiedzi?<think><set name="topic">wkolo</set></think></template>

</category>

<topic name="wkolo">

<category>

<pattern>*</pattern>

<template><think><set name="x"><star /></set></think>

<condition>

<li name="x" value="tak">Ciesze sie :-) <think> <set name="topic"><star /></set></think></li>

<li name="x" value="nie">Przykro mi, staram sie jak moge<think><set name="topic"><star /></set></think></li>

<li>Podoba sie czy nie?</li>

</condition>

</template>

</category>

</topic>

W temacie „wkolo” znajduje się jedna kategoria zawierająca w sekcji <template> wyrażenie warunkowe <condition> z listą wariantów <li>. Odpowiedź wirtualnego rozmówcy będzie zależała od odpowiedzi użytkownika. Jednakże będzie on zadawał pytanie „Podoba sie czy nie?” tak długo, aż uzyska odpowiedź „tak” lub „nie” i wtedy powróci do tematu ogólnego.

W utworzonej bazie wiedzy znajdują się jeszcze następujące kategorie:

<category>

<pattern>JAK MASZ NA IMIE</pattern>

<template>Nazywam sie WIKUS. A Ty?</template>

</category>

<category>

<pattern>*</pattern><that>Nazywam sie WIKUS. A Ty?</that>

<template><think><set name="imie"><star /></set></think>Milo mi Cie poznac, <get name="imie" /></template>

</category>

<category>

<pattern>NAZYWAM SIE *</pattern><that>Nazywam sie WIKUS. A Ty?</that>

<template><think><set name="imie"><star /></set></think>Milo mi Cie poznac, <get name="imie" /></template>

</category>

<category>

<pattern>MAM NA IMIE *</pattern><that>Nazywam sie WIKUS. A Ty?</that>

<template><think><set name="imie"><star /></set></think>Milo mi Cie poznac, <get name="imie" /></template>

</category>

<category>

<pattern>DO WIEDZENIA</pattern>

<template>Do widzenia. Milo sie z Toba rozmawialo.</template>

</category>

Poniższy rysunek przedstawia przykładową rozmowę z utworzonym w ten sposób wirtualnym doradcą.

Użytkownik:

Witaj

Chatterbot:

Czesc, o czym chcesz porozmawiac?

Użytkownik:

Jak masz na imie?

Chatterbot:

Nazywam się WIKUS. A Ty?

Użytkownik:

Nazywam się Kinga

Chatterbot:

Milo mi Cie poznac, Kinga.

Użytkownik:

Czy wiesz czym jest chatterbot?

Chatterbot:

Chatterbot jest programem komputerowym zaprojektowany do symulacji inteligentnej konwersacji przez metody tekstowe lub werbalne

Użytkownik:

Czy Eliza zdobyla nagrode Loebnera?

Chatterbot:

Sadze, ze nie

Użytkownik:

Czym jest inzynieria wiedzy?

Chatterbot:

Chcesz sie dowiedziec, czym jest inzynieria wiedzy?

Użytkownik:

Nie

Chatterbot:

Przykro mi. O czym porozmawiamy?

Użytkownik:

Czym jest wiedza?

Chatterbot:

Chetnie porozmawiam z Toba na tematy zwiazane z wiedza. Zdaj mi  pytanie.

Użytkownik:

Jakie znasz rodzaje wiedzy?

Chatterbot:

Wiedze mozemy podzielic na wiedze jawna i wiedze niejawna.

Użytkownik:

Co wiesz o komputerach?

Chatterbot:

Nie dotyczy to wiedzy. Spytaj ponownie

Użytkownik:

Nie chce juz o tym rozmawiac

Chatterbot:

Dobrze. Mozemy porozmawiac o czym tylko chcesz

Użytkownik:

Dzieki

Chatterbot:

Czy jestes zadowolony z moich odpowiedzi?

Użytkownik:

Nie wiem

Chatterbot:

Podoba sie czy nie?

Użytkownik:

Tak

Chatterbot:

Ciesze sie :-)

Użytkownik:

Do widzenia

Chatterbot:

Do widzenia. Milo sie z Toba rozmawialo.

Jak widać utworzenie bazy wiedzy w języku AIML jest proste. Zaletami tego języka oprócz minimalistycznego podejścia jest przede wszystkim: czytelność, przejrzystość, zgodność ze standardem XML oraz szybkość tworzenia.