Implémentation de flux de conversation
Voici quelques bonnes pratiques pour implémenter des flux de conversations dans les assistants numériques.
Avec un modèle bien conçu, vous êtes prêt à commencer à créer les flux de conversation pour vos intentions standard. Les conversations sont définies par une série d'étapes de flux de dialogue dans les briques Oracle Digital Assistant.
Utiliser le mode visuel
Lorsque vous créez une brique, vous avez la possibilité de la définir pour qu'elle utilise le mode de conception Visual ou YAML hérité. Vous devez toujours utiliser le mode Visual, qui est également l'option par défaut. Le mode visuel offre les avantages suivants par rapport au mode YAML hérité, notamment :
- Expérience de conception visuelle, avec des états de flux représentés visuellement sur un canevas, des éditeurs de propriétés de composant et une validation au moment de la conception.
- Possibilité de fractionner le flux de dialogue global en plusieurs flux.
- Possibilité de créer des flux réutilisables qui peuvent être appelés à partir d'autres flux pour gérer les éléments utilisés par plusieurs flux.
- Beaucoup de facilité de lecture et de maintenance.
Conversations axées sur le dialogue
Les conversations pilotées par dialogue collectent les informations utilisateur nécessaires à l'exécution d'une tâche en parcourant un utilisateur à travers une série d'états de flux de dialogue. Chaque état est lié à un composant pour afficher les réponses de bot et les invites utilisateur, ou pour gérer les conditions, la logique et d'autres fonctionnalités.
Avec cette approche, vous développez le flux de dialogue comme un script de film que vous dérivez des cas d'utilisation que vous avez conçus lors de la phase de planification de votre projet. Etant donné que les étapes individuelles d'une conversation sont contrôlées par le flux de dialogue, celui-ci peut rapidement devenir assez volumineux. Pour éviter les flux de dialogue dont la taille n'est pas gérable, vous devez partitionner vos cas d'emploi en différentes briques.
Utilisation d'une convention de dénomination pour les noms d'état de flux de dialogue
Prenez en compte les noms des états de flux de dialogue dans votre documentation. Si le nom de l'état du flux de dialogue fournit un contexte, les réviseurs de code trouvent plus facile de comprendre ce que fait un état de flux de dialogue et à quel flux de conversation il appartient. Par exemple :
promptForOrderNumber
findOrder
cancelOrder
De plus, si votre brique est en mode YAML, envisagez de garder les états de flux de dialogue associés étroitement liés dans BotML afin qu'il soit plus facile de suivre le cours des actions d'une conversation lors de la révision de votre code.
Meilleures pratiques d'utilisation des variables
Les variables contiennent les informations qu'une brique collecte auprès d'un utilisateur. Dans la mesure du possible, utilisez des variables de type d'entité pour les informations à collecter. Effectuez cette opération pour les raisons suivantes :
-
La saisie utilisateur est validée et les utilisateurs sont réinvités après une saisie de données non valide.
-
Les assistants numériques gèrent la navigation non séquentielle, ce qui signifie que les utilisateurs peuvent démarrer une nouvelle conversation dans une conversation existante sans avoir à la coder.
-
Pour les entités intégrées encapsulées dans une entité de conteneur composite et pour les entités personnalisées, vous pouvez définir des invites, un message d'erreur de validation et une invite de désambiguïsation (affichée automatiquement par les composants Réponse commune et Entités de résolution).
-
Une variable d'un type d'entité peut être placée à partir des messages utilisateur initiaux si vous associez l'entité à l'intention. Pour les briques développées en mode boîte de dialogue Visual, cet emplacement se produit automatiquement avec les composants Réponse commune et Résoudre les entités. Pour les briques développées en mode de dialogue YAML, utilisez la propriété
nlpResultVariable
sur les composants d'entrée afin d'obtenir cette fonctionnalité.
Utilisation de mots-clés sur les points d'action
Les composants de réponse communs et les composants personnalisés vous permettent de définir des mots-clés pour vos actions. Avec un mot-clé, les utilisateurs peuvent appeler une action en envoyant un raccourci comme un nombre ou une abréviation. Cela signifie qu'ils n'ont pas besoin d'appuyer sur un élément d'action, ce qu'ils n'ont pas pu quand même utiliser un canal ou une voix en texte uniquement, ni saisir le texte complet du libellé de l'élément d'action affiché.
Tenez compte des points suivants lorsque vous définissez des mots-clés à l'aide de réponses communes ou de composants personnalisés, y compris les gestionnaires d'événements d'entité.
-
Les mots-clés n'ont pas besoin d'afficher le même texte dans le libellé.
-
Les mots-clés ne sont pas sensibles à la casse. Vous n'avez pas besoin de définir un mot-clé dans toutes les variantes possibles sensibles à la casse.
-
Si vous prévoyez de créer des bots pour plusieurs langues, vos mots-clés ne peuvent pas être définis en anglais uniquement. Pour prendre en charge les mots-clés multilingues, vous pouvez référencer une chaîne de groupe de ressources à partir de la propriété
keyword
des composants de réponse commune (${rb('resource_key_name')}
). La chaîne du regroupement de ressources contient ensuite une liste de mots-clés séparés par des virgules. -
Fournissez des indices visuels indiquant que des mots-clés peuvent être utilisés, par exemple en ajoutant un numéro d'index devant le libellé.
Par exemple, un menu d'actions permettant d'envoyer ou d'annuler une prescription peut être défini avec les libellés suivants : "1. Envoyer","2. Annuler". Et les mots-clés pourraient être définis comme "1,1, envoyer" et "2,2, annuler". Ainsi, pour annuler une commande, l'utilisateur peut taper "annuler", "2" ou "2".
Remarque
Notez que dans ce cas, "send" et "cancel" doivent également être définis en tant que mots-clés car les libellés sont "1". Envoyer"et"2. Annuler, pas seulement "Envoyer" un "Annuler". -
Les mots-clés ne fonctionnent pas s'ils sont utilisés dans une phrase. Si, par exemple, un utilisateur écrit "Je préfère annuler ma commande", "annuler" n'est pas détecté en tant que mot-clé. Si vous attendez de vos utilisateurs qu'ils utilisent une conversation au lieu de mots-clés à sélectionner dans une option, prenez en compte les menus d'action basés sur NLU comme expliqué dans la section suivante.
Si vous demandez comment créer des mots-clés basés sur des index pour des actions créées dynamiquement, voici les choix :
-
Activez la numérotation automatique dans vos briques via le paramètre de configuration Activer la numérotation automatique sur les actions de postback dans les flux de tâches de la brique. Cela configure les composants pour ajouter le mot-clé à la liste des mots-clés et l'index à l'étiquette.
-
Utilisez les expressions Apache FreeMarker pour ajouter le numéro d'index et/ou référencer une chaîne de regroupement de ressources contenant la valeur de l'élément d'action dans son nom.
Considérer les menus d'action basés sur NLU
Les menus d'actions utilisent généralement des éléments d'action sur lesquels un utilisateur peut appuyer pour effectuer une navigation vers une conversation spécifique ou pour envoyer, confirmer ou annuler une opération. Lorsqu'un élément d'action est activé, un message est envoyé à la brique avec une charge utile facultative pour la mise à jour des variables et une chaîne d'action pour déterminer l'état du flux de dialogue vers lequel effectuer la transition.
Si un utilisateur saisit un message qui ne correspond pas au libellé de l'élément d'action ou un mot-clé défini pour un élément d'action, la transition suivante est suivie. Par exemple, imaginez une paire de points d'action qui utilisent les libellés Envoyer une note de frais et Annuler une note de frais. Si un utilisateur saisit ou indique "Oui, veuillez envoyer", la transition suivante est déclenchée à la place du point d'action marqué avec Envoyer une note de frais. La raison pour laquelle cela se produirait est qu'une implémentation qui oblige les utilisateurs à appuyer sur un bouton ou un point d'action n'est pas conversationnelle !
Pour créer des menus d'actions robustes et réellement conversationnels, vous devez les créer en fonction d'entités de liste de valeurs, où les valeurs de liste indiquent l'action à suivre et les synonymes définissent les mots-clés possibles qu'un utilisateur utiliserait dans un message pour appeler une action.
Pour ce faire, vous devez d'abord créer une entité de liste de valeurs, pour laquelle vous définissez ensuite une variable dans le flux de dialogue. Vous pouvez ensuite utiliser un composant de réponse commune ou de résolution d'entités pour afficher la liste des options. La variable que vous créez doit être configurée en tant que valeur de la propriété de variable du composant. De cette façon, la transition suivante est déclenchée lorsque l'utilisateur saisit "Oui, veuillez envoyer" et accède à un état de flux de dialogue qui vérifie la valeur stockée dans la variable.
La valeur stockée dans la variable est l'une des valeurs définies dans l'entité value-list. A l'aide d'un composant Switch, vous pouvez définir l'état suivant du flux de dialogue avec lequel la conversation se poursuit.
Si l'utilisateur saisit un message qui ne figure pas dans l'entité de liste de valeurs ou dans l'un de ses synonymes, le menu d'actions est à nouveau appelé. Comme vous avez utilisé une entité de liste de valeurs, vous pouvez utiliser le message d'erreur défini pour l'entité pour aider les utilisateurs à comprendre ce qui est attendu d'eux. En outre, étant donné que vous pouvez configurer plusieurs invites pour l'entité de liste de valeurs, vous pouvez afficher des invites alternatives et même des messages qui révèlent progressivement des informations supplémentaires, y compris des informations sur la manière d'annuler l'affichage du menu d'actions.
Si vous créez des noms de chaîne de groupe de ressources pour les valeurs de l'entité de liste de valeurs, vous pouvez vous assurer que les libellés affichés sur les éléments d'action peuvent être traduits à l'aide de l'une des expressions suivantes :
${rb(enumValue)}
${rb(enumValue.value.primaryLanguageValue)}
(si la propriétéfullEntityMatches
est définie surtrue
pour le composant Réponse commune)
Pour définir dynamiquement les valeurs d'un élément d'action, les composants Réponse commune sont plus faciles à utiliser. Si vous êtes à l'aise avec les gestionnaires d'événements d'entité de programmation, l'utilisation de la fonction Résoudre les entités est également possible.
Avec les menus d'action basés sur NLU, les utilisateurs peuvent appuyer sur un élément d'action ou saisir un message qui n'a pas besoin d'être la correspondance exacte d'un libellé d'action ou d'un mot-clé.
Interruption d'une conversation en cours pour une nouvelle conversation
Une question fréquemment posée est de savoir comment configurer une conversation afin que les utilisateurs puissent démarrer une nouvelle conversation ou une autre conversation lorsqu'ils sont invités à la saisir. Cependant, cette question est plus une décision de conception que vous devez prendre que sur le savoir-faire technique. Voici les considérations relatives à la conception :
-
Votre brique est-elle exposée via un assistant numérique ? Si tel est le cas, la brique participe au routage non séquentiel de l'assistant numérique, qui achemine les messages vers une autre brique ou une autre intention de la même brique si le message utilisateur n'a pas pu être validé pour l'état de flux de dialogue en cours. Pour que cette navigation non séquentielle se produise, assurez-vous que les entrées utilisateur sont validées par rapport à une variable basée sur une entité.
-
Votre brique est-elle exposée en tant que brique autonome ? Si c'est le cas, il n'y a pas de navigation non séquentielle intégrée et vous devez la concevoir. Pour ce faire, vous utilisez une variable basée sur une entité pour l'état de flux de dialogue que vous voulez autoriser les utilisateurs à basculer dans une nouvelle conversation. Vous définissez ensuite la propriété
maxPrompts
du composant d'entrée utilisateur sur 1 et configurez la transition d'actioncancel
pour démarrer une nouvelle conversation. Ce serait une erreur de pointer directement la transition d'annulation vers l'état d'intention, car cela entraînerait probablement une boucle sans fin. Par conséquent, avant de revenir à l'état d'intention, assurez-vous d'utiliser un état de flux de dialogue configuré avec le composant Réinitialiser les variables pour réinitialiser la variable de typenlpresult
et les autres variables nécessaires à la conversation.
Bien que la création de briques autonomes que vous exposez directement sur un canal soit une option, nous ne le recommandons pas. La raison principale est que vous manquez tous les avantages conversationnels et de développement que vous tirez de l'utilisation d'un assistant numérique. Certains des avantages que vous manqueriez sont :
-
Navigation non séquentielle, qui permet à l'assistant numérique de suspendre une conversation en cours pour modifier temporairement la rubrique en une autre conversation.
-
Développement modulaire qui vous permet de diviser vos efforts de développement en plusieurs briques, permettant un développement incrémentiel et des améliorations à votre bot.
-
Traitement automatique des demandes d'aide.
-
Réutilisation des compétences généralement nécessaires, telles que les questions fréquemment posées, les petites discussions et l'intégration d'agents.
Conversations basées sur des modèles
Les conversations basées sur un modèle sont une extension des conversations basées sur le dialogue. Grâce aux conversations basées sur un modèle, vous réduisez la quantité de code de flux de dialogue que vous écrivez, en fournissant une navigation mature et axée sur les objets de domaine des interactions bot-utilisateur.
L'idée derrière ce que nous appelons une conversation orientée modèle est de gérer la conversation en résolvant les entités de conteneur composite à l'aide des composants Résoudre les entités ou Réponse commune. Les entités de conteneur composite sont similaires aux objets de domaine en ce sens qu'elles regroupent un ensemble d'entités pour former un objet du monde réel qui représente une commande, une réservation, un client, etc.
Chaque entité du conteneur composite est automatiquement résolue par un composant de résolution d'entités ou de réponse commune, ce qui signifie que toutes les réponses et invites de bot sont générées pour vous sans qu'il soit nécessaire de créer des états de flux de dialogue pour chacune d'elles. Avec les conversations basées sur un modèle, vous écrivez moins de code de flux de dialogue et obtenez plus de fonctionnalités.
Approche recommandée
Les meilleures pratiques pour créer une conversation basée sur un modèle consistent à utiliser des entités de conteneur composite, des gestionnaires d'événements d'entité et le composant Résoudre les entités.
Il n'y a rien de mal à utiliser le composant Réponse commune au lieu de ResolveEntities, mais, grâce aux gestionnaires d'événements d'entité, Résoudre les entités est suffisant pour la plupart des implémentations.
-
Les entités de conteneur composite sont des objets de domaine qui ont des éléments de conteneur pour chaque information à collecter auprès d'un utilisateur. Chaque élément de poche comporte des invites, des messages d'erreur et une invite de désambiguïsation qui s'affiche si nécessaire. Pour les éléments de conteneur composite basés sur des entités de liste de valeurs, vous pouvez également afficher des listes à sélection multiple. L'un des avantages des entités de conteneur composite est leur capacité à collecter des entrées utilisateur pour de nombreux éléments de conteneur à partir d'un seul message utilisateur. Cette fonctionnalité, appelée extraction dans le désordre, est activée par défaut.
-
Le composant Résoudre les entités résout les entités en affichant les invites définies dans l'entité, en validant les entrées utilisateur, en affichant les messages d'erreur de validation définis dans l'entité et en affichant une boîte de dialogue de désambiguïsation lorsque les utilisateurs fournissent plus d'informations que prévu dans un message. Pour les entités de conteneur composite, le composant Résoudre les entités affiche les interfaces utilisateur pour tous les éléments de conteneur de l'entité de conteneur composite dans l'ordre dans lequel ils sont définis.
-
Un gestionnaire d'événements d'entité est un composant JavaScript inscrit auprès d'une entité de conteneur composite et contient des fonctions appelées par le composant Résoudre les entités lors de la résolution de l'entité de conteneur composite. Cette approche orientée événement vous permet d'exécuter une logique de code personnalisée et même d'appeler des services REST distants lorsqu'un utilisateur travaille dans une entité de conteneur composite. Nous aborderons les gestionnaires d'événements d'entité plus en détail plus loin dans ce guide.
Procédure de conception de conversations basées sur un modèle
La meilleure conception pour les conversations basées sur un modèle consiste à minimiser le nombre d'éléments de conteneur requis par une entité de conteneur composite. Imaginez les entités de conteneur composite en tant que modules conversationnels individuels que vous enchaînez à une conversation.
Vérifiez auprès de l'utilisateur après chaque entité de conteneur composite que vous résolvez pour lui donner la possibilité de poursuivre ou d'arrêter la conversation.
Bien sûr, cela ne devrait pas être implémenté avec une invite telle que "devrais-je continuer" suivie d'une paire de boutons "oui" et "non". Laissez votre concepteur de conversation créer une transition moins intrusive qui relie deux modules de conversation.
Groupes de ressources pour les messages et les invites
Comme pour tous les messages et invites, nous vous recommandons vivement d'utiliser des chaînes de regroupement de ressources pour les invites et les messages définis dans les éléments de conteneur d'entité composite. Voici quelques exemples d'entités de conteneur composite :
-
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
Meilleures pratiques pour Apache FreeMarker
Apache FreeMarker est un langage d'expression puissant que vous pouvez utiliser dans vos flux de dialogue ainsi que dans les configurations d'entité et de brique. Cependant, les expressions Apache FreeMarker deviennent problématiques lorsqu'elles deviennent trop complexes, ce qui les rend sujettes aux erreurs et difficiles à utiliser en raison du manque d'options de débogage.
Nous vous recommandons d'éviter les expressions Apache FreeMarker multilignes complexes et de considérer plutôt l'une des options suivantes :
-
Répartissez les expressions FreeMarker complexes en enregistrant les valeurs dans les variables avec des noms courts avant de les utiliser dans l'expression.
-
Utilisez les directives
<#/if ...>
pour améliorer la lisibilité de vos expressions FreeMarker. -
Utilisez des gestionnaires d'événements d'entité avec des entités de conteneur composite pour traiter un code de validation complexe ou lors du calcul de valeurs à affecter à une variable.
-
Recherchez les valeurs NULL pour les variables référencées à l'aide de l'expression intégrée
?has_content
. Fournissez une valeur par défaut raisonnable si l'expression renvoie la valeur False, par exemple?has_content?then(...,<SENSIBLE_DEFAULT_VALUE>)
.
Liste de contrôle pour l'implémentation des conversations
- ☑ Choisissez des noms sensibles et descriptifs pour vos flux et états de flux.
- ☑ Utilisez des variables de type entité.
- ☑ Les invites d'entrée utilisateur pour les variables de type d'entité doivent lire l'invite à partir de l'entité.
- ☑ Créez des conversations basées sur un modèle.
- ☑ Créez des menus d'actions à partir d'entités de liste de valeurs.
- ☑ Evitez les expressions FreeMarker Apache complexes.
- ☑ Utiliser des groupes de ressources. Aucun message texte ou invite ne doit être ajouté directement au flux de dialogue.
- ☑ Créez des flux réutilisables pour des parties de la conversation communes à différents flux.
En savoir plus
- Vidéo Oracle Digital Assistant Design Camp : L'art de la navigation dans Oracle Digital Assistant
- Exemple Oracle TechExchange : Conversation basée sur un modèle - Compétence de commande de pâtes
- Exemple Oracle TechExchange : Conversation basée sur un modèle - Compétence de reporting des dépenses
- Tutoriel : Développement de flux de dialogue
- Tutoriel : Création d'entités de conteneur composite
- Tutoriel : Optimisation des rapports d'analyse avec les marqueurs de conversation