1. Avant de commencer
Dans cet atelier de programmation, vous allez apprendre à créer un chatbot de vente au détail avec Dialogflow CX, une plate-forme d'IA conversationnelle (CAIP) permettant de créer des UI conversationnelles. Dialogflow CX peut implémenter des agents virtuels, tels que des chatbots, des voicebots et des passerelles téléphoniques, et est compatible avec plusieurs canaux dans plus de 50 langues différentes.
Cet atelier de programmation vous explique comment créer un chatbot de site Web pour un commerce. L'entreprise fictive pour laquelle nous créons le chatbot s'appelle G-Records. G-Records est une maison de disques de rock basée en Californie. La maison de disques compte quatre groupes de rock : Alice Googler, G's N' Roses, The Goo Fighters et The Google Dolls. G-Records vend des produits dérivés de groupes de rock à tous les fans de rock.
À la fin de cet atelier de programmation, vous pourrez utiliser le chatbot pour commander des chemises ou de la musique, ou pour vous renseigner sur votre commande.
Points abordés
Vous découvrirez les avantages de Dialogflow CX par rapport à Dialogflow ES en vous exerçant ! Il comprend les concepts suivants :
- Créer un agent virtuel Dialogflow CX dans Google Cloud
- Découvrir comment créer des flux
- Découvrir comment créer des entités
- Découvrez comment créer des intents.
- Découvrir comment créer des pages et des pages de transition avec des gestionnaires d'état
- Découvrez comment effectuer des transitions entre les pages à l'aide de routes d'intent.
- Découvrez comment effectuer des transitions entre les pages à l'aide de paramètres et de routes de condition.
- Renvoyer des réponses conditionnelles avec des fonctions système
- Découvrez comment créer des messages de remplacement.
- Découvrez comment utiliser le simulateur.
- Créer des scénarios de test et mesurer la couverture de test
La conception finale de l'agent Dialogflow CX se présente comme suit :
Prérequis
- Vous aurez besoin d'une identité Google/adresse Gmail pour créer un agent Dialogflow CX.
- Accès à Google Cloud
2. Configuration de l'environnement
Créer un projet Google Cloud
Étant donné que Dialogflow CX s'exécute dans Google Cloud, vous devez créer un projet Google Cloud. Un projet permet d'organiser toutes vos ressources Google Cloud. Elle se compose d'un ensemble de collaborateurs, d'API activées (et d'autres ressources), d'outils de surveillance, d'informations de facturation, ainsi que de contrôles d'authentification et d'accès.
Lorsque vous créez un projet, vous devez saisir un nom de projet. Vous devrez également l'associer à une organisation et à un compte de facturation existants.
Un compte de facturation sert à déterminer qui assume les frais pour un ensemble de ressources donné. Il peut être associé à un ou plusieurs projets. Les frais d'utilisation du projet sont imputés au compte de facturation associé. Dans la plupart des cas, vous configurez la facturation lorsque vous créez un projet. Pour en savoir plus, consultez la documentation sur Cloud Billing. Assurez-vous que la facturation est activée pour votre projet Cloud.
Activer l'API Dialogflow
Pour utiliser Dialogflow, vous devez activer l'API Dialogflow pour votre projet.
- Sélectionnez le projet pour lequel vous souhaitez activer l'API, puis cliquez sur Continuer.
- Réduisez le menu "API et services", puis cliquez sur Créer des identifiants.
- Cliquez sur Application Data (Données d'application).
- Répondez Non, je ne les utilise pas, car vous n'utilisez pas Kubernetes Engine, App Engine ou Cloud Functions pour le moment.
- Cliquez sur Terminé.
Créer un agent Dialogflow CX
Pour créer un agent Dialogflow CX, ouvrez d'abord la console Dialogflow CX:
- Sélectionnez le projet Google Cloud créé précédemment.
- Cliquez sur Create Agent (Créer un agent).
Remplissez le formulaire pour les paramètres de base de l'agent :
- Vous pouvez choisir n'importe quel nom à afficher.
- Sélectionnez l'emplacement us-central1.
- Sélectionnez le fuseau horaire de votre choix.
- Sélectionnez en - English (Anglais) comme langue par défaut.
Cliquez sur Créer.
Très bien, tout est prêt. Nous pouvons enfin commencer à modéliser notre agent virtuel.
3. Flux
Les boîtes de dialogue complexes impliquent souvent plusieurs sujets de conversation. Dans le cas du chatbot que nous créons pour G-Records, qui vend des produits dérivés de groupes de musique, nous pourrions avoir des conversations sur le catalogue de produits, le paiement, l'état de la commande et les questions du service client. Nous pouvons diviser ces sujets de conversation en flux.
Les flux permettent aux équipes de travailler sur des parcours de conversation individuels. Il est recommandé de simplifier le flux afin qu'il s'adapte facilement à un écran et qu'il soit plus modulaire.
Les flux sont un nouveau concept dans Dialogflow CX. Dialogflow Essentials propose le concept de méga-agents, qui sont en quelque sorte similaires aux flux. Toutefois, vous utiliserez les flux beaucoup plus souvent.
Plus tard dans cet atelier, nous utiliserons des gestionnaires d'état qui peuvent mettre fin à un flux (il reviendra alors à un flux suivant ou précédent), ou vous pourrez mettre fin à la session complète de l'agent.
Créons quelques flux.
Créer des flux
- Dans Dialogflow CX, cliquez sur l'icône + > Créer un flux.
- Spécifiez le nom :
Catalog
, puis appuyez sur Entrée.
Votre premier flux Catalogue a été créé. À présent, créez les autres flux:
Order Process
My Order
Customer Care
Plus tard dans cet atelier, nous définirons des gestionnaires d'état de page. Cela permettra de s'assurer que la visualisation ressemblera à ceci :
Simulateur
Sur la droite de la console Dialogflow CX, vous pouvez tester l'agent virtuel à l'aide du simulateur intégré. Vous pouvez tester la conversation depuis le début ou à partir d'un flux particulier.
- Cliquez sur le bouton Tester l'agent en haut à droite de l'écran.
- Dans le champ "Discuter avec un agent", saisissez :
Hello
. L'agent virtuel répondra par un message d'accueil par défaut : Bonjour ! Que puis-je faire pour vous aider ?
Modifions à présent ce texte d'accueil par défaut.
Flux de démarrage par défaut
Commençons par créer une route d'intent qui se déclenchera lorsque vous saluerez l'agent virtuel.
- Dans la barre latérale de gauche Build > Flows (Créer > Flux), cliquez sur Default Start Flow (Flux de démarrage par défaut), puis sélectionnez le nœud d'arborescence Start (Démarrage).
La page Démarrer s'ouvre. Il a automatiquement sélectionné la page d'accueil, dans la section de la barre latérale Build > Pages (Créer > Pages).
- Dans Start > Routes (Démarrer > Routes), cliquez sur Default Welcome Intent (Intent d'accueil par défaut).
Un intent permet de catégoriser l'intention exprimée par un utilisateur final durant un tour de parole. Dans Dialogflow CX, les intents peuvent faire partie d'un gestionnaire d'état pour acheminer la page ou l'exécution active suivante.
- Supprimez toutes les entrées L'agent dit, puis ajoutez le nouveau texte suivant :
Welcome, I am the virtual agent of G-Records, a fictional rock label. You can order artists merchandise, ask questions about your order or shipping, and I can tell you more which artists are currently signed with us. How can I help?
Pour simplifier la conversation, nous aurons également besoin de boutons de réponse rapide ou de suggestions.
- Cliquez sur Add dialogue option > Custom payload (Ajouter une option de boîte de dialogue > Charge utile personnalisée) et utilisez l'extrait de code ci-dessous.
- Utilisez l'extrait de code ci-dessous comme charge utile personnalisée, puis cliquez sur Enregistrer.
Pour en savoir plus sur les charges utiles personnalisées, consultez la documentation.
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Which artists?"
},
{
"text": "Which products?"
},
{
"text": "About my order..."
}
]
}
]
]
}
- Testez l'intent de bienvenue dans le simulateur.
Vous vous demandez peut-être pourquoi vous ne voyez aucun contenu enrichi. En effet, les contenus enrichis tels que les chips de suggestion dépendent d'une intégration. Les étapes suivantes nécessitent un compte de facturation, mais vous pouvez les ignorer si vous n'en avez pas.
- Dans la barre latérale de gauche, cliquez sur Manage > Integrations (Gérer > Intégrations).
- Choisissez Dialogflow Messenger et cliquez sur Connect (Se connecter).
- Dans le pop-up, cliquez sur Activer.
Une autre fenêtre pop-up s'affiche, cette fois avec le code JavaScript d'intégration que vous pouvez coller sur votre site Web pour intégrer le composant Dialogflow Messenger. Comme nous n'avons pas encore de site Web, nous allons tester l'agent virtuel directement dans l'outil.
- Cliquez sur le lien Essayer.
- Cliquez sur l'icône du chatbot en bas à droite pour ouvrir la fenêtre de chat. Écrivez
Hello
pour lancer la conversation.
Pour le moment, lorsque vous cliquerez sur les chips de suggestion, l'agent virtuel ne comprendra pas ce que vous voulez dire. En effet, notre agent virtuel ne passe pas encore d'un état à un autre. Nous pouvons le faire dans Dialogflow CX avec les pages. Poursuivons l'atelier. Nous allons commencer par créer des entités et des intents.
4. Types d'entités
Les types d'entités permettent de contrôler la manière dont les données des entrées de l'utilisateur final sont extraites. Les types d'entités Dialogflow CX sont très semblables aux types d'entités Dialogflow ES. Dialogflow fournit des entités système prédéfinies correspondant à de nombreux types de données courants. Par exemple, il existe des entités système pour la mise en correspondance des dates, des heures, des couleurs, des adresses e-mail, etc. Vous pouvez également créer vos propres entités pour la mise en correspondance de données personnalisées.
Commençons par préparer toutes les entités personnalisées avant de pouvoir concevoir les pages dans un flux. Nous allons créer les entités suivantes:
Créer des entités
Créons une entité Artiste.
- Cliquez sur Manage > Entity Types (Gérer > Types d'entités).
- Cliquez sur + Créer.
- Nom à afficher :
Artist
- Entités :
The Google Dolls
(avec synonyme:Google Dolls
)The Goo Fighters
(avec synonyme :Goo Fighters
)G's N' Roses
(avec synonyme:Gs and Roses
)Alice Googler
- Cliquez sur "Options avancées", puis cochez la case Correspondance partielle. (Si vous avez mal orthographié le nom du groupe, il se peut qu'il corresponde toujours à la bonne entité.)
- Sous "Options avancées", cochez également Masquer dans le journal. (Si vous avez mal orthographié le nom du groupe, il sera corrigé dans le journal.)
- Cliquez sur Enregistrer.
Nous aurons également besoin d'une entité pour l'élément Merch :
- Cliquez sur Manage > Entity Types (Gérer > Types d'entités).
- Cliquez sur + Créer.
- Nom à afficher :
Merch
- Entités :
T-shirt
Longsleeve
(avec synonyme :Longsleeve shirt
)Tour Movie
Digital Album
(avec synonyme :MP3 Album
,MP3
)CD
(avec synonymesDisc
,Physical CD
)
- Cliquez sur Enregistrer.
Nous aurons également besoin d'une entité pour l'album:
- Cliquez sur Manage > Entity Types (Gérer > Types d'entités).
- Cliquez sur + Créer.
- Nom à afficher:
Album
- Entités :
Live
Greatest Hits
(avec synonyme :Hits
)
- Cliquez sur Enregistrer.
Nous aurons également besoin d'une entité pour les tailles de vêtements :
- Cliquez sur Gérer > Types d'entités.
- Cliquez sur + Créer.
- Nom à afficher:
ShirtSize
- Entités :
XS
(avec synonyme :Extra Small
)S
(avec synonyme :Small
)M
(avec synonyme :Medium
)L
(avec synonyme :Large
)XL
(avec synonyme :Extra Large
)2XL
(avec synonyme :Extra Extra Large
)3XL
- Cliquez sur Enregistrer.
Une entité pour les numéros de commande, qui comportent généralement quatre caractères alphanumériques et trois chiffres. (par exemple, ABCD123)
- Cliquez sur Manage > Entity Types (Gérer > Types d'entités).
- Cliquez sur + Créer.
- Nom à afficher :
OrderNumber
- Entités d'expression régulière
- Entité: [A-Z]{4}[0-9]{3}
- Cliquez sur Enregistrer.
La configuration de votre entité doit se présenter comme suit:
@Artiste :
@Merch:
@Album :
@ShirtSize:
@OrderNumber:
Une fois les entités personnalisées préparées, nous pouvons préparer les intents. Continuons l'atelier.
5. Intents
Un intent permet de catégoriser l'intention exprimée par un utilisateur final durant un tour de conversation. Elles ont été considérablement simplifiées dans Dialogflow CX. Elles ne constituent plus un élément de base de la commande des conversations. Dialogflow CX n'utilise les intents que pour faire correspondre ce que disent les utilisateurs. Dans Dialogflow ES, vous deviez associer tous les éléments à un intent (paramètres, événements, traitement, etc.). Les intents dans Dialogflow CX ne contiennent que des expressions d'entraînement et sont donc réutilisables. Il ne contrôle plus la conversation. Le processus de création d'intents est donc simple :
Les expressions d'entraînement des intents peuvent utiliser des entités pour extraire l'entrée "variable". C'est pourquoi il est recommandé de créer vos types d'entités à l'avance, ce que nous avons fait sur la page précédente de la procédure de l'atelier.
Créer des intentions
Commençons par préparer tous les intents avant de pouvoir concevoir les pages dans un flux.
- Cliquez sur Manage > Intents (Gérer > Intents).
- Cliquez sur + Créer.
Utilisez les informations suivantes :
- Nom à afficher :
redirect.artists.overview
- Description
Artists overview: The bands supported by the label
Faites défiler la page vers le bas et créez les phrases d'entraînement suivantes:
Which bands are signed?
Which bands
Which artists
Which artists are part of the record label
Who is part of the label
From which bands can I buy merchandise
Band merchandise
Which music do you have?
I would like to know who are signed to the label
Who are supported by the label
From who can I buy shirts
What music can I order
Can I get an overview of all the artists
- Cliquez sur Enregistrer.
- Passons maintenant à la création de tous les autres intents. Utilisez votre imagination pour trouver d'autres expressions d'entraînement. Une bonne pratique consiste à définir au moins 10 phrases d'entraînement par intent pour couvrir les différentes façons dont un utilisateur peut déclencher cet intent. Pour les besoins de cet atelier, vous pouvez aussi en avoir moins.
Voici quelques points à vérifier:
- Notez que lorsque vous saisissez votre phrase d'entraînement, Dialogflow CX annote automatiquement vos entités. Si ce n'est pas le cas, vous devrez peut-être mettre à jour votre entité (en ajoutant un synonyme) ou annoter manuellement la phrase d'entraînement.
- Phrases d'entraînement plus courtes : le système de NLU de Dialogflow peut également fonctionner avec des phrases d'entraînement plus courtes. Nous vous en avons fourni quelques exemples ici.
- Surentraînement : un trop grand nombre de phrases d'entraînement pour un intent peut entraîner un surentraînement et un résultat moins souhaitable. Il est recommandé d'utiliser des tests itératifs et incrémentiels, et d'ajouter des phrases d'entraînement en cas de non-correspondance d'un intent.
Nom à afficher | Phrases d'entraînement |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Maintenant que les éléments réutilisables (flux, entités et intents) sont prêts, nous pouvons les rassembler en créant des pages et des gestionnaires d'état.
6. Pages et gestionnaires d'état
Une conversation (session) Dialogflow CX peut être décrite et visualisée en tant que machine à états finis. Prenons l'exemple d'un distributeur automatique. Il pourrait être modélisé comme une machine à états finis. Il comporte les états suivants : "En attente de pièces", "Sélectionner une bonbonnière" et "Donner une bonbonnière". En fonction d'un ensemble d'entrées, il passe d'un état à l'autre. Par exemple, si vous insérez une pièce, le distributeur automatique passe de l'état "En attente de pièces" à "Sélectionner une friandise". Les pages permettent de modéliser ces états pour un agent virtuel Dialogflow CX.
Lorsqu'un utilisateur final interagit avec Dialogflow CX dans une conversation, la conversation passe d'une page à l'autre. Par conséquent, à un moment donné, une seule page est la page actuelle. La page actuelle est considérée comme active, et le flux associé à cette page est également considéré comme actif.
Pour chaque Flow, vous définissez de nombreuses pages, où vos pages combinées peuvent traiter une conversation complète sur le ou les sujets pour lesquels le flux est conçu. Chaque flux dispose d'une page de démarrage spéciale. Lorsqu'un flux devient initialement actif, la page d'accueil devient la page actuelle. À chaque tour de conversation, la page actuelle reste la même ou passe à une autre page. Ce concept vous permet de créer des agents plus volumineux avec de nombreuses pages et plusieurs tours de conversation.
Les pages contiennent des traitements (boîtes de dialogue de saisie statiques et/ou webhooks), des paramètres et des gestionnaires d'état. La gestion des conversations s'effectue via des gestionnaires d'état, ce qui vous permet de créer différents parcours de transition pour passer à une autre page Dialogflow CX, y compris en les rendant conditionnels (pour la ramification des conversations).
L'état d'une conversation est contrôlé en gérant les transitions entre les pages selon trois types de routes différents:
- Routes d'intent : moment auquel un intent doit être mis en correspondance (par exemple, changer de page en fonction de ce qu'un utilisateur final dit). (Lignes bleues dans le diagramme visuel.)
- Routes de condition : lorsque vous devez vérifier une condition (par exemple, changer de page en fonction de certains paramètres stockés dans la session) (lignes orange dans le diagramme visuel).
- Gestionnaires d'événements : lorsque vous devez gérer un événement de remplacement spécifique (par exemple, gérer l'absence d'entrée ou de correspondance afin de diriger l'utilisateur final vers un intent ou un parcours de condition) (lignes vertes dans le diagramme visuel).
Les énoncés de conversation (c'est-à-dire le contenu ou la réponse renvoyée à l'utilisateur) sont définis par un fulfillment, qui peut être statique ou dynamique:
- Fulfillment statique : lorsque vous fournissez une réponse de fulfillment statique.
- Fulfillment dynamique : lorsque le webhook de traitement est appelé pour des réponses dynamiques
Pour notre bot de vente au détail, nous allons créer des parcours d'intent et fournir des réponses de traitement des entrées statiques, qui seront présentées à l'utilisateur dès qu'une page sera activée. Nous créerons ensuite des paramètres avec des parcours de conditions pour recueillir les informations dont vous avez besoin pour passer une commande de marchandises.
Routes d'intent de page
Créer les pages du flux de démarrage par défaut
Voici un organigramme du flux de démarrage par défaut:
Cliquons dessus ensemble :
- Cliquez sur Build > Default Start Flow (Créer > Flux de démarrage par défaut).
- Cliquez sur Page d'accueil.
- Cliquez sur l'icône + à côté de Routes.
- Ajouter redirect.artists.overview
- Faites défiler la page vers le bas jusqu'à Transition, puis passez au flux Catalogue.
- Cliquez sur Enregistrer.
- Répétez les étapes ci-dessus pour
redirect.product.overview
et les 11 autres lignes de ce tableau:
Page (dans le parcours) | Routes > Intent | Routes > Transition vers |
Démarrer |
| - |
Démarrer |
| Flux: catalogue |
Démarrer |
| Flux: catalogue |
Démarrer |
| Flux: catalogue |
Démarrer |
| Flux: catalogue |
Démarrer |
| Flux: catalogue |
Démarrer |
| Flux: catalogue |
Démarrer |
| Parcours : Service client |
Démarrer |
| Parcours : Service client |
Démarrer |
| Parcours : Service client |
Démarrer |
| Flux : "Ma commande" |
Démarrer |
| Flux : "Ma commande" |
Démarrer |
| Flux : "Ma commande" |
Démarrer |
| Page : Mettre fin à la session |
Le flux de démarrage par défaut fonctionne comme un menu d'options lorsque vous appelez un centre d'appels. Toutefois, dans cet agent virtuel, il est entraîné avec le langage naturel, avec les phrases d'entraînement dans les intents. Par conséquent, l'interaction est motivée par la conversation et non par les options DTMF. Elle est donc plus naturelle et semblable à celle d'un être humain.
Créer les pages dans le flux de catalogue
La transcription de chat suivante appartient au flux "Catalogue" :
> "Hi"
"Welcome, I am the virtual agent of G-Records, a fictional rock label.
You can order artists merchandise, ask questions about your order or shipping,
and I can tell you more which artists are currently signed with us. How can I help?"
> "Which bands are signed with this record label?"
"The following bands are signed with G-Records:
Alice Googler, G's N' Roses, The Goo Fighters and The Google Dolls.
From which of these artists would you like to order merchandise?"
> "Alice Googler"
"You want to rock with Alice Googler merchandise. Awesome!
We sell shirts, music or the tour movie.
Which merchandise item do you want?"
"(Suggestion chips: [Shirts] [Music] [Tour Movie])"
> "I would like to buy a Shirt"
"Do you want a longsleeve or a t-shirt?"
"(Suggestion chips: [T-shirt, Longsleeve, Price?])"
> "What's the price difference?"
"A t-shirt costs $25 and a longsleeve costs $30.
Do you want a longsleeve or a t-shirt?"
> "A t-shirt",
"What shirt size do you want?"
"(Suggestion chips: [XS, S, M, L, XL, 2XL, 3XL])"
> "M"
"A T-shirt of Alice Googler size: M costs $25. Shall I continue to order?"
Les dialogues sont différents lorsque vous sélectionnez Musique ou Film de la tournée. Pour la musique, ils se présentent comme suit :
> "Music"
"We have a Greatest Hits Album or the Live Album. Which one do you want?"
"(Suggestion chips: [Greatest Hits, Live, Price?])"
> "The Live Album"
"Do you want this album on CD or MP3?"
"(Suggestion chips: [CD, MP3])"
> "What's the price difference?"
"A CD costs $15. The digital album on MP3 costs $10.
Do you want this album on CD or MP3?"
> "Digital Album",
"The Digital Album: Alice Googler - Live costs $10. Shall I continue to order?"
Pour le film de visite, la boîte de dialogue se présente comme suit :
> "Tour Movie"
"The Tour Movie of G's N' Roses costs $25. Shall I continue to order?
Voici un organigramme de toutes les pages du flux "Catalogue" :
Notez la complexité de ce flux:
- Je pourrais passer la question Quels artistes ? et demander directement Quels articles de merchandising sont disponibles ?
- Dans le parcours de démarrage par défaut, je peux dire : "Je veux acheter le t-shirt The Google Dolls" ou "Je veux acheter quelque chose". Cela signifie que l'agent virtuel posera des questions de suivi afin de remplir les emplacements pour ces paramètres obligatoires. Il accède directement à la page du produit.
- La boîte de dialogue "Prix" provient de la page "Prix" qui sera réutilisée.
- Bien que le dialogue du film de visite semble être le plus simple, nous allons en faire quelque chose de spécial. Nous allons réutiliser cette partie de la boîte de dialogue afin que les utilisateurs finaux puissent également la saisir directement pour l'un des autres produits, s'ils spécialisent toutes les informations en même temps :
> "I want The Goo Fighters longsleeve size S."
"The longsleeve of The Goo Fighters size S costs $30. Shall I continue to order?"
Commençons par associer les pages.
- Cliquez sur Build > Catalog (Compiler > Catalogue).
- Cliquez sur Page d'accueil.
- Cliquez sur l'icône + à côté de Routes.
- Ajouter redirect.artists.overview
- Faites défiler la page jusqu'à Transition, sélectionnez Page, puis choisissez + nouvelle page.
- Utilisez le nom de la page :
Artist Overview
, puis cliquez sur Enregistrer.
Terminons le reste du flux :
- Les étapes précédentes peuvent être répétées avec les pages, les intents et les traitements suivants. Prendre la relève de cette table. Page correspond à la page que vous sélectionnerez dans le flux. Routes > Transition vers correspond au nouveau flux ou à la nouvelle page que vous allez créer et vers laquelle vous allez effectuer la transition.
Page (dans le flux) | Routes > Intent | Routes > Transition vers |
Début du catalogue |
| Présentation de l'artiste |
Début du catalogue |
| Produit |
Début du catalogue |
| Présentation du produit |
Début du catalogue |
| Présentation du produit |
Début du catalogue |
| Chemises |
Début du catalogue |
| Musique |
Début du catalogue |
| Mettre fin à la session |
Début du catalogue |
| Flux de fin |
Présentation de l'artiste |
| Présentation du produit |
Passons maintenant à l'ajout d'autres traitements statiques.
- Dans le flux de catalogue, cliquez sur la page Présentation de l'artiste.
- Cliquez sur Modifier le fulfillment dans la section Fulfillment de la saisie.
- Utilisez les exécutions statiques suivantes (Agent says) :
The following bands are signed with G-Records: Alice Googler, G's N' Roses, The Goo Fighters and The Google Dolls.
- Cliquez sur Enregistrer.
- Dans le flux "Catalogue", cliquez sur la page Aperçu des produits.
- Cliquez sur Modifier le fulfillment dans la section Fulfillment de la saisie.
- Utilisez le traitement statique suivant (Agent says) :
We sell shirts, music or the tour movie.
- Cliquez sur Enregistrer.
Paramètres de la page
Les paramètres sont utilisés pour capturer et mentionner des valeurs ayant été fournies par l'utilisateur final au cours d'une session. Chaque paramètre possède un nom et un type d'entité. @Artist
et @Merch
sont les paramètres minimaux que nous devons collecter pour passer une commande de produits. Pour les tee-shirts ou les hauts à manches longues, vous devez également collecter des @ShirtSize
. Si vous souhaitez commander de la musique, vous aurez également besoin d'un nom @Carrier
et @Album
.
Ces paramètres devront être marqués comme obligatoires. Une fois que c'est nécessaire, vous pouvez fournir des invites personnalisées pour se souvenir de votre utilisateur final et fournir les bonnes réponses afin que ces paramètres puissent être collectés. Plusieurs mécanismes de Dialogflow CX peuvent vous aider à y parvenir.
Par exemple, vous pouvez fournir des messages de fulfillment statique personnalisés dans la section Paramètre. Si le paramètre est obligatoire, ces exécutions de paramètre s'affichent. Ces messages de réponse sont ajoutés à la file d'attente de réponses. Au tour d'un agent, il est possible (et parfois souhaitable) d'appeler plusieurs fulfillments, chacun d'eux pouvant générer un message de réponse. Dialogflow conserve ces réponses dans une file d'attente de réponses. Pour en savoir plus sur le cycle de vie des pages et l'ordre dans lequel ces traitements seront ajoutés à la file d'attente de réponses, consultez la documentation de la page Dialogflow CX.
Créer les paramètres sur la page "Vue d'ensemble de l'artiste"
Définissons quelques paramètres de page :
- Dans le flux du catalogue, cliquez sur la page Présentation de l'artiste.
- Cliquez sur + dans le bloc Paramètres. Ajoutez le paramètre artist:
- Nom à afficher :
artist
- Type d'entité:
@Artist
- Obligatoire : cochez cette case
- Masquer dans le journal : cocher
- Nous allons maintenant ajouter des messages de traitement des paramètres personnalisés. Si le paramètre artiste n'a pas encore été collecté par l'agent virtuel, la réponse de l'agent sera ajoutée à la file d'attente de réponses de l'utilisateur final :
From which of these artists would you like to order merchandise?
- Ajout d'une deuxième option de boîte de dialogue proposant des chips de suggestion enrichis Cliquez sur Ajouter une option de boîte de dialogue, puis utilisez ce code (au format JSON) :
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
Vous pouvez gérer différentes invites de traitement de remplacement en fonction du nombre de tentatives de réponse de l'utilisateur final. Pour ce faire, vous devez utiliser des gestionnaires d'événements de paramètres. Vous pouvez choisir parmi plusieurs gestionnaires d'événements intégrés, tels que Paramètres non valides, Expressions trop longues, Aucune entrée, Aucune entrée au 1er essai, 2e essai ou Aucune correspondance. La différence entre "Aucune entrée" et "Aucune correspondance" est que, dans le premier cas, l'utilisateur n'a jamais fourni de réponse, tandis que dans le second, l'utilisateur a bien fourni une réponse, mais Dialogflow CX n'a pas pu la faire correspondre à une page.
- Faites défiler la page jusqu'à la section Reprompt event handlers (Relancer les gestionnaires d'événements).
- Cliquez sur Ajouter un gestionnaire d'événements, puis sélectionnez l'événement :
No-match default
- Utilisez la réalisation de texte statique d'événement suivante :
I missed that. Please, specify the artist. You can choose between: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- Cliquez sur Enregistrer.
- Cliquez sur Ajouter un gestionnaire d'événements, puis sélectionnez l'événement :
No-input default
. - Utilisez la réalisation de texte statique d'événement suivante :
I am sorry, I could understand the artist's name. You can choose between Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- Cliquez sur Enregistrer.
Routes de condition de page
Les paramètres sont très puissants en combinaison avec les routes conditionnelles de page. Lorsqu'une condition est évaluée à "true", la route de page associée est appelée. Une condition peut être, par exemple, Un paramètre est égal à une valeur spécifique, Un paramètre ne peut pas être manquant, Un formulaire a été rempli, etc. Pour en savoir plus sur les paramètres et les conditions, consultez la documentation Dialogflow CX.
Pour notre agent virtuel de vente au détail, nous devons collecter une séquence de paramètres. Nous devons donc créer une condition pour vérifier si un "formulaire" a été rempli. Un formulaire est une liste de paramètres à collecter auprès de l'utilisateur final pour la page. L'agent virtuel interagit avec l'utilisateur final pendant plusieurs tours de conversation, jusqu'à ce qu'il ait collecté tous les paramètres de formulaire requis, également appelés paramètres de page.
Dialogflow CX définit automatiquement les valeurs de paramètre fournies par l'utilisateur final lors du remplissage du formulaire. Pour vérifier si le formulaire de la page actuelle est rempli, utilisez la condition suivante : $page.params.status = "FINAL"
Créer des routes conditionnelles sur la page "Présentation de l'artiste"
Créons une route conditionnelle qui passera à la page suivante une fois l'artiste identifié :
- Sur la page Présentation de l'artiste, cliquez sur l'icône + dans la section Routes.
- Faites défiler la page jusqu'à la section Condition.
- Sélectionnez Au moins une (OU).
- Ensuite, nous allons écrire une expression qui
- Paramètre :
$page.params.status
- Opérateur :
=
- Valeur :
"FINAL"
- Nous allons maintenant créer un message de traitement statique spécifique sur le parcours, confirmant le choix de l'utilisateur final. Faites défiler la page jusqu'au bloc Fulfillment (Exécution) et écrivez les messages d'exécution suivants :
$session.params.artist, great choice! Rock on!
You want to rock with $session.params.artist merchandise. Awesome!
- Lorsque la condition est vraie, vous devez passer à la page Vue d'ensemble du produit. Faites défiler la page jusqu'à la section Transition, puis utilisez la page suivante :
Product Overview
. - Cliquez sur Enregistrer.
Créer les routes sur la page Vue d'ensemble des produits
Maintenant que nous savons comment créer des paramètres et des routes conditionnelles, créons d'autres paramètres pour les pages suivantes:
Présentation du produit
- Créez le paramètre
artist
sur la page Product Overview (Présentation du produit) :
- Nom à afficher :
artist
- Type d'entité:
@Artist
- Obligatoire : cochez cette case
- Masquer dans le journal : cocher
- Fulfillment d'invite initial :
From which of these artists would you like to order merchandise?
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- Gestionnaire d'événements >
No-match default
:To buy merchandise you can choose between the following artists: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist do you want to buy merchandise from?
- Charge utile personnalisée :
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- Gestionnaire d'événements >
No-input default
:To buy merchandise you can choose between the following artists: Alice Googler, G's N' Roses, The Google Dolls or The Goo Fighters. Which artist were you trying to mention?
- Charge utile personnalisée :
{
"richContent": [
[
{
"options": [
{
"text": "The Google Dolls"
},
{
"text": "The Goo Fighters"
},
{
"text": "Alice Googler"
},
{
"text": "G's N' Roses"
}
],
"type": "chips"
}
]
]
}
- Créez le paramètre
merch
:
- Nom à afficher :
merch
- Type d'entité :
@Merch
- Obligatoire: Cochez la case
- Masquer dans le journal : cocher
- Traitement :
Which merchandise item do you want?
- Cliquez sur Add dialogue option > Custom payload (Option de boîte de dialogue > Charge utile personnalisée) :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- Gestionnaire d'événements >
No-match default
- Fulfillment du gestionnaire d'événements :
We sell Shirts, Music or the Tour movie. Which of these items do you want?
- Charge utile personnalisée :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- Gestionnaire d'événements >
No-input default
- Fulfillment du gestionnaire d'événements :
I couldn't understand which merchandise item you wanted to buy. You can choose between: Shirts, Music or the Tour movie. Which item do you want?
- Charge utile personnalisée :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Shirts"
},
{
"text": "Music"
},
{
"text": "Tour movie"
}
]
}
]
]
}
- Créez une route qui transfère vers la page Produit lorsque
artist
est fourni et que l'élémentmerch
est fourni.
- Condition :
- Correspondre à chaque règle (ET)
- Expression:
$session.params.artist != null
- Expression :
$session.params.merch != null
- Traitement:
Alright! $session.params.merch of $session.params.artist, let's go!
- Transition : Page :
Product
- Créer un parcours lorsque l'utilisateur dit "Chemises"
- Intent : redirect.shirts
- Transition: Page:
Shirts
- Créer un parcours lorsque l'utilisateur dit "Musique"
- Intent : redirect.music
- Transition : Page :
Music
- Créer un itinéraire lorsque l'utilisateur demande des informations sur les prix
- Intent : redirect.price
- Transition: Créer une page:
Price
Une fois la configuration ci-dessus définie, une visualisation semblable à celle ci-dessous s'affiche. Notez que les routes d'intent sont en bleu dans le schéma et que les routes de condition sont en orange. Bien qu'ils ne soient pas représentés, les gestionnaires d'événements sont verts. Lorsque plusieurs types de routes passent à une page, la ligne est grise.
Vous avez maintenant appris à créer des flux, des entités, des intents et des pages avec des gestionnaires d'état tels que les routes d'intent et les routes conditionnelles basées sur des paramètres. Plus tard dans cet atelier, nous utiliserons la ramification conditionnelle dans l'exécution pour fournir différents dialogues en fonction de l'entrée.
Vous pouvez utiliser les configurations suivantes pour finaliser notre agent virtuel.
Page "Chemises" :
- Créez les configurations suivantes sur la page Shirts:
- Fulfillment d'entrée :
Do you want a longsleeve or a t-shirt?
- Charge utile personnalisée de traitement des entrées :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
},
{
"text": "Price?"
}
]
}
]
]
}
- Créez une route d'intent:
redirect.price
avec une transition vers la pagePrice
. - Créez le paramètre suivant :
- Paramètre :
merch
– Type d'entité :@Merch
,Required
etRedact in log
- Paramètre > Gestionnaire d'événements >
No-match default
- Paramètre > Fulfillment du gestionnaire d'événements :
You can choose between a t-shirt or a longsleeve. Which of these do you want?
- Paramètre > Charge utile personnalisée du fulfillment du gestionnaire d'événements:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
}
]
}
]
]
}
- Paramètre > Gestionnaire d'événements >
No-input default
- Paramètre > Fulfillment du gestionnaire d'événements :
I couldn't understand if you want the t-shirt or the longsleeve. Which of these do you want?
- Paramètre > Charge utile personnalisée de traitement du gestionnaire d'événements :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "T-shirt"
},
{
"text": "Longsleeve"
}
]
}
]
]
}
- Cliquez sur le traitement de l'entrée et faites défiler la page jusqu'à Paramètres prédéfinis. Chaque fois que la page "Chemises" est activée, le paramètre de catégorie est défini sur chemises:
Paramètre | Valeur |
|
|
- Ajoutez une route conditionnelle :
- Correspondre à au moins une règle (OU)
- Expression :
$session.params.merch = "T-shirt"
- Expression :
$session.params.merch = "Longsleeve"
- Transition vers une nouvelle page :
Shirt Size
Page des tarifs :
Étant donné que les messages sur les prix dépendent de l'article ou de la catégorie de produits choisis (musique ou chemises), nous allons corriger cette partie plus tard dans l'atelier. Pour le moment, il suffit de saisir un espace réservé.
- Créez les configurations suivantes sur la page Price (Prix) :
- Fulfillment d'entrée :
PRICE TODO
Étant donné que vous pouvez demander le prix à différents endroits de la conversation, vous devriez toujours obtenir une réponse et revenir à la partie précédente de la conversation, afin de poursuivre la commande. Dans l'arborescence de dialogue, vous pouvez accéder à cinq sections pour obtenir des informations sur les prix. (Chemise, Taille de chemise, Musique, Opérateur et également directement via un parcours d'intent). Nous aurons donc besoin de routes conditionnelles pour revenir en arrière :
- Ajoutez une route conditionnelle :
- Correspondre à chaque règle (ET)
- Expression :
$session.params.category = "shirts"
- Expression :
$session.params.merch = "null"
- Transition vers une nouvelle page :
Shirts
- Ajoutez une route conditionnelle :
- Correspondance avec toutes les règles (ET)
- Expression :
$session.params.category = "shirts"
- Expression :
$session.params.size = "null"
- Transition vers une nouvelle page :
Shirt Size
- Ajoutez une route conditionnelle:
- Correspondre à chaque règle (ET)
- Expression :
$session.params.category = "music"
- Expression :
$session.params.album = "null"
- Transition vers la nouvelle page:
Music
- Ajoutez une route conditionnelle:
- Correspondre à chaque règle (ET)
- Expression :
$session.params.category = "music"
- Expression :
$session.params.merch = "null"
- Transition vers une nouvelle page :
Carrier
- Ajoutez une route conditionnelle:
- Correspondre à chaque règle (ET)
- Expression :
$session.params.category = "null"
- Transition vers une nouvelle page :
Product Overview
Page sur les tailles de chemises :
- Créez les configurations suivantes sur la page Taille de chemise :
- Fulfillment d'entrée :
What shirt size do you want?
- Charge utile personnalisée de traitement des entrées :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- Créez une route d'intent :
redirect.price
avec une transition vers la pagePrice
. - Créez le paramètre suivant :
- Paramètre :
shirtsize
- Type d'entité :@ShirtSize
-Required
,Redact In Log
- Paramètre > Gestionnaire d'événements >
No-match default
- Paramètre > Fulfillment du gestionnaire d'événements :
Please tell me the shirt size, such as XL.
- Paramètre > Charge utile personnalisée de traitement du gestionnaire d'événements :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- Paramètre > Gestionnaire d'événements >
No-input default
- Paramètre > Fulfillment du gestionnaire d'événements :
I couldn't understand the shirt size. What size do you want?
- Paramètre > Charge utile personnalisée de traitement du gestionnaire d'événements :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "XS"
},
{
"text": "S"
},
{
"text": "M"
},
{
"text": "L"
},
{
"text": "XL"
},
{
"text": "2XL"
},
{
"text": "3XL"
}
]
}
]
]
}
- Ajoutez une route conditionnelle :
- Correspondre à chaque règle (ET)
- Expression:
$page.params.shirtsize != "null"
- Transition vers la page :
Product
Page Musique:
- Créez les configurations suivantes sur la page Musique :
- Fulfillment d'entrée :
We have a Greatest Hits Album or the Live Album. Which one do you want?
- Charge utile personnalisée de traitement des entrées :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
},
{
"text": "Price?"
}
]
}
]
]
}
- Créez une route d'intent :
redirect.price
avec une transition vers la pagePrice
. - Créez le paramètre suivant :
- Paramètre :
album
- Type d'entité :@Album
-Required
,Redact In Log
- Paramètre > Gestionnaire d'événements >
No-match default
- Paramètre > Traitement du gestionnaire d'événements:
You can choose between Greatest Hits and Live Album. Which of these do you want?
- Paramètre > Charge utile personnalisée du fulfillment du gestionnaire d'événements:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
}
]
}
]
]
}
- Paramètre > Gestionnaire d'événements >
No-input default
- Paramètre > Fulfillment du gestionnaire d'événements :
I couldn't understand if you want the album: Greatest Hit or Live. Which of these do you want?
- Paramètre > Charge utile personnalisée du fulfillment du gestionnaire d'événements:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Greatest Hits"
},
{
"text": "Live"
}
]
}
]
]
}
- Cliquez sur l'exécution de l'entrée, puis faites défiler la page jusqu'à Préparégés de paramètres. Chaque fois que la page "Musique" sera active, le paramètre de catégorie sera défini sur musique :
Paramètre | Valeur |
|
|
- Ajoutez une route conditionnelle :
- Correspondre à chaque règle (ET)
- Expression :
$page.params.album != "null"
- Transition vers la page:
Carrier
Page de l'opérateur :
- Créez les configurations suivantes sur la page Opérateur :
- Fulfillment d'entrée :
Do you want this album on CD or MP3?
- Charge utile personnalisée de traitement des entrées :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "MP3"
},
{
"text": "Price?"
}
]
}
]
]
}
- Créez une route d'intent (
redirect.price
) qui passe à la pagePrice
. - Créez le paramètre suivant :
- Paramètre:
merch
– Type d'entité:@Merch
–Required
,Redact In Log
- Paramètre > Gestionnaire d'événements >
No-match default
- Paramètre > Fulfillment du gestionnaire d'événements :
Do you want a physical CD or the digital album?
- Paramètre > Fulfillment du gestionnaire d'événements : charge utile personnalisée :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "Digital Album"
}
]
}
]
]
}
- Paramètre > Gestionnaire d'événements >
No-input default
- Paramètre > Fulfillment du gestionnaire d'événements :
I couldn't understand if you mean CD or MP3. Which one do you want?
- Paramètre > Fulfillment du gestionnaire d'événements : charge utile personnalisée :
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "CD"
},
{
"text": "MP3"
}
]
}
]
]
}
- Ajoutez une route conditionnelle :
- Correspondre à chaque règle (ET)
- Expression :
$page.params.merch != "null"
- Transition vers la page :
Product
Page produit :
- Créez les paramètres suivants :
Nom à afficher du paramètre | Type d'entité de paramètre | Vérifications |
|
| Requis, Masquer dans le journal |
|
| Obligatoire, masquer dans le journal |
- Le paramètre artist nécessite le traitement d'invite initial suivant, qui s'affichera si l'artiste est inconnu.
You didn't mention which artist you are interested in. You can ask me to buy the $session.params.merch of the artist you like or ask which artists we signed. How can I help?
{
"richContent": [
[
{
"options": [
{
"text": "Which artists?"
}
],
"type": "chips"
}
]
]
}
- Ajoutez également un gestionnaire d'événements
No-input default
avec un traitement :I couldn't understand what you just said. Ask me which artists are signed.
- Et un gestionnaire d'événements
No-match default
avec un traitement :I missed that. Please ask me which artists are signed.
- Le paramètre merch nécessite également des gestionnaires d'événements de nouvelle invite.
- Ajouter un gestionnaire d'événements
No-input default
avec un traitement :I couldn't understand what you just said. Which merchandise item do you want?
- Et un gestionnaire d'événements
No-match default
avec un traitement :I missed that. Which merchandise item do you want?
Le parcours suivant passe à la page de confirmation lorsque l'artiste est connu et que l'utilisateur choisit un "Tour Movie".
- Ajoutez une route conditionnelle :
- Correspondre à chaque règle (ET)
- Expression :
$session.params.artist != null
- Expression :
$session.params.merch = "Tour Movie"
- Préréglages de paramètres : ajouter un paramètre >
price = 25
- Transition vers une nouvelle page :
Confirmation
Le parcours suivant mène à la page de confirmation lorsque l'artiste est connu, que l'utilisateur choisit un "T-shirt" et que la taille du T-shirt est sélectionnée.
- Ajoutez une route conditionnelle :
- Expression personnalisée :
$session.params.artist != null AND $session.params.merch = "T-shirt" AND $session.params.shirtsize != null
- Préréglages des paramètres Ajouter un paramètre >
price = 25
- Transition vers la page:
Confirmation
L'itinéraire suivant passera à la page de confirmation une fois que l'artiste est connu et que l'utilisateur choisit un modèle "Longsleeve" (à manches longues) et que la taille de chemise est choisie.
- Ajoutez une route conditionnelle :
- Expression personnalisée:
$session.params.artist != null AND $session.params.merch = "Longsleeve" AND $session.params.shirtsize != null
- Préréglages de paramètres : ajouter un paramètre >
price = 30
- Transition vers la page :
Confirmation
Le parcours suivant passe à la page de confirmation lorsque l'artiste est connu et que l'utilisateur choisit un "CD" et le nom de l'album.
- Ajoutez une route conditionnelle:
- Expression personnalisée:
$session.params.artist != null AND $session.params.merch = "CD" AND $session.params.album != null
- Préréglages des paramètres Ajouter un paramètre >
price = 15
- Transition vers la page:
Confirmation
L'itinéraire suivant passera à la page de confirmation une fois que l'artiste est connu et que l'utilisateur choisit un "album numérique" et que le nom de l'album est choisi.
- Ajoutez une route conditionnelle :
- Expression personnalisée :
$session.params.artist != null AND $session.params.merch = "Digital Album" AND $session.params.album != null
- Préréglages des paramètres Ajouter un paramètre >
price = 10
- Transition vers la page:
Confirmation
Nous allons maintenant créer des conditions avancées avec des invites qui détectent les informations manquantes. Le parcours suivant redirige l'utilisateur vers la page de musique lorsque l'artiste est connu et que l'utilisateur choisit un "CD" ou un "Album numérique", mais que le nom de l'album n'a pas été choisi.
- Ajoutez une route conditionnelle :
- Expression personnalisée :
$session.params.artist != null AND ($session.params.merch = "CD" OR $session.params.merch = "Digital Album") AND $session.params.album = null
- Traitement :
I would also need to know which album you would like to buy!
- Transition vers la page :
Music
Le dernier parcours mène à la page de confirmation lorsque l'artiste est connu et que l'utilisateur choisit un "T-shirt" ou un "T-shirt à manches longues", mais que la taille du T-shirt n'a pas été choisie.
- Ajoutez une route conditionnelle:
- Expression personnalisée :
$session.params.artist != null AND ($session.params.merch = "T-shirt" OR $session.params.merch = "Longsleeve") AND $session.params.shirtsize = null
- Traitement :
I would also need to know which shirt size you need!
- Transition vers la page:
Shirt Size
Dans la partie suivante de l'atelier, nous allons utiliser des traitements conditionnels pour afficher différents messages de traitement en fonction de l'entrée.
7. Réponses conditionnelles
Certaines réponses renverront un dialogue différent en fonction de l'entrée. Les dialogues se ramifieront. C'est ce que nous appelons des réponses conditionnelles. Cela peut devenir intéressant lorsque vous n'utilisez pas les fulfillments webhook, où les réponses conditionnelles ont été déterminées sur le backend. Voici un exemple:
if [condition]
[response]
elif [condition]
[response]
elif [condition]
[response]
else
[response]
endif
- Un exemple de [condition] peut être
$session.params.user-age >= 21
. Il utilise une mise en forme semblable à celle des conditions des itinéraires. - Une [response] récupère la réponse textuelle statique
- Les réponses conditionnelles commencent toujours par
if
. - Les blocs
elif
etelse
sont facultatifs.
Dialogflow CX peut également utiliser des fonctions système intégrées. Par exemple, pour mettre en forme une date ou une heure, ou pour afficher l'heure actuelle ($sys.func.NOW()
).
Finalisons le flux Catalogue en corrigeant les pages Confirmation et Prix.
Page de confirmation:
Nous allons maintenant créer la page de confirmation. Les conditions requises sont les suivantes:
- Si le paramètre merch est CD ou Digital Album, Les champs suivants s'affichent dans la confirmation : artiste, merch, album et prix.
- Si merch est T-shirt ou Longsleeve. Les champs suivants s'affichent dans la confirmation : artiste, merch, taille et prix.
- Sinon (et donc si merch est Tour Movie). Les champs suivants s'affichent dans la confirmation: artist, merch et price.
- Cliquez sur la page Confirmation.
- Cliquez sur Modifier l'exécution > Réponses de l'agent > Ajouter un dialogue > Réponse conditionnelle :
if ($session.params.merch = "CD" OR $session.params.merch = "Digital Album")
The $session.params.merch: $session.params.artist - $session.params.album costs $$session.params.price. Shall I continue to order?
elif ($session.params.merch = "T-shirt" OR $session.params.merch = "Longsleeve")
A $session.params.merch of $session.params.artist size: $session.params.shirtsize costs $$session.params.price. Shall I continue to order?
elif $session.params.merch = "Tour Movie"
The $session.params.merch of $session.params.artist costs $$session.params.price. Shall I continue to order?
else
It looks like something went wrong with your order. You can say "Reset", to restart the order process.
endif
- Create the following Custom payload:
- Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Yes, confirm"
}
],
"type": "chips"
}
]
]
}
Next, create two intent routes:
confirm.proceed.order
transitions to:Order Process
Flow.decline.proceed.order
transitions toEnd Flow
When the user declines the order, and does not want to proceed the order process, we will have to transition back to the welcome page, but all the parameters have to be cleared. We can do this by specifically setting null to all the possible parameters. You can do this with Parameter presets.
- In the decline.proceed.order intent route, scroll down to Parameter presets and add the following parameters:
Parameter | Value |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Notice that we have created an additional parameter called restart
. If this parameter is present, the Default Start Flow, should know to continue the conversation by showing a customized message.
- Click on the Default Start Flow, Start Page, and create another Conditional Route:
$session.params.restart = "true"
- Fulfillment:
"Welcome back, as the virtual agent of G-Records, I can help you order artists merchandise, you can ask questions about your order or shipping, and I can tell you more which artists are currently signed with us. How can I help?"
- Custom payload:
{
"richContent": [
[
{
"type": "chips",
"options": [
{
"text": "Which artists?"
},
{
"text": "Which products?"
},
{
"text": "About my order..."
}
]
}
]
]
}
- Select the Start Page and click on the
redirect.end
intent. Create the following fulfillment:Thank you for contacting G-Records! Have a nice day!
Price Page:
Let's also fix the Price TODOs. The price information will be static for now. Click on the Price Page in the Catalog Flow, and use the following entry fulfillment:
- Delete the Agent Says entry fulfillment.
- Create a new Conditional Response:
if $session.params.category = "shirts"
A t-shirt costs $25 and a longsleeve costs $30.
elif $session.params.category = "music"
A CD costs $15. The digital album on MP3 costs $10.
else
A t-shirt costs $25 and a longsleeve costs $30. A CD costs $15 and a digital album on MP3 $10. In case you are interested in the Tour Movie, that one is $25.
endif
Well done, by now you completed the Catalog flow. Your flow should look similar to this diagram:
8. Wrapping up the agent
We are almost at the end of this lab. Let's configure the last flows together, and take in practice all the new things that we have learned.
Creating the My Order Flow
- Go to the My Order Flow, and create the following intent transitions:
Page (In Flow) | Routes > Intent | Routes > Transition To |
My Order Start |
| My Order |
My Order Start |
| My Order Status |
My Order Start |
| My Order Cancellation |
My Order Start |
| End Session |
My Order Start |
| End Flow |
My Order |
| My Order Status |
My Order |
| My Order Cancellation |
Default Start Flow |
| Flow: My Order |
Default Start Flow |
| Flow: My Order |
- Let's create the following entry fulfillment for the My Order Page:
- Entry fulfillment:
I can look up the status of your order, or I can cancel an order.
- In the My Order Page create the following parameter:
- Displayname:
ordernumber
- Entity Type:
@OrderNumber
- Required: checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123.
- Event Handler:
No-match default
:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Event Handler:
No-input default
:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Create the following conditional route:
- Customize Expression:
$page.params.status = "FINAL"
- Fulfillment:
And do you want to Cancel your order, or should I look up the status?
- Click on Add state handler > Event Handlers and create the Event Handler:
No-input default
- Fulfillment:
I'm sorry, what was that? Would you like me to cancel an order or look up the status?
- Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Status"
},
{
"text": "Cancel"
}
],
"type": "chips"
}
]
]
}
- Create the Event Handler:
No-match default
- Fulfillment:
Would you like me to cancel an order or lookup the status?
- Custom payload:
{
"richContent": [
[
{
"options": [
{
"text": "Status"
},
{
"text": "Cancel"
}
],
"type": "chips"
}
]
]
}
- In the My Order Status Page create the following parameter:
- Displayname:
ordernumber
- Entity Type:
@OrderNumber
- Required checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123.
- Event Handler:
No-match default
:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Event Handler:
No-input default
:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- In the My Order Status Page create the following conditional route:
- Customize Expression:
$session.params.ordernumber != null
- Fulfillment:
Your order $session.params.ordernumber has been shipped, it can take up to approx 2 weeks before you will receive your items.
- Add dialogue option > Text:
Is there anything else I can help you with?
- In the My Order Cancelation Page create the following parameter:
- Displayname:
ordernumber
- Entity Type:
@OrderNumber
- Required checked
- Initial prompt fulfillment:
What's the order number? For example ABCD123.
- Event Handler:
No-match default
:To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- Event Handler:
No-input default
:I missed that. To proceed with your order I will need an order number. Order numbers start with 4 characters and end with 3 numbers, such as ABCD123. Which order number may I use?
- In the My Order Cancelation Page create the following conditional route:
- Customize Expression:
$session.params.ordernumber != null
- Fulfillment:
Your order $session.params.ordernumber has been canceled.
- Add dialogue option > Text:
Is there anything else I can help you with?
- Test the flow and create the following two test scenarios:
>"About my order"
>"ABCD123"
>"Status"
And:
>"What's the status of order DEFG222"
- Select the Start Page and click on the
redirect.end
intent. Create the following fulfillment:Thank you for contacting G-Records! Have a nice day!
- Select the Start Page and click on the
redirect.home
intent. Create the following parameter preset:restart = true
Default Negative intents (Fallback)
When you create a virtual agent, a default negative intent is created for you. You can add training phrases to this intent that act as negative examples that will trigger a No-match event. There may be cases where end-user input has a slight resemblance to training phrases in normal intents, but you do not want these inputs to match any normal intents.
- Try in the simulator:
I don't like Alice Googler
.
You will see that the virtual agent answers with the Product Overview Page, to continue ordering Alice Googler merchandise. However, your end user does not like that artist. Let's use the Default Negative Intent for this.
- Go to Manage > Intents and select the Default Negative Intent.
- Add the following training phrases that will trigger the No-match event.
I don't like Alice Googler
I am not a fan of G's N' Roses
I can't stand the music of the Google Dolls
- Hit Save and test the following sentence in the simulator:
I am really not a fan of the Goo Fighters
This time the No-match
event was triggered, you stayed on the Start Page.
Default Fallback Messages
- Click the Default Start Flow, select the
sys.no-input-default
event handler.
The No-input fallback basically means: No text or speech answers were detected. Likely no answers were given, or the system couldn't hear it. Therefore, let's make the fallback messages more specific. Use the tab key, to create alternative dialogues:
- Remove all answers, and add these text dialogues:
I'm sorry, I didn't receive an answer. Can you say it again?
I missed your answer, can you say it again?
Sorry, I didn't hear anything. Can you say it again?
I couldn't hear what you were saying, what was that?
I'm sorry, I missed your answer. What were you trying to say?
Don't forget to click Save.
- Click the Default Start Flow, select the
sys.no-match-default
event handler.
The No Match fallback basically means: Text or speech answers were detected but nothing in Dialogflow CX got matched.
- Remove all answers, and add these text dialogues:
Sorry, I didn't get that. Can you please rephrase?
I'm sorry, I don't understand. Can you please rephrase?
I don't understand, please rephrase.
Sorry, I didn't get that. What was that?
I didn't get that, can you please rephrase?
Don't forget to click Save.
- It's advised to repeat these steps for the Catalog, My Order, Order Process and Customer Care flows.
Here's a tip: when creating fallback messages, make them more explicit, by rephrasing the previous question or by mentioning an example. You could create these type of No-match and No-input events on Page level when creating parameters. In our labs, we have already done this.
Creating the Order Process Flow
- Go to the Order Process Flow, and create the following intent transitions:
Page (In Flow) | Routes > Intent | Routes > Transition To |
Order Process Start |
| End Session |
Order Process Start |
| End Flow |
Order Process Start |
| New Page: Shipping Details |
- Let's create the following entry fulfillment for the Shipping Details Page:
- Entry fulfillment:
To complete your order I will first need to collect your shipping details.
- Create the following parameters:
These parameters will make use of built-in system entities. System entity support differs for each language. See the docs for more information.
Parameter Display name | Entity | Required? | Initial prompt fulfillment | No-match default | No-input default |
| @sys.person | Required |
|
|
|
| @sys.person | Required |
|
|
|
| @sys.address | Required |
|
|
|
| @sys.any | Required |
|
|
|
| @sys.geo-city | Required |
|
|
|
| @sys.geo-country | Required |
|
|
|
| @sys.email | Required |
|
|
|
- Create the following conditional route:
- Customize Expression:
$page.params.status = "FINAL"
- Transition to new Page:
Payment Details
- Create the following entry fulfillment.
Let's fake it that this virtual agent makes use of Google Pay. Don't worry this tutorial won't make real transactions. Create the following entry dialogues:
- Agent Says:
Alright $session.params.firstname! We will make use of Google Pay, that's connected to your email account: $session.params.email.
- Conditional Response
if $session.params.merch != "Digital Album"
Shipping costs an additional 5 dollars. This will make the total price $$sys.func.TO_TEXT($sys.func.ADD($session.params.price, 5)).
Your merchandise will be shipped to:
$session.params.firstname $session.params.lastname
$session.params.address
$session.params.zipcode $session.params.city
$session.params.country
To continue the order process please explicitly say "I confirm". Do you want to confirm your $session.params.artist $session.params.merch order?
else
The total costs will be: $$session.params.price.
After purchasing the digital album, you will receive an email with the download link.
To continue the order process please explicitly say "I confirm".
Do you want to confirm your $session.params.artist $session.params.merch order?
endif
- Créez la route d'intent suivante :
- Intent :
confirm.proceed.order
- L'agent dit:
Thank you for your order! Your merchandise will be shipped today!
- Ajouter une option de dialogue > Texte:
Here's the order number: ABCD123
. - Ajouter une option de dialogue > Texte :
Have a good day!
- Transition :
End Session
- Sélectionnez la page Démarrer, puis cliquez sur l'intent
redirect.end
. Créez le traitement suivant :Thank you for contacting G-Records! Have a nice day!
. - Sélectionnez la page Démarrer, puis cliquez sur l'intent
redirect.home
. Créez le préréglage de paramètre suivant :restart = true
Parfait ! Nous disposons désormais d'un chatbot de marchand entièrement opérationnel. Dans le prochain atelier, nous testerons les performances de l'agent virtuel.
9. Tester votre agent virtuel
Vous pouvez utiliser le simulateur intégré pour tester les dialogues de votre agent virtuel. L'avantage de tester les flux dans le simulateur est que vous obtenez un aperçu détaillé des flux, des pages, des paramètres et des événements DTMF que le simulateur a collectés lors de la navigation dans vos flux. Cela permet d'effectuer des tests plus facilement que de les tester directement dans une intégration, car ces informations ne sont pas visibles par l'utilisateur final. Il est même possible de créer des scénarios de test, de les enregistrer et de les réutiliser. Cela a beaucoup de sens, lorsque vous gérez ou modifiez vos flux au fil du temps et que vous voulez être sûr qu'aucune de vos modifications n'interrompt votre travail précédent.
Vous pouvez également exporter et importer des scénarios de test créés précédemment en les stockant dans Google Cloud Storage ou localement. L'exportation d'un test permet de télécharger un fichier blob. Pour en savoir plus sur le simulateur et les scénarios de test, consultez la documentation sur le simulateur/les scénarios de test.
Avant de créer des scénarios de test, finalisons le reste de notre agent virtuel:
Créer le parcours du service client
- Accédez au parcours Customer Care et créez les transitions d'intent suivantes:
Page (dans le parcours) | Routes > Intent | Routes > Passer à |
Démarrage du service client |
| Livraison |
Démarrage du service client |
| Remboursement |
Démarrage du service client |
| Échange |
Début du service client |
| Flux de fin |
Démarrage du service client |
| Mettre fin à la session |
- Créez les fulfillments d'entrée suivants pour la page Livraison :
Shipping physical merchandise items can take up to 2 weeks.
Is there anything else I can help you with?
- Créez les traitements d'entrée suivants pour la page Remboursement:
We offer free returns and refunds. We provide one free return label for each order. You can use it within 30 days from receiving your order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.
Is there anything else I can help you with?
- Créez les exécutions d'entrée suivantes pour la page Échange:
If you would like to change your item for a different one, please return your unwanted item and place a new order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.
Is there anything else I can help you with?
- Sélectionnez la page Démarrer, puis cliquez sur l'intent
redirect.end
. Créez le traitement suivant :Thank you for contacting G-Records! Have a nice day!
. - Sélectionnez la page d'accueil et cliquez sur l'intent
redirect.home
. Créez le préréglage de paramètre suivant :restart = true
Créer des scénarios de test
- Cliquez sur le bouton Tester l'agent à droite de l'écran.
Lorsque vous ouvrez le simulateur pour la première fois, vous devez sélectionner un environnement pour l'agent et un flux actif. Dans la plupart des cas, vous devez utiliser l'environnement brouillon et le flux de démarrage par défaut.
- Type :
Hi
- Question :
Which artists are signed with your label?
- Dites :
The Google Dolls
- Dites :
I am interested in buying a shirt
- Dites :
A t-shirt
- Dites :
Medium
- Cliquez à présent sur le bouton "Enregistrer le scénario de test". Vous la trouverez en haut du simulateur (à côté de la flèche de rétablissement et de l'icône de réinitialisation de la corbeille).
- Attribuez-lui les informations suivantes :
- Nom du scénario de test :
Buy Google Dolls t-shirt size M
- Tags: #catalog, #chemises, #t-shirt, #DollesGoogle
- Cliquez sur Enregistrer.
Créons d'autres scénarios de test.
- Commencez par effacer la boîte de dialogue actuelle en cliquant sur l'icône de réinitialisation (thrash bin).
- Créez les scénarios de test suivants :
Achetez le t-shirt Googler Alice :
>"Buy the Alice Googler t-shirt."
>"XL"
- Nom du scénario de test :
Buy the Alice Googler t-shirt
- Tags :
#catalog, #shirts, #t-shirt, #AliceGoogler
Acheter un t-shirt de taille M : (notez que le nom de l'artiste n'a pas été mentionné, mais que vous souhaitez ignorer les pages "Présentation des groupes", "Présentation des produits", "T-shirts" et "Tailles de t-shirts")
>"Buy a t-shirt size M"
>"The Google Fighters"
- Nom du scénario de test :
Buy a t-shirt size M
- Tags :
#catalog, #shirts, #t-shirt, #TheGoogleFighters
- Description: (Notez que le nom de l'artiste n'a pas été mentionné, mais que vous souhaitez ignorer les pages de présentation des bracelets, de présentation des produits, de chemises et de tailles de chemises.)
Acheter de la musique de Guns N' Roses (notez que vous passerez la page "Présentation des groupes" et la page "Présentation des produits")
>"Purchase music of G's N' Roses"
>"Live"
>"CD"
- Nom du scénario de test:
Purchase music of G's N' Roses
- Tags :
#catalog, #music, #CD, #GsNRoses, #live
- Description: (notez que cette action ignorera les pages de présentation des bracelets et des produits)
Vérifiez les informations tarifaires:
>"Which products"
>"Shirts"
>"What's the price difference?"
>"Longsleeve"
>"What does it cost?"
>"M"
>"The Google Dolls"
>"No"
>"Which bands"
>"The Gooo Fighters"
>"Music"
>"How much does it cost?"
>"Greatest Hits"
>"What's the price difference?"
>"Mp3"
>"No"
>"I want to buy the tour movie"
>"Alice Googler"
>"Yes"
- Nom du scénario de test:
Price info
- Tags :
#catalog, #music, #tourmovie, #shirts
- Description : Test des informations sur les prix à différents endroits de la boîte de dialogue
Tester des scénarios de test préenregistrés
- Sélectionnez Gérer > Cas de test dans le menu principal de Dialogflow à gauche.
- Sélectionnez tous les scénarios de test, puis appuyez sur le bouton Run (Exécuter) au-dessus du tableau.
Dialogflow CX exécute tous les scénarios de test sélectionnés sur l'enregistrement enregistré en tant que "scénario de test d'or". Si les résultats sont identiques à ceux que vous avez enregistrés, les tests sont réussis. - Si quelque chose a changé dans les flux, comme des pages mal configurées ou des intents qui vous ont dirigé vers les mauvaises pages, les tests échoueront.
- Dans le simulateur, posez la question suivante:
How long will shipping take?
- Notez le résultat et enregistrez le scénario de test en tant que
Shipping
avec la balise :#shipping
. - Accédez au panneau "Gérer" > "Cas de test", puis appuyez sur le bouton Exécuter en haut à droite de la grille pour exécuter uniquement le cas de test
Shipping
.
Ce test devrait réussir.
- Revenez au parcours client, sélectionnez la page Démarrer, puis cliquez sur l'en-tête Routes.
Un écran avec une grille affichant tous les itinéraires s'affiche.
- Supprimez
redirect.shipping.info route
. - Accédez au panneau "Gérer" > "Cas de test", puis appuyez sur le bouton Exécuter en haut à droite de la grille pour exécuter uniquement le cas de test
Shipping
.
Ce test doit échouer.
- Vous pouvez cliquer sur le test ayant échoué pour en afficher les détails.
Dans ce cas, le test a échoué avec le message d'erreur suivant :
Page: Page mismatch:
Expected: Shipping
Actual: Start Page
En effet, la page n'existe plus dans le flux. Nous nous attendions à la page Shipping
, mais nous n'avons jamais quitté la page Start
. (ou vos utilisateurs finaux recevront un message de remplacement).
En d'autres termes, il s'agit d'une requête manquée, d'un résultat de test faux négatif. Échec du test. Nous nous attendions à la page Livraison, mais rien ne s'est produit ou un message de remplacement s'est affiché.
- Revenez au parcours de service client et ajoutez
redirect.shipping.info
en tant que route d'intent sur la page Démarrer. N'oubliez pas de passer à la page Livraison et d'appuyer sur Enregistrer. - Dans le simulateur, enregistrez le scénario suivant:
I want to swap my item
. Enregistrez ce scénario sous le nomSwapping
#swapping
. - Ouvrez Gérer > Intents > redirect.refund.info, puis ajoutez l'expression d'entraînement suivante :
I want to swap this item for a refund
Sans cette expression d'entraînement, lorsqu'un utilisateur demande à modifier un article en vue d'un remboursement, il appelle l'intent redirect.swapping.info. Toutefois, nous ne souhaitons pas vous fournir d'informations sur la modification d'un article, mais plutôt sur les remboursements.
- Créez le scénario de test de référence suivant:
I want to swap this item for a refund
dans le simulateur, puis enregistrez-le sous le nomSwap for Refund
#refund
. - Revenez à l'intent Gérer > Intents > redirect.refund.info, puis supprimez la ligne
I want to swap this item for a refund
. - Revenez à Gérer > Scénarios de test, sélectionnez le scénario de test Échange contre remboursement, puis Exécutez-le.
Échec de votre dernier test. Le message d'erreur ci-dessous s'affiche:
If you would like to change your item for a different one, please return your unwanted item and place a new order. If your refund is accepted, we will refund the price you paid for your item back to your original payment method.`
Is there anything else I can help you with?
Page: Page mismatch:
Expected: Refund
Actual: Swapping
En d'autres termes, il s'agit d'une requête mal comprise, d'un résultat de test faux positif. Échec du test. La page de remboursement était attendue, mais la page d'échange est devenue active.
Couverture
Dans Dialogflow CX, la couverture du test est une mesure utilisée pour décrire le degré d'exécution du dialogue de l'agent virtuel (pages et intents) lors de l'exécution d'une suite de tests particulière. Un agent virtuel dont la couverture de test est élevée (mesurée en pourcentage) a vu un plus grand nombre de ses dialogues exécutés lors des tests. Cela suggère qu'il a moins de chances de contenir des bugs non détectés (comme des requêtes mal comprises) qu'un agent virtuel dont la couverture de test est faible.
- Pour afficher un rapport sur la couverture de test pour tous les scénarios de test, cliquez sur Coverage (Couverture).
- Cliquez sur l'onglet Transitions.
La couverture de test de toutes les transitions de page s'affiche alors.
- Cliquez sur l'onglet Intents (Intents).
La couverture des tests pour tous les intents s'affiche alors.
Félicitations ! Vous venez de créer et de tester un exemple concret et complet de bot pour un marchand. Passons à la page suivante de l'atelier pour lire la conclusion et trouver des références utiles.
10. Conclusion
Dialogflow CX est une plate-forme d'IA conversationnelle (CAIP, Conversational AI Platform) permettant de créer des agents virtuels tels que des bots de chat ou de commande vocale. Dialogflow CX permet à votre équipe de créer plus rapidement des expériences conversationnelles d'entreprise grâce à des outils de création de bots visuels, à des intents réutilisables et à la possibilité de gérer des conversations multitours.
Dans cet atelier de programmation, vous avez appris à créer un agent virtuel pour le commerce en ligne. Nous avons abordé les concepts suivants :
- Flux
- Paramètres, entités personnalisées et système
- Pages
- Gestionnaires d'état tels que les routes d'intent et les routes de condition
- Messages de fulfillment statiques et réponses conditionnelles
- Intents de remplacement
- Simulateur, cas de test et couverture
Références
Pour en savoir plus sur Dialogflow CX, consultez les blogs et la documentation suivants.