[alicebot-style] Extending Badanswer.aiml further
John Campbell
alicebot-style@list.alicebot.org
Fri, 10 Jun 2005 23:37:20 +0100
Badanswer.aiml makes use of the Pandorabots new <learn> and <eval> tags.
The version as previously published here cannot handle multi-sentence inputs, and
breaks badly on them. My experience has been that visitors who have used BAD
ANSWER seem to want to input multi-sentence answers.
After some thought I've come up with a modified version. This makes use of
Pandorabots extended tags "response" and "request" to capture multi-sentence inputs
and responses.
Once the topic has been set to BADANSWER or BADANSWER2, all inputs are
captured and processed. We need to detect whether the current input sentence is part
of the corrected answer (whether one sentence or more). We do this by checking the
value of the "current bot response" (<response index = "1" />) to see if the user is still
responding to "OK, what should I have said". If so, no processing is done to that
sentence.
We then check the value of the "previous bot response" (<response index = "2" />) to
see if we have moved on to the next input. If so, we can pick up previous input in full,
whether multi-sentence or not, using <request index = "1" />.
<?xml version="1.0" encoding="ISO-8859-1"?>
<aiml version="1.0">
<!-- Free software Copyright © ALICE A.I. Foundation. -->
<!-- This program is open source code released under -->
<!-- the terms of the GNU General Public License -->
<!-- as published by the Free Software Foundation. -->
<!-- Complies with AIML 1.01 Tag Set Specification -->
<!-- as adopted by the ALICE A.I. Foundation. -->
<!-- Badanswer.aiml: Demo of Pandorabots learning, AIML unquoting and eval -->
<!-- Revision Badanswer-0.01 -->
<!-- Last Modified Feb 23 2005 -->
<!-- Extended by KnyteTrypper, March 3, 2005 -->
<!-- Modified by John Campbell to allow multi-sentence inputs, June 3, 2005 -->
<category>
<pattern>BAD ANSWER</pattern>
<template>
<think>
<set name="badanswer-input"><input index="2" /></set>
<set name="badanswer-that"><that index="2,1" /></set>
<set name="badanswer-that-full"><that index="2" /></set>
</think>
OK, what should I have said?
</template>
</category>
<category>
<pattern>_</pattern>
<that>OK WHAT SHOULD I HAVE SAID</that>
<template>
<think>
<set name="badanswer-newresp"><input index="1" /></set>
</think>
<condition>
<li name="badanswer-that" value="*">
<think><set name="topic">BADANSWER</set></think>
Does this depend on me having just said, "<get name="badanswer-that-full"
/>"?
</li>
<li>
<think><set name="topic">BADANSWER2</set></think>
Do you want me to remember that?
</li>
</condition>
</template>
</category>
<topic name="BADANSWER">
<category>
<pattern>_</pattern>
<template>
<think>
<set name="star"><star /></set>
<set name="response1"><response index = "1" /></set>
<set name="response2"><response index = "2" /></set>
<condition>
<li name="response2" value="OK, what should I have said">
<set name="badanswer-newresp"><request index = "1" /></set>
</li>
</condition>
</think>
<condition>
<li name="response1" value="OK, what should I have said"></li>
<li name="star" value="no">I'll try to remember to respond,
"<get name="badanswer-newresp" />" when you say,
"<get name="badanswer-input" />"
<learn>
<category>
<pattern>
<eval><uppercase><get name="badanswer-input"
/></uppercase></eval>
</pattern>
<template>
<eval><get name="badanswer-newresp" /></eval>
</template>
</category>
</learn>
<think><set name="topic">learning new answers</set></think>
</li>
<li name="star" value="yes">I'll try to remember to respond,
"<get name="badanswer-newresp" />" when you say,
"<get name="badanswer-input" />" if I have just said
"<get name="badanswer-that-full" />"
<learn>
<category>
<pattern>
<eval><uppercase><get name="badanswer-input"
/></uppercase></eval>
</pattern>
<that>
<eval><uppercase><get name="badanswer-that"
/></uppercase></eval>
</that>
<template>
<eval><get name="badanswer-newresp" /></eval>
</template>
</category>
</learn>
<think><set name="topic">learning new answers</set></think>
</li>
<li>Yes or No?</li>
</condition>
</template>
</category>
</topic>
<topic name="BADANSWER2">
<category>
<pattern>_</pattern>
<template>
<think>
<set name="star"><star /></set>
<set name="response1"><response index = "1" /></set>
<set name="response2"><response index = "2" /></set>
<condition>
<li name="response2" value="OK, what should I have said">
<set name="badanswer-newresp"><request index = "1" /></set>
</li>
</condition>
</think>
<condition>
<li name="response1" value="OK, what should I have said"></li>
<li name="star" value="yes">Fine. I'll try to remember to respond,
"<get name="badanswer-newresp" />" when you say,
"<get name="badanswer-input" />"
<learn>
<category>
<pattern>
<eval><uppercase><get name="badanswer-input"
/></uppercase></eval>
</pattern>
<template>
<eval><get name="badanswer-newresp" /></eval>
</template>
</category>
</learn>
<think><set name="topic">learning new answers</set></think>
</li>
<li name="star" value="no">OK, let's forget it then.
<think><set name="topic">learning new answers</set></think>
</li>
<li>Yes or No?</li>
</condition>
</template>
</category>
</topic>
<category>
<pattern>WRONG</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>NOT RIGHT</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT IS WRONG</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT IS NOT RIGHT</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT IS INCORRECT</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT ANSWER IS NOT CORRECT</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT ANSWER IS INCORRECT</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT ANSWER IS WRONG</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT ANSWER IS NOT RIGHT</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT ANSWER WAS BAD</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT WAS A BAD ANSWER</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT WAS AN INCORRECT ANSWER</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT WAS THE WRONG ANSWER</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>THAT ANSWER WAS NOT RIGHT</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>WRONG ANSWER</pattern>
<template><srai>BAD ANSWER</srai>
</template>
</category>
<category>
<pattern>YOUR ANSWER WAS WRONG</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>YOUR ANSWER WAS NOT RIGHT</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>YOUR ANSWER WAS NOT CORRECT</pattern>
<template><srai>BAD ANSWER</srai></template>
</category>
<category>
<pattern>CAN I TEACH YOU</pattern>
<template>Yes, if I give you a bad answer, just say "Bad answer" and you can teach
me a new response.</template>
</category>
<category>
<pattern>CAN YOU LEARN</pattern>
<template><srai>CAN I TEACH YOU</srai></template>
</category>
<category>
<pattern>DO YOU LEARN</pattern>
<template><srai>CAN I TEACH YOU</srai></template>
</category>
<category>
<pattern>CAN I TEACH YOU *</pattern>
<template><srai>CAN I TEACH YOU</srai></template>
</category>
<category>
<pattern>CAN YOU LEARN *</pattern>
<template><srai>CAN I TEACH YOU</srai></template>
</category>
<category>
<pattern>WILL YOU LEARN *</pattern>
<template><srai>CAN I TEACH YOU</srai></template>
</category>
<category>
<pattern>IF * WILL YOU LEARN *</pattern>
<template><srai>CAN I TEACH YOU</srai></template>
</category>
<category>
<pattern>DO YOU LEARN *</pattern>
<template><srai>CAN I TEACH YOU</srai></template>
</category>
</aiml>
If you don't want to ask if the response depends on the context, you can just change
the line
<li name="badanswer-that" value="*">
to
<li name="badanswer-that" value="nevercomehere">
though there are far better ways to do that.
This seems to work fine both in training mode and when published.
I had previously written a series of categories for this that worked perfectly in training
but not when published! There's something odd about srais in topics that I can't
fathom. If, for example, I change the line
<li>Yes or No?</li>
to
<li>I'll take that as No, then. <srai>No</srai></li>
the bot output is the generic substitution for "No", as if the topic was of no effect, but
the learning still happens, so obviously the processing has taken place within the topic.
John Campbell
http://www.jesus.org.uk/bot