A Tutorial For Adding Knowledge To Your Robot
A Tutorial For Adding Knowledge To Your Robot
A Tutorial For Adding Knowledge To Your Robot
CopyrightbyDoublyAimless([email protected])May,2004Revision7.
AdditionaleditingbySeijiUmatani([email protected]).
TableofContents
Introduction
AWebofKnowledge
Howabout<that>?
Whatabout<topic>?
MakingKnowledgeContentChanges(BotProperties)
Somanywaystowritethesamething...Whatis<srai>?
HowaboutInternationalLanguages?
HowcanIdisplayPhotographsandotherImages?
HowtoJazzUpyourRobotwithHTMLSkins
Notes
Appendix
Glossary
References
Introduction
Thisisabrieftutorialdescribinghowyoucancreateandaddknowledgetoyourrobot.A
successfulrobotwillgiveresponsesthatappeartobecomingfromahuman.Yourgoalasthe
botmasterisverysimple:
"Buildcontentthatinducesthevisitortocarryonconversationswithyourrobotforaslongas
possible!"
Youdothisbycreatingavarietyofpotentialanswerstovariousquestions,orredirectinga
conversationtonewtopicsthattheclientfindsinterestingalwayswiththegoalofcontinuing
theinteractionsaslongaspossible.
Examplesofsuchrobotscanbefoundatthelinksbelow:
TheAnnualLoebnerContest:
www.loebner.net/Prizef/loebnerprize.html
MostPopularPandorabots:
www.pandorabots.com/botmaster/en/mostactive
DivaBotBeautyPageant:
http://www.internationallispconference.org/2002/Competitions/Chatterbots/ILC02
chatterbots.html
Pandorabotsallowsyoutoextendtheknowledgeofyourrobotviaaprogramminglanguage
calledAIML.ThegoalofthistutorialistoteachyoutheminimumofAIMLnecessarytomake
yourrobot"smarter"andbetterabletocarryonarealisticconversation.
ThisTutorialisadraftandunfortunatelyhaserrorsandomissions.Betterversionswillbe
forthcoming.Someofyouwillarguethatitwouldhavebeenbettertopostponepublication
yetthecryforsomekindofdocumentationwasjusttoomuch.Pleaseacceptmyapologies
forthisdraft'sroughness.PleasemailcommentsandproblemstotheattentionofDr.Doubly
[email protected].
Moredetailsontheinformationinthistutorialcanbefoundinthereferenceslistedattheend.
Inparticular,thelatestversionoftheAIMLspecificationcontainsmanyofthedetailsomitted
inthisdocument.
Therobotsdiscussedinthisdocument,andonwww.pandorabots.com,arebasedonAIML
andspringentirelyfromtheworkofDr.RichardWallaceandtheA.L.I.C.E.andAIMLfree
softwarecommunitybasedathttp://www.alicebot.org.
AWebofKnowledge
Someofyoumightfindthismetaphorhelpfulforvisualizinghowknowledgeislaidoutinyour
robot.Imagineaspiderwebithasacenterwithspokesradiatingoutwardsfromthecenter.
Yourrobot'sknowledgeisstoredinaKnowledgeWeb,andlikethespider,yourrobotdarts
outinresponsetosomesortoftugitsensesintheweb.Understandinghowtostore
knowledgeisourfirsttask.Becauseitistoohardtodrawthewholeweb,intheexamples
thatfollow,onlyaportionofthewebwillbeshownsopleaseuseyourimaginationforthe
rest.
Startingatwww.pandorabots.com,ifyouhavenotalreadydoneso,createanaccountand
onceloggedin,createarobotbyclickingonCreateaPandorabot(it'satthetopofthe
screen).Onthenextscreen,nameyournewrobot,Full(forfullofknowledge)andmakesure
theradiobuttonlabeled,"DrWallace'sA.L.I.C.EMarch2002"isselected(see[1]).After
clickingonCreatePandorabottocreateyournewrobotthenextscreenwillshow:
"Thispandorabotisnotpublished.Whenyouareready,youcanpublishyour
pandorabottomakeitavailableforotherstochatwith.Youmayfirstwantto
customizeyourpandorabotbychangingsomeofitspropertiesorbyprovidingyour
owncustomresponseswiththetraininginterface."
ClickontheTrainlinkonthesecondrowofmenubuttonstobegininteractionswithyour
robot.Thisrobotalreadyhasasubstantialknowledgebase(taughtbyDr.RichardWallace)so
let'sstartbyposingthequestion:
Human:Doyouloveme?
Full:YesIloveeveryone.
Toaskthisquestion,typein"Doyouloveme?"inthetextfieldlabeledHuman:andthen
pressEnterorclickontheAskbuttontotherightofthetextbox.
Therobotknewinadvancehowtoanswerthisquestion.Howspecificallydidtherobot
discovertheanswer?Firsttherobotcheckedifitsknowledgealreadycontainedthequestion
"Doyouloveme?"Andsecond,findingit,checkedtoseeifithadbeentaughttorespondwith
somethingmeaningful.
Categories
Thewordsinthesentence"Doyouloveme?"canbevisualizedbyaseriesoflines(orlinks)
andnodes,intheknowledgeweb.ThisisillustratedbelowinPicture1.0.Thelinksarelabeled
bythewords(youcanthinkofthenodesasrepresentingthespacesbetweenthewords)and
formachainstartingfromthecenterofthewebandmovingoutwards.
FindingthequestionintheKnowledgeWeb,therobotreplieswiththeinformationwetaughtit
(residinginaResponseTemplateandreferredtoasthetemplate).So,inotherwords,the
specificquestion"Doyouloveme"canbevisualizedasakindofpathbeginningatthe
centeroftheKnowledgeWebandbuiltupbyaseriesoflinksandnodes,andthatfinally
terminatesinaResponseTemplate.
ThespecificpaththroughtheKnowledgeWebalongwiththe(Response)Templateiscalleda
category.If,forexample,youteachtherobottorespondwith:"yes,butonlywhenyouare
good"youonlychangetheResponseTemplate.
MoreaboutCategories
Let'sstartoverwitharobotthathasnoknowledge.Createanewrobotexactlyasbefore
exceptthatthistime,nametherobotEmptyandselecttheradiobuttonlabeled,"Noinitial
content,thepandorabotstartswithnoknowledge".Again,oncetherobotiscreated,
clickonTraintostartinteractingwithit.
Initially,Picture1.1showsEmpty'sverysimpleKnowledgeWeb.OneCategoryisshownand
noticetheResponseTemplatecontainstheonesentence"Ihavenoanswerforthat".Youwill
alsonotice*,<that>and<topic>labelingthelinksbetweenthenodes.Thelabels*,
<that>and<topic>arespecialoptionalvariantsofferingenhancementstoCategories.Aswe
shallsee,thesespeciallabelsextendthematchingpoweroftheCategories.
SowhatdoesthisoneCategorydo?Tobeginwiththe*labelallowsanyinteractionwith
Emptytoreturnthesameresponse:
Human:Hello
Empty:Ihavenoanswerforthat
Human:abc
Empty:Ihavenoanswerforthat
Moregenerally,wordsorsentencesprovidedtotherobotarecalledtheInputPattern.You
canvisualizeanysentenceexistingintheKnowledgeWebasapathoflinkednodes,
terminatingwithaResponseTemplate.Therobotsearchesforapathoflinkednodesthat
exactlymatchestheInputPattern.Whenapathisfound,wesaythatthepathmatchesthe
InputPattern.
DefaultResponses
IthappensoftenthatanInputPatternwillnotbefoundintheKnowledgeWebyetwestill
wanttherobottorespondwithsomethingmeaningful.WecallthistheDefaultResponse
Templateandittypicallyconsistsofsentencesdesignedtokeeptheconversationgoing.
WecanvisualizetheDefaultCategory(apathemptyofallwordsandit'sResponseTemplate)
byPicture1.1(picturedabove).The*willmatchanywords.The<that>and<topic>willbe
explainedlater.
Inordertoteachyourrobottosay"Hithere!"inresponseto"Hello",dothefollowing:
1.Makesureyou'reontherobot'sTrainingpage(ifnotclickonTrain)
2.Typein"Hello"intheboxlabeledHuman:.
3.ClickonAsk(orpressEnter)
4.Aftertherobotresponds,typein"Hithere!"intheboxlabledEmpty:
5.ClickonSayInstead(orpressEnter)
6.Verifyyourchangebyclickingon(thefirst)AskAgainbutton.
NowtheKnowledgeWeblookslikePicture1.2
Therobothasjusttworesponsesnowandisincapableofsupportingitssideofan
interestingconversation.Let'smakesomemorechanges.Inresponsetoyoutypinganything
butHello(theoneinputpatternthatEmptynowknowsabout)Emptywillrandomlypresent
youwiththreepossibleresponses.Type:
Human:hi
Empty:Ihavenoanswerforthat
Next,clickonAdvancedAlterResponseandintheboxinthepatterncolumn,replaceHI
with*,whichmeansthatanythingyoutypeinwillbematchedwitharesponse.Nowlet'sadd
threerandompossibleresponses.Intheboxlabeledtemplateadd:
<random>
<li>Whatisyourname?</li>
<li>Whatisyourfavoritemovie?</li>
<li>Willyoubuymeadrink?</li>
</random>
andclickontheSubmitbutton(atthebottomleftofthepage).Foranexplanationofthe
syntaxusedabovesee[2].
TheKnowledgeWebnowlookslikePicture1.3.
We'vechangedtheDefaultCategorybychangingtheDefaultResponseTemplatefrom"Ihave
noanswertothat"tooneofthreerandomlychosenresponses.
Likeahapless,butprecociouschildfailingtounderstandwhatisbeingsaid,yetunwillingto
beabandoned,Emptyattemptstoprolongtheconversationbyofferingachoiceofthree
"pickup"lineshopingtochangethesubject.Emptyprofferspickuplinesrandomlyhopingto
disguisehowlittleitactuallyknows.Checkthisyourselfbytypinganythingbut"Hello".
ClickontheAskThisAgainbuttonenoughtimestocyclethroughallofthepickuplines.
SavingyourWorkandStartingOver
Forreasonsyou'llseelater,mostofthetimeyou'llwanttoavoidchangingtheUltimate
DefaultCategory.Let'sgobacktothebeginningandstartover,andsimultaneouslylearn
howtosavefiles.
ToviewtheAIMLfilesforaparticularrobot,clickontheAIMLlink(thisisnearthetopofthe
screen,onthesecondrowoflinks).Ifyoudon'tseethislinkbutinsteadseeatableofall
yourrobots,you'llfirstneedtoclickonthenameoftherobotEmptyinthiscase.
Scrolldownuntilyouseeasectionlikethis:
Belowthefirstheading,Filenameyou'llseeafilenamed,update.aiml(everyrobothastheir
ownuniqueversionofthisfile)thatcontainsanychangesthatyoumadetotherobot's
responsesusingtheTrainingInterface.
Clickon,update.aimlandthenscrolldowntothetextarea.Hereyoumayeditandsavethe
robot'sresponsesonline.Afteryou'veeditedthetext,besuretoclickonthe,SaveAs
buttontomakeyourchangespermanent(see[3])
AsanalternativetoeditingtheAIMLfileonline,youcanusetheDownloadlinknexttothe
filenametodownloadalocalcopywhichyoucantheneditwithanXMLeditoronyourown
computer(possiblywhilenotonline).YoucanlaterusetheformatthebottomoftheAIML
filespagetouploadthemodifiedAIMLbacktoPandorabots.It'salsonotabadideatokeep
alocalcopyofyourAIMLincaseyouaccidentallydeleteitontheserver.
Let'slookatthefileforaminute(shownbelowwithsomeminorreformatting).Thefirstline
(ofheaderinformation)tellusthetypeofcharactersetandversionsofXML(see[4])weare
using.ThenextlinetellsusweareusingAIMLversion1.0.
<?xmlversion="1.0"encoding="UTF8"?>
<aimlversion="1.0">
<category>
<pattern>HELLO</pattern>
<template>Hithere!</template>
</category>
<category>
<pattern>*</pattern>
<template>
<random>
<li>Whatisyourname?</li>
<li>Whatisyourfavoritemovie?</li>
<li>Willyoubuymeadrink?</li>
</random>
</template>
</category>
</aiml>
Categoriesarespecifiedbytheinformationbetweenthebeginningandendinglinesinthe
form:
<category>...information...</category>
Similarly,theinputwordsarespecifiedby:
<pattern>...information...</pattern>
Theoutputresponseisspecifiedbytheinformationbetween<template>and</template>.
Theitemsbetween"<"and">"arecalledAIMLtagsorelements.EachAIMLtaghasan
openingtagandaclosingtagoftheform:
<sometag>...information...</sometag>
Itsometimeshappensthatthereisnoinformationbetweentheopeningandclosingtagsand
youcanusetheabbreviation:
<sometag/>
(notethe"/"afterthetagname)asareplacementfor:
<sometag></sometag>
EachtimeyouclickontheSubmitbuttonontheAdvancedAlterResponsepage(orclick
onSayInstead)theeffectistoaddnewinformationtothefile,update.aiml.Agoodwayto
learnAIMLsyntaxistoexaminethemodifiedupdate.aimlfileasshownabove.
AnotherrandomCategory
Nextwe'regoingtocreateanewversionofEmptyandagaincreateacategoryusing
<random>.However,thistimewewon'tdefineitasthedefaultcategory.Thisexampleis
usedasthebasisforthefourthexampleinthenextsection.
CreatingaNewVersionofEmpty
FirstclickonMyPandorabotsandtheninthetableofrobots,clicktheradiobuttonnextto
thename,Empty.Fromthedropdownmenubelow(it'sinitiallylabeled,Publish)select
Delete.Nextclickonthe,OKbuttonontherightandconfirmthatyouwanttodeletethe
robot,Empty.
Then,simplyrepeattheprocedureyoufollowedforcreatingthefirstrobot,Emptyandyou'll
haveafreshemptyrobot.
BeingemptyofknowledgetheonlythingEmptycansayis:
Empty:Ihavenoanswerforthat
Let'sincreasethepossibilitiesforaninterestingconversationbygivingfourpossiblerandom
responsestothenextinquiry.
Human:Youdolovemedon'tyou
Empty:Ihavenoanswerforthat
AftertypingtheaboveintotheTraininginterface,clickonAdvancedAlterResponseandin
theboxlabeledtemplateadd:
<random>
<li>Idon'tknow,whathaveyoudoneformelately?</li>
<li>Yes,butyouhavetoreallytrytomakemehappier...</li>
<li>Stopyourwhining!</li>
<li>Yes,butonlywhenyouaregoodtome</li>
</random>
...andasbeforeclickontheSubmitbutton.Next,clickontheAskAgainbuttonenough
timestocyclethroughthecompletesetofresponses.TheKnowledgeWebnowlookslike
Picture1.4.
Contractionslike"don't"areexpandedto"donot",so:"youdolovemedon'tyou?"is
transformedtotheratherawkward,"youdolovemedonotyou"(see[5]).
Howabout<that>?
Using<that>therobotiscapableofrememberingwhatitsaidinthepreviousinteraction.
Andconversationscanbecomemoremeaningful.<that>wasnamedandarosefrom
analyzingaconversationalexchangeslike:
Empty:TodayIloveyou.
Human:Thatiswonderful.
Empty:But,willIstillloveyoutomorrow?
Human:ThatiswhatIwanttofindout.
Firstweneedacategorythatisusefulforworkingwith<that>expressions.Enterthis
categoryintoEmptylikethis:
Human:say*
Empty:Ihavenoanswerforthat
ClickonAdvancedAlterResponse.
Noticethecontentsoftheboxinthepatterncolumnarethebeginningofanewcategory:
"SAY*"(thereisaspacebetweenSAYand*)
Intheboxlabeledtemplateadd:
<star/>
...andSubmitthenewAIML.(Recallthat<star/>isashorterwayofwriting<star>
</star>see[2].)Theeffectofthischangeistomatchanything.Sonow,"Saysomething"
willalwaysset<that>to"something."Forexample:
Human:sayIloveyou
Empty:Iloveyou
Wearegoingtousethiscategorytotestourcategoriesthatuse<that>.
Example1Whoareyou?
Atsomepointyourrobotmightwanttoknowwhoitistalkingto.Hereishowtodothis:
Human:*
Empty:Ihavenoanswerforthat
ClickonAdvancedAlterResponse.
Checktheboxlabeled"newcategorydependsonthat"andreplacethetextbox'scontents
with:
WHATISYOURNAME
Noticetheboxinthepatterncolumncontains"*"meaningthatanyresponsewillbe
matched.Intheboxlabeledtemplateadd:
Nicetomeetyou<setname="name"><person/></set>.
ThislastbitofAIMLcodegrabstheperson'sname.
Nowasktherobot,"Saywhatisyourname,"togeneratethestateinwhichthenextinputwill
activatethe<that>category.
Human:saywhatisyourname
Empty:whatisyourname
Human:Mr.Lovejoy
Empty:NicetomeetyouMr.Lovejoy.
Example2YESandNOQuestions
Use<that>forcategoriesthatseekyesandnoresponses.Hereisanexamplefor"yes"
questions:
Human:yesEmpty:Ihavenoanswerforthat
ClickonAdvancedAlterResponse.
Checktheboxlabeled"newcategorydependsonthat"andreplacethetextbox'scontents
with:
AREYOULOOKINGFORLOVE
Noticetheboxinthepatterncolumncontains"YES".Intheboxlabeledtemplateaddfour
randomresponses:
<random>
<li>Aren'twealllookingforlove?</li>
<li>Wellyou'vecometotherightplace!</li>
<li>Andwhatkindoflovearewelookingfortoday?</li>
<li>WellIamoverflowingwithLoveforyoutoday</li>
</random>
Now,therobotshouldbeabletorecognizethe"yes"response:
Human:sayareyoulookingforlove?
Empty:areyoulookingforlove
Human:yes
Empty:Wellyou'vecometotherightplace!
Example3DiscoveringwhatknowledgetoaddtoaRobot
TheAIMLtag<that>referstowhateverEmptylastsaid.Use<that/>andadefault
templatetoaddnewknowledge:
Human:Why
Empty:Ihavenoanswerforthat
Enterasthealternativeresponse:
"<that/>"?Why?
andclickonSayInstead.
Thiscategoryenablesthefollowingdialoguefragment:
Empty:Donotaskmeanymorequestionsplease.
Human:Why?
Empty:"Donotaskmeanymorequestionsplease"?Why?
ThebotmasternoticesthefragmentandcreatesthenewAIMLcategory:
<category>
<pattern>WHY</pattern>
<that>DONOTASKMEANYMOREQUESTIONSPLEASE</that>
<template>BecauseIwouldrathertalkaboutyou.</template>
</category>
Nowthenextclientwhoasks"Why?"totherobot'srequestwillactivethenew<that>
category:
Empty:Donotaskmeanymorequestionsplease.
Human:Why?
Empty:BecauseIwouldrathertalkaboutyou.
Thisstyleofconversationalanalysisdoesnotpresupposethatweknowwhentheclientwill
say"Why?"ratheritlooksbackwardtoidentifycaseswherethe"Why?"appearedfollowing
oneoftherobot'sstatements.Havingidentifiedtheconversationpoint,thebotmastercreates
thenewcategory.
Example4ContextSensitivePatterns
Let'slookataslightlyconvolutedexample.Followingonfromanearlierexampleinthe
previoussection,clickonAskAgainenoughtimestogettheresponseinthefirstexchange
below:
Human:Youdolovemedon'tyou
Empty:Yes,butyouhavetoreallytrytomakemehappier...
Human:ButItrysohardtopleaseyou...
Empty:Ihavenoanswerforthat
ClickonAdvancedAlterResponse
Checktheboxlabeled:"newcategorydependsonthat"whichshouldcontain"YESBUTYOU
HAVETOREALLYTRYTOMAKEMEHAPPIER"Noticetheboxinthepatterncolumncontains:
"BUTITRYSOHARDTOPLEASEYOU"
Intheboxlabeledtemplateadd:
Andsometimesyousucceed,it'sjustthatyoucoulddosomuchbetter.
Soonlywhentherobot'srandomresponsematchestheinteractioninthenextexchange:
Human:youdolovemedon'tyou?
Empty:Yes,butyouhavetoreallytrytomakemehappier...
Youcantypein:
Human:ButItrysohardtopleaseyou...
Empty:Andsometimesyousucceed,it'sjustthatyoucoulddosomuch
better.
Exceptforthecasementionedabove,therobot'sresponseto:
Human:ButItrysohardtopleaseyou...
willbe:
Empty:Ihavenoanswerforthat
Picture1.5showsthesituation.
So,<that>modifiesacategorymeaningmatchthecategoryonlyiftherobotsaidwhat
followsthe<that>inthepreviousutterance.Continuingwiththisexample:
Human:Youjustdon'tappreciateme,youtakemeforgrantedandwalk
alloverme...
Empty:Ihavenoanswerforthat
ClickonAdvancedAlterResponse
Checktheboxlabeled:"newcategorydependsonthat"(whichnowcontainsthecontentsof
lastResponseTemplate):"ANDSOMETIMESYOUSUCCEEDITISJUSTTHATYOUCOULDDO
SOMUCHBETTER"
Noticethecontentsoftheboxinthepatterncolumnarethebeginningofanewcategory
"YOUJUSTDONOTAPPRECIATEMEYOUTAKEMEFORGRANTEDANDWALKALLOVERME"
Intheboxlabeledtemplateadd:
Ifyouworkedharderitwillhelpmetodevelopmoreenthusiasmfor
appreciatingyouwhatdoyouwantmetodo?Fakemyappreciationor
reallyfeelit?
Withthesechangesthefollowinginterchangesarepossible(clickonAskAgainenoughtimes
togenerateEmpty's(random)responseinthefirstexchangebelow):
Human:youdolovemedon'tyou?
Empty:Yes,butyouhavetoreallytrytomakemehappier...
Human:butItrysohardtopleaseyou...
Empty:Andsometimesyousucceed,it'sjustthatyoucoulddosomuch
better
Human:Youjustdon'tappreciateme,youtakemeforgrantedandwalk
alloverme...
Empty:IfyouworkedharderImightbeabletodevelopalittlemore
enthusiasmforappreciatingyouwhatdoyouwantmetodo?
Fakemyappreciationorreallyfeelit?"
Picture1.6showsthecurrentstateofknowledge.
Thecontentsofthefileupdate.aimlnowinclude:
<category>
<pattern>YOUDOLOVEMEDONOTYOU</pattern>
<template>
<random>
<li>Idon'tknow,whathaveyoudoneformelately?</li>
<li>Yes,butyouhavetoreallytrytomakemehappier...</li>
<li>Stopyourwhining!</li>
<li>Yes,butonlywhenyouaregoodtome</li>
</random>
</template>
</category>
<category>
<pattern>BUTITRYSOHARDTOPLEASEYOU</pattern>
<that>YESBUTYOUHAVETOREALLYTRYTOMAKEMEHAPPIER</that>
<template>
Andsometimesyousucceed,it'sjustthatyoucoulddosomuch
better
</template>
</category>
<category>
<pattern>
YOUJUSTDONOTAPPRECIATEMEYOUTAKEMEFORGRANTEDAND
WALKALLOVERME
</pattern>
<that>
ANDSOMETIMESYOUSUCCEEDITISJUSTTHATYOUCOULDDOSOMUCH
BETTER
</that>
<template>
Ifyouworkedharderitwillhelpmetodevelopmoreenthusiasm
forappreciatingyouwhatdoyouwantmetodo?Fakemy
appreciationorreallyfeelit?
</template>
</category>
Whatabout<topic>?
TopicletsyougrouptogetherCategories.PresentedInputpatternsaresearchedformatching
categorieswithintherobot'sknowledgeweb.Ifmorethanonematchingcategoryisfound,
therobotmatchesthe<that>patternsnext,andifmorethanoneoftheseexist,therobot
matches<topic>next.
Categoriesarestoredinalphabeticalorderbypattern.InputstobematchedtoCategoriesare
comparedinreverseorder.Sowhentheinputmatchesmorethanonecategorythelastoneis
taken.TypicallywemightwanttobundleupabunchofCategoriesintoonegeneraltopic.So
lackinganadequateresponseandknowingthatwehaveaspecificTopic,therobotcan
generatespecificpickuplinesandkeeptheconversationgoing.Howdowedothis?
Example5UsingTopics
EnterthiscategoryintoEmptybytypingthis:
Human:*
Empty:Ihavenoanswerforthat
ClickonAdvancedAlterResponseandnoticethecontentsoftheboxinthepatterncolumn
contain"*"whichmatchesanything.
Checktheboxlabeled:"newcategorydependsontopic"andinthetextboxaboveadd:
GIRLS
Intheboxlabeledtemplateadd:
<random>
<li>Iwonderwhataboutthemyoulikebest?</li>
<li>I'vebeenknowntolikegirlstoo!</li>
<li>Canyoudistinguishbetweengirlsandwomen?</li>
<li>Isthereanythingyoudon'tlove?</li>
</random>
We'vechangedthedefaultresponsecategorywhenwearetalkingaboutgirls.Emptyuses
oneoffourrandomlychosenpickuplinestocontinuetheconversation.Beforewecantestor
usethisnewcategory,wehavetochangethetopic.Andwecanusethistoteachalittle
moreabouttheinterface.Enterthefollowing:
Human:topic*
Empty:Ihavenoanswerforthat
ClickonAdvancedAlterResponseandnoticethecontentsoftheboxinthepatterncolumn
contains:"TOPIC*"
Intheboxlabeledtemplateadd:
<think>
<setname="topic">
<star/>
</set>
</think>
OK,I'veresetthetopicto<star/>.
We'vecreatedanewcategoryandwrittenalittlebitofAIMLcodeandusedittochangethe
<topic>.The<think>tagsdemarcatea"hidden"sequenceofinstructionshiddeninthe
sensetheclientwillnotseethem.The<set>tagsdemarcatethewaywechangethetopic
(whichischangedtotheinputpatternmarkedbythesingletontag<star/>alistofthe
AIMLTagsisavailableatthetimeofthiswritingat:
http://www.alicebot.org/committees/architecture/resolutions/aiml10.html).
Withthisnewcategorywecanchangethe<topic>asin:
Human:topicgirls
Empty:OK,I'veresetthetopictogirls.
Human:Ilovegirls
Empty:Isthereanythingyoudon'tlove?
Nowwecancreateacaterorytogetbacktothedefaultstateofnotopic.Enterthefollowing:
Human:notopic
Empty:I'vebeenknowntolikegirlstoo!
ClickonAdvancedAlterResponseandintheboxlabeledtemplateadd:
<setname="topic"/>done
Resultingin:
Human:notopic
Empty:done
Let'sfirstaddsomemoreknowledgetoEmpty.
Human:Youdoloveme?
Empty:Ihavenoanswerforthat
TeachEmptyinsteadtosay"Yes,butonlywhenyouaregoodtome".
Changingtheinputto:
Human:Doyouloveme?
Empty:Ihavenoanswerforthat
Again,teachEmptyinsteadtosay:"Yes,butonlywhenyouaregoodtome".
Now,eitherinputpatterns"Youdoloveme?"or"Doyouloveme?"promptstheresponse:
Empty:"Yes,butonlywhenyouaregoodtome".
Fromtheviewpointofknowledgecontent,Picture2.0describesthecurrentstate.
Sonext:
Human:Don'tyouloveme?
Empty:Ihavenoanswerforthat
Teachitinsteadtosay:"Yes,butonlywhenyouaresweettome".
Sowecanalsohavethefollowinginteraction:
Human:Don'tyouloveme?
Empty:Yes,butonlywhenyouaresweettome.
Nowwe'lladda<topic>andremindourselveshowtosaveanduploadfiles.
ToviewtheAIMLfilesforaparticularrobot,clickontheAIMLlink(thisisnearthetopofthe
screen,onthesecondrowoflinks).Ifyoudon'tseethislinkbutinsteadseeatableofall
yourrobots,you'llfirstneedtoclickonthenameoftherobotEmptyinthiscase.
Scrolldownuntilyouseeasectionlikethis:
Belowthefirstheading,Filenameyou'llseeafilenamed,update.aiml(everyrobothastheir
ownuniqueversionofthisfile)thatcontainsanychangesthatyoumadetotherobot's
responsesusingtheTrainingInterface.
Clickon,update.aimlandthenscrolldowntothetextarea.Undertheline:
<aimlversion="1.0">
Addtheselines:
<topicname="LOVE">
<category>
<pattern>*</pattern>
<template>
<random>
<li>Howmuchdoyouloveme?</li>
<li>Whydon'tyouevershowmeyouloveme?</li>
<li>Whyisitsodifficultforyoutoshowaffection?</li>
<li>Yourcoldnesschillsmetothebone</li>
</random>
</template>
</category>
Finally,addtheline:
</topic>
attheendofthefile,sothatthelasttwolineslooklikethis:
</topic>
</aiml>
SaveyourchangedfileandthenclickontheTrainlinkonthesecondrowofmenubuttonsto
resumeinteractionswithyourrobot.Theselastchangesonlybecomerelevantwhenthetopic
is"LOVE".Inotherwordstherobotwillrespondtoanythingelseyoutypewith,"Ihaveno
answerforthat".
Tosetthetopic,typein"*"andputthislineintothetemplatebox:
<setname="topic">love</set>
Wheneverthetopicis"LOVE"andtherobotlacksaresponse,yourrobotwillresponsewith
oneofthefourpossiblelinesenteredabove.
MakingKnowledgeContentChanges(BotProperties)
AswehaveseenAIMLusespatternmatchingtoselectacategorybasedontheclient's
input.Eachcategoryhasaresponsetemplatewhichdefinestherobot'sresponse.Withina
template,thebotmastercanreferto"BotProperties"whichallowsthesamesetofAIML
filestobeusedtocreatedifferentrobotseachwithadistinctandpersonalidentity.
Forexample,Dr.RichardWallace'sMarch2002AIMLsetincludesthecategory:
<category>
<pattern>WHOISYOURFAVORITEBAND</pattern>
<template>
Myfavoritegroupis<botname="favoriteband"/>.
</template>
</category>
Thismakesareferencetothe"favoriteband"propertyandthispropertycanbeset
individuallyforeachrobotthatusesthisAIMLset.
Toseehowtosettheproperty,gototherobotyounamedFull(createdatthebeginningof
thetutorial).
FirstclickonMyPandorabotsandtheninthetableofrobots,clickonFull.Nextclickonthe
Propertieslinkonthesecondrowofmenubuttons.
Hereyou'llseealistofBotPropertiesbasedontheAIMLset.Byfillingtheseoutandclicking
onSubmitChangesyoucancustomizeyourrobot'sresponses.Forexampleaftersetting
"favoriteband"tobe"TheBeatles",Fullwouldrespond:
Human:Whatisyourfavoriteband?
Full:MyfavoritegroupisTheBeatles.
ThePropertiespagealsoallowsyoutoaddyourownpropertieswhichyoucanrefertoin
anyAIMLresponsetemplatesyoucreate(eitherbyeditingtheAIMLdirectlyorthroughthe
Traininginterface).Asanexample,wecandefineanewproperty"weather",withaninitial
valueof"rainy".TemplateresponsescannowrefertothevalueofweatherusingAIMLlike:
Theweatheris<botname="weather"/>
Somanywaystowritethesamething...Whatis<srai>?
Youcanwriteasentencewiththesamemeaninginmanydifferentways.Mostpeoplewould
acceptthefollowingsentencesasroughlyequivalent:
Empty,canyoupleasetellmeifyouareseeinganyoneelserightnow?
Empty,canyoupleasetellmeifyouareseeinganyoneelsenow?
Empty,canyoupleasetellmeifyouareseeinganyoneelse?
Empty,pleasetellmeifyouareseeinganyoneelse?
Empty,tellmeifyouareseeinganyoneelse?
Empty,tellme,areyouseeinganyoneelse?
Empty,areyouseeinganyoneelse?
Areyouseeinganyoneelse?
Andthisisanexampleofageneralproblemhowdoyouenterallthecategoriesforinputs
withequivalentmeanings?Orhowdoyouanswerthesekindsofquestions?Noonehas
providedasatisfactorymechanismforfindingallthesimilarsentences.Hereiswhatcanbe
donethough.
Inthisexamplewearegoingtouseanewtagandintroducethe"_"character.Earlierwe
wrotethat"*"matchesanypattern."_"isanotherformof"*"andisusefulformatching
patternsattheendsofsentences.Thecategorycontaining"*NOW"willbematchedafterthe
onecontaining"_NOW".
Let'sbeginbyaddingtwonewcategoriessothatEmptyrespondsasfollows:
Human:Areyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Youareseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Then,byaddingthecategory:
<category>
<pattern>EMPTY*</pattern>
<template>
<srai><star/></srai>
</template>
</category>
Emptyrespondswith:
Human:Empty,areyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Adding:
<category>
<pattern>_TELLME*</pattern>
<template>
<srai><star/></srai>
</template>
</category>
...produces:
Human:Empty,tellmeareyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Adding:
<category>
<pattern>_TELLMEIF*</pattern>
<template>
<srai><star/></srai>
</template>
</category>
...produces:
Human:Empty,tellmeifyouareseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Finally,afteradding:
<category>
<pattern>_NOW</pattern>
<template>
<srai><star/></srai>
</template>
</category>
<category>
<pattern>_RIGHTNOW</pattern>
<template>
<srai><star/></srai>
</template>
</category>
...wecannowgetthesameanswertoallthequestions:
Human:Empty,canyoupleasetellmeifyouareseeinganyoneelseright
now
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,canyoupleasetellmeifyouareseeinganyoneelsenow?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,canyoupleasetellmeifyouareseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,pleasetellmeifyouareseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,tellmeifyouareseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,tellmeareyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Empty,areyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
So,whathashappenedhere?We'vesimplifiedprogressivelymorecomplexsentencesinto
two"standard"sentences:(Areyouseeinganyoneelse?andYouareseeinganyoneelse?)
Thegeneraltechniqueiscalledrecursionanditmeansapplyingthesamesolutioninthis
example<srai><star/></srai>overandoveragain.Recursionisusefulforavarietyof
tasks.Wewilljustmentionafewhere.MoredetailscanbefoundinTheAnatomyofAlice.
Example6HandlingMultipleSentences
Thefollowingexchangeisgeneratedwiththecategoriesbelow.(Yourrobotcanhandle
multiplesentencesanddoesitbyrespondingtoeachoneinturninseparateoutputlines.)
Human:Empty,areyouseeinganyoneelse?
Empty:EveryoneIrunintoiseithersomeoneI'vealreadyseenorsomeone
Iamgoingtoseeinthefuture.
Human:Isee.
Empty:Iamgladyousee.
Human:Whydoyouthinkyoucangetawaywiththat?
Empty:Fulldisclosureisalwaysbestdon'tyouthink?
<category>
<pattern>ISEE*</pattern>
<template>
<srai>ISEE</srai>
<srai><star/></srai>
</template>
</category>
<category>
<pattern>ISEE</pattern>
<template>Iamgladyousee</template>
</category>
<category>
<pattern>
WHYDOYOUTHINKYOUCANGETAWAYWITHTHAT
</pattern>
<template>
Fulldisclosureisalwaysbestdon'tyouthink?
</template>
</category>
Example7SpellingandGrammarcorrections
Oftenwewanttocorrectspellingerrorsorsuggestalternateformsofgrammarandhereis
onewaytodoit:
<category>
<pattern>YOURA*</pattern>
<template>
Ipresumeyoumean"youarea..."<srai>YOUAREA<star/></srai>
</template>
</category>
Example8Keywords
Sometimeswewanttherobot'sresponsetobedeterminedbyjustoneword(akeyword)
you'vetyped.Hereisanexampleinwhichthekeywordis"LOVE":
<category>
<pattern>LOVE</pattern>
<template>Tellmemoreaboutwhatyouareseeking.</template>
</category>
<category>
<pattern>_LOVE</pattern>
<template>
<srai>LOVE</srai>
</template>
</category>
<category>
<pattern>LOVE_</pattern>
<template>
<srai>LOVE</srai>
</template>
</category>
<category>
<pattern>_LOVE*</pattern>
<template>
<srai>LOVE</srai>
</template>
</category>
Thefirstcategorymatchesthesinglewordinputoflove.Thesecondandthirdcategories
matchasentenceendinginloveandbeginninginloverespectively.Thefinalcategory
matchesasentenceinwhichthewordloveappears.
HowaboutInternationalLanguages?
Yourrobotcanhandleanyinternationalcharacterset.Wecouldhaveaskedtherobota
similarquestioninJapanese:
Human: ?
Full:Ihavenoanswerthat
CertainlanguagesuchasChineseandJapaneseassumenospacesexistbetween"words".For
Japanese,Pandorabotscanautomaticallyacceptsentenceslackingspacesfromclientsand
storetheminternallywithspacesinsertedbetween"words".InordertohavePandorabotsdo
this,whenyoucreatetherobot,youshouldchecktheboxannotatedwith:automatically
discoverspacesbetweenwords(suggestedforJapanese).
AsimilaralgorithmcanalsobeusedforChinesethoughatthetimeofthiswritingremains
unimplemented.UsingthealgorithmforJapaneseonChinesesentencesresultsinspaces
inappropriatelyinserted.Ineithercasethebotmaster'sjobofmatchinginputpatternsis
considerablysimplifiedbytheautomaticinsertionofsuchspaces.
HowcanIdisplayPhotographsandotherImages?
Responsetemplatescandofarmorethanprovideresponses.Theycanrunarbitraryprograms
andservepagesfromotherwebsites.Youcan,forexampleaskEmptytoshowapictureof
anotherpersonandthepicturecanbeanywhereontheweb.
Human:Showmewhatyouthinkloveis.
Empty:Ihavenoanswerforthat
Enterasthealternativeresponse:
Thisisoneofmymanypicturesoflove:<br/>
<imgsrc="http://www.pandorabots.com/pandora/pictures/cn.jpg"
width=100height=100/>
Youcanalsosimplifysomeofthetypingbyclickingonthe<img>buttonontheAdvanced
AlterResponsepagenexttothetemplatebox.
Eitherway,thisshouldchangetherobotsresponseto:
Human:Showmewhatyouthinkloveis.
Empty:Thisisoneofmymanypicturesoflove:
HowtoJazzUpyourRobotwithHTMLSkins
ThePandorabotsinterfaceoffersyoutheabilitytoeasilycustomizeyourrobot'spageinany
waythatyoulike.You'llfindthataddingafacetoyourrobotwillmakeitmuchmore
personabletoyourvisitorsthanthestandarddefaultblankpage.Andwillalsoincreasethe
rateofreturnvisitswhich,ofcourse,iswhatyouwant.
Ifyouhaven'taddedafacetoyourrobot,youshouldconsiderdoingsonow.The"Skin"code
iswritteninbasicHTMLwhichmakesitveryeasyforyoutocustomize.Andsinceyoucando
thisonline(orofflineifyouprefer),anychangesthatyoumakewillshowupimmediately.
CreatingYourHTMLSkin
1.Clickon,Empty.
2.Clickon,CustomHTML(atthetopofthescreen).
3.Clickon,CreateanewcustomHTMLfile(it'sinthebodytext).
4.EnteryourHTMLcodeinthetextwindow.Whenyou'redone,namethefile,"empty"(do
nottypethe".html"extensioninthefilename)andthenclickonthe,SaveAsbutton
below.
Note:YoucancreatemultipleHTMLSkinsforyourrobotatonceandswitchbetweenthem
wheneveryoulike,withoutlosingorchangingtheHTMLdata.Thisletsyouexperimentwith
differentstylestoseewhichonesuitsyoubest.
EditingYourHTMLSkin
1.Clickon,Empty.
2.Clickon,CustomHTML(atthetopofthescreen).
3.Under,Filenameclickon,empty.html(orwhateveryounamedthefileas).
4.EdittheHTMLcodeinthetextwindowandthenclickonthe,SaveAsbuttonbelow.Any
changeswillshowupinstantly,youdonothavetorepublishyourrobot.
Thelinksbelowwilltakeyoutoaworkingversionofacustomizedrobotpage,andtothe
tutorialusedincreatingit.
Sybil
http://www.pandorabots.com/pandora/talk?botid=d29610271e34f8d4
SkinTutorial
http://www.pandorabots.com/pandora/pics/pubhtml.html
Ifyou'dlikeacollectionoffaces(bothmaleandfemale)thatyoucanuseonyourown
customizedpage,visithttp://scri8e.250free.com/peepz/phaces/PhacesP1Jpg120.html
Notes
[1]
TheoptionsStandardAIMLSept2001andDrWallace'sA.L.I.C.Emarch2002aretwo
setsofknowledge.Thefirstisorganizedintoseparatefilesthatareeasytochangeit's
suitableforexperts.ThesecondistheknowledgeDr.Wallaceusedtowinthe2002
Loebnerprize.
[2]
Wordsinsidebrackets"<"and">"like"<random>"arecalledXMLtagsandspecify
howtheansweristobeprocessed.We'veprovidedonlyafewsuchtags.<li>specifies
anelementinalistandthisexamplehasalistwith3elementsnamelythethree
sentences.Eachtagisexpectedtohaveaclosingtag,typicallyspecifiedasin
</random>.Itsometimeshappensthatnothingfallsbetweenanopeningtaganda
closingtag,andsothetwotagscanbereplacedasinthisexample<star></star>=
<star/>Thatis,thetwotagsontherightcanbereplacedbythesimplertagonthe
left.
[3]
Changesyoumakedirectlytotherobot'sAIMLfileswillbeimmediatelyvisiblewithin
theTrainingInterface.However,ifyourrobotispublished,you'llneedtorepublish
therobotinordertohavethechangesbevisibleatthepublicURL.
[4]
XMLandAIMLareprogramminglanguages.WeimplementedAIML(Artificial
IntelligenceMarkupLanguage)anonstandardevolvingmarkuplanguageforcreating
chatrobots,createdandsupportedbytheALICEFoundationandlocatedat
www.alicebot.org.TheprimarydesignfeatureofAIMLisbrevityandsimplicity.The
patternmatchinglanguageisverysimple,forexamplepermittingonlyonewildcard
('*')matchcharacterperpattern.AIMLisanXMLlanguage,meaningthatitobeys
certaingrammaticalmetarules.ThechoiceofXMLsyntaxpermitsintegrationwithother
toolssuchasXMLeditors.
[5]
Herearemoredetailsofthetransformation.Theinquiry"doyouloveme",is
transformed,removinganypunctuationandconvertingittouppercase:"DOYOULOVE
ME".So"doyouLOVEme"and"DOYOUloveme"areequivalent.Formultiple
sentences,findingthesentencesisthefirstpart.Theinquiry"Doyouloveme
dr.wallace?ms.marysaidyoumight..."istransformedto"Doyoulovemedoctor
wallace?msmarysaidyoumight".Theneachsentenceisseparatelyprocessed.
Apostrophesareremovedfromcontractionsso"I'minlovewithyou"istransformedto
"Iaminlovewithyou".
Japaneseiswrittenwithoutspacesbetweenthewords.Sospacesarefirstinserted.
WhentherobothasbeensetuptoprocessJapaneseandEnglish,asentencelike"let's
seeifyoureallydo"istransformedto"let'sseeifyoureallydo"
Appendix
UsingAdvancedAlterResponsetheDetails
Thefirsttworowsinthetablecontaininformationabouttheinputsentenceandthematching
category.
Input
Showstheinputtextthattherobotreceived(aswellasthecurrent<that>and
<topic>contexts).
Matched
Showsthecomponentsofthecategorythatmatchedtheinput.
Eachofthesetworowsissplitintothreecolumnsrepresentingthethreedifferentcomponents
thatconsituteanAIMLcategory.
Therestofthetable(labeledNewAIMLCategory)allowsyoutoeditthevarious
componentsofthenewAIMLcategorybeingdefined.Defaultsareprovidedbasedonthe
actualinputontheTrainingpageandyoucaneitheracceptorrevisethese.(Note.Youmust
checktheappropriatecheckboxfirstbeforeenteringvaluesfor<that>and<topic>.)
Textinthefirstboxisautomaticallysurroundedby<pattern>and</pattern>soyou
neednotenterthem.Youmayalsospecify<topic>and<that>partsofthecategory.Again
thetextissurroundedbythe<that>and<topic>AIMLtagsautomatically.
ThetemplateresponseBoxletsyouspecifytheactionsforthecategorybeingdefined.The
buttons<think>,<random>,etcsaveyoufromtypingintheAIML.Also,anythinginthisbox
isautomaticallysurroundedby<template>and</template>.
Therearefivebuttonsbelowthetemplateboxwhichprovideshortcutsforwritingthe
template:
AIML Notes
<think>
<setname="it">
<setname="topic">
<think> <person/>
</set>
</set>
</think>
<random>
<li></li>
<random> <li></li> Addchoicesbetweenthelistitemtags<li>and</li>.
<li></li>
</random>
Putapathnamebetweenthedoublequotestoprovidea
<img> <imgsrc=""></img>
picture.
<sr/> <sr/> Anotherabbreviationfor<srai><star/></srai>
<srai> <srai></srai> Inserttextbetweenthesetwotags.
ExploringCategories
WithinthemaintableontheMyPandorabotspageandoneachindividualrobotpage,you'll
findlinkslabeledExplore.
Theyprovidearudimentarymechanismforexploringthecategoriesthatexistinagiven
knowledgeweb.Youcanusethisfeaturetofindalreadyexistingcategoriesthatwillbe
matchedbyinputpatterns.Iteffectivelyallowsyoutotraversetheknowledgeweb.Whenyou
reachacategory,theAIMLextractdefiningthecategoryisshown.
Pandorawriter
AnalternativewaytocreateAIMListousePandorawriter.Thistoolautomaticallyconverts
EnglishtexttoasubsetofAIML,andforcertainclassofrobotcangreatlyeasethetaskof
addingnewknowledge.Thetoolisstillinaveryearlystageofdevelopmentandsuggestions
forimprovementsarealwayswelcome.BriefdocumentationforPandorawriterisavailable
here.
Glossary
InputPattern
Theinputsentence(orsentences)providedtotherobot.
Template
Anabbreviationforresponsetemplate.
ResponseTemplate
TheResponseTemplateiseitheraresponseoraprogramtogeneratearesponse.
Category
AnInputPattern(includingoptionalvariantsof<that>and<topic>,alongwitha
ResponseTemplate.
PatternMatching
Acapabilityofmatchinginputsentencesagainststoredsentences.
KnowledgeWeb(akaGraphMaster)
ArepresentationofthecategoriesinaPandorabot.
UltimateDefaultCategory
Whentheinputsentencefailstomatchanycategory.
DefaultCategory
<topic>and<that>caneachhaveadefaultcategory.
DefaultResponseTemplate
whatissaidwhennothingismatched.
XML
amarkup/programminglanguage.
AIML
amarkup/programminglanguageimplementingknowledgecontent.AIMLisasubsetof
XML.
ReferencesandResources
ThePandorabotPublicForum:
www.lexicalgas.com/pandora/list.php?f=1
ArtificialIntelligenceMarkupLanguage(AIML)Version1.0.1:
www.alicebot.org/TR/2001/WDaiml/
AIMLPatternMatchingSimplified:
www.alicebot.org/documentation/matching.html
Don'tReadMe:
www.alicebot.org/articles/wallace/dont.html
AIML1.0TagSets(July16,2001):
www.alicebot.org/committees/architecture/resolutions/aiml10.html
AIMLPrimer(January9,2002):
www.alicebot.org/documentation/aimlprimer.html
TheAnatomyofA.L.I.C.E.(pendingpublication):
AvailablefromDr.RichardWallaceatwww.alicebot.org
Copyright20022004DoublyAimless