Unterhaltungsabläufe implementieren

Im Folgenden finden Sie einige Best Practices für die Implementierung von Unterhaltungsabläufen in digitalen Assistenten.

Mit einem gut gestalteten Modell sind Sie bereit, die Gesprächsabläufe für Ihre regulären Intents zu erstellen. Unterhaltungen werden durch eine Reihe von Dialogablaufschritten in Oracle Digital Assistant-Skills definiert.

Visuellen Modus verwenden

Wenn Sie einen Skill erstellen, können Sie ihn auf Visuell oder den Legacy-Entwurfsmodus YAML setzen. Verwenden Sie immer den visuellen Modus, der auch die Standardoption ist. Der visuelle Modus bietet folgende Vorteile gegenüber dem Legacy-YAML-Modus:

  • Eine visuelle Gestaltungserfahrung, bei der Flusszustände visuell auf einer Leinwand, Editoren für Komponenteneigenschaften und Designzeitvalidierung dargestellt werden.
  • Die Möglichkeit, den gesamten Dialogablauf in mehrere Abläufe aufzuteilen.
  • Die Möglichkeit, wiederverwendbare Abläufe zu erstellen, die von anderen Abläufen aufgerufen werden können, um Dinge zu verarbeiten, die von mehreren Abläufen verwendet werden.
  • Viel einfachere Lesbarkeit und Wartbarkeit.

Dialoggesteuerte Unterhaltungen

Dialoggesteuerte Unterhaltungen erfassen die Benutzerinformationen, die zum Abschließen einer Aufgabe erforderlich sind, indem sie einen Benutzer durch eine Reihe von Dialogablaufstatus navigieren. Jeder Status ist mit einer Komponente verknüpft, um Botantworten und Benutzereingaben wiederzugeben oder Bedingungen, Logik und andere Funktionen zu verarbeiten.

Mit diesem Ansatz entwickeln Sie den Dialogablauf wie ein Filmskript, das Sie aus den Anwendungsfällen ableiten, die Sie in der Planungsphase Ihres Projekts entworfen haben. Da die einzelnen Schritte in einer Unterhaltung durch den Dialogablauf gesteuert werden, kann Ihr Dialogablauf schnell recht groß werden. Um Dialogabläufe zu vermeiden, die in ihrer Größe nicht verwaltet werden können, sollten Sie Ihre Anwendungsfälle in verschiedene Skills partitionieren.

Benennungskonvention für Dialogablaufstatusnamen verwenden

Berücksichtigen Sie die Namen der Dialogablaufstatus in Ihrer Dokumentation. Wenn der Name des Dialogablaufstatus einen Kontext angibt, können Codeprüfer leichter nachvollziehen, was ein Dialogablaufstatus tut und zu welchem Unterhaltungsablauf er gehört. Beispiel:

  • promptForOrderNumber
  • findOrder
  • cancelOrder

Wenn sich Ihr Skill im YAML-Modus befindet, sollten Sie außerdem die zugehörigen Dialogablaufstatus eng in der BotML zusammenhalten, damit Sie beim Prüfen Ihres Codes den Verlauf der Aktionen in einer Unterhaltung einfacher verfolgen können.

Best Practices für die Verwendung von Variablen

Variablen enthalten die Informationen, die ein Skill von einem Benutzer erfasst. Verwenden Sie nach Möglichkeit Variablen eines Entitytyps für die Informationen, die Sie erfassen möchten. Führen Sie dies aus den folgenden Gründen aus:

  • Benutzereingaben werden validiert, und Benutzer werden nach einer ungültigen Dateneingabe erneut angefordert.

  • Digitale Assistenten verwalten die Navigation ohne Sequenzierung, was bedeutet, dass Benutzer eine neue Unterhaltung in einer vorhandenen Unterhaltung starten können, ohne dafür programmieren zu müssen.

  • Für integrierte Entitys, die in eine Mischentity gewrappt sind, und für benutzerdefinierte Entitys können Sie Prompts, eine Validierungsfehlermeldung und einen Disambiguierungs-Prompt definieren (der automatisch von den Komponenten "Gemeinsame Antwort- und Lösungsentitys" angezeigt wird).

  • Eine Variable eines Entitytyps kann aus anfänglichen Benutzernachrichten eingefügt werden, wenn Sie die Entity mit dem Intent verknüpfen. Bei Skills, die im visuellen Dialogmodus entwickelt wurden, erfolgt dieses Einschalten automatisch mit den Komponenten "Gemeinsame Antwort- und Lösungsentitys". Für Skills, die im YAML-Dialogmodus entwickelt wurden, verwenden Sie die Eigenschaft nlpResultVariable in den Eingabekomponenten, um diese Funktionalität abzurufen.

Stichwörter für Aktionspunkte verwenden

Mit gemeinsamen Antwortkomponenten und benutzerdefinierten Komponenten können Sie Stichwörter für Ihre Aktionspunkte definieren. Mit einem Schlüsselwort können Benutzer eine Aktion aufrufen, indem sie eine Verknüpfung wie eine Zahl oder eine Abkürzung senden. Das bedeutet, dass sie keinen Aktionspunkt drücken müssen, den sie ohnehin nicht mit einem Nur-Text-Kanal oder einer Sprachausgabe verwenden konnten, oder den vollständigen Text des angezeigten Aktionspunktlabels eingeben müssen.

Beachten Sie Folgendes, wenn Sie Schlüsselwörter mit Common Response oder benutzerdefinierten Komponenten definieren, einschließlich Entity-Event-Handlern.

  • Schlüsselwörter müssen nicht denselben Text im Label enthalten.

  • Bei Schlüsselwörtern wird zwischen Groß- und Kleinschreibung unterschieden. Sie müssen kein Schlüsselwort in allen möglichen Varianten definieren, bei denen die Groß-/Kleinschreibung beachtet wird.

  • Wenn Sie Bots für mehrere Sprachen erstellen möchten, können Ihre Schlüsselwörter nicht nur in englischer Sprache definiert werden. Um mehrsprachige Schlüsselwörter zu unterstützen, können Sie eine Resource Bundle-Zeichenfolge aus der Eigenschaft keyword der gemeinsamen Antwortkomponenten (${rb('resource_key_name')}) referenzieren. Die Resource Bundle-Zeichenfolge enthält dann eine durch Komma getrennte Liste der Schlüsselwörter.

  • Geben Sie visuelle Hinweise an, die darauf hinweisen, dass Schlüsselwörter verwendet werden können, z. B. durch Hinzufügen einer Indexnummer vor dem Label.

    Beispielsweise kann ein Aktionsmenü zum Einreichen oder Abbrechen einer Anforderung mit den folgenden Bezeichnungen definiert werden: "1. Senden", "2. Abbrechen". Und die Schlüsselwörter könnten als "1,1.,send" und "2,2.,cancel" definiert werden. Um eine Bestellung zu stornieren, kann der Benutzer also "Abbrechen", "2" oder "2" eingeben.

    Hinweis

    Beachten Sie, dass in diesem Fall auch "send" und "cancel" als Schlüsselwörter definiert werden müssen, da die Labels "1" lauten. Senden" und "2. Abbrechen", nicht nur "Abbrechen" senden.
  • Schlüsselwörter funktionieren nicht, wenn sie in einem Satz verwendet werden. Wenn beispielsweise ein Benutzer "Ich möchte meine Bestellung stornieren" schreibt, wird "Abbrechen" nicht als Schlüsselwort erkannt. Wenn Sie erwarten, dass Ihre Benutzer Konversationen anstelle von Schlüsselwörtern verwenden, um eine Option auszuwählen, berücksichtigen Sie NLU-basierte Aktionsmenüs, wie im nächsten Abschnitt erläutert.

Wenn Sie sich fragen, wie Sie indexbasierte Schlüsselwörter für dynamisch erstellte Aktionselemente erstellen, stehen Ihnen folgende Optionen zur Verfügung:

  • Aktivieren Sie die automatische Nummerierung in Ihren Skills über die Konfigurationseinstellung Automatische Nummerierung bei Postback-Aktionen in Taskflows aktivieren des Skills. Dadurch werden die Komponenten konfiguriert, um das Schlüsselwort zur Liste der Schlüsselwörter und den Index zum Label hinzuzufügen.

  • Verwenden Sie Apache FreeMarker-Ausdrücke, um die Indexnummer hinzuzufügen und/oder eine Resource Bundle-Zeichenfolge zu referenzieren, die den Aktionspunktwert in seinem Namen enthält.

NLU-basierte Aktionsmenüs berücksichtigen

Aktionsmenüs verwenden normalerweise Aktionspunkte, die ein Benutzer drücken kann, um zu einer bestimmten Unterhaltung zu navigieren oder einen Vorgang weiterzuleiten, zu bestätigen oder abzubrechen. Wenn ein Aktionspunkt gedrückt wird, wird eine Nachricht mit einer optionalen Payload zum Aktualisieren von Variablen und einer Aktionszeichenfolge an den Skill gesendet, um den Dialogablaufstatus für den Übergang zu bestimmen.

Wenn ein Benutzer eine Nachricht eingibt, die nicht mit dem Aktionspunktlabel übereinstimmt, oder ein für ein Aktionselement definiertes Schlüsselwort, wird der nächste Übergang befolgt. Beispiel: Stellen Sie sich ein Paar Aktionspunkte vor, die Spesenabrechnung senden und Spesenabrechnung stornieren als Labels verwenden. Wenn ein Benutzer "Ja, bitte senden" eingibt, wird der nächste Übergang anstelle des Aktionspunkts ausgelöst, der mit Spesenabrechnung senden markiert ist. Der Grund dafür ist, dass eine Implementierung, bei der Benutzer eine Schaltfläche oder einen Aktionspunkt drücken müssen, nicht dialogorientiert ist.

Um robuste und wirklich dialogorientierte Aktionsmenüs zu erstellen, müssen Sie sie auf Basis von Wertelistenentitys erstellen. Dabei geben die Listenwerte die zu befolgende Aktion an, und die Synonyme definieren mögliche Schlüsselwörter, die ein Benutzer in einer Nachricht zum Aufrufen einer Aktion verwenden würde.

Dazu erstellen Sie zunächst eine Wertelistenentity, für die Sie dann eine Variable im Dialogablauf definieren. Anschließend können Sie die Optionsliste mit einer Komponente "Gemeinsame Antwort" oder "Entitys auflösen" anzeigen. Die von Ihnen erstellte Variable muss als Wert der Variableneigenschaft der Komponente konfiguriert werden. Auf diese Weise wird der nächste Übergang ausgelöst, wenn der Benutzer "Ja, bitte senden" eingibt und zu einem Dialogablaufstatus navigiert, der den in der Variablen gespeicherten Wert prüft.

Der in der Variablen gespeicherte Wert ist einer der Werte, die in der Wertelistenentity definiert sind. Mit einer Switch-Komponente können Sie den nächsten Dialogablaufstatus definieren, mit dem die Unterhaltung fortgesetzt wird.

Wenn der Benutzer eine Nachricht eingibt, die nicht in der Wertelistenentity oder als eines ihrer Synonyme enthalten ist, wird das Aktionsmenü erneut aufgerufen. Da Sie eine Wertelisten-Enitity verwendet haben, können Sie die für die Entity definierte Fehlermeldung verwenden, um Benutzern zu helfen, zu verstehen, was von ihnen erwartet wird. Da Sie mehrere Eingabeaufforderungen für die Wertelistenentity konfigurieren können, können Sie auch alternative Eingabeaufforderungen und sogar Nachrichten anzeigen, die schrittweise zusätzliche Informationen enthalten, einschließlich Informationen zum Abbrechen der Anzeige des Aktionsmenüs.

Wenn Sie Resource Bundle-Zeichenfolgennamen für die Werte in der Wertelistenentity erstellen, können Sie sicherstellen, dass die in den Aktionspunkten angezeigten Labels mit einem der folgenden Ausdrücke übersetzt werden können:

  • ${rb(enumValue)}
  • ${rb(enumValue.value.primaryLanguageValue)} (wenn die Eigenschaft fullEntityMatches für die Komponente "Gemeinsame Antwort" auf true gesetzt ist)

Um die Werte für einen Aktionspunkt dynamisch festzulegen, sind gemeinsame Antwortkomponenten einfacher zu verwenden. Wenn Sie mit der Programmierung von Entity-Event-Handlern vertraut sind, ist auch die Verwendung der Resolve-Entitys möglich.

Mit NLU-basierten Aktionsmenüs können Benutzer einen Aktionspunkt drücken oder eine Nachricht eingeben, die nicht genau mit einem Aktionslabel oder Schlüsselwort übereinstimmen muss.

Aktuelle Unterhaltung für eine neue Unterhaltung unterbrechen

Eine häufig gestellte Frage ist, wie eine Unterhaltung konfiguriert wird, damit Benutzer eine neue oder andere Unterhaltung starten können, wenn sie zur Eingabe aufgefordert werden. Diese Frage ist jedoch eher eine Designentscheidung, die Sie treffen müssen, als über technisches Know-how. Hier sind die Design-Überlegungen:

  • Ist Ihr Skill über einen digitalen Assistenten verfügbar? In diesem Fall nimmt der Skill am Nicht-Sequitur-Routing des digitalen Assistenten teil, der Nachrichten an einen anderen Skill oder ein anderes Intent in demselben Skill weiterleitet, wenn die Benutzernachricht für den aktuellen Dialogablaufstatus nicht erfolgreich validiert werden konnte. Um diese Nicht-Sequitur-Navigation durchzuführen, stellen Sie sicher, dass die Benutzereingabe anhand einer Entity-basierten Variablen validiert wird.

  • Wird Ihr Skill als Standalone-Skill angezeigt? Wenn ja, gibt es keine integrierte Navigation ohne Sequitur, und Sie müssen dafür entwerfen. Dazu verwenden Sie eine Entity-basierte Variable für den Dialogablaufstatus, mit dem Benutzer in eine neue Unterhaltung verzweigen können sollen. Anschließend setzen Sie die Eigenschaft maxPrompts der Benutzereingabekomponente auf 1 und konfigurieren den Aktionsübergang cancel, um eine neue Unterhaltung zu starten. Es wäre ein Fehler, den Abbruchübergang direkt auf den Intent-Status zu verweisen, da dies höchstwahrscheinlich zu einer Endlosschleife führen würde. Bevor Sie also wieder in den Intent-Status navigieren, stellen Sie sicher, dass Sie einen Dialogablaufstatus verwenden, der mit der Komponente "Variablen zurücksetzen" konfiguriert ist, um die Variable vom Typ nlpresult und andere für die Unterhaltung erforderliche Variablen zurückzusetzen.

Hinweis

Es wird nicht empfohlen, eigenständige Skills zu erstellen, die Sie direkt in einem Kanal verfügbar machen. Der Hauptgrund ist, dass Sie alle Konversations- und Entwicklungsvorteile verpassen, die Sie durch die Verwendung eines digitalen Assistenten erhalten. Einige der Vorteile, die Sie verpassen würden, sind:
  • Nicht-Sequitur-Navigation. Dies ist die Möglichkeit des digitalen Assistenten, eine aktuelle Unterhaltung auszusetzen, um das Thema vorübergehend in eine andere Unterhaltung zu ändern.

  • Modulare Entwicklung, mit der Sie Ihren Entwicklungsaufwand in mehrere Fähigkeiten aufteilen können, sodass Ihr Bot inkrementell entwickelt und verbessert werden kann.

  • Automatische Bearbeitung von Hilfeanfragen.

  • Wiederverwendung häufig benötigter Fähigkeiten wie häufig gestellte Fragen, Small Talk und Agent-Integration.

Modellgesteuerte Unterhaltungen

Modellgesteuerte Unterhaltungen sind eine Erweiterung von dialoggesteuerten Unterhaltungen. Mit modellgesteuerten Unterhaltungen reduzieren Sie die Menge an Dialogablaufcode, den Sie schreiben, und bieten eine ausgereifte und domänenobjektorientierte Navigation von Botbenutzerinteraktionen.

Die Idee hinter der modellgesteuerten Unterhaltung besteht darin, die Unterhaltung zu verarbeiten, indem Mischentitys mit Komponenten "Entitys auflösen" oder "Gemeinsame Antwort" aufgelöst werden. Mischentitys ähneln Domainobjekten, da sie eine Gruppe von Entitys zu einem realen Objekt gruppieren, das eine Bestellung, Buchung, einen Kunden oder dergleichen darstellt.

Jede Entity in der Mischentity wird automatisch von einer Komponente "Entitys auflösen" oder "Gemeinsame Antwort" aufgelöst. Das bedeutet, dass alle Botantworten und Prompts für Sie generiert werden, ohne dass Dialogablaufstatus für jede dieser Entitys erstellt werden müssen. Mit modellgesteuerten Unterhaltungen schreiben Sie weniger Dialogablaufcode und erhalten mehr Funktionalität.

Empfohlener Ansatz

Best Practices zum Erstellen von modellgesteuerten Unterhaltungen sind die Verwendung von Mischentitys, Entity-Event-Handlern und der Komponente "Entitys auflösen".

An der Verwendung der Komponente "Gemeinsame Antwort" anstelle von ResolveEntities ist nichts falsch, aber dank Entity-Event-Handlern sind Resolve-Entitys für die meisten Implementierungen ausreichend.

  • Composite Bag-Entitys sind Domainobjekte mit Mischentityelementen für jede Information, die von einem Benutzer erfasst werden soll. Für jedes Mischentityelement sind Prompts, Fehlermeldungen und ein Disambiguation-Prompt definiert, der bei Bedarf angezeigt wird. Bei Mischentityelementen, die auf Wertelistenentitys basieren, können Sie auch Mehrfachauswahllisten anzeigen. Ein Vorteil von Mischentitys besteht darin, dass sie Benutzereingaben für viele ihrer Mischentityelemente aus einer einzigen Benutzernachricht erfassen können. Diese Funktion wird als Out-of-Order-Extraktion bezeichnet und ist standardmäßig aktiviert.

  • Die Komponente Entitys auflösen löst Entitys auf, indem Eingabeaufforderungen angezeigt werden, die in der Entity definiert sind, die Benutzereingabe validiert, Validierungsfehlermeldungen angezeigt werden, die in der Entity definiert sind, und ein Dialogfeld zur Erläuterung angezeigt wird, wenn Benutzer mehr Informationen als erwartet in einer Nachricht angeben. Bei Mischentitys stellt die Komponente "Entitys auflösen" Benutzeroberflächen für alle Mischentityelemente in der Mischentity in der Reihenfolge dar, in der sie definiert sind.

  • Ein Entity-Event-Handler ist eine JavaScript-Komponente, die bei einer Mischentity registriert ist und Funktionen enthält, die bei der Auflösung der Mischentity von der Komponente "Entitys auflösen" aufgerufen werden. Mit diesem ereignisgesteuerten Ansatz können Sie benutzerdefinierte Codelogik ausführen und sogar Remote-REST-Services aufrufen, während ein Benutzer in einer Mischentity arbeitet. Wir werden Entity-Event-Handler später in dieser Anleitung ausführlicher behandeln.

Modellgesteuerte Unterhaltungen entwerfen

Das beste Design für modellgesteuerte Unterhaltungen besteht darin, die Anzahl der Beutelartikel zu minimieren, die von einer Mischentity benötigt werden. Stellen Sie sich Mischentitys als einzelne Konversationsmodule vor, die Sie bis zu einer Unterhaltung verketten.

Setzen Sie sich nach jeder Mischentity, die Sie auflösen, mit dem Benutzer in Verbindung, um ihr die Möglichkeit zu geben, die Konversation fortzusetzen oder abzubrechen.

Natürlich sollte dies nicht mit einer Eingabeaufforderung wie "sollte ich fortfahren" gefolgt von einem Paar "Ja" und "Nein" Tasten implementiert werden. Lassen Sie Ihren Konversationsdesigner einen weniger aufdringlichen Übergang erstellen, der zwei Konversationsmodule miteinander verbindet.

Resource Bundles für Nachrichten und Prompts

Wie bei allen Nachrichten und Prompts wird dringend empfohlen, Resource Bundle-Zeichenfolgen für Prompts und Nachrichten zu verwenden, die in Mischentity-Bag-Elementen definiert sind. Im Folgenden finden Sie einige Beispiele für Mischentitys:

  • cbe.<entity_name>.bag_item_name.errorMessage

  • cbe.<entity_name>.bag_item_name.disambiguationMessage

  • cbe.<entity_name>.bag_item_name.prompt1

  • cbe.<entity_name>.bag_item_name.prompt2

Best Practices für Apache FreeMarker

Apache FreeMarker ist eine leistungsstarke Ausdruckssprache, die Sie in Ihren Dialogabläufen sowie in Entity- und Skillkonfigurationen verwenden können. Apache FreeMarker-Ausdrücke werden jedoch problematisch, wenn sie zu komplex werden, was sie fehleranfällig und aufgrund fehlender Debuggingoptionen schwierig zu verwenden macht.

Unsere Empfehlung ist, komplexe mehrzeilige Apache FreeMarker-Ausdrücke zu vermeiden und stattdessen eine der folgenden Optionen zu berücksichtigen:

  • Teilen Sie komplexe FreeMarker-Ausdrücke auf, indem Sie Werte in Variablen mit Kurznamen speichern, bevor Sie sie im Ausdruck verwenden.

  • Verwenden Sie <#/if ...>-Anweisungen, um die Lesbarkeit für Ihre FreeMarker-Ausdrücke zu verbessern.

  • Verwenden Sie Entity-Event-Handler mit Mischentitys, um komplexen Validierungscode zu verarbeiten oder Werte zu berechnen, die einer Variablen zugewiesen werden sollen.

  • Prüfen Sie mit dem integrierten Ausdruck ?has_content auf Nullwerte für Variablen, die Sie referenzieren. Geben Sie einen vernünftigen Standardwert an, wenn der Ausdruck in "false" aufgelöst wird, z.B. ?has_content?then(...,<SENSIBLE_DEFAULT_VALUE>).

Checkliste für die Implementierung von Unterhaltungen

  • ☑ Wählen Sie sinnvolle und aussagekräftige Namen für Ihre Abläufe und Ablaufstatus aus.
  • ☑ Verwenden Sie Entitytypvariablen.
  • ☑ Benutzereingabe-Prompts für Entitytypvariablen müssen die Eingabeaufforderung aus der Entity lesen.
  • ☑ Erstellen Sie modellgesteuerte Unterhaltungen.
  • ☑ Erstellen Sie Aktionsmenüs aus Wertelistenentitys.
  • ☑ Vermeiden Sie komplexe Apache FreeMarker-Ausdrücke.
  • ☑ Resource Bundles verwenden Es sollte keine Textnachricht oder Eingabeaufforderung direkt zum Dialogablauf hinzugefügt werden.
  • ☑ Erstellen Sie wiederverwendbare Abläufe für Teile der Unterhaltung, die in verschiedenen Abläufen vorkommen.