Integration von benutzerdefiniertem Code und Backend
Hier einige Best Practices für das Schreiben von benutzerdefiniertem Code und die Backend-Integration für digitale Assistenten.
Am Ende einer Konversation müssen Sie etwas mit den Informationen tun, die von einem Benutzer gesammelt wurden. Dieses "Etwas" erfordert in der Regel den Zugriff auf einen Backend-Service, um Daten oder persistente Daten abzufragen, für die Sie benutzerdefinierte Komponenten erstellen müssen. Eine weitere Verwendung für benutzerdefinierte Komponenten besteht darin, benutzerdefinierte Logik zu integrieren, die komplexe Validierungen oder andere Utilityfunktionen verarbeitet. Oracle Digital Assistant unterstützt zwei Typen von benutzerdefinierten Komponenten:
- Benutzerdefinierte Dialogablaufkomponenten (CCS)
- Entity-Event Handler (EEH)
Während der Planungs- und Designphase Ihres digitalen Assistenten müssen Sie die benötigten Backend-Ressourcen identifizieren und entscheiden, ob die dafür verfügbaren APIs ausreichend sind oder nicht.
- Da es sich bei digitalen Assistenten nicht um Webanwendungen handelt, müssen vorhandene APIs möglicherweise über eine Optimierungsebene optimiert oder abstrahiert werden, um nur die Daten und die Datenmenge zurückzugeben, die in einer Unterhaltung mit digitalen Assistenten erforderlich sind.
- Wenn Sie keine REST-Services für die Backend-Funktionalität zur Integration in eine Unterhaltung des digitalen Assistenten haben, müssen Sie ein Projekt entwerfen und auslösen, um sie zu erstellen.
Bei der Implementierung Ihrer Backend-Serviceintegration treffen Sie Entscheidungen darüber, ob Sie benutzerdefinierte Komponenten remote bereitstellen oder die eingebetteten Komponentencontainer in Oracle Digital Assistant-Kenntnissen verwenden möchten.
Wie die folgende Abbildung zeigt, ist die Backend-Integration ein notwendiger Teil der Planungs- und Implementierungsphase.
Benutzerdefinierte Dialogablaufkomponenten
Mit benutzerdefinierten Dialogablaufkomponenten können Sie eigene Benutzeroberflächenkomponenten erstellen, die Sie Ihrem Dialogablauf hinzufügen können, um benutzerdefinierte Codelogik im Kontext einer Unterhaltung auszuführen. Zu den Anwendungsfällen beim Schreiben dieser Komponenten gehören:
-
Abfragen und Schreiben von Remote-Backend-Services über REST-Services.
-
Out-of-the-box-Lösungen, die alle Benutzerinteraktionen für eine bestimmte Aufgabe verarbeiten, wie das Anfordern von Benutzerfeedback am Ende einer Unterhaltung, das Protokollieren und Melden von Fehlern an einen Administrator usw.
-
Unterstützung der Verwaltung von Daten in Objektarrays, die in einer Dialogablaufvariable gespeichert sind.
Gute Namen für Komponenten und Eingabeparameter verwenden
Es gibt kein Feld zum Bereitstellen von Beschreibungen für benutzerdefinierte Komponenten, in dem erläutert wird, was sie tun und welche Informationen an sie übergeben werden müssen. Die besten Möglichkeiten, Skillentwicklern bei der Verwendung Ihrer Komponente zu helfen, sind daher, gute Namen für die Komponente und Eingabeparameter zu verwenden und die Aktionszeichenfolgen, die Ihre Komponente zurückgibt, sorgfältig auszuwählen.
-
Integrierte YAML-Komponenten verwenden
System.<name>
als Namen. Vor allem für YAML-basierte Dialogabläufe können SieCustom.<name>
für Skillprüfer verwenden, um zu verstehen, dass es sich um eine benutzerdefinierte Komponente handelt, die der Dialogablauf referenziert. Sie können auch einen Namensraum verwenden, um Kontext bereitzustellen. Für unsere kundenspezifischen Musterkomponenten verwenden wir oftoracle.sample.<name>
, um anzugeben, dass diese Komponenten nicht als Produktionsqualität gedacht sind. -
Eingabeparameter stellen Daten für die zu verarbeitende benutzerdefinierte Komponente bereit. Häufig sind die an eine benutzerdefinierte Komponente übergebenen Daten nicht der tatsächliche Wert, mit dem gearbeitet werden soll, sondern der Name einer Variablen, die entweder die zu verarbeitenden Datenwerte enthält oder in die Daten geschrieben werden sollen, die von einem Remote-Service abgefragt wurden. Beim Betrachten der integrierten Komponenten verwenden sie
variable
als Eigenschaftsnamen, um den Namen der Variablen zu speichern, in die das Komponentenergebnis geschrieben wird, oder<name>Var
(z.B.nlpResultVar
), um Eigenschaften anzugeben, die auf einen Variablenreferenznamen verweisen. Sie können dies weiter verbessern, indem Sie die Postfixe_in
und_out
verwenden, um anzugeben, ob eine Variable auf eine Variable verweist, die Daten enthält oder Daten von der Komponente erwartet. -
Aktionszeichenfolgen sind optional und können vom Skillentwickler verwendet werden, um den nächsten Dialogablaufstatus für die Navigation zu bestimmen. Wenn Sie
success
oderfailure
als Aktionszeichenfolge verwenden, wird nicht viel Kontext bereitgestellt. Daher wird empfohlen, stattdessenorderSubmitted
,orderRejected
oderuserUnauthorized
zu verwenden.
Vermeiden Sie Annahmen in Ihrem Code
Die Realität ist, dass oft der Entwickler einer benutzerdefinierten Komponente auch der Skillentwickler ist, der sie verwendet. Aus diesem Grund vereinfachen viele Entwickler ihre Arbeit mit benutzerdefinierten Komponenten, indem sie Annahmen über Variablen treffen, die im Skill vorhanden sind. Anstatt den Namen einer Variablen an die Komponente zu übergeben, verweisen sie direkt auf den Namen in der benutzerdefinierten Komponentenlogik. Wir empfehlen dies nicht, da solche Annahmen eine benutzerdefinierte Komponente leicht brechen können. Es wird empfohlen, einen klaren und vollständigen Vertrag zwischen der benutzerdefinierten Komponente und den verwendeten Skills zu definieren.
Denkbibliothek
Eine allgemeine Frage ist, wie viele benutzerdefinierte Komponenten einem benutzerdefinierten Komponentenservicepaket hinzugefügt werden sollen. Im Allgemeinen ist es immer eine gute Idee, benutzerdefinierte Komponentenservices und die darin enthaltenen Komponenten als Bibliotheken zu betrachten. Daher können alle Komponenten, die sich auf eine Aufgabe beziehen, in einem einzelnen benutzerdefinierten Komponentenservice gespeichert werden. Empfehlungen müssen sich der Realität stellen können. Daher muss die Frage, wie benutzerdefinierte Komponenten verpackt werden sollen, basierend auf der beabsichtigten Verwendung der benutzerdefinierten Komponenten beantwortet werden.
-
Wiederverwendung ist keine Option für viele Entwickler benutzerdefinierter Komponenten. Wenn benutzerdefinierte Komponenten für einen bestimmten Skill entwickelt und verwendet werden, ist es sinnvoll, alle diese Komponenten in einem einzelnen benutzerdefinierten Komponentenservice-Deployment zu gruppieren. Die Ausnahme ist für Komponenten, die tatsächlich in anderen Fähigkeiten wiederverwendet werden.
-
Eingebettete Komponentencontainer-Deployments sind durch die Anzahl der benutzerdefinierten Komponentenservices pro Oracle Digital Assistant-Instanz eingeschränkt. Daher möchten Sie einen einzelnen benutzerdefinierten Komponentenservice pro Skill verwenden oder nach einem Remote-Deployment Ihrer benutzerdefinierten Komponenten suchen.
-
Verwenden Sie das Remote-Deployment benutzerdefinierter Komponentenservices in Kubernetes in Oracle Cloud Infrastructure aus den folgenden Gründen:
-
So geben Sie vertrauliche Informationen nicht weiter, die in Ihrem benutzerdefinierten Komponentencode enthalten sind. Benutzerdefinierte Komponentenservices, die im eingebetteten Container bereitgestellt werden, können von allen Personen heruntergeladen werden, die vollständigen Zugriff auf Ihre Oracle Digital Assistant-Instanz haben.
-
Bessere Segmentierung des Codes. Benutzerdefinierte Komponenten dürfen nur Code enthalten, der zur Interaktion mit dem Bot und zum Aufrufen von REST-Services erforderlich ist. Der gesamte andere Code muss in externen JavaScript-Dateien (wenn ein eingebetteter Container verwendet wird) oder in Integrationslayer (REST-Services) gespeichert werden. Benutzerdefinierte Komponenten umfassen Code, der Folgendes ausführt:
-
Eingabeparameter lesen
-
Variablenwerte lesen/festlegen
-
von einer Komponente empfangene Nachrichten verarbeiten
-
Benutzeroberfläche der benutzerdefinierten Komponente wiedergeben
-
Übergang zu einem nächsten Status bestimmen
-
Komponentenstatus verwalten
-
auf REST-Services zugreifen
-
-
Um die Leistung zu verbessern. Der eingebettete Container für das Deployment benutzerdefinierter Komponenten in Skills verwendet OCI-Funktionen, die eine Kaltstartverzögerung aufweisen. Um diese Verzögerung zu vermeiden und die Anzahl der Services, die bereitgestellt werden können, zu begrenzen, bietet Ihnen eine Remote-Bereitstellung benutzerdefinierter Komponenten eine sorgenfreie Alternative.
-
Gemeinsame Komponenten gemeinsam verwenden. Obwohl unsere Erfahrung darin besteht, dass die Wiederverwendung unter den Entwicklern von benutzerdefinierten Komponenten nicht sehr hoch eingestuft wird, ist es sinnvoll, häufig verwendete benutzerdefinierte Komponenten zu erstellen und auf einem Remoteserver bereitzustellen. Möglicherweise sind allgemeine Komponenten für Fehlerbehandlung und Eskalation, 2-beinige OAuth2-Autorisierungsverarbeitung und mehr vorhanden.
-
So schreiben Sie Logmeldungen
Der Standardlogger, der für benutzerdefinierte Komponenten implementiert ist, ist der Konsolenlogger. Sie greifen über einen Aufruf an context.logger()
auf den Logger zu. Sie können die für den Konsolenlogger verfügbaren Aufrufloggingfunktionen wie ".info('…')
oder ".warn('…')
" verwenden.
Hinweis: Die Verwendung von context.logger()
ist bei der Bereitstellung im eingebetteten Container am sinnvollsten, da der eingebettete Container weiß, wie diese Logs ordnungsgemäß angezeigt werden. Für benutzerdefinierte Komponenten, die Sie extern bereitstellen, sollten Sie eine andere Logging-Library verwenden, wie log4js.
Den internen Status Ihrer Komponente verwalten
Benutzerdefinierte Dialogablaufkomponenten können eine längere Interaktion mit einem Benutzer haben, bevor die Navigation in einen nächsten Dialogablaufstatus übergeht. Für diese Interaktion müssen Sie sicherstellen, dass die Komponente ihren internen Status verarbeitet, damit sie zwischen einem Erstaufruf und nachfolgenden Aufrufen unterscheiden kann. Dazu gibt es zwei Möglichkeiten:
-
Fügen Sie ein Token zur Payload der Postback-Nachricht hinzu. Wenn die benutzerdefinierte Komponente eine Benutzeroberfläche wiedergibt, auf der Benutzer einen Aktionspunkt drücken können, wird eine Postback-Nachricht an die benutzerdefinierte Komponente zurückgesendet. Die benutzerdefinierte Komponente muss die empfangenen Postback-Nachrichten auswerten, um zu bestimmen, ob dieses Postback von der Benutzeroberfläche stammt, die es wiedergibt, oder von einer anderen Komponente. Hierfür kann die Postback-Nachricht geprüft werden, ob sie ein Token enthält, das die benutzerdefinierte Komponente beim Rendern des Aktionspunkts hinzugefügt hat.
-
Dialogablaufvariable verwenden Wenn Sie einen komplexeren Status zwischen benutzerdefinierten Komponentenaufrufen verwalten müssen, z.B. um aus Benutzernachrichten extrahierte Werte zu verfolgen, können Sie dafür eine Dialogablaufvariable verwenden. Benutzerdefinierte Komponenten können Dialogablaufvariablen zur Laufzeit in einem Aufruf von
context.variable('variable name', value)
erstellen. Wenn eine Variable mit dem angegebenen Namen nicht vorhanden ist, wird sie erstellt. Das Objekt "Wert" kann alles sein, was Sie im Auge behalten müssen.
Eingabeparameter validieren
Eingabeparameter, die Sie für eine benutzerdefinierte Komponente definieren, müssen validiert werden, um Inhalt zu haben. Dies gilt auch für Parameter, die Sie bei Bedarf festlegen. Folgende Fälle müssen geprüft werden:
-
Der Eingabeparameter hat ein Werteset.
-
Der Wert beginnt nicht mit
'$ {'
, da dies einen Ausdruck zum Lesen des Eingabeparameterwerts aus einer Variablen angibt oder ein Objekt im Dialogablauf nicht korrekt aufgelöst wird.
Klasse MessageFactory für Komponentennachrichten verwenden
Alle Botantworten, die Sie von einer benutzerdefinierten Komponente senden, müssen die Klasse MessageFactory
verwenden. Mit der Klasse MessageFactory
kann derselbe Typ von Rich-User-Nachrichten erstellt werden wie die Komponente "Allgemeine Antwort", die Wertelisten, Anhänge, Kartenlayouts und Textnachrichten enthält.
Darüber hinaus sind Nachrichten, die mit der Klasse MessageFactory
definiert sind, kanalunabhängig. Dies bedeutet, dass Sie eine einzelne Komponentenmeldung erstellen, die dann von den kanalspezifischen Connectors in das vom jeweiligen Clientkanal benötigte Format konvertiert wird.
Um von einer benutzerdefinierten Komponente auf die Klasse MessageFactory
zuzugreifen, verwenden Sie die folgende Referenz:
let MessageFactory = context.MessageFactory();
Die Klasse
MessageFactory
ersetzt die Klasse MessageModel
, die veraltet ist. Beide Klassen haben denselben allgemeinen Zweck, aber MessageFactory
bietet die folgenden Vorteile:
- Es unterstützt alle Meldungsarten und -eigenschaften des Common Message Model (CMM) und nicht nur eine Teilmenge.
- Die Implementierung ist klassenbasiert und bietet einen sauberen Getter, Setter und Methoden zum Ändern der Nachrichtendefinition. Der Codeabschluss erfolgt bei Verwendung von Typescript sowie in JavaScript, wenn die richtigen Typdefinitionen oben im Event Handler oder in der benutzerdefinierten Komponente enthalten sind.
- Die Implementierung verwendet das Builder-Muster, mit dem Sie eine Reihe von Settern ketten oder Methoden hinzufügen können, um den Code lesbarer zu machen und die Anzahl der Zeilen zu reduzieren, die Sie codieren müssen
Checkliste für benutzerdefinierte Komponenten
- ☑ Stellen Sie sicher, dass Backend-Services für die Verwendung mit Skills optimiert oder abstrahiert sind.
- ☑ Benutzerdefinierte Komponenten dürfen nur botbezogenen Code enthalten. Der gesamte andere Code muss in Utilityklassen oder -bibliotheken verschoben oder als einzelne REST-Services auf einem Remoteserver oder Cloud-Service bereitgestellt werden.
- ☑ Erstellen Sie einen klaren und vollständigen Vertrag zwischen benutzerdefinierten Komponenten und den Skills, in denen sie verwendet werden.
- ☑ Verwenden Sie benutzerdefinierte Komponenten für komplexe Auswertungen. Vermeiden Sie in diesen Fällen Apache FreeMarker.
- ☑ Komponentenstatus für Benutzerinteraktionen mit mehreren Anforderungen verwalten.
- ☑ Validieren Sie alle Eingabeparameter für benutzerdefinierte Komponenten.
- ☑ Behandeln Sie Fehler, indem Sie eine Aktionszeichenfolge zurückgeben, damit der Skillentwickler Probleme lösen kann.
Entity-Event-Handler
Ein Entity Event Handler ist ein Typ einer benutzerdefinierten Komponente, mit der Sie benutzerdefinierten Komponentencode im Kontext der Auflösung von Mischentitys aufrufen können. Entity-Event-Handler werden in modellgesteuerten Unterhaltungen verwendet, um mit Benutzereingaben zu interagieren und diese zu validieren und Remote-Backend-Services für Lese- und Schreibzugriff aufzurufen. Im Gegensatz zu benutzerdefinierten Dialogablaufkomponenten ist die Wiederverwendungswahrscheinlichkeit für einen Event Handler minimal. Daher ist die Standardimplementierung des Entity Event Handlers für den eingebetteten Skillcontainer.
Fehlende Funktionalität zur Auflösung von Entitätskomponenten hinzufügen
Viele der Funktionen, die für die Komponente "Allgemeine Antwort" festgelegt werden können, wie globale Schaltflächen für Hilfe und Abbrechen, sind für die Komponente "Entitäten auflösen" nicht über die Konfiguration verfügbar.
Sie können jedoch fehlende Funktionen mit Entity Event Handlern hinzufügen. Auf diese Weise können Sie die Einfachheit der Komponente "Entitäten auflösen" im Dialogablauf nutzen, ohne die erweiterte Funktionalität zu beeinträchtigen.
Status verwalten
Entity-Event-Handler-Funktionen werden von den Resolve-Entitys und Common-Response-Komponenten beim Auflösen einer Mischentity aufgerufen. Sie müssen nicht verfolgen, welcher Beutelartikel als Nächstes gelöst werden muss, da alles für Sie erledigt ist.
Dennoch können Sie einige Informationen für die spätere Verwendung speichern. Dazu stehen zwei Optionen zur Verfügung:
-
Kontextauflösungseigenschaften sind Variablen, die Sie für das Kontextobjekt erstellen. Die Variablen und ihre Werte sind vorhanden, bis die Mischentity aufgelöst ist oder Sie den Dialogablaufstatus verlassen, der eine Mischentity auflöst. Der Vorteil der Verwendung der Eigenschaften für die Kontextauflösung besteht darin, dass Sie keinen Housekeeping-Service benötigen.
- Zum Schreiben verwenden Sie:
context.setCustomProperty(name, value);
- Zum Lesen verwenden Sie:
context.getCustomProperty(name);
- Zum Schreiben verwenden Sie:
-
Dialogflussvariablen, die zur Laufzeit oder zur Entwurfszeit erstellt wurden, können verwendet werden, um Werte zu speichern, die über die Auflösung der Mischentity hinaus persistiert werden sollen. Auf Inhalt, der in Dialogablaufvariablen gespeichert ist, kann über Dialogablaufstatus (nur für zur Entwurfszeit definierte Variablen) und andere Entity-Event-Handler zugegriffen werden.
- Zum Schreiben verwenden Sie:
context.variable(name,value);
- Zum Lesen verwenden Sie:
context.variable(name);
- Zum Schreiben verwenden Sie:
So schreiben Sie Logmeldungen
Der für Entity Event Handler implementierte Standardlogger ist der Konsolenlogger.
Sie greifen über einen Aufruf an context.logger()
auf den Logger zu.
Sie können die für den Konsolenlogger verfügbaren Aufrufloggingfunktionen wie .info('…')
oder .warn('…')
verwenden.
Anzeigen von Benutzernachrichten
Benutzerdefinierte Benutzernachrichten werden über die Funktion context.addMessage()
angezeigt. Wie bei benutzerdefinierten Dialogablaufkomponenten wird empfohlen, die Klasse MessageFactory
zum Erstellen kanalagnostischer Nachrichten zu verwenden, anstatt kanalspezifische Payloads auszugeben. Entity-Event-Handler unterstützen auch Nachrichten vom Typ "Werteliste", "Kartenlayout" und "Anhang".
Checkliste für Entity Event Handler
- ☑ Speichern Sie temporäre Werte im Lösungskontext, es sei denn, Sie benötigen sie in einem späteren Dialogablaufstatus.
- ☑ Verwenden Sie einen einzelnen benutzerdefinierten Komponentenservice für alle Entity-Event-Handler, die in einem Skill verwendet werden.
- ☑ Verwenden Sie die Klasse
MessageFactory
, damit Nachrichten für Benutzer angezeigt werden.
Weitere Informationen
- Oracle Digital Assistant Design Camp-Video: Entity Event Handler
- Tutorial: Entity Event Handler in externer IDE entwickeln
- Beispiel: Modellgesteuerte Unterhaltungen mit EEH nach Beispiel einer Spesenabrechnung
- Bots Node-SDK-Dokumentation: MessageFactory Beispielcode für verschiedene UI-Antworten
- Dokumentation: Entity Event Handler-Funktionen (im Kontextobjekt dargestellt)
Welche Komponente sollten Sie verwenden?
Entity Event Handler werden mit Mischentitys verwendet, während benutzerdefinierte Dialogablaufkomponenten im Kontext von Unterhaltungen verwendet werden, die zwischen Dialogablaufstatus wechseln. Letztendlich werden Sie wahrscheinlich beide verwenden. Wenn Sie die Empfehlung zur Verwendung modellgesteuerter Unterhaltungen befolgen, verwenden Sie eher Entity-Event-Handler als benutzerdefinierte Dialogablaufkomponenten.
Aus funktionaler Sicht sind die benutzerdefinierten Dialogablaufkomponenten (CCS) und Entity Event Handler (EEH) sehr ähnlich. In der folgenden Tabelle werden die beiden benutzerdefinierten Komponententypen verglichen.
Funktionalität | CCS | ANH |
---|---|---|
Node.js Modulunterstützung / JavaScript Entwicklung | Ja | Ja |
TypeScript-Unterstützung | Ja | Ja |
Browserbasierte Entwicklung | Nein | Ja |
Entwicklung der externen IDE | Ja | Ja |
In Dialogfeldern verwenden | Ja | Nein |
In Mischentitys verwenden | Nein | Ja |
Eingabeparameter | Ja | Nein |
Programmatische Navigation zu Aktionsübergängen | Ja | Nein |
REST-Services aufrufen | Ja | Ja |
Von Dialogablaufvariablen lesen/schreiben | Ja | Ja |
Werte temporär im Auflösungskontext speichern | Nein | Ja |
Resource Bundles/Mehrsprachenfähigkeit verwenden | Ja | Ja |
Reiche Benutzeroberflächen und Eingabeaufforderungen für die Interaktion mit Benutzern darstellen | Ja | Ja |
Unterstützung für Skillcontainerbereitstellung | Ja | Ja |
Remote-Bereitstellungsunterstützung | Ja | Ja |
Lokale Debugging-Unterstützung (erfordert NGROK oder andere Tunnel) | Ja | Ja |
Benutzerdefinierte Veranstaltungen | Nein | Ja |
Unterstützung von Post-Back-Aktionen | Ja | Ja |
Resource Bundles für CCS und EEH verwenden
Benutzerdefinierte Dialogablaufkomponenten und Entity-Event-Handler, die Botnachrichten für den Benutzer anzeigen, müssen Nachrichten in den vom digitalen Assistenten unterstützten Sprachen anzeigen.
Bis vor kurzem gab es keine einfache Möglichkeit, Resource Bundles zu verwenden, die in einem Skill aus benutzerdefinierten Komponenten definiert wurden. Aber jetzt gibt es eine neue Programmierschnittstelle, mit der Sie Resource Bundle-Schlüssel in Ihrem Code referenzieren können. Es gibt zwei bekannte Einschränkungen, die Sie beachten sollten:
-
Die Verwendung von Resource Bundle-Zeichenfolgen ist auf Resource Bundles ohne Parameter oder mit Positionsparametern beschränkt. Benannte Parameter, die mit ICU-Nachrichten-Bundles verwendet werden, werden von der neuen API noch nicht unterstützt.
-
Die API erstellt einen Ausdruck, der, wenn er als Botantwort zurückgegeben wird, durch die referenzierte Nachrichten-Bundle-Zeichenfolge für die erkannte Sprache ersetzt wird.
Um die neue API aufzurufen, verwenden Sie einen der folgenden Kontextobjektaufrufe:
let expression = context.translate('resource_bundle_key_name');
let expression = context.translate('resource_bundle_key_name', param1, param2);
Der Ausdruck kann in Textantworten, als Schaltflächenlabels und auf Karten mit der Klasse MessageFactory
verwendet werden.
-
Beispiel für Entity Event Handler:
const messageModel = context.getMessageFactory(); //create a conversation message format text object that references a key name const message = messageModel.createTextMessage(context.translate('resource_bundle_key')); //display the message to the user keeping the turn, which means the composite bag entity //proceeds with the next bag item to resolve context.addMessage(message,true);
-
Beispiel für benutzerdefinierten Dialogablauf:
const messageModel = context.getMessageFactory(); //create a conversation message format text object that references a key name const message = messageModel.createTextMessage(context.translate('resource_bundle_key')); //display the message to the user keeping the turn, which means the composite bag entity //proceeds with the next bag item to resolve context.reply(message); context.keepTurn(true); context.transition(); done();
Siehe auch den Artikel TechExchange Eingabeparameter verwenden, um übersetzte Resource Bundle-Zeichenfolgen an benutzerdefinierte Komponenten zu übergeben.
Benannte Parameter verwenden
So können Sie auf benannte Parameter in einem Resource Bundle zugreifen:
//Entity event handler sample
let expression = "${rb('key_name','param_name1,param_name2',"+value1+","+value2+")}";
let message = messageFactory.createTextMessage(expression);
context.addMessage(message,true);
//Custom dialog flow component sample
let expression = "${rb('key_name','param_name1,param_name2',"+value1+","+value2+")}";
let message = messageFactory.createTextMessage(expression);
context.reply(message);
Unsere Empfehlung zu Resource Bundles und benutzerdefinierten Komponenten
Die Verwendung von Resource Bundles überall ist ein allgemeines Thema in dieser Dokumentation. Die Verwendung von Resource Bundles, die in einem Skill gespeichert sind, schafft jedoch eine enge Kopplung zwischen der benutzerdefinierten Dialogablaufkomponente oder dem Ereignis-Handler und dem Skill. Wenn Sie mit dieser Abhängigkeit einverstanden sind und den Vorteil schätzen, dass Ressourcenzeichenfolgen an einem einzigen Ort verwaltet werden, anstatt das Problem der engen Kopplung zu vermeiden, sollten Sie dies tun. Für Event Handler ist die Wiederverwendungswahrscheinlichkeit ohnehin minimal, weshalb es keinen Zweifel an der Verwendung von Resource Bundle-Zeichenfolgen in Entity Event Handlern geben sollte.
Bei benutzerdefinierten Dialogablaufkomponenten, die in verschiedenen Skills wiederverwendet werden, funktioniert die Übersetzungsfunktion auch, wenn die Skills die Resource Bundle-Schlüsselnamen aufweisen, die von der benutzerdefinierten Komponente benötigt werden, die ihrem Resource Bundle hinzugefügt wurde.
Mit einer alternativen Lösung können Sie eine enge Kopplung benutzerdefinierter Komponenten an einen Skill vermeiden, indem Sie die aus einem Resource Bundle gelesenen Nachrichten als Eingabeparameter an eine benutzerdefinierte Dialogablaufkomponente übergeben.
Sollen Sie zu Entity Event Handlern migrieren?
Wenn Sie von benutzerdefinierten Dialogablaufkomponenten zu Entity-Event-Handlern wechseln, sollte dies aus einem bestimmten Grund geschehen, nicht nur, weil es sich um eine neue Technologie handelt. Das Ändern von Likes durch Likes verbessert Ihre Fähigkeiten nicht. Wenn Sie mit dem aktuellen Unterhaltungsablauf nicht zufrieden sind und die Verwendung von Mischentitys in Betracht ziehen, um Teile Ihrer Dialogablaufkonversation zu ersetzen, ist dies ein guter Grund, die Codelogik von benutzerdefinierten Dialogablaufkomponenten in Entity-Event-Handler zu verschieben.
Best Practices bei der Migration zu Entity Event Handlern
Wenn Sie vorhandene Funktionen aus benutzerdefinierten Dialogablaufkomponenten in Entity Event Handler verschieben möchten, um den Unterhaltungsablauf zu verbessern, stellen Sie sicher, dass Sie nicht nur versuchen, das Verhalten nachzuahmen, das Sie mit der benutzerdefinierten Dialogablaufkomponente und der Komponente "Gemeinsame Antwort" implementiert haben. Verwenden Sie stattdessen die Komponente "Entitys auflösen", und verwenden Sie Entity Event Handler-Funktionen, um die gesamte Validierung und Logik zu implementieren, die für Ihren Konversationsanwendungsfall erforderlich ist.