Witaj świecie!
Dodajemy nowy plik AIML o nazwie warsztaty.
Będzie on widoczny w panelu nawigacyjnym.
Jego domyślna treść zawiera podstawową strukturę AIML.
Uzupełniamy treść pliku tak, aby ostatecznie jego zawartość wyglądała jak poniżej i zapisujemy zmiany:
<?xml version=”1.0″ encoding=”UTF-8″?>
<aiml version=”2.0″>
<category>
<pattern>Witaj</pattern>
<template>Witam serdecznie!</template>
</category>
</aiml>
Możemy teraz przejść do przetestowania rozwiązania:
Cześć cokolwiek
Otwieramy ponownie plik warsztaty.aiml
Dodajemy gwiazdkę we wzorcu, dzięki czemu bot będzie w stanie rozpoznać więcej interakcji z użytkownikiem:
<?xml version=”1.0″ encoding=”UTF-8″?>
<aiml version=”2.0″>
<category>
<pattern>Witaj *</pattern>
<template>Witam serdecznie!</template>
</category>
</aiml>
W zakładce „Train” wpisujemy przykładowe interakcje – w tym „Witaj bocie” oraz „Witaj”. Jak odpowiada nasz bot?
Dokonujemy modyfikacji pliku warsztaty.aiml zamieniając znak „*” na „^”; czyli teraz zawartość naszego pliku powinna wyglądać jak poniżej:
<?xml version=”1.0″ encoding=”UTF-8″?>
<aiml version=”2.0″>
<category>
<pattern>Witaj ^</pattern>
<template>Witam serdecznie!</template>
</category>
</aiml>
W zakładce „Train” wpisujemy przykładowe interakcje – w tym „Witaj bocie” oraz „Witaj”. Jak odpowiada nasz bot? Jaka jest różnica względem pierwszej wersji?
Cześć, hejka, siema…
A co się stanie jeśli przywitamy się z botem w inny sposób niż „witaj”? Wygląda na to że musimy zapewnić inne sposoby rozpoczęcia konwersacji. Dodajmy więc kilka nowych kategorii, przykładowo:
<?xml version=”1.0″ encoding=”UTF-8″?>
<aiml version=”2.0″>
<category>
<pattern>Witaj ^</pattern>
<template>Witam serdecznie!</template>
</category>
<category>
<pattern>Cześć ^</pattern>
<template>Witam serdecznie!</template>
</category>
<category>
<pattern>Hej ^</pattern>
<template>Witam serdecznie!</template>
</category>
<category>
<pattern>Hejka ^</pattern>
<template>Witam serdecznie!</template>
</category>
<category>
<pattern>Siema ^</pattern>
<template>Witam serdecznie!</template>
</category>
</aiml>
Przetestujmy rozwiązanie w zakładce „Train”. Czy uzyskujemy odpowiedź bot’a na wszystkie przywitania?
Dodaj kilka swoich kategorii przywitań 🙂 . Użyjesz „*”, „^”, czy bez znaku specjalnego? Dlaczego?
Trochę losowości
W obecnym rozwiązaniu jesteśmy przygotowani na różne przywitania użytkownika. Za każdym razem odpowiadamy jednak w ten sam sposób „Witam!”. Nie jest to naturalne zachowanie dla człowieka i nie chcielibyśmy żeby nasz bot w ten sposób się zachowywał. Dodajmy więc trochę losowości do naszych odpowiedzi. Zmodyfikujmy jedną z kategorii dodając w <template> znacznik <random>. Przykładowa kategoria może wyglądać następująco:
<category>
<pattern>Witaj ^</pattern>
<template>
<random>
<li>Witam serdecznie!</li>
<li>Witaj.</li>
<li>Witaj, jak się masz?</li>
<li>No hej.</li>
<li>Dzień dobry.</li>
</random>
</template>
</category>
Przejdźmy ponownie do interakcji w zakładce „Train”. Jakie wyniki uzyskujemy? Dodajmy kilka odpowiedzi naturalnych dla nas 🙂 .
Zauważmy że do przywitania służy nam kilka kategorii. Jeśli chcielibyśmy dla każdej z nich wprowadzić losowość, wtedy musielibyśmy kopiować tę samą odpowiedź dla każdej z nich. Czy można to rozwiązać inaczej?
Redukcja
Tworząc bazę wiedzy bota często wykorzystuje się powtarzalne elementy, w tym odpowiedzi. Aby zapobiec kopiowaniu elementów korzystamy z redukcji. Jak ona działa? Wystarczy w odpowiedzi wskazać jaką inną kategorię wykorzystamy. Przykładowo:
<category>
<pattern>Cześć ^</pattern>
<template><srai>Witaj ^</srai></template>
</category>
Czy wpisując „Cześć” w zakładce „Train” otrzymujemy takie same odpowiedzi jak przy wpisaniu „Witaj”?
Zastosujmy redukcję dla pozostałych kategorii. Jak wyglądałby plik warsztaty.aiml, który dawałby taki sam rezultat lecz bez redukcji?
Poniżej przykładowa treść warsztaty.aiml pod koniec ćwiczenia:
<?xml version=”1.0″ encoding=”UTF-8″?>
<aiml version=”2.0″>
<category>
<pattern>Witaj ^</pattern>
<template>
<random>
<li>Witam serdecznie!</li>
<li>Witaj.</li>
<li>Witaj, jak się masz?</li>
<li>No hej.</li>
<li>Dzień dobry.</li>
</random>
</template>
</category>
<category>
<pattern>Cześć ^</pattern>
<template><srai>Witaj ^</srai></template>
</category>
<category>
<pattern>Hej ^</pattern>
<template><srai>Witaj ^</srai></template>
</category>
<category>
<pattern>Hejka ^</pattern>
<template><srai>Witaj ^</srai></template>
</category>
<category>
<pattern>Siema ^</pattern>
<template><srai>Witaj ^</srai></template>
</category>
</aiml>
Przejdźmy teraz do zakładki „Train”. Wpiszmy dowolne pytanie. Jakiej odpowiedzi udziela bot?
Nie wiem o czym mówisz
Każdy bot, nawet z bogatą bazą wiedzy natrafia w końcu na pytanie na które nie potrafi odpowiedzieć. Zmieńmy domyślną odpowiedź tak, aby była bardziej naturalna.
Przejdźmy do zakładki „Files”. Tym razem znajdźmy plik „pand_initial.aiml” i poszukajmy który fragment powinniśmy zmodyfikować aby domyślna odpowiedź była inna.
Musimy podmienić kategorię która przyjmuje dowolny ciąg wyrazów, czyli „*”. Przykładowa kategoria z ulepszoną domyślną odpowiedzią może wyglądać jak poniżej:
<category><pattern>*</pattern>
<template>Nie mam ochoty o tym rozmawiać. Powiedz mi coś o sobie.</template>
</category>
Czy moglibyśmy jeszcze poprawić domyślną odpowiedź? W jaki sposób?
Przykładowa zawartość pliku „pand_initial.aiml” powinna teraz wyglądać jak poniżej:
<?xml version=”1.0″ encoding=”UTF-8″?>
<aiml>
<!– File: update.aiml –>
<!– Author: Dr. Richard S. Wallace –>
<!– Last modified: August 10, 2013 –>
<!– –>
<!– This AIML file is part of the ALICE2 0.0.5 chat bot knowledge base. –>
<!– –>
<!– The ALICE2 brain is Copyright © 2013 by ALICE AI Foundation. –>
<!– –>
<!– The ALICE2 brain is released under the terms of the GNU Lesser General –>
<!– Public License, as published by the Free Software Foundation. –>
<!– –>
<!– This file is distributed WITHOUT ANY WARRANTY; without even the –>
<!– implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. –>
<!– –>
<!– For more information see http://www.alicebot.org –>
<!– –><category><pattern>*</pattern>
<template>Nie mam ochoty o tym rozmawiać. Powiedz mi coś o sobie.</template>
</category><category><pattern>BRAIN VERSION</pattern>
<template><program/></template>
</category><category><pattern>PROGRAM VERSION</pattern>
<template><program/></template>
</category><category><pattern>BRAIN BUILD</pattern>
<template><program><info>build</info></program></template>
</category><category><pattern>AIML MATCH LIMIT *</pattern>
<template>Match limit exceeded</template>
</category><category><pattern>AIML MATCH FAIL *</pattern>
<template>Match failed</template>
</category></aiml>
Zaczynamy interpretować
Wrażenie interaktywnej rozmowy można uzyskać powtarzając część wypowiedzi rozmówcy. Wykorzystamy do tego znacznik <star>. Przykładowo jeśli chcemy przywitać użytkownika po imieniu możemy dodać kategorię:
<category>
<pattern>Jestem *</pattern>
<template>Witaj <star/></template>
</category>
Możemy także wykazać się pomysłowością przewidując pytania na które odpowiedzi nie znamy ale możemy udzielić mniej generyczną odpowiedź niż ta domyślna, na przykład dodajmy taką kategorię:
<category>
<pattern>Co to *</pattern>
<template>Nie mam pojęcia co to <star/>. Jestem tylko maszyną.</template>
</category>
Nie zapomnij o pamięci
Jedną z podstawowych charakterystyk dobrego bota jest pamiętanie informacji, które przekazał człowiek. Spróbujmy zapamiętać imię które podał nam użytkownik:
<category>
<pattern>Moje imie to *</pattern>
<template>Dobrze wiedzieć, <set name=”imie”><star/></set></template>
</category>
Przejdźmy do zakładki „Train” i sprawdźmy czy otrzymamy spodziewaną odpowiedź. Teraz pozostaje jedynie dodanie kategorii, która wyświetli zapisane wcześniej imię.
<category>
<pattern>Jak mam na imie</pattern>
<template>Twoje imię to <get name=”imie”/>, prawda?</template>
</category>
Czy potrafiłbyś dodać nauczyć bota zapamiętywania nazwiska, wiek lub inne informacje?
Budowanie wiedzy
Zainteresował Cię AIML? To dopiero początek. Przejdź tutorial na stronie PandoraBots, sprawdź dostępne tagi języka AIML.