Conseils de création de conversation
Obtenez des conseils sur les manières de traiter les tâches courantes.
Ajout de noeuds
-
Ajoutez un nom de noeud décrivant la fonction du noeud.
Aujourd'hui, vous savez ce que le noeud fait, mais dans quelques mois, vous ne le saurez peut-être pas. Le nom du noeud est également affiché dans le journal, ce qui peut vous aider à déboguer une conversation ultérieurement.
-
Pour collecter les informations nécessaires à l'exécution d'une tâche, utilisez un noeud avec attributs au lieu d'un groupe de noeuds distincts pour obtenir des informations des utilisateurs. Reportez-vous à la section Collecte d'informations à l'aide d'attributs.
-
Pour un flux de processus complexe, indiquez aux utilisateurs les informations qu'ils doivent fournir au début du processus.
-
Comprenez comment l'assistant se déplace dans l'arborescence du dialogue et l'impact des dossiers, des branches, des accès directs et des digressions sur le trajet. Reportez-vous à la rubrique Flux de dialogue.
-
N'ajoutez pas de liens d'accès partout. Ils augmentent la complexité du flux de dialogue et rendent plus difficile son débogage ultérieur.
-
Pour accéder à un noeud de la même branche que le noeud actuel, utilisez Skip user input et non Jump-to.
Cette option vous évite d'avoir à modifier les paramètres du noeud en cours lorsque vous supprimez ou réorganisez les noeuds enfant auxquels vous avez fait un saut. Reportez-vous à la rubrique Définition de l'étape suivante.
-
Avant d'activer les digressions à partir d'un noeud, testez les scénarios utilisateur les plus courants. Et assurez-vous que les noeuds susceptibles de faire l'objet d'une digression sont configurés pour effectuer un retour de la digression. Reportez-vous à la rubrique Digressions.
Ajout de réponses
-
Faites en sorte que vos réponses soient brèves et utiles.
-
Reflétez l'intention de l'utilisateur dans la réponse.
Cela garantit aux utilisateurs que le bot les comprend ou, si ce n'est pas le cas, leur donne la possibilité de corriger immédiatement un malentendu.
-
Incluez des liens vers des sites externes dans les réponses si la réponse dépend de données qui changent fréquemment.
-
Evitez l'utilisation excessive des boutons. Encourager les utilisateurs à choisir des options prédéfinies à partir d'un ensemble de boutons ressemble moins à une conversation réelle et diminue votre capacité à apprendre ce que les utilisateurs veulent vraiment faire. Lorsque vous laissez des utilisateurs réels formuler des demandes avec leurs propres mots, vous pouvez utiliser ces entrées pour former le système et en déduire de meilleures intentions.
-
Evitez d'utiliser un groupe de noeuds lorsqu'un noeud suffit. Par exemple, ajoutez plusieurs réponses conditionnelles à un seul noeud pour renvoyer des réponses différentes en fonction des détails fournis par l'utilisateur. Reportez-vous à la rubrique Réponses conditionnelles.
-
Formulez soigneusement vos réponses. Vous pouvez modifier la façon dont une personne réagit à votre système simplement en modifiant la formulation de votre réponse. La modification d'une ligne de texte peut vous éviter d'avoir à écrire plusieurs lignes de code pour mettre en oeuvre une solution de programmation complexe.
Conseils relatifs à la capture d'informations à partir des entrées utilisateur
Il peut être difficile de connaître la syntaxe à utiliser dans votre noeud de dialogue afin de capturer avec précision les informations que vous souhaitez rechercher dans l'entrée utilisateur. Voici quelques approches que vous pouvez utiliser pour atteindre des objectifs communs.
-
Renvoi de l'entrée utilisateur : vous pouvez capturer le texte exact énoncé par l'utilisateur et le renvoyer dans votre réponse. Utilisez l'expression SpEL suivante dans une réponse pour répéter le texte que l'utilisateur a spécifié dans la réponse :
You said: <? input.text ?>.Si l'autocorrection est en fonction, et que vous souhaitez renvoyer l'entrée d'origine de l'utilisateur avant qu'elle ait été corrigée, vous pouvez utiliser
<? input.original_text ?>. Toutefois, veillez à utiliser une condition de réponse qui vérifie si la zoneoriginal_textexiste d'abord. -
Détermination du nombre de mots dans l'entrée utilisateur : vous pouvez exécuter l’une des méthodes String prises en charge sur l’objet input.text. Par exemple, vous pouvez connaître le nombre de mots d'un énoncé utilisateur à l'aide de l'expression SpEL suivante :
input.text.split(' ').size() -
Utilisation de plusieurs intentions: un utilisateur entre une entrée qui exprime deux tâches distinctes.
I want to open a savings account and apply for a credit card.Comment le dialogue reconnaît-il et traite-t-il ces deux intentions ? Voir l'entrée de blogue Questions composées. -
Prise en charge des intentions ambiguës: un utilisateur entre une entrée suffisamment ambiguë pour que l'assistant trouve deux noeuds ou plus avec des intentions susceptibles de la traiter. Comment le dialogue sait-il quelle branche de dialogue il doit suivre ? Si vous activez la désambiguïsation, il peut présenter des options aux utilisateurs et leur demander de choisir celle qui convient. Pour plus d'informations, reportez-vous à la rubrique Désambiguïsation.
-
Traitement de plusieurs entités dans une entrée : si vous souhaitez évaluer uniquement la valeur de la première instance détectée pour un type d'entité, vous pouvez utiliser la syntaxe
@entity == 'specific-value'à la place du format@entity:(specific-value).Par exemple, lorsque vous utilisez
@appliance == 'air conditioner', vous évaluez uniquement la valeur de la première entité@appliancedétectée. Mais, lorsque la syntaxe@appliance:(air conditioner)est utilisée, elle prend la forme développéeentity['appliance'].contains('air conditioner'), et une correspondance est établie chaque fois qu'au moins une entité@applianceavec la valeur 'air conditioner' est détectée dans l'entrée utilisateur. -
Masquage des données du journal: vous pouvez empêcher le stockage des informations dans les journaux en les stockant dans une variable contextuelle et en imbriquant la variable contextuelle dans la section
$privatedu contexte de message. Par exemple,$private.my_info. Le stockage des données dans l'objet privé les masque uniquement vis à vis des journaux. Les informations sont toujours stockées dans l'objet JSON sous-jacent. N'exposez pas ces informations à l'application client. -
Recherche d'informations personnelles : si vous souhaitez vérifier qu'aucun utilisateur n'envoie des informations identifiant la personne à un processus ultérieur et empêcher ce type d'envoi, vous pouvez ajouter un noeud de dialogue avec une condition sur une entité de canevas. Placez le noeud au début de l'arborescence du dialogue pour qu'il vérifie d'abord l'entrée. Par exemple, l'entité peut rechercher des modèles de numéro de sécurité sociale aux Etats-Unis ou des modèles d'adresse électronique. Il peut ensuite répondre par quelque chose comme,
Please do not submit personally identifiable information. Can you reenter your request?Vous pouvez éventuellement réinitialiser le contexte pour vous assurer que les informations soumises par l'utilisateur avec les informations personnellement identifiables ne soient pas conservées.
Conseils relatifs à l'utilisation des conditions
-
Recherche de valeurs contenant des caractères spéciaux : si vous souhaitez vérifier si une entité ou une variable contextuelle contient une valeur et que cette dernière comporte un caractère spécial, par exemple, une apostrophe ('), vous devez placer la valeur recherchée entre parenthèses. Par exemple, pour vérifier si une entité ou une variable contextuelle contient le nom
O'Reilly, vous devez placer celui-ci entre parenthèses.@person:(O'Reilly)et$person:(O'Reilly)L'assistant convertit ces références abrégées en expressions SpEL complètes, présentées ci-dessous :
entities['person']?.contains('O''Reilly')etcontext['person'] == 'O''Reilly'SpEL utilise une seconde apostrophe pour mettre en échappement l'apostrophe incluse dans le nom.
-
Vérification de plusieurs valeurs : si vous souhaitez rechercher plusieurs valeurs, vous pouvez créer une condition utilisant des opérateurs OR (
||) pour répertorier plusieurs valeurs dans la condition. Par exemple, pour définir une condition qui est vraie si la variable contextuelle$statecontient les abréviations pour Massachusetts, Maine ou New Hampshire, vous pouvez utiliser l'expression suivante :$state:MA || $state:ME || $state:NH -
Recherche de valeurs numériques: Lorsque vous comparez des nombres, vérifiez d'abord que l'entité ou la variable que vous vérifiez possède une valeur. Si l'entité ou la variable n'a pas de valeur numérique, elle est traitée comme ayant une valeur nulle (0) dans une comparaison de nombres.
Par exemple, vous souhaitez vérifier si une valeur en dollars incluse dans l'entrée utilisateur est inférieure à 100. Si vous utilisez la condition
@price < 100et que l'entité@pricea la valeur nulle, la condition est évaluée en tant quetruecar 0 est inférieur à 100, même si le prix n'a jamais été défini. Pour éviter ce type de résultat inexact, utilisez une condition telle que@price AND @price < 100. Si aucune valeur n'est associée à@price, cette condition renvoie correctement la valeur false. -
Recherche d'intentions ayant un canevas de nom d'intention spécifique : vous pouvez utiliser une condition qui recherche des intentions correspondant à un canevas. Par exemple, pour rechercher des intentions détectées dont les noms commencent par 'User_', vous pouvez utiliser une syntaxe telle que la suivante dans la condition :
intents[0].intent.startsWith("User_")Toutefois, lorsque vous faites cela, toutes les intentions détectées sont prises en compte, même celles dont la cote de confiance est inférieure à 0.2. Vérifiez également que les intentions considérées comme non pertinentes en fonction de leur score de confiance ne sont pas renvoyées. Pour ce faire, modifiez la condition comme suit :
!irrelevant && intents[0].intent.startsWith("User_") -
Comment l'appariement flou influence la reconnaissance de l'entité: si vous utilisez une entité comme condition et que la correspondance partielle est activée,
@entity_namen'a pour résultat vrai que si la confiance de la correspondance est supérieure à 30 %. En d'autres cas, uniquement si@entity_name.confidence > .3.
Stockage et reconnaissance des groupes de canevas d'entités dans l'entrée
Pour stocker la valeur d'une entité de canevas dans une variable contextuelle, ajoutez .literal au nom d'entité. L'utilisation de cette syntaxe permet de s'assurer que le passage de texte issu d'une entrée utilisateur qui correspondait
exactement au canevas spécifié est stocké dans la variable.
| Variable | Valeur |
|---|---|
| adresse électronique | <? @email.literal ?> |
Pour stocker le texte d'un groupe unique dans une entité de canevas avec des groupes définis, spécifiez le numéro de tableau du groupe que vous souhaitez stocker. Supposons par exemple que le canevas d'entité est défini comme suit pour l'entité @phone_number (n'oubliez pas que les parenthèses désignent des groupes de canevas) :
\b((958)|(555))-(\d{3})-(\d{4})\b
Pour stocker uniquement l'indicatif régional du numéro de téléphone spécifié dans l'entrée utilisateur, vous pouvez utiliser la syntaxe suivante :
| Variable | Valeur |
|---|---|
| area_code | <? @phone_number.groups[1] ?> |
Les groupes sont délimités par l'expression régulière qui est utilisée pour définir le canevas de groupe. Par exemple, si l'entrée utilisateur qui correspond au modèle défini dans l'entité @phone_number est: 958-234-3456,
les groupes suivants sont créés:
| Numéro de groupe | Valeur de moteur d'expression régulière | Valeur de dialogue | Explication |
|---|---|---|---|
| groupes[0] | 958-234-3456 |
958-234-3456 |
Le premier groupe est toujours la chaîne qui correspond parfaitement. |
| groupes[1] | ((958)l(555)) |
958 |
Chaîne qui correspond à l'expression régulière pour le premier groupe défini, ((958)l(555)). |
| groupes[2] | (958) |
958 |
Correspondance par rapport au groupe qui est inclus comme première opérande dans l'opération OR ((958)l(555)). |
| groupes[3] | (555) |
null |
Pas de correspondance par rapport au groupe qui est inclus comme seconde opérande dans l'opération OR ((958)l(555)). |
| groupes[4] | (\d{3}) |
234 |
Chaîne qui correspond à l'expression régulière définie pour le groupe. |
| groupes[5] | (\d{4}) |
3456 |
Chaîne qui correspond à l'expression régulière définie pour le groupe. |
Afin de vous aider à déchiffrer le numéro de groupe à utiliser pour capturer la section d'entrée qui vous intéresse, vous pouvez extraire des informations sur tous les groupes en même temps. Utilisez la syntaxe suivante pour créer une variable contextuelle qui renvoie un tableau de toutes les correspondances d'entité de canevas regroupées :
| Variable | Valeur |
|---|---|
| array_of_matched_groups | <? @phone_number.groups ?> |
Utilisez le panneau "Try it out" pour entrer des valeurs de numéro de téléphone de test. Pour l'entrée 958-123-2345, cette expression affecte à $array_of_matched_groups la valeur ["958-123-2345","958","958",null,"123","2345"].
Vous pouvez ensuite compter chaque valeur du tableau à partir de 0 afin d'obtenir le numéro de groupe correspondant.
| Valeur d'élément de tableau | Numéro d'élément de tableau |
|---|---|
| "958-123-2345" | 0 |
| "958" | 1 |
| "958" | 2 |
| null | 3 |
| "123" | 4 |
| "2345" | 5 |
A partir du résultat, vous pouvez déterminer que pour capturer les quatre derniers chiffres du numéro de téléphone, vous avez besoin du groupe #5, par exemple.
Afin de renvoyer la structure de tableau JSON qui est créée pour représenter l'entité de canevas regroupée, utilisez la syntaxe suivante :
| Variable | Valeur |
|---|---|
| json_matched_groups | <? @phone_number.groups_json ?> |
Cette expression affecte à $json_matched_groups le tableau JSON suivant :
[
{"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]}
]
location est une propriété d'une entité qui utilise un décalage de caractère basé sur des zéros indiquant où la valeur d'entité détectée commence et finit dans le texte d'entrée.
Si vous vous attendez à ce que deux numéros de téléphone soient fournis en entrée, vous pouvez rechercher deux numéros de téléphone. S'ils sont présents, utilisez la syntaxe suivante pour capturer l'indicatif régional du second numéro, par exemple :
| Variable | Valeur |
|---|---|
| second_areacode | <? entities['phone_number'][1].groups[1] ?> |
Si l'entrée est I want to change my phone number from 958-234-3456 to 555-456-5678, la valeur de $second_areacode est 555.