Implémentation de flux de conversation

Voici quelques bonnes pratiques pour implémenter les 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.


La description de l'implémentation-flows.png suit

Utiliser le mode visuel

Lorsque vous créez une brique, vous pouvez la définir de manière à utiliser le mode de conception Visuel ou YAML hérité. Vous devez toujours utiliser le mode Visuel, 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 lors de la conception.
  • Possibilité de diviser 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 basées sur les dialogues

Les conversations orientées boîte de dialogue collectent les informations utilisateur nécessaires à l'exécution d'une tâche en parcourant 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'utilisation 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

En outre, si votre brique est en mode YAML, envisagez de garder les états de flux de dialogue associés étroitement ensemble dans BotML afin qu'il soit plus facile de suivre le cours des actions dans une conversation lors de la révision de votre code.

Meilleures pratiques pour l'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 d'un type d'entité pour les informations que vous souhaitez collecter. Pour les raisons suivantes :

  • L'entrée utilisateur est validée et les utilisateurs sont de nouveau invités après une entrée 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éshomonymie (affichée automatiquement par les composants Réponse commune et Résoudre des entités).

  • Une variable d'un type d'entité peut être insérée dans les messages utilisateur initiaux si vous associez l'entité à l'intention. Pour les briques développées en mode de dialogue visuel, ce slotting est effectué 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 pour obtenir cette fonctionnalité.

Utiliser des mots-clés pour 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 points d'action. Avec un mot-clé, les utilisateurs peuvent appeler une action en envoyant un raccourci tel qu'un nombre ou une abréviation. Cela signifie qu'ils n'ont pas besoin d'appuyer sur un point d'action, ce qu'ils n'ont pas pu de toute façon utiliser un canal ou une voix de texte uniquement, ni de 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 la réponse commune ou de composants personnalisés, y compris des gestionnaires d'événements d'entité.

  • Les mots-clés n'ont pas besoin d'avoir le même texte affiché dans le libellé.

  • Les mots-clés ne sont pas sensibles à la casse. Il n'est pas nécessaire de définir un mot-clé dans toutes les variantes possibles sensibles à la casse.

  • Si vous envisagez 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'action 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.,send" et "2,2.,cancel". 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 plutôt que des mots-clés pour sélectionner une option, envisagez les menus d'actions basés sur NLU comme expliqué dans la section suivante.

Si vous voulez savoir comment créer des mots-clés basés sur un index pour des points d'action créés 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 permet de configurer les composants pour ajouter le mot-clé à la liste des mots-clés et l'index au libellé.

  • Utilisez des 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.

Prendre en compte 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 accéder à une conversation spécifique ou pour soumettre, confirmer ou annuler une opération. Lorsqu'un point 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 passer.

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 la note de frais. Si un utilisateur saisit "Oui, veuillez envoyer", la transition suivante est déclenchée à la place du point d'action marqué avec Envoyer une note de frais. Cela est dû au fait 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 conversationnels fiables, vous devez les créer en fonction d'entités de liste de valeurs, où les valeurs de liste indiquent l'action à suivre et où 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 Réponse commune ou Résoudre les 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 continue.

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 de nouveau appelé. Etant donné que 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é value-list, vous pouvez afficher d'autres invites et même des messages qui révèlent progressivement des informations supplémentaires, y compris des informations sur la façon d'annuler l'affichage du menu d'actions.

Si vous créez des noms de chaîne de regroupement 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 sur true pour le composant Réponse commune)

Pour définir dynamiquement les valeurs d'un point d'action, les composants Réponse commune sont plus faciles à utiliser. Si vous êtes à l'aise avec la programmation de gestionnaires d'événements d'entité, l'utilisation des entités de résolution est également possible.

Avec les menus d'action basés sur NLU, les utilisateurs peuvent appuyer sur un point d'action ou saisir un message qui ne doit pas nécessairement correspondre exactement à un libellé d'action ou à 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 à propos du savoir-faire technique. Voici les points à prendre en compte pour 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 dans la même brique si le message utilisateur n'a pas pu être validé avec succès pour l'état de flux de dialogue en cours. Pour effectuer cette navigation non séquentielle, assurez-vous que la saisie utilisateur est validée par rapport à une variable basée sur une entité.

  • Votre compétence est-elle exposée en tant que compétence autonome ? Si tel 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 du flux de dialogue auquel vous voulez autoriser les utilisateurs à accéder à une nouvelle conversation. Vous définissez ensuite la propriété maxPrompts du composant d'entrée utilisateur sur 1 et configurez la transition d'action cancel pour démarrer une nouvelle conversation. Il serait erroné de pointer directement la transition d'annulation vers l'état d'intention car elle entraînerait très probablement une boucle sans fin. Avant de revenir à l'état d'intention, veillez donc à utiliser un état de flux de dialogue configuré avec le composant Réinitialiser les variables pour réinitialiser la variable de type nlpresult et les autres variables nécessaires à la conversation.

Remarque

Nous vous déconseillons de créer des briques autonomes que vous exposez directement sur un canal. La raison principale est que vous manquez tous les avantages conversationnels et de développement que vous obtenez de l'utilisation d'un assistant numérique. Certains des avantages que vous pourriez manquer sont :
  • Navigation non séquentielle, c'est-à-dire la possibilité pour 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 partitionner vos efforts de développement en plusieurs compétences, ce qui permet un développement incrémentiel et des améliorations à votre bot.

  • Traitement automatique des demandes d'aide.

  • Réutilisation des compétences couramment nécessaires, telles que les questions fréquemment posées, les petites discussions et l'intégration des agents.

Conversations basées sur des modèles

Les conversations basées sur des modèles sont une extension des conversations basées sur des dialogues. Avec les conversations orientées modèle, vous réduisez la quantité de code de flux de dialogue que vous écrivez, ce qui permet une navigation mature et axée sur les objets du domaine des interactions bot-utilisateur.

L'idée derrière ce que nous appelons une conversation basée sur un 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 ou similaire.

Chaque entité du conteneur composite est résolue automatiquement par un composant Résoudre les entités ou 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 des modèles, 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 sont l'utilisation d'entités de conteneur composite, de gestionnaires d'événements d'entité et du 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é, Resolve Entities est suffisant pour la plupart des implémentations.

  • Les entités de conteneur composite sont des objets de domaine comportant des éléments de conteneur pour chaque information à collecter auprès d'un utilisateur. Chaque élément de conteneur 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 à choix multiples. L'un des avantages des entités de conteneur composite est leur capacité à collecter les entrées utilisateur pour un grand nombre de ses éléments de conteneur à partir d'un message utilisateur unique. Cette fonctionnalité est appelée extraction hors séquence et 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éshomonymie 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 de 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 qui 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 basée sur les événements vous permet d'exécuter une logique de code personnalisé et même d'appeler des services REST distants pendant qu'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 jusqu'à 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 continuer ou d'interrompre la conversation.

Bien sûr, cela ne devrait pas être implémenté avec une invite comme "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 ensemble.

Groupes de ressources pour les messages et les invites

Comme pour tous les messages et invites, nous 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és composites. 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 vulnérables aux erreurs et difficiles à utiliser en raison du manque d'options de débogage.

Nous vous recommandons d'éviter les expressions Apache FreeMarker multiligne complexes et d'envisager 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.

  • Utiliser des gestionnaires d'événements d'entité avec des entités de conteneur composite pour gérer le code de validation complexe ou pour calculer les 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. Indiquez 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 sensés 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 de l'entité.
  • ☑ Créez des conversations basées sur des modèles.
  • ☑ Créez des menus d'actions à partir d'entités de liste de valeurs.
  • ☑ Evitez les expressions FreeMarker Apache complexes.
  • ☑ Utilisez 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.