Das AIML Praxisbuch

Chatbots selbst erstellen

Inhalt

  1. Was ist AIML

  2. Die wichtigsten Elemente - AIML in der Praxis

  3. Normierung und Vereinfachung

  4. Wildcards in AIML

  5. Fortgeschrittene Beispiele und Techniken (coming soon)

  6. Referenz (coming soon)

  7. Anhang


Aktuelles Kapitel:

Die wichtigsten Elemente

    Die wichtigsten Elemente

    AIML enthält zahlreiche Elemente. Einige davon werden Sie sehr oft benötigen - sie gehören sozusagen zum Grundwortschatz. In den Praxisbeispielen werden diese Grundelemente als bekannt vorausgesetzt und dort nicht noch einmal erklärt. Wird ein anderes Element in einem Praxisbeispiel verwendet, ist seine Funktion entweder direkt im Beispiel erläutert oder es wird auf die Referenz am Ende dieses Buches verwiesen.

    Die drei grundlegenden Elemente category, template und pattern

    Der Inhalt einer AIML-Datei besteht hauptsächlich aus einer Anzahl von category Elementen. Jedes category-Element stellt eine Reaktion auf eine mögliche Benutzereingabe dar. Dazu enthält es als Erstes ein pattern-Element. In dieses wird die Eingabe des Benutzers eingetragen, auf welche dieses category reagieren soll. Darauf folgt ein template-Element, in welchem die Reaktion des Chatbots auf diese Benutzereingabe enthalten ist. Das folgende Beispiel zeigt eine Reaktion auf die Eingabe "Guten Tag". Gibt der Benutzer dies bei einem Gespräch ein, so wird der Chatbot antworten "Hallo, ich freue mich, Sie kennen zu lernen."

    Beispiel: Ein category-Element

    <category>
        <pattern>GUTEN TAG</pattern>
        <template>Hallo, ich freue mich, Sie kennen zu lernen.</template>
    </category>
    

    Normierung im pattern-Element

    Es ist Ihnen sicher aufgefallen, dass die Eingabe im pattern-Element komplett aus Großbuchstaben besteht und keine Interpunktion enthält. Im template-Element hingegen ist ein ganz normaler Satz als Antwort eingetragen.

    Der Grund dafür ist, dass der AIML-Interpreter, welcher eine AIML-Datei verarbeitet, die Eingabe des Benutzers zuerst normiert. Erst danach vergleicht er diese mit den Inhalten der pattern-Elemente. Normierung bedeutet hierbei (am Beispiel für deutsche Sprache):

    • Alle Buchstaben werden in Großschrift umgewandelt.
    • Sonderzeichen und Umlaute werden - soweit möglich - durch alternative Schreibweisen ersetzt. Dies gilt auch für deutsche Umlaute. Aus "ä" wird dabei also "ae" und aus "ß" ein "ss".
    • Interpunktion wird komplett entfernt. Zeichen innerhalb eines Satzes (also zum Beispiel ein Komma) werden direkt gelöscht. Besteht die Eingabe des Benutzers aus mehreren Sätzen, werden die Satztrennzeichen (zum Beispiel ein Punkt oder ein Fragezeichen) ebenfalls entfernt. Gleichzeitig wird aber aus dem zweiten Satz eine eigene Eingabe erzeugt. Diese wird anschließend wie eine zweite Benutzereingabe (und getrennt vom ersten Satz) verarbeitet. Für den AIML-Interpreter erscheint es bei einer Eingabe mit zwei Sätzen so, als seien zwei Benutzereingaben nacheinander getätigt worden.
    • Gängige Abkürzungen und Schreibfehler werden ersetzt. Die Grundlage dafür bilden Übersetzungslisten, welche der AIML-Interpreter für jede unterstützte Sprache bereit hält. Eine solche Übersetzung kann zum Beispiel vorgeben, dass "geht's" nach "geht es" übersetzt wird.

    Beispiel: Die Normierung der Benutzereingaben

    • "Hallo, ich heiße Sven." wird zu "HALLO ICH HEISSE SVEN"
    • "Hallo, ich heiße Sven. Wie geht's Dir?" wird zu "HALLO ICH HEISSE SVEN" und einer zweiten Eingabe "WIE GEHT ES DIR"

    Durch diese Normierungen ist es möglich, Benutzereingaben im pattern-Element sehr universell zu formulieren. Man muss nicht alle Variationen der Interpunktion und Abkürzungen einzeln erfassen. Leider hat dies - gerade in der deutschen Sprache - auch Nachteile. Da AIML ursprünglich für die englische Sprache konzipiert wurde, entfällt zum Beispiel das Fragezeichen am Ende einer Frage. Dadurch ist es nicht möglich, die unterschiedliche Bedeutung der beiden Eingaben "Sven ist 30 Jahre alt?" und "Sven ist 30 Jahre alt." zu erkennen. Beide Eingaben werden auf die selbe Eingabe "SVEN IST 30 JAHRE ALT" normiert.

    Lassen Sie auch aber von diesen kleinen Unstimmigkeiten nicht täuschen: Die Vorteile dieser Normierungen überwiegen deutlich. Selbst das vermeintlich fehlende Fragezeichen am Satzende ist besser als die Alternative: Diese würden nämlich bedeuten, dass der Benutzer die Eingabe einer Frage immer zwingend mit einem Fragezeichen abschließen müsste. Das wäre dann zwar syntaktisch korrekt, entspricht aber leider gar nicht dem Verhalten der meisten Chatbot-Benutzer. Diese sparen nämlich gerne an Interpunktion - was dann aber durch die Normierung des AIML-Interpreters neutralisiert wird.

    Weiterleitung mit dem srai-Element

    Ein sehr mächtiges Werkzeug innerhalb von AIML ist das srai-Element. Es kann nur innerhalb des template-Elementes verwendet werden. Die kryptische Abkürzung dieses Elementes kann man sich anfangs meist nur schwer merken. Unglücklicherweise ist die ausgeschriebene Bezeichnung "Stimulus-Response artificial intelligence" auch nicht viel verständlicher oder einprägsamer.

    Die Funktion von srai hingegen ist leicht beschrieben: Trifft der AIML-Interpreter auf ein srai-Element, behandelt er den Inhalt des Elementes wie eine neue Benutzereingabe. Ein Blick auf die folgenden Beispiele macht die Funktion deutlich.

    Beispiel: Ohne srai-Element

    <category>
        <pattern>HALLO</pattern>
        <template>Hallo, ich freue mich, Sie kennen zu lernen.</template>
    </category>
    
    <category>
        <pattern>GUTEN TAG</pattern>
        <template>Hallo, ich freue mich, Sie kennen zu lernen.</template>
    </category>
    

    In diesem Beispiel wird auf beide Eingaben "Hallo" und "Guten Tag" die gleiche Antwort "Hallo, ich freue mich, Sie kennen zu lernen." gegeben. Die Antwort musste dazu aber auch an zwei Stellen in gleicher Weise erfasst werden. Es ist aber nicht empfehlenswert, die gleiche Information an verschiedenen Stellen doppelt zu hinterlegen.

    Statt dessen wäre es attraktiver, beide Eingaben zusammenzuführen und auf dieselbe Antwort zu bündeln.

    Genau dies ermöglichst das nächste Beispiel:

    Beispiel: Mit srai-Element

    <category>
        <pattern>HALLO</pattern>
        <template>Hallo, ich freue mich, Sie kennen zu lernen.</template>
    </category>
    
    <category>
        <pattern>GUTEN TAG</pattern>
        <template><srai>HALLO</srai></template>
    </category>
    

    Das Verhalten des ersten category-Elementes kennen wir bereits: Auf die Eingabe von "Hallo" antwortet der Chatbot "Hallo, ich freue mich, Sie kennen zu lernen.". Das zweite category-Element verwendet nun eine Weiterleitung per srai. Gibt der Benutzer "Guten Tag" ein, antwortet der Chatbot hier ebenfalls mit "Hallo, ich freue mich, Sie kennen zu lernen.".

    Im Hintergrund geschieht dabei folgendes: Der AIML-Interpreter findet in der zweiten category das passende pattern-Element zur Benutzereingabe "Guten Tag". Im template-Element dieser category befindet sich nun eine srai-Weiterleitung mit dem Inhalt "HALLO".

    Dieses "HALLO" wird nun wie eine neue Benutzereingabe verarbeitet: Der Interpreter sucht nach einem pattern-Element, das zur Benutzereingabe "Hallo" passt. Genau diese Aufgabe erfüllt die erste category, so dass der Chatbot dann auch die passende Antwort geben kann. Man kann also mit dem srai-Element mehrere inhaltsgleiche Benutzereingaben von der selben Antwort beantworten lassen. Dieses Thema wird unter "Mehr Übersicht durch Normierung und Vereinfachung" noch detailreicher behandelt.

    Das star-Element

    Das star-Element ist ein so genanntes Wildcard - auch Joker genannt - also ein Platzhalter für eine beliebige Zeichenfolge in den Benutzereingaben.

    Sie kennen Joker bestimmt bereits aus der Verwendung von Suchmaschinen: Dort können Sie nach kompletten Begriffen wie "Bildschirm" suchen. Sie können aber auch mit einem Joker zum Beispiel nach "Bild*" suchen und damit auch Treffer wie "Bilderrahmen" oder "Bildungslücke" finden.

    Verwendung des star-Elementes im pattern

    In AIML bietet das Joker-Element * eine ähnliche Funktion. Es ist hier jedoch nicht Platzhalter für einzelne Buchstaben, sondern für ganze Worte oder sogar ganz Satzteile. Das folgende Beispiel macht die Funktion deutlich.

    Beispiel: Der *-Joker im pattern-Element

    <category>
        <pattern>HALLO *</pattern>
        <template>Hallo, ich freue mich, Sie kennen zu lernen.</template>
    </category>
    

    Durch dieses pattern-Element werden zahlreiche Benutzereingaben erkannt, wie zum Beispiel "Hallo, wie geht´s?", "Hallo, ich heiße Sven." oder "Hallo Leute". Die Antwort lautet hier immer "Hallo, ich freue mich, Sie kennen zu lernen.".

    Wie im vorherigen Beispiel gezeigt, ist das *-Element im pattern ein Platzhalter. Dieser Platzhalter kann für eine beliebige Anzahl von Wörtern stehen. Sie können sogar mehrere *-Elemente in einem pattern verwenden.

    Eine weitere Anwendungsmöglichkeit für das *-Element ist die Behandlung von Benutzer-Eingaben, welche der Chatbot noch nicht kennt. Dazu erstellen Sie ein pattern-Element, welches ausschließlich ein *-Element enthält. Dadurch wird eine Benutzer-Eingabe, für welche kein anderes pattern gepasst hat, am Ende bei diesem *-Joker landen.

    Beispiel: Eine Notfall-Antwort durch einen *-Joker im pattern-Element

    <category>
        <pattern>*</pattern>
        <template>Ich habe Sie leider nicht verstanden.Können Sie die Frage evtl. anders formulieren?</template>
    </category>
    

    Das star-Element im template einsetzen

    Wie soeben gesehen, können Sie im pattern-Element einen oder mehrere *-Platzhalter verwenden und dadurch Benutzereingaben verallgemeinern. Im template-Element können Sie darüber hinaus auch noch den Inhalt dieser Platzhalter weiter verarbeiten.

    Dafür verwendet AIML das star-Element. Dieses enthält den Inhalt des jeweiligen *-Platzhalters aus der Benutzereingabe.

    Beispiel: Ein einfaches Beispiel für die Verwendung des Star-Elementes

    <category>
        <pattern>ICH HEISSE *</pattern>
        <template>Hallo <star/>.</template>
    </category>
    

    In diesem Beispiel kann der Chatbot den Benutzer mit seinem Namen begrüßen. Eine Eingabe von "Ich heiße Seven." wird beantwortet mit "Hallo Sven.".

    Das star-Element sieht in diesem Beispiel etwas anders aus, als die bisher bekannten Elemente. Dies liegt daran, dass es im Gegensatz zu beispielsweise dem pattern-Element keinen Text oder weitere Element enthalten kann.

    Neben dem *-Zeichen existieren in AIML noch weitere Wildcards. Diese weisen leicht unterschiedliches Verhalten auf, gelten aber alle nur für ganze Wörter und somit nicht für einzelne Zeichen innerhalb von Worten. Eine komplette Übersicht der Wildcards ist im Kapitel "Wildcards" zu finden.

    Vergangenheitsbewältigung mit dem that-Element

    Bisher haben Sie einfache Antworten für einzelne Benutzer-Eingaben erstellt. Es können aber auch Antworten auf eine zuvor vom Chatbot gestellte Fragen notwendig sein:

    Chatbot: Möchten Sie, dass ich Ihnen meine Website zeige?
    Benutzer: Ja
    Chatbot: Sehr gerne - die Website finden Sie unter http://www.gaitobot.de.

    In diesem Beispiel müssten wir ein Pattern für die Eingabe "JA" erstellen, welches die Antwort "Sehr gerne - die Website finden Sie unter http://www.gaitobot.de" auslöst. Dieses Pattern-Muster würde aber immer reagieren, wenn der Benutzer "JA" eingibt. Spätestens sobald Sie eine zweite Frage für Ihren Chatbot erstellen, auf die man ebenfalls mit "JA" antworten kann, kann das zu unerwarteten Ergebnissen führen.. Um dies zu verhindern, kann man das that-Element verwenden. Mit seiner Hilfe werden Eingaben nur dann als passend angesehen, wenn der Chatbot zuvor etwas bestimmtes gesagt hat.
    Im GaitoBot AIML Editor ist das Einfügen eines that-Elementes etwas versteckt, da es zwischen das pattern- und das template-Element eingefügt werden muss. Am einfachsten wählen Sie dazu das entsprechende pattern-Element aus und drücken dann einmal die Cursor-Rechts Taste. Der Cursor steht nun zwischen dem pattern- und dem template-Element. Fügen Sie nun an dieser Stelle ein that-Element ein. In das that-Element wird die letzte Antwort des Chatbots eingetragen, für welche dieser Fall gelten soll. Für das obige Beispiel muss in das that-Element daher "Möchten Sie, dass ich Ihnen meine Website zeige?" geschrieben werden:

    Beispiel für die Verwendung des that-Elementes

    <category>
        <pattern>JA</pattern>
        <that>Möchten Sie, dass ich Ihnen meine Website zeige?</that>
        <template>Sehr gerne - die Website finden Sie unter http://www.gaitobot.de.</template>
    </category>
    

    Nur, wenn der Chatbot vorher gefragt hat, ob er die Website anzeigen soll, führt die Benutzer-Eingabe "Ja" zur Ausgabe der entsprechenden Antwort.

    Dies gilt auch (oder um so mehr) für die Verwendung von Jokern im pattern-Element, wie folgendes Beispiel zeigt:

    Chatbot: Wie heißen Sie?
    Benutzer: Hans Mustermann
    Chatbot: Schön Sie kennen zu lernen, Hans Mustermann.

    Die Benutzer-Eingabe "Hans Mustermann" enthält nur variable Teile. Nichts davon kann im pattern-Muster fest hinterlegt werden. Daher muss das Erkennungsmuster ausschließlich aus einem *-Joker bestehen. Dies würde dann ja eigentlich so aussehen:

    Ohne that-Element ist das pattern mehrdeutig

    <category>
       <pattern>*</pattern>
       <template>Schön Sie kennen zu lernen, <star/>.</template>
    </category>
    

    Dieses Pattern-Muster würde aber wie oben für das *-Element beschrieben auf alle Benutzer-Eingaben reagieren, auf welche der Chatbot keine Antwort kennt. Gibt der Benutzer also an einer ganz anderen Stelle eines Gespräches wie z.B. "Wie geht es Dir?" ein (und ist dafür kein eigenes pattern-Muster hinterlegt) würde fälschlicher Weise ebenfalls diese Antwort gegeben:

    Benutzer: Wie geht es Dir?
    Chatbot: Schön Sie kennen zu lernen, Wie geht es Dir.

    Auch hier ist es daher sinnvoll, mit Hilfe des that-Elementes einen Bezug zur zuvor gestellten Frage des Chatbots herzustellen.

    Beispiel für die Verwendung des that-Elementes

    <category>
        <pattern>*</pattern>
        <that>Wie heissen Sie</that>
        <template>Schön Sie kennen zu lernen, <star/>.</template>
    </category>
    

    Wenn der Benutzer eine beliebige Eingaben abgesendet hat und der Chatbot direkt zuvor "Wie heißen Sie" gesagt hat, dann gibt er die im template-Element enthaltene Antwort aus.

    Innerhalb des that-Elementes können Sie den bereits aus dem pattern-Element bekannten _-Platzhalter verwenden, um die Erkennung an dieser Stelle etwas "unschärfer" zu gestalten. Die Funktion des star-Elementes übernimmt hierbei dann das Thatstar-Element. Dieses enthält bei Verwendung im template-Element die vom _-Platzhalter "gefangenen" Worte.

    Ein Thema vertiefen mit dem topic-Element

    Manchmal reicht das that-Element nicht aus, um den Zusammenhang eines Thema über mehrere Gesprächseingaben hinweg aufrecht zu erhalten. Dies kann zum Beispiel in folgendem Szenario der Fall sein: Der GaitoBot eines Automobil-Portals bekommt die Eingabe "Ich interessiere mich für Fahrzeugtyp XYZ.". Anschließend folgen Eingaben wie "Gibt es den auch mit Sportfahrwerk?" oder "Gibt es dazu auch eine Anhängerkupplung?". Da das Automobil-Portal nicht nur den Fahrzeugtyp XYZ, sondern auch den Typ ABC und andere enthält, wären solche Benutzer-Eingaben uneindeutig, da sie für jeden Fahrzeugtyp gestellt werden könnten. Weitere Szenarien, bei welchen sich die Verwendung eines topic (im folgenden auch "Thema" genannt) anbietet, sind beispielsweise unterschiedliche Fachschaften auf einem Universitäts-Portal, Produktgattungen auf einer Shop-Website oder auch inhaltliche Themen-Schwerpunkte wie "Beschwerde", "Bestellung" oder "Öffnungszeiten". Im GaitoBot AIML Editor finden Sie das topic-Element nicht an der gleichen Stelle wie die bisher bekannten Elemente pattern und template, da es selbst eine beliebige Anzahl dieser Elemente enthalten kann. Statt dessen können Sie die Themen pro AIML-Datei über ein Bedienelement verwalten.

    Verwaltung von Topics (Themen) im GaitoBot AIML Editor

    Verwaltung von Topics (Themen) im GaitoBot AIML Editor

    In jeder AIML-Datei ist bereits ein Thema "_standard_" enthalten; in diesem haben wir bisher alle Antwort-Muster hinterlegt.

    Schauen wir uns nun das Fahrzeugtyp Beispiel einmal genauer an:

    Benutzer: Ich interessiere mich für Fahrzeugtyp XYZ.
    Chatbot: Was darf ich Ihnen zu den XYZs sagen?
    Benutzer: Gibt es den auch mit Sportfahrwerk?
    Chatbot: Ja, den XYZ können Sie auch als Sportversion wählen.
    Benutzer: Gibt es dazu auch eine Anhängerkupplung?
    Chatbot: Eine Anhängerkupplung ist bei XYZ Modellen leider nicht möglich.

    Hier wird spätestens bei der Frage nach der Anhängerkupplung klar, dass das that-Element nicht ausreicht, den Kontext über beide Fragen hinweg zu behalten. Wie das aber per topic funktionieren könnte, zeigt folgendes Beispiel:

    Verwendung von topic und srai in Kombination

    Der Inhalt des Standard-Topic:

    <category>
        <pattern>Ich interessiere mich für Fahrzeugtyp XZY</pattern>
        <template>Was darf ich Ihnen zu den XYZs sagen?<think><set name="topic">typxyz</set></think></template>
    </category>
    

    Dieses pattern erkennt das "XYZ" in der Mitte und hinterlegt als zukünftiges Schwerpunkt-Thema "typxyz".

    Der Inhalt des Topic "typxyz":

    <category>
        <pattern>Gibt es den auch mit Sportfahrwerk?</pattern>
        <template>Ja, den XYZ können Sie auch als Sportversion wählen.</template>
    </category>
    <category>
        <pattern>Gibt es dazu auch eine Anhängerkupplung?</pattern>
        <template>Eine Anhängerkupplung ist bei XYZ Modellen leider nicht möglich.</template>
    </category>
    

    Da diese beiden pattern innerhalb des Themas "typxyz" vorhanden sind, reagieren Sie in diesem Beispiel auf die Eingaben "Gibt es den auch mit Sportfahrwerk?" und "Gibt es dazu auch eine Anhängerkupplung?". Wäre das Thema zuvor nicht auf "typxyz" gesetzt worden, würden diese Antworten hingegen nicht verwenden.

    (Für den Fahrzeugtyp ABC und auch weitere kann dieses Vorgehen einfach mit weiteren Themen wiederholt werden.)

    Was geschieht nun im Detail in diesem Beispiel?

    Im ersten pattern wird in der Antwort mit Hilfe des Set-Elementes [](Das Set-Element kennen Sie bisher noch nicht. Sie können damit während des Gespräches Informationen setzen und speichern. Mehr dazu finden Sie in der Referenz.) und des Think-Elementes [](Den Inhalt des Think-Elementes "denkt" Ihr Chatbot nur, er spricht ihn aber nicht laut aus. Details dazu finden Sie in der Referenz.) das Thema "typxyz" gemerkt. Von da an befindet sich das Gespräch in einem per topic gesetzten Themenschwerpunkt "typxyz". Das bedeutet, dass der Chatbot für Benutzer-Eingaben zunächst, schaut, ob er innerhalb des Themas eine passende Antwort findet. Erst wenn dort keine passenden pattern gefunden wurden, wird anschließend nach pattern im "_standard_" topic gesucht.

    Tipp

    Bei der Verwendung von Jokern und Weiterleitungen gilt jede per srai weiter geleitete Antwort als neue Benutzer-Eingabe. Das bedeutet, dass Sie allgemeine Vereinfachungen und Normierung der Eingabe durch srai-Weiterleitungen nicht für jedes topic erneut wiederholen müssen.

    Was genau geschieht dabei im Hintergrund? Wenn für das Gespräch ein Thema gesetzt ist, wird zunächst innerhalb dieses Themas nach einem passenden Pattern gesucht. Findet sich dort keines, wird im allgemeinen Teil des AIML Wissens weiter gesucht. Findet sich dort ein Pattern inklusive srai-Weiterleitung (z.B. zur Vereinfachung einer Eingabe) wird dieses ausgeführt. Für die entstandene Eingabe wird nun wieder komplett von vorn begonnen, d.h. zuerst im aktuell gesetzten Thema.

    Fortgeschrittene Anwendung des topic-Elementes

    Nun ist es aber oft auch so, dass der Benutzer nicht erst das Thema nennt und anschließend eine Frage dazu stellt, sondern beides in einer Eingabe kombiniert:

    Benutzer: Gibt es den XYZ auch mit Sportfahrwerk?
    Chatbot: Ja, den XYZ können Sie auch als Sportversion wählen.
    Benutzer: Gibt es dazu auch eine Anhängerkupplung?
    Chatbot: Eine Anhängerkupplung ist bei XYZ Modellen leider nicht möglich.

    In der ersten Eingabe steckt hierbei sowohl die Information XYZ, welche wir als Thema merken möchten, als auch die Detail-Frage innerhalb dieses Themas. Hier kann das Weiterleitungs-Element srai verwendet werden, um zuerst das Thema zu verarbeiten und anschließend an die Detail-Antwort weiter zu leiten:

    Verwendung von topic und srai in Kombination

    <category>
        <pattern>* XYZ *</pattern>
        <template><srai><star index="1"/> <star index="2"/></srai><think><set name="topic">typxyz</set></think></template>
    </category>
    

    Dieses pattern erkennt das "XYZ" in der Mitte und hinterlegt als zukünftiges Schwerpunkt-Thema "typxyz"