Raport z projektu
wykonanego na przedmiot Sztuczna inteligencja

Marta Stępień

20 czerwca 2007r.


Spis treści

  1. Opis problemu
  2. Przyjęte założenia
  3. Rozwiązanie
  4. Przykłady rozmów
  5. Testy, wyniki
  6. Wnioski
  7. Wykorzystane materiały i narzędzia

1. Opis problemu

Celem projektu było stworzenie bota, który rozwiązuje proste zadania z matematyki (pola figur - prostokąt, kwadrat, trójkąt, trapez) oraz dodatkowo potrafi prowadzić konwersację w zakresie tematu (potrafi podać definicje, przykłady itp.)

Bot składa się z dwóch części: bazy wiedzy oraz silinika przetwarzającego tą wiedzę. Baza wiedzy została utworzona w języku AIML, który został opracowany na potrzeby projektu ALICE. Skorzystałam z gotowego interpretera o nazwie ChatterBean.

Efektem końcowym projektu jest bot o imieniu Matty.

[spis treści]

2. Przyjęte założenia

Co bot potrafi?

  • Bot potrafi przeprowadzić prostą rozmowe wprowadzającą, czyli umie się przywitać, zapytać o imię.
  • Umie podać definicję, o którą poprosi rozmówca (np. "Co to jest prostokąt?", "Jak obliczyć pole trójkąta?"). Umie także podać przykład, jeżeli użytkownik sobie tego zażyczy (np. "Pole trójkąta o podstawie 5 i wysokości 6 wynosi 1/2*5*6.").
  • Bot specjalizuje się w rozwiązywaniu prostych zadań związanych z obliczaniem pól figur (np. "Oblicz pole prostokąta, które dłuższy bok wynosi d 10, wiedząc że jego obwód wynosi d 30.").
  • Uwaga: dane liczbowe w treści zadań muszą być poprzedzone literą d. Jest to niestety konieczne, gdyż interpretery języka AIML nie rozróżniają cyfr od liter. Ponadto treści zadań nie powinny zawierać polskich liter oraz znaków interpunkcyjnych.

Jakie podstawowe słowa/dane rozpoznaje?

Nazwy figur: prostokąt, kwadrat, trójkąt, trapez.

Słowa związane z właściwościami figur: obwód, pole, bok, długość, szerokość, wysokość, podstawa, górna podstawa, dolna podstawa.

Oczywiście język polski jest problematyczny i każde słowo ma jeszcze odmiany, które również należy uwzględnić. Jest to dosyć kłopotliwe. Należy więc zwrócić uwagę, w jakich przypadkach najczęściej używane są poszczególne słowa w treściach zadań i na tych przypadkach się skupić.

[spis treści]

3. Rozwiązanie

Baza wiedzy została zdefiniowana w języku AIML (Artificial Intelligence Markup Language), który jest dialektem języka XML. Podstawową jednostką wiedzy w AIML jest kategoria, składająca się z pytania zwanego wzorcem (pattern) i odpowiedzi nazywanej szablonem (template) oraz opcjonalnego kontekstu(<topic>, <that>) jak i synonimów.

3.1. AIML - struktura pliku

Każdy plik, który będzie zawierał fragment bazy wiedzy ma następującą strukturę:

			<?xml version="1.0" encoding="UTF-8" ?>
			<aiml version="1.0">
			
</aiml>

Wszelkie wypowiedzi bota będą następnie umieszczane w obrębie głównego znacznika <aiml>

3.2. AIML - schemat budowania wypowiedzi

Wszystkie wypowiedzi bota definiujemy w następujący sposób:

				   <category>
					<pattern>CZESC</pattern>
					<template>Witaj</template>
				   </category>
        
			

W tym prostym przykładzie wzorcem jest słowo "Czesc". Jeżeli je wpiszemy, to w odpowiedzi otrzymamy słowo "Witaj", które tutaj jest szablonem. Przy pomocy tej prostej struktury oraz dodatkowych mechanizmów, o których będzie mowa za chwilę, można zbudować bazę wiedzy bota.

3.3. AIML - wykorzystane mechanizmy

Kontekst - znaczniki <that>, <topic>

Ważnym elementem języka AIML jest tzw. kontekst, pozwala on rozróżnić pomiędzy kategoriami w przypadku jednakowego wzorca. Istnieją dwie możliwości zdefiniowania kontekstu. Pierwsza z nich to zastosowanie znacznika <that>:

				   <category>
				   	<pattern> * </pattern>
					<that>JAK MASZ NA IMIE</that>
					<template>
					Witaj <star />! 
					</template>
				   </category>
			

Powyższy wzorzec dopasuje się tylko wtedy, gdy wcześniejszą wypowiedzią bota było "Jak masz na imie".

Druga możliwość zdefiniowania kontekstu polega na ustawieniu tematu. Jeżeli jakieś kategorie zdefiniujemy w obrębie tagów

	
				<topic name="PROSTOKAT"> </topic>
			

to wzorzec zostanie dopasowany tylko wtedy, gdy zmienna topic będzie miała wartość "PROSTOKAT".

A jak ustawić zmienną topic? Należy użyć

				<set name="topic"> PROSTOKAT </set> 
			

Synonimy - znacznik <srai>

Synonimy w języku AIML pozwalają w niektórych przypadkach zaoszczędzić pisania. Oczywiste jest, że chcielibyśmy, żeby bot reagował na zdania sformułowane w różny sposób, ale mające to samo znaczenie. Dzięki synonimom wystarczy raz zdefiniować szablon odpowiedzi.

			            <category>
				    	<pattern>CZESC</pattern>
					<template>Witaj</template>
				    </category>
				    <category>
				    	<pattern>WITAM</pattern>
					<template>
						<srai>CZESC</srai>
					</template>
				    </category>

			

Powyższy zapis oznacza, że wzorzec "WITAM" jest synonimem wzorca "CZESC". W przypadku wpisania slowa "WITAM", bot przeszuka bazę wiedzy w poszukiwaniu słowa "CZESC".

Losowe odpowiedzi - znacznik <random>

Warto wykorzystać ten mechanizm. Dzięki niemu zróżnicujemy odpowiedzi i na to samo pytanie bot będzie udzielał różnych odpowiedzi (wybranych losowo ze zdefiniowanej listy).

			   	   <category>
				   	<pattern>CZESC</pattern>
					<template>
						<random>
						   <li>Witaj</li>
						   <li>Czesc, co slychac?</li>
						   <li>Jak sie masz?</li>
						   <li>Dzien dobry </li>
						</random>
					</template>
				   </category>
			

Zmienne - znaczniki <get> i <set>

W AIML istnieje także możliwość zapisywania i odczytywania zmiennych.

				   <category>
				   	<pattern>MAM NA IMIE *</pattern>
					<template> 
						<set name="UserName"> <star /> </set> 
					</template>
				   </category>
				   
				   <category>
				   	<pattern>CZY PAMIETASZ JAK MAM NA IMIE</pattern>
					<template>
						Oczywiscie! Masz na imie <get name="UserName">
					</template>
				   </category>
			

Najpierw ustawiamy wartość zmiennej o nazwie UserName. Do tak zdefiniowanej zmiennej można się później odwoływać.

Wyrażenia warunkowe - znacznik <condition>

Można też uzależnić odpowiedź bota od wartości pewnej zmiennej. Przykładowo
				   <category>
					<pattern>*</pattern>
					<that>CZY JUZ ROZUMIESZ</that>
					<template>
						<think>
						   <set name="odp">
						      <star index="1"/>
						   </set>
						</think>
						<condition name="odp">
						   <li value="tak">Bardzo sie ciesze!</li>
						   <li value="nie">Ohhh.. Nie wiem jak jeszcze mam ci to tlumaczyc.</li>
						   <li value="prawie">Mhm..</li>
						   <li value="tak sobie">No dobrze, przejdzmy zatem dalej.</li>
						   <li>Hmm..</li>
						</condition>
					</template>
				   </category>

			

W kolejnych elementach listy porównywana jest wartość zmiennej odp i na przykład jeżeli użytkownik powiedział "tak", to bot odpowie "Bardzo sie ciesze!" itd.

3.4. Interpreter języka AIML

Postanowiłam skorzystać z gotowego interpretera języka AIML, aby móc skupić się jedynie na definiowaniu wzorców. Wydawało mi się, że skoro jest ustalony standard AIML, to nie będzie z tym problemu.

Okazuje się jednak, że wybór interpretera języka AIML wcale nie jest prosty. Dostępnych jest wiele interpreterów, które są napisane w różnych językach i w różnych formach. Można się z nimi zapoznać tutaj.

Na początku postanowiłam skorzystać z silnika o nazwie Program# napisanego w języku C#, jednak okazało się, że nie do końca poprawnie parsuje on zdania. Problem pojawia się wtedy, gdy we wzorcu znajduje się więcej gwiazdek (gwiazdka * oznacza dopasowanie dowolnego ciągu liter). W języku AIML można odwoływać się do gwiazdek w następujący sposób: <star index="" />. Atrybut index oznacza oczywiście numer gwiazdki. Program# numeruje gwiazdki od końca, co jest niezgodne ze standardem.

Kolejnym wybranym przeze mnie interpreterem był ProgramQ napisany w C++. Wybór ten również nie był dobry, gdyż szybko okazało się, że interpreter ma problem z uwzględnianiem kontekstu (znacznik <that>).

Ostatecznie skorzystałam z interpretera o nazwie ChatterBean napisanego w Javie. Okazało się, że najlepiej pasuje do wykonania tego zadania (chociaż też nie jest idealny, ale o tym później). Jednym z jego plusów jest to, że potrafi wykonywać proste działania na liczbach (znacznik <system>).

[spis treści]

3.5. Baza wiedzy bota

Podstawowa wiedza bota zdefiniowana jest w następujących plikach: ogolne.aiml, prostokat.aiml, trojkat.aiml, trapez.aiml, kwadrat.aiml.

Każdy plik dotyczący figury składa się z trzech części:

  • definicje i przykłady,
  • zadania,
  • odpowiedzi na pytania niejednoznaczne; odpowiedzi te można wywnioskować na podstawie aktualnego tematu (zmienna topic).

Wzorce dla zadań zostały zdefiniowane w oparciu o zadania ze zbioru "Mogę zostać Pitagorasem" oraz podręcznika "Matematyka 5".

[spis treści]

4. Przykłady rozmów

Rozmowa 1. (udana)

> Czesc
czesc, jak sie nazywasz?
> Ania
Ania, o co chcesz mnie zapytac?
> O pola figur
jakiej figury?
> trojkata
To latwe. Pole trojkata jest rowne polowie iloczynu dlugosci jego podstawy przez wysokosci opuszczona na te podstawe.
> Podaj mi jakis przyklad .
Nie ma sprawy. Trojkat o podstawie 6 i wysokosci 4 ma pole rowne 0.5*6*4=12.
> To latwe
Ania, chcesz wiedziec cos jeszcze o trojkatach?
> Umiesz rozwiazywac jakies zadania ?
Moge sprobowac. Podaj mi tylko tresc.
> Oblicz pole trojkata o podstawie d 7 i wysokosci opuszczonej na te podstawe o dlugosci d 5
To proste, pole tego trojkata wynosi 17.5
> Bok trojkata ma dlugosc d 7 a wysokosc opuszczona na ten bok d 4 drugi bok trojkata wynosi d 12 Oblicz wysokosc opuszczona na ten bok
--To juz jest bardziej skomplikowane zadanie. Najpierw trzeba obliczyc pole. Znamy dlugosc boku i wysokosci opuszczonej na ten bok - pole wynosi wiec 7*4*0.5 = 14.0. Teraz znajac dlugosc drugiego boku trojkata, mozemy obliczyc takze wysokosc opuszczona na ten bok. Wynosi ona 2.3333333333333335.
> Zmienmy temat
Ania, chcesz wiedziec cos jeszcze o trojkatach?
> nie
OK, zmienmy temat.
> Powiedz mi co to jest trapez
Trapez to czworokat, ktory posiada dwa boki rownolegle nazywane podstawami. Dwa pozostale boki nazywamy ramionami trapezu.
> podstawy trapezu maja d 10 i d 5 oblicz pole trapezu jezeli jego wysokosc wynosi d 7
Pole trapezu o podstawach 10 i 5 oraz wysokosci 7 wynosi 52.5.

Rozmowa 2. (nieudana)

> czesc
czesc, jak sie nazywasz?
> Ola
Ola, o co chcesz mnie zapytac?
> gorna podstawa trapezu ma d 8 dolna jest o d 10 dluzsza oblicz pole trapezu jezeli jego wysokosc wynosi d 12
Oj, Ola, chyba sie pogubilem. O czym to teraz rozmawiamy?
> ile wynosi pole trapezu jezeli jego gorna podstawa ma dlugosc d 10 dolna d 20 a wysokosc d 7
Pole trapezu o podstawach 10 i 20 oraz wysokosci 7 wynosi 105.0.
> pole trojkata wynosi d 90 oblicz podstawe tego trojkata jezeli jego wysokosc ma d 12
W tym przypadku podstawa trojkata wynosi 7.
> ile wynosi pole trojkata ktorego podstawa ma d 10 a wysokosc odpowiadajaca tej podstawie jest od niej o 5 dluzsza
Ola, chcesz wiedziec cos jeszcze o trojkatach?
> Nie
OK, zmienmy temat.

Rozmowa 3. (udana)

> witaj
dzien dobry, jak masz na imie?
> Marta
Marta, o co chcesz mnie zapytac?
> ile wynosi pole kwadratu jezeli wiadomo ze obwod jest rowny d 60
Pole kwadratu,ktorego obwod jest rowny 60 wynosi 225.
> skad to wiesz
To nie jest trudne. Wystarczy wiedziec jak obliczac pole kwadratu.Pole kwadratu jest rowne kwadratowi dlugosci jego boku. Czy teraz juz rozumiesz?
> Tak
To dobrze.
> oblicz obwod prostokata jezeli wiadomo ze pole wynosi d 120 a szerokosc ma d 20
Znamy pole prostokata oraz jego szerokosc. Dzieki temu latwo mozemy obliczyc dlugosc prostokata: 120/20 = 6. Teraz wystarczy zsumowac wymiary bokow i wynik pomnozyc przez dwa. Obwod wynosi 52.
> a to skad wiesz
Aby obliczyc obwod nalezy zsumowac dlugosc i szerokosc prostokata, a otrzymany wynik pomnozyc przez 2. Czy juz rozumiesz?
> oczywiscie
Hmm..
> co teraz ?
Chcesz wiedziec cos jeszcze o prostokatach?
> oblicz pole prostokata jezeli wiadomo ze dluzszy bok wynosi d 20.5 a drugi jest o d 7 krotszy
W takim przypadku prostokat ma boki o dlugosciach 20.5 oraz 13.5. Pole prostokata wynosi wiec 276.75.
> jaka jest wysokosc trapezu jesli jego podstawy maja d 13 i d 8 a pole rowna sie d 63
Znamy pole trapezu, ktore wynosi 63 oraz dlugosci podstaw: 13 oraz 8. W takim razie wysokosc tego trapezu wynosi 6.

Rozmowa 4. (nieudana)

> hej
witam, jak masz na imie?
> Ala
Ala, o co chcesz mnie zapytac?
> o nic
Oj, Ala, chyba sie pogubilem. O czym to teraz rozmawiamy?
> O figurach
Tak, tak rzeczywiscie. Moze rozwiazac jakies zadanie?
> oblicz obwod prostokata jezeli jego pole wynosi d 30 a jeden z bokow ma d 6
Nie jestem pewien, czy wiem o czym mowisz. Ala, podpowiedz mi.
> pole prostokata ma d 30 a jego dlugosc d 6 ile wynosi obwod tego prostokata
Obwod prostokata o polu 30 i bokach 6 oraz 5 wynosi 22.
> pole pewnego prostokata ma wartosc d 120 oblicz ile wynosi jego obwod jezeli wiadomo ze jeden z bokow ma d 25
Chcesz wiedziec cos jeszcze o prostokatach?
> tak
To pytaj
> jak wlasciwie oblicza sie pole prostokata ?
To latwe, wystarczy pomnozyc przez siebie dlugosci jego dwoch sasiednich bokow
> Rzeczywiscie, to latwe
Chcesz wiedziec cos jeszcze o prostokatach?
> nie
OK, zmienmy temat.

[spis treści]

5. Testy, wyniki

Testowanie odbyło się w dwóch fazach. W trakcie tworzenia bazy wiedzy przeprowadzane były testy robocze (na podstawie zbioru "Mogę zostać Pitagorasem" oraz podręcznika "Matematyka 5"). Wykorzystane zadania znajdują się w pliku o nazwie "zadania-1.txt". Po utworzeniu bazy wiedzy nastąpiła druga faza testów.

Druga faza testów polegała na wprowadzeniu dużej ilości zadań. Zadania zostały zaczerpnięte ze zbioru "Matematyka dla Ciebie" oraz z internetu. Ponadto poprosiłam kilka osób, żeby same wymyśliły po kilkanaście zadań. Zależało mi na tym, aby zadania wykorzystane do testów końcowych były zróżnicowane - dwie osoby mogą napisać treść do takiego samego zadania na dwa różne sposoby (np. inne słowa, inna kolejność podawania danych). Zadania wykorzystane do testów końcowych zostały zgromadzone w pliku o nazwie "zadania-2.txt".

Wyniki testów

Figura Liczba zadań Brak rozwiązania Złe dopasowanie wzorca Zła odpowiedź Skuteczność
Prostokąt 67 12 2 2 76%
Kwadrat 42 1 1 3 88%
Trójkąt 61 14 2 1 72%
Trapez 56 17 0 0 69%
Razem 226 44 5 6 75%


Brak rozwiązania oznacza, że bot nie znalazł w bazie wiedzy żadnego wzorca, który pasowałby do podanej treści zadania. Ta sytuacja występowała najczęściej w zadaniach na pola trapezu.

Ze złym dopasowaniem wzorca mamy do czynienia wtedy, gdy bot dopasował jakiś wzorzec i rozwiązał zadanie, jednak to rozwiązanie nie do końca było poprawne (np. w treści zadania było pytanie o obwód i bok kwadratu, a bot podał tylko obwód itp.) albo jako odpowiedź zwrócił null (oznacza to, że wzorzec został dopasowany, ale w miejscu, gdzie miała wystąpić liczba pojawiła się np. liczba+wyraz i to wywołało błąd).

Złe rozwiązanie zadania zdarza się wtedy, kiedy bot dobrze dopasuje wzorzec, ale wynik liczbowy jest zły. Okazuje się, że taka sytuacja może mieć miejsce. Dzieje się tak przykładowo wtedy, gdy wszystkie dane liczbowe są całkowite, a wynik jest liczbą niecałkowitą - wynik jest wtedy niedokładny, gdyż nie zawiera informacji o części ułamkowej. Jest to jednak specyfika wybranego interpretera, a nie złej bądź niewystarczającej definicji wzorców. Niemniej jednak podanie niedokładnego wyniku traktowane jest jako błąd.

[spis treści]

6. Wnioski

O czym świadczą otrzymane wyniki?

Bot dosyć dobrze poradził sobie z rozwiązaniem ponad 200 zadań i osiągnął 75% skuteczności. Najczęściej oczywiście nie mógł dopasować wzorca, jednak zdarzały się też sytuacje, w których dopasował zły wzorzec.

Okazuje się, że najłatwiejsze były dla niego zadania dotyczące kwadratu, co jest logiczne, gdyż w tych zadaniach potrzebnych jest najmniej danych (przeważnie jedna liczba). Treści zadań są więc do siebie zbliżone.

Najtrudniejszymi zadaniami były te dotyczące trapezu, gdyż tam jest najwięcej danych (przeważnie trzy liczby). Jest dużo różnych sformułowanie tego samego zadania, dlatego częściej zdarzało się, że bot nie potrafił dopasować wzorca.

Zadania możemy uszeregować według poziomu trudności w następujący sposób:

  1. zadania dotyczące kwadratu,
  2. zadania dotyczące prostokąta,
  3. zadania dotyczące trójkąta,
  4. zadania dotyczące trapezu.

Skuteczność działania bota pokrywa się z powyższą listą.

Co można, a czego nie można zrobić za pomocą języka AIML, czyli napotkane problemy

Definicja wzorca jest bardzo prosta. Można wykorzystać znaki * lub _ , które oznaczają dowolny ciąg znaków (ChatterBean uznaje za dowolny ciąg znaków także ciąg pusty, w przypadku innych interpreterów może być inaczej). Jest to kłopotliwe, gdyż nie można zaznaczyć, że w danym miejscu będzie liczba. Dlatego też podanie danych liczbowych w treści zadania wymaga poinformowania o tym bota. W ten sposób unika się sytuacji, w których następuje próba wykonania operacji dodawania na ciągu liter, ponieważ został on potraktowany jako liczba.

Możliwość wykorzystania wyrażeń regularnych do definicji wzorca znacznie uprościłaby to zadanie.

Pojawia się też problem z liczbami rzeczywistymi. Większość interpreterów potraktuje liczbę 5.6 (lub 5,6) jako 5, gdyż kropka (przecinek) będzie oznaczać nowe zdanie. Interpreter ChatterBean akurat poprawnie interpretuje takie sytuacje, ale jeżeli otrzyma dwie liczby całkowite, a wynikiem będzie liczba rzeczywista, to poda on niedokładny wynik. W tym przypadku wina leży akurat po stronie interpretera, a nie samego języka AIML.

Czy wybór metody rozwiązania problemu był dobry?

Zadanie okazało się trudniejsze, niż wydawało mi się na początku. Już w trakcie pracy nad projektem pojawiły się drobne problemy (o których pisałam w raporcie), które miały duży wpływ na całość realizacji.

Jednak wydaje mi się, że wybór metody był dobry, ale... gdybym miała ponownie rozwiązać taki problem używając języka AIML, to zaczęłabym od napisania własnego interpretera, który zostałby dostosowany do tego konkretnego zadania. Przede wszystkim umożliwiałby on poprawne wykonywanie działań (mniej i bardzie skomplikowanych, także z nawiasami). Ponadto dodałabym możliwość używania wyrażeń regularnych w definicjach wzorców. Znacznie ułatwiłoby to realizację projektu, ale niestety nie byłby to już język AIML zgodny z opracowanym standardem.

[spis treści]

7. Wykorzystane materiały i narzędzia

Ponadto ważną rolę odegrał zbiór zadań dla klasy 5 "Mogę zostać Pitagorasem" (W.Łęska, S.Łęski), podręcznik "Matematyka 5" (M.Dobrowolska) oraz zbiór zadań "Matematyka dla Ciebie" (K.Gałązka).

[spis treści]

Valid XHTML 1.0 Transitional