Tipps zum Erstellen von Dialogen

Rufen Sie Tipps für die Verarbeitung allgemeiner Tasks ab.

Knoten hinzufügen

  • Fügen Sie einen aussagefähigen Knotennamen hinzu, der den Zweck des Knotens beschreibt.

    Zurzeit wissen Sie, was der Knoten bewirkt, aber in einigen Monaten erinnern Sie dies möglicherweise nicht mehr. Außerdem wird der Knotenname im Protokoll angegeben. Dies kann bei der Fehlerbehebung für einen Dialog später hilfreich sein.

  • Um die Informationen zusammenzustellen, die zum Ausführen einer Task erforderlich sind, verwenden Sie einen Knoten mit Slots anstelle einer Reihe separater Knoten, um Informationen von Benutzern zu erhalten. Weitere Informationen enthält der Abschnitt Informationen mit Slots erfassen.

  • Bei einem komplexen Prozessablauf informieren Sie Benutzer über alle Informationen, die sie zu Beginn des Prozesses bereitstellen müssen.

  • Machen Sie sich damit vertraut, wie der Assistent die Baumstruktur des Dialogmoduls durchläuft und wie sich Ordner, Verzweigungen, Sprungaktionen und Abschweifungen auf die Route auswirken. Weitere Informationen enthält der Abschnitt Dialogablauf.

  • Fügen Sie nicht überall Sprungaktionen ein. Sie erhöhen die Komplexität des Dialogablaufs und erschweren später die Fehlerbehebung für das Dialogmodul.

  • Verwenden Sie zum Springen zu einem Knoten in derselben Verzweigung wie der aktuelle Knoten die Aktion Benutzereingabe überspringen anstelle der Aktion Springen zu.

    Diese Auswahl verhindert, dass Sie die Einstellungen des aktuellen Knotens bearbeiten müssen, wenn Sie die untergeordneten Knoten, zu denen gesprungen wird, entfernen oder neu ordnen. Weitere Informationen enthält der Abschnitt Nächste Schritte definieren.

  • Testen Sie vor dem Aktivieren von Abschweifungen, die von einem Knoten abgehen, die gängigsten Benutzerszenarios. Und stellen Sie sicher, dass Knoten, die potenzielle Abschweifungsziele sind, so konfiguriert werden, dass der Dialogablauf von ihnen zurück geleitet wird. Weitere Informationen enthält der Abschnitt Abschweifungen.

Antworten hinzufügen

  • Antworten sollten kurz und aussagekräftig sein.

  • Beziehen Sie die Absicht des Benutzers in die Antwort ein.

    Dies zeigt den Benutzern, dass der Bot ihr Anliegen versteht oder ihnen die Möglichkeit gibt, ein Missverständnis sofort zu korrigieren.

  • Schließen Sie Links zu externen Sites in Antworten ein, wenn die Antwort von Daten abhängt, die sich häufig ändern.

  • Verwenden Sie nicht zu viele Schaltflächen. Das Auffordern der Benutzer, vordefinierte Optionen in einer Gruppe von Schaltflächen auszuwählen, hat wenig mit einem echten Dialog zu tun und verringert Ihre Chancen, die eigentliche Intention der Benutzer zu erfahren. Wenn reale Benutzer ihre Anliegen mit eigenen Worten formulieren, können Sie mithilfe dieser Eingaben das System trainieren und zutreffendere Absichten ableiten.

  • Vermeiden Sie die Verwendung mehrerer Knoten, wenn ein Knoten ausreichend ist. Fügen Sie beispielsweise mehrere bedingte Antworten in einem einzelnen Knoten hinzu, um entsprechend den vom Benutzer angegebenen Details verschiedene Antworten zurückzugeben. Weitere Informationen enthält der Abschnitt Bedingte Antworten.

  • Formulieren Sie die Antworten mit Bedacht. Wie auf Ihr System reagiert wird, hängt sehr von der Formulierung Ihrer Antwort ab. Durch eine kleine Änderung in einer einzigen Textzeile kann vermieden werden, dass viele Codezeilen eingefügt werden müssen, um eine komplexe programmgesteuerte Lösung zu implementieren.

Tipps zum Erfassen von Informationen aus Benutzereingaben

Es ist nicht immer einfach, die richtige Syntax für Ihr Dialogmodul zu finden, um die Informationen präzise zu erfassen, die Sie in den Benutzereingaben finden möchten. Im Folgenden finden Sie einige Ansätze, mit denen Sie gemeinsame Ziele erreichen können.

  • Eingabe des Benutzers zurückgeben: Sie können den genauen Wortlaut der Benutzeräußerung erfassen und in Ihrer Antwort zurückgeben. Mit dem folgenden SpEL-Ausdruck können Sie den zuvor vom Benutzer angegebenen Text in Ihrer Antwort wiederholen:

    You said: <? input.text ?>.

    Wenn die automatische Korrektur aktiviert ist und Sie die ursprüngliche Eingabe des Benutzers zurückgeben möchten, bevor sie korrigiert wurde, können Sie <? input.original_text ?> verwenden. Stellen Sie jedoch sicher, dass Sie eine Antwortbedingung verwenden, die zuerst prüft, ob das Feld original_text vorhanden ist.

  • Wörterzahl der Benutzereingabe ermitteln: Sie können jede der unterstützten Methoden für Zeichenfolgen auf das Objekt 'input.text' anwenden. Mit dem folgenden SpEL-Ausdruck können Sie beispielsweise feststellen, wie viele Wörter eine Benutzeräußerung enthält:

    input.text.split(' ').size()

  • Mit mehreren Absichten arbeiten: Ein Benutzer gibt eine Eingabe ein, die zwei separate Tasks ausdrückt. I want to open a savings account and apply for a credit card. Wie kann das Dialogmodul beide Tasks erkennen? Siehe den Blogeintrag Zusammengesetzte Fragen.

  • Mehrdeutige Absichten behandeln: Ein Benutzer gibt eine Eingabe ein, die mehrdeutig genug ist, dass der Assistent zwei oder mehrere Knoten mit Absichten findet, die potenziell darauf reagieren könnten. Wie kann das Dialogmodul erkennen, welche Verzweigung ausgewählt werden sollte? Wenn Sie die Begriffsklärung aktivieren, kann das Dialogmodul die verfügbaren Optionen anzeigen und den Benutzer auffordern, die zutreffende Option auszuwählen. Weitere Details enthält der Abschnitt Begriffsklärung.

  • Mehrere Entitäten in der Eingabe verarbeiten: Wenn Sie nur den Wert der ersten erkannten Instanz eines Entitätstyps auswerten möchten, können Sie die Syntax @entity == 'specific-value' anstelle des Formats @entity:(specific-value) verwenden.

    Wenn Sie beispielsweise die Syntax @appliance == 'air conditioner' verwenden, werten Sie nur den Wert der ersten erkannten Entität @appliance aus. Die Verwendung von @appliance:(air conditioner) wird jedoch auf entity['appliance'].contains('air conditioner') erweitert, was immer dort zu einer Übereinstimmung führt, wo mindestens eine Entität @appliance mit dem Wert 'Klimaanlage' in der Benutzereingabe erkannt wird.

  • Daten aus dem Protokoll ausblenden: Sie können verhindern, dass Informationen in Protokollen gespeichert werden, indem Sie sie in einer Kontextvariablen speichern und die Kontextvariable im Abschnitt $private des Nachrichtenkontexts verschachteln. Zum Beispiel $private.my_info. Durch das Speichern in dem privaten Objekt werden Daten nur vor den Protokollen verborgen. Die Informationen werden trotzdem im zugrunde liegenden JSON-Objekt gespeichert. Machen Sie diese Informationen nicht für die Clientanwendung zugänglich.

  • Personenbezogene Daten prüfen: Wenn Sie prüfen und verhindern möchten, dass ein Benutzer personenbezogene Daten an einen späteren Prozess übergibt, können Sie einen Dialogmodulknoten mit Bedingungen für eine Musterentität hinzufügen. Platzieren Sie den Knoten am Beginn der Baumstruktur für das Dialogmodul; dies stellt sicher, dass als Erstes die Eingabe überprüft wird. Die Entität könnte beispielsweise nach US-Sozialversicherungsnummern-oder E-Mail-Adressmustern suchen. Die Antwort könnte ähnlich wie Please do not submit personally identifiable information. Can you reenter your request? lauten. Sie können den Kontext optional zurücksetzen, um sicherzustellen, dass die vom Benutzer übergebenen Informationen mit personenbezogenen Daten nicht beibehalten werden.

Tipps zur Verwendung von Bedingungen

  • Auf Werte mit Sonderzeichen überprüfen: Wenn Sie überprüfen möchten, ob eine Entität oder Kontextvariable einen Wert enthält, in dem ein Sonderzeichen, z. B. ein Hochkomma (') vorkommt, müssen Sie den Wert, den Sie überprüfen möchten, in runde Klammern einschließen. Beispiel: Um zu überprüfen, ob eine Entität oder Kontextvariable den Namen O'Reilly enthält, müssen Sie den Namen in runde Klammern einschließen.

    @person:(O'Reilly) und $person:(O'Reilly)

    Der Assistent wandelt diese gekürzten Verweise in die folgenden vollständigen SpEL-Ausdrücke um:

    entities['person']?.contains('O''Reilly') und context['person'] == 'O''Reilly'

    SpEL verwendet ein zweites Hochkomma als Escapezeichen für das Hochkomma in dem Namen.

  • Auf mehrere Werte prüfen: Wenn Sie mehr als einen Wert überprüfen möchten, können Sie eine Bedingung mit Operatoren des Typs OR (||) erstellen, um mehrere Werte in der Bedingung aufzulisten. Wenn Sie beispielsweise eine Bedingung definieren möchten, die wahr (true) ist, wenn die Kontextvariable $state die Abkürzungen für Massachusetts, Maine oper New Hampshire enthält, können Sie den folgenden Ausdruck verwenden:

    $state:MA || $state:ME || $state:NH

  • Überprüfung auf Zahlenwerte: Stellen Sie beim Vergleichen von Zahlen zunächst sicher, dass die Entität oder Variable, die Sie überprüfen, einen Wert hat. Wenn die Entität oder Variable keinen Zahlenwert hat, wird sie als mit einem Nullwert (0) in einem Zahlenvergleich behandelt.

    Sie möchten beispielsweise prüfen, ob ein in der Benutzereingabe enthaltener Dollarwert kleiner als 100 ist. Wenn Sie die Bedingung @price < 100 verwenden und die Entität @price null ist, wird die Bedingung als true ausgewertet, da 0 kleiner als 100 ist, obwohl der Preis nie festgelegt wurde. Um diesen Typ von ungenauen Ergebnissen zu verhindern, verwenden Sie eine Bedingung wie @price AND @price < 100. Falls @price keinen Wert besitzt, gibt diese Bedingung richtigerweise 'false' zurück.

  • Auf Absichten mit einem bestimmten Muster im Absichtsnamen überprüfen: Sie können eine Bedingung verwenden, die nach Absichten sucht, die mit einem bestimmten Muster übereinstimmen. Beispiel: Um alle erkannten Absichten zu suchen, deren Absichtsnamen mit 'User_' beginnen, können Sie eine Syntax wie die folgende in der Bedingung verwenden:

    intents[0].intent.startsWith("User_")

    Dabei werden jedoch alle erkannten Absichten berücksichtigt, auch solche mit einem niedrigeren Konfidenzwert als 0,2. Stellen Sie außerdem sicher, dass Absichten, die aufgrund ihrer Konfidenzbewertung als irrelevant eingestuft werden, nicht zurückgegeben werden. Um dies zu erreichen, ändern Sie die Bedingung wie folgt:

    !irrelevant && intents[0].intent.startsWith("User_")

  • Auswirkungen der unscharfen Suche auf die Entitätserkennung: Wenn Sie eine Entität als Bedingung verwenden und die unscharfe Suche aktiviert ist, wird @entity_name nur dann als wahr ausgewertet, wenn die Übereinstimmungswahrscheinlichkeit größer als 30% ist. Dies ist nur der Fall, wenn @entity_name.confidence > .3.

Entitätsmustergruppen in der Eingabe erkennen und speichern

Um den Wert einer Musterentität in einer Kontextvariablen zu speichern, hängen Sie .literal an den Entitätsnamen an. Die Verwendung dieser Syntax stellt sicher, dass der exakte Textbereich aus der Benutzereingabe, der dem angegebenen Muster entspricht, in der Variablen gespeichert wird.

.literal anhängen
Variable Wert
E-Mail <? @email.literal ?>

Um den Text aus einer einzelnen Gruppe in einer Musterentität mit definierten Gruppen zu speichern, geben Sie die Arraynummer der Gruppe an, die Sie speichern möchten. Angenommen, das Entitätsmuster für die Entität '@phone_number' ist wie folgt definiert (beachten Sie, dass die Klammern Mustergruppen einschließen):

\b((958)|(555))-(\d{3})-(\d{4})\b

Um nur die Ortsnetzkennzahl der in der Benutzereingabe angegebenen Telefonnummer zu speichern, können Sie die folgende Syntax verwenden:

Nur Vorwahl
Variable Wert
area_code <? @phone_number.groups[1] ?>

Die Gruppen werden durch den regulären Ausdruck begrenzt, der zum Definieren des Gruppenmusters verwendet wird. Wenn die Benutzereingabe, die dem in der Entität @phone_number definierten Muster entspricht, beispielsweise 958-234-3456 ist, werden die folgenden Gruppen erstellt:

Details zur Gruppe
Gruppennummer Wert in der Regex-Engine Wert im Dialog Erläuterung
Gruppen[0] 958-234-3456 958-234-3456 Die erste Gruppe ist immer die vollständige übereinstimmende Zeichenfolge
Gruppen[1] ((958)l(555)) 958 Zeichenfolge, die dem regulären Ausdruck für die erste definierte Gruppe, d. h. ((958)l(555)), entspricht
Gruppen[2] (958) 958 Übereinstimmung mit der Gruppe, die als erster Operand im Ausdruck OR ((958)l(555)) enthalten ist
Gruppen[3] (555) null Keine Übereinstimmung mit der Gruppe, die als zweiter Operand im Ausdruck OR ((958)l(555)) enthalten ist
Gruppen[4] (\d{3}) 234 Zeichenfolge, die mit dem für die Gruppe definierten regulären Ausdruck übereinstimmt
Gruppen[5] (\d{4}) 3456 Zeichenfolge, die mit dem für die Gruppe definierten regulären Ausdruck übereinstimmt

Als Hilfe für die Entscheidung, welche Gruppennummer zum Erfassen des für Sie relevanten Eingabeabschnitts verwendet werden soll, können Sie Informationen zu allen Gruppen auf einmal extrahieren. Erstellen Sie mit der folgenden Syntax eine Kontextvariable, die ein Array aller gruppierten Übereinstimmungen mit Musterentitäten zurückgeben:

Array übereinstimmender Gruppen
Variable Wert
array_of_matched_groups <? @phone_number.groups ?>

Geben Sie in der Anzeige 'Ausprobieren' einige Testwerte mit Telefonnummern ein. Für die Eingabe 958-123-2345 setzt dieser Ausdruck $array_of_matched_groups auf den Wert ["958-123-2345","958","958",null,"123","2345"].

Anschließend können Sie alle Werte in dem mit 0 beginnenden Array zählen, um die entsprechende Gruppennummer abzurufen.

Array-Elemente
Array-Elementwert Array-Elementnummer
"958-123-2345" 0
"958" 1
"958" 2
null 3
"123" 4
"2345" 5

Anhand des Ergebnisses können Sie ermitteln, dass Sie beispielsweise die Gruppe #5benötigen, um die letzten vier Ziffern der Telefonnummer zu erfassen.

Verwenden Sie die folgende Syntax, um die JSONArray-Struktur zurückzugeben, die zum Darstellen der gruppierten Musterentität erstellt wird:

JSON übereinstimmender Gruppen
Variable Wert
json_matched_groups <? @phone_number.groups_json ?>

Dieser Ausdruck legt für $json_matched_groups das folgende JSON-Array fest:

[
  {"group": "group_0","location": [0, 12]},
  {"group": "group_1","location": [0, 3]},
  {"group": "group_2","location": [0, 3]},
  {"group": "group_3"},
  {"group": "group_4","location": [4, 7]},
  {"group": "group_5","location": [8, 12]}
]

Die Entitätseigenschaft location gibt durch eine relative Zeichenposition mit der Basis null an, wo der erkannte Entitätswert im Eingabetext beginnt und endet.

Wenn Sie erwarten, dass die Eingabe zwei Telefonnummern enthält, können Sie auf zwei Telefonnummern prüfen. Verwenden Sie gegebenenfalls die folgende Syntax, um beispielsweise die Ortsnetzkennzahl der zweiten Nummer zu erfassen.

JSON übereinstimmender Gruppen
Variable Wert
second_areacode <? entities['phone_number'][1].groups[1] ?>

Wenn die Eingabe aus der Zeichenfolge I want to change my phone number from 958-234-3456 to 555-456-5678 besteht, dann ist $second_areacode gleich 555.