AIML
Overview
AIML is the Artificial Intelligence Markup Language. It is an XML standard for defining chat bot responses. Bot Libre bots support AIML, but are based on Self and have a knowledge base similar to the human brain.
About AIML
AIML defines how a bot should respond to a question using <pattern> and <template> elements. A pattern represents the user's question, and the template defines the bot's response. The pattern and template elements are grouped in a category element, which can be grouped under topic elements.
List of AIML template tags
Tags | Description |
---|---|
<star index="N"/> | Replaced with value of * in pattern (or Nth *). |
<that index="M,N"/> | Replaced with value of bot's previous response (or Mth previous response, and N sentence of the response). |
<input index="N"/> | Replaced with value of users's input (or Nth *). |
<thatstar index="N"/> | Replaced with value of * in "that" (or Nth *). |
<topicstar index="N"/> | Replaced with value of * in topic (or Nth *). |
<get name="XXX"/> | Replaced by the value of the conversation specific variable. |
<bot name="XXX"/> | Replaced by the value of the bot specific variable. |
<sr/> | Short form for <srai><star/><srai> (replaced with response to value of * from pattern). |
<person2/> | Converts the text (or <star/>) between 1st and 2nd person (I <-> he, etc.). |
<person/> | Converts the text (or <star/>) between 1st and 3rd person (I <-> you, etc.). |
<gender/> | Converts the text (or <star/>) between male and female (he <-> she). |
<date/> | Replaced with the current date and time, a "format" attribute is also supported. |
<id/> | Replaced by the client id. |
<size/> | Replaced with the size of bot's memory. |
<version/> | Replaced with the AI engine version. |
<uppercase> | Converts the text to uppercase. |
<lowercase> | Converts the text to lowercase. |
<formal> | Converts all words in the text to be capitalized. |
<sentence> | Converts the first word in the text to be capitalized. |
<condition name="X" value="Y"> | Defines an "if" condition based on comparing the value of a variable to a pattern. |
<condition name="X"> | Case statement. |
<condition> | Multi-valued if/else statement. |
<random> | Choose on of the nested <li> values at random. |
<li name="X" value="Y"> | Used in random and condition tags. |
<li value="Y"> | Used in random and condition tags. |
<li> | Used in random and condition tags. |
<set name="XXX"> | Set the value of a variable. |
<gossip> | Logs the text. |
<srai> | Recursively evaluates the text and replaces it with the response. |
<think> | Evaluates the nested statements but does not output any result. |
<learn> | Load external AIML file, this is not currently allowed. |
<system> | Executes a OS command, this is not currently allowed. |
<javascript> | Executes JavaScript code. |
<topic> | Category topic tags can now be set on a category to make it easier to add categories to topics. |
<map> | Maps tag to allow the lookup of the element value in a predefined mapping, returning the mapped value. |
<loop> | Condition loops tag to loop a conditional statement. |
<var> | Local variables attribute for variables scoped to a category. |
<sraix> | Remote requests tag to make a remote request of another bot instance, or service. |
<normalize> and <denormalize> | Normalization and denormalization tags to convert special character into words, and back again. |
<request> | Request tag to return the user's previous input request. |
<response> | Response tag to return the bot's previous response. |
<learn>, <learnf>, and <eval> | Learning tags to dynamically train a bot with new responses. |
<explode> | Explode tag to split a word into its characters. |
<oob> | Mobile (out of band) tag to support client and mobile device commands. |
(<b>, <a>, <i>, <ul>, <ol>, <li>, <p>, <br>, <button>, <img>, <video>) | Various HTML tags are also allowed. |
<self> | Evaluate Self code (Bot Libre extension). |
List of AIML pattern operators
Tags | Description |
---|---|
* | Matches one or more words. |
_ | Matches one or more words, takes priority over all other words and wildcards, except $. |
^ | Matches zero or more words. |
# | Matches zero or more words, takes priority over all other words and wildcards, except $. |
$ | Pattern priority marker to make a pattern word match highest priority. |
() | Optional set of words (Bot Libre extension). |
[] | Required set of words (Bot Libre extension). |
<set> | Set tag to evaluate a pattern based on words defined in a predefined set. |
/ | Regular expression pattern (Bot Libre extension). |
{} | Self code (Bot Libre extension). |
Examples
Here is a simple 'Hello World' AIML example:
This code will make your bot respond with 'Hello to you too' to the question 'Hello World'.
<aiml>
<category>
<pattern>HELLO WORLD</pattern>
<template>Hello to you too</template>
</category>
</aiml>
Here is a simple wildcard example:
This code will make your bot respond with 'Hello to you too' to any question containing the word 'hello'.
<aiml>
<category>
<pattern>* HELLO *</pattern>
<template>Hello to you too</template>
</category>
</aiml>
Here is a joke 'that' example:
This code will make your bot tell a joke.
<aiml>
<category>
<pattern>TELL ME A JOKE</pattern>
<template>Why did the chicken cross the road?</template>
</category>
<category>
<pattern>* WHY *</pattern>
<that>Why did the chicken cross the road?</that>
<template>To get to the other side.</template>
</category>
</aiml>
Here is a complex template example:
This code will make your bot respond to the question 'Do you like apples or do you like oranges' with 'I love apples and I love oranges'.
<aiml>
<category>
<pattern>* OR *</pattern>
<template><srai><star/></srai> and <srai><star index="2"/></srai></template>
</category>
<category>
<pattern>DO YOU LIKE *</pattern>
<template>I love <star/></template>
</category>
</aiml>
^ and # Wildcards
<category>
<pattern>^ aiml ^</pattern>
<template>AIML is cool.</template>
</category>
<category>
<pattern>^ chat bot^</pattern>
<template>Yes, I am a chat bot.</template>
</category>
$ Priority
<category>
<pattern># sex #</pattern>
<template>I'm not that kind of bot.</template>
</category>
<category>
<pattern>$what is your sex</pattern>
<template>I am female.</template>
</category>
() and [] Lists
<category>
<pattern>do [you u] (really) [like love luv lv] me</pattern>
<template>Yes, I love you.</template>
</category>
Regular expressions
<category>
<pattern>my email is /.+\@.+\..+</pattern>
<template>That is a valid email</template>
</category>
Sets
<category>
<pattern>I am <set>name</set></pattern>
<template>Pleased to meet you <star/>.</template>
</category>
<category>
<pattern><set>number</set> + <set>number</set></pattern>
<template><srai>addition <star/> <star index="2"/></srai></template>
</category>
AIML template to set a knowledge object's type:
<category>
<pattern>load animals</pattern>
<template>
<think>
<map name="meaning" value="dog">dog</map><map name="instantiation" value="animal"><map name="meaning">dog</map></map>
<map name="meaning" value="dog">doggy</map>
<map name="meaning" value="cat">cat</map><map name="instantiation" value="animal"><map name="meaning">cat</map></map>
</think>
</template>
</category>
Pattern tags
<category>
<pattern><bot name="name"/></pattern>
<template>Yes, that's my name.</template>
</category>
<category>
<pattern>I am </pattern>
<template>That is my age too.</template>
</category>
<category>
<pattern> </pattern>
<template>You are repeating yourself.</template>
</category>
<category>
<pattern><response/></pattern>
<template>Please don't repeat me.</template>
</category>
Attributes as Elements
<category>
<pattern>My * is *</pattern>
<template>I will remember that your <star/> is <star index="2"/><think><set><name><star/></name><star index="2"/></set></think></template>
</category>
<category>
<pattern>What is my *</pattern>
<template>Your <star/> is <get><name><star/></name></get></template>
</category>
Maps
<category>
<pattern>what is the capital of <set>country</set></pattern>
<template>The capital of <star/> in <map name="capital"><star/></map>.</template>
</category>
Bot Libre extends the map operation to also allow setting the map value. This will set the value of a relationship on the knowledge object.
<category>
<pattern>the opposite of * is *</pattern>
<template>Okay, the opposite of <star/> is <star index="2"/>.
<think><map name="opposite"><value><star index="2"/></value><star/></map></think>
</template>
</category>
<category>
<pattern>what is the opposite of *</pattern>
<template>the opposite of <star/> is <map name="opposite"><star/></map>
</template>
</category>
Conditions and Loops
<category>
<pattern>count down from <set>number</set></pattern>
<template>
<think><set var="count"><star/></set></think>
<condition var="count">
<li value="5"><think><set var="count">4</set></think>5 <loop/></li>
<li value="4"><think><set var="count">3</set></think>4 <loop/></li>
<li value="3"><think><set var="count">2</set></think>3 <loop/></li>
<li value="2"><think><set var="count">1</set></think>2 <loop/></li>
<li value="1"><think><set var="count">0</set></think>1 </li>
</condition>
</template>
</category>
<category>
<pattern>what is <set>number</set> + <set>number</set></pattern>
<template>
<think>
<set var="result"><star/></set>
<set var="count">0</set>
</think>
<condition var="count">
<li><value><star index="2"/></value></li>
<li>
<think>
<set var="result"><map name="word"><map name="next"><map name="meaning"><get var="result"/></map></map></map></set>
<set var="count"><map name="word"><map name="next"><map name="meaning"><get var="count"/></map></map></map></set>
</think>
<loop/>
</li>
</condition>
The answer is <get var="result"/>
</template>
</category>
Learning
<category>
<pattern>learn question * answer *</pattern>
<template>
<think>
<learn>
<category>
<pattern><eval><star/></eval></pattern>
<template><eval><star index="2"/></eval></template>
</category>
</learn>
</think>
Okay, I will answer "<star index="2"/>" to "<star/>" next time
</template>
</category>
<category>
<pattern>wrong</pattern>
<template>What should I have said?</template>
</category>
<category>
<pattern>*</pattern>
<that>what should I have said</that>
<template>
<think>
<learn>
<category>
<pattern><eval><input index="3"/></eval></pattern>
<template><eval><star/></eval></template>
</category>
</learn>
</think>
Okay, I will answer "<star/>" to "<input index="3"/>" next time
</template>
</category>
Sraix
<category>
<pattern>ask * about *</pattern>
<template><star/> says "<sraix default="Timeout or max anonymous API calls exceeded"><botname><star/></botname><star index="2"/></sraix>"</template>
</category>
<category>
<pattern>ask pandorabot * about *</pattern>
<template><star/> says "<sraix server="http://www.pandorabots.com" default="Timeout or max anonymous API calls exceeded"><botid><star/></botid><star index="2"/></sraix>"</template>
</category>
<category>
<pattern>ask pandorabot chomsky about *</pattern>
<template>He says "<sraix server="http://www.pandorabots.com" botid="b0dafd24ee35a477" default="Timeout or max anonymous API calls exceeded"><star/></sraix>"</template>
</category>
<category>
<pattern>wikidata *</pattern>
<template><sraix service="wikidata" default="Timeout or missing data"><star/></sraix>
</category>
<category>
<pattern>wikidata * hint *</pattern>
<template><sraix service="wikidata" default="Timeout or missing data"><hint><star index="2"/></hint><star/></sraix></template>
</category>
<category>
<pattern>wiktionary *</pattern>
<template><sraix service="wiktionary" default="Timeout or missing data"><star/></sraix></template>
</category>
Self
<category>
<pattern>what is * + *</pattern>
<template><star index="1"/> + <star index="2"/> = <self>star + star</self></template>
</category>