{"id":5936,"date":"2019-06-17T14:00:11","date_gmt":"2019-06-17T18:00:11","guid":{"rendered":"https:\/\/zux.zsm.mybluehost.me\/majoctobre2019\/?p=5936"},"modified":"2021-09-20T11:27:06","modified_gmt":"2021-09-20T15:27:06","slug":"dialogflow-distilled-on-error-handling-article-en-anglais","status":"publish","type":"post","link":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/","title":{"rendered":"Dialogflow sous la loupe : la gestion des erreurs (Article en anglais)"},"content":{"rendered":"<p>We said it before, and we\u2019ll say it again: error handling is a crucial element of the conversational UX for chatbot. In <a href=\"https:\/\/medium.com\/cxinnovations\/conversational-ux-for-chatbots-ca8cc8e08ea\" target=\"_blank\" rel=\"noopener\">a previous post<\/a>, we identified two primordial characteristics of good error handling. Firstly, it should be <em>contextual<\/em>, by avoiding generic messages (like \u201cI\u2019m sorry, I didn\u2019t understand that\u201d) and ensuring that error prompts are always relevant in the context of the dialogue. Secondly, it should be <em>progressive<\/em>, which consists of giving different error messages if the bot doesn\u2019t recognize the user query multiple times in a row, each time escalating towards more exhaustive answers. Ideally, your error handling should be both contextual and progressive, but it\u2019s easier said than done, as these kinds of behavior demand design considerations that can have profound repercussions on how a bot is implemented.<\/p>\n<h2>Error handling in vanilla Dialogflow: follow-up intents and fallbacks<\/h2>\n<p>Dialogflow uses <a href=\"https:\/\/dialogflow.com\/docs\/intents\/default-intents#default_fallback_intent\" target=\"_blank\" rel=\"noopener\">fallback intents<\/a> when it fails to associate a user input with an intent. This, coupled with the <a href=\"https:\/\/dialogflow.com\/docs\/contexts\/follow-up-intents\" target=\"_blank\" rel=\"noopener\">follow-up intent<\/a> mechanism, allows for contextual error handling. For example, suppose a very simple agent containing these intents :<\/p>\n<p><img decoding=\"async\" class=\"wp-image-9205 alignnone size-full lazyload\" style=\"--smush-placeholder-width: 331px; --smush-placeholder-aspect-ratio: 331\/164;display: block; margin-left: auto; margin-right: auto;\" data-src=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/Default-fallback-intent.jpg\" alt=\"\" width=\"331\" height=\"164\" data-srcset=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/Default-fallback-intent.jpg 331w, https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/Default-fallback-intent-300x149.jpg 300w, https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/Default-fallback-intent-20x10.jpg 20w\" data-sizes=\"(max-width: 331px) 100vw, 331px\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" \/><br \/>\n<span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing<\/span> is a normal intent that will be triggered by specific user inputs (in this case, a <a href=\"https:\/\/dialogflow.com\/docs\/intents\/training-phrases\" target=\"_blank\" rel=\"noopener\">training phrase<\/a> for this intent could be, for example, \u201cI want to do the thing\u201d). Intents can also be triggered by <a href=\"https:\/\/dialogflow.com\/docs\/events\" target=\"_blank\" rel=\"noopener\">events<\/a>, but it\u2019s not really relevant to the current discussion.<\/p>\n<p>The <span style=\"font-family: 'Courier New', Courier, monospace;\">DefaultFallbackIntent<\/span> is created automatically when you generate a new Dialogflow agent, and is triggered when Dialogflow can\u2019t match the user input with anything else. You can think of the <span style=\"font-family: 'Courier New', Courier, monospace;\">DefaultFallbackIntent<\/span> as a safety net that will catch everything, but only as a last resort. Custom fallback intents can also be created, as we\u2019ll see.<\/p>\n<p>In Dialogflow, it\u2019s possible to declare intents as follow-up to other intents. To continue with our same example, let\u2019s suppose that the agent ask the user if he\u2019s sure that he wants to do the thing when <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing<\/span> is matched:<\/p>\n<p><img decoding=\"async\" class=\"wp-image-9206 alignnone size-full lazyload\" style=\"--smush-placeholder-width: 579px; --smush-placeholder-aspect-ratio: 579\/359;display: block; margin-left: auto; margin-right: auto;\" data-src=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/DoTheThing.jpg\" alt=\"\" width=\"579\" height=\"359\" data-srcset=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/DoTheThing.jpg 579w, https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/DoTheThing-480x298.jpg 480w\" data-sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 579px, 100vw\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" \/><\/p>\n<p><span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThink-yes<\/span> and <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing-no<\/span> are follow-up intents: they can only be matched if <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing<\/span> was previously matched. The way Dialogflow determines that is by keeping track of <a href=\"https:\/\/dialogflow.com\/docs\/contexts\" target=\"_blank\" rel=\"noopener\">contexts<\/a>. Specifically, when <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing<\/span> is matched, a new context, <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing-followup<\/span>, is generated. This context is then considered as one of the conditions to trigger <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing-yes<\/span> or <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing-no<\/span>, as we can see in this screenshot:<\/p>\n<p><img decoding=\"async\" class=\"wp-image-9207 alignnone size-full lazyload\" style=\"--smush-placeholder-width: 486px; --smush-placeholder-aspect-ratio: 486\/306;display: block; margin-left: auto; margin-right: auto;\" data-src=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/DoTheThing-yes.jpg\" alt=\"\" width=\"486\" height=\"306\" data-srcset=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/DoTheThing-yes.jpg 486w, https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/DoTheThing-yes-480x302.jpg 480w\" data-sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 486px, 100vw\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" \/><\/p>\n<p>Finally, there is the follow-up fallback, <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing-fallback<\/span>. This kind of fallback works the same way as the <span style=\"font-family: 'Courier New', Courier, monospace;\">DefaultFallbackIntent<\/span>, but will only be operational when a specific context is active (<span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing-followup<\/span>), like with any follow-up intent.<\/p>\n<p>This allows a Dialogflow agent to have contextual error messages for virtually any situation: simply create follow-up fallbacks for every point in your dialogue where the user could say something that is not supported by your agent (pro-tip: most of the time, it\u2019s all the time). You can even implement <em>progressive<\/em> error handling with this, since follow-up fallback intents can be daisy-chained to ensure proper escalation of error prompts:<\/p>\n<p><img decoding=\"async\" class=\"wp-image-9208 alignnone size-full lazyload\" style=\"--smush-placeholder-width: 575px; --smush-placeholder-aspect-ratio: 575\/429;display: block; margin-left: auto; margin-right: auto;\" data-src=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/DoTheThing-fallback.jpg\" alt=\"\" width=\"575\" height=\"429\" data-srcset=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/DoTheThing-fallback.jpg 575w, https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/DoTheThing-fallback-480x358.jpg 480w\" data-sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 575px, 100vw\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" \/><\/p>\n<p>Here, if a user triggers <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing<\/span> and then says something that is not recognized, <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing-fallback<\/span> will handle the situation. If the user then says something that is contextually correct (something that would match <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing-yes<\/span> or <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing-no<\/span>), the dialogue will continue normally. If they say another unsupported input, the agent will use the next follow-up fallback, <span style=\"font-family: 'Courier New', Courier, monospace;\">DoTheThing-fallback-fallback<\/span>.<\/p>\n<h2>The problem with slot filling error handling<\/h2>\n<p>So all is good, right? After all, we just demonstrated that you can do anything you want with follow-ups and fallbacks. Well, <em>almost<\/em> anything. Most notably, this approach will not work with<a href=\"https:\/\/dialogflow.com\/docs\/concepts\/slot-filling\" target=\"_blank\" rel=\"noopener\"> slot filling<\/a>. But before we tell you why and what can be done about it, we need to take a closer look at how slot filling is handled in Dialogflow.<\/p>\n<p>First of all, what is slot filling? It is a simple conversational pattern where a bot is given a list of information to obtain (or <em>slots<\/em> to <em>fill<\/em>). Usually, each of these slots will correspond to an entity that the chatbot will try to extract from the user\u2019s input. When a slot is considered filled, the bot will simply move to the next slot, until they\u2019re all filled.<\/p>\n<p>In Dialogflow, slot filling is tied to a given intent. In other words, a user will first need to trigger a specific intent for the agent to start the slot filling. One important detail to note is that the agent will <em>stay<\/em> on the same intent for the duration of the slot filling.<\/p>\n<p>Let\u2019s see how it works with this image taken from Dialogflow\u2019s documentation:<\/p>\n<p><img decoding=\"async\" class=\"wp-image-9209 alignnone size-full lazyload\" style=\"--smush-placeholder-width: 713px; --smush-placeholder-aspect-ratio: 713\/440;display: block; margin-left: auto; margin-right: auto;\" data-src=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/Action-Parameters.jpg\" alt=\"\" width=\"713\" height=\"440\" data-srcset=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/Action-Parameters.jpg 713w, https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/Action-Parameters-480x296.jpg 480w\" data-sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 713px, 100vw\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" \/><\/p>\n<p>The agent is given a list of three slots to fill : <span style=\"font-family: 'Courier New', Courier, monospace;\">number-int, color <\/span>and <span style=\"font-family: 'Courier New', Courier, monospace;\">size<\/span>, each of a different entity type. When the user triggers the intent that contains the slot filling, the agent will ask the user for each slot, in order. By default, the question is in the form \u201cWhat is SLOT_NAME?\u201d, but customized prompts can be defined for each slot.<\/p>\n<p>What constitutes an error in slot filling is when the agent is not able to extract the expected entity from a user input. In this situation, by default, the Dialogflow agent will simply repeat the question until it receives a valid answer. Forever.<\/p>\n<p>Error handling in slot filling is problematic because we can\u2019t use the strategies that work in other circumstances (follow-up intents and fallbacks), since slot filling always happens <em>within<\/em> a single intent, and these strategies are built on top of the intent detection mechanism. It results in a very basic error handling for slot filling, and while it at least provides the possibility of continuing the dialogue, there is simply no error message guiding the user, which is not really interesting in terms of conversational UX.<\/p>\n<p>Let\u2019s try to fix that.<\/p>\n<h2>Detecting slot filling error context<\/h2>\n<p>(Please note that for the purpose of this article, we\u2019ll suppose that the fulfillment is deployed in a serverless execution environment such as Google Cloud Function, which must remain stateless. Other approaches are of course possible.)<\/p>\n<p>The first step to implement error handling in slot filling is to properly configure your agent to use your fulfillment webhook, and to activate calls to your fulfillment for the slot filling in your intent:<\/p>\n<p><img decoding=\"async\" class=\"wp-image-9210 alignnone size-full lazyload\" style=\"--smush-placeholder-width: 552px; --smush-placeholder-aspect-ratio: 552\/249;display: block; margin-left: auto; margin-right: auto;\" data-src=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/Fulfillment.jpg\" alt=\"\" width=\"552\" height=\"249\" data-srcset=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/Fulfillment.jpg 552w, https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/Fulfillment-480x217.jpg 480w\" data-sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 552px, 100vw\" src=\"data:image\/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\" \/><\/p>\n<p>That was easy enough. The next step is to make your fulfillment code detect occurrences of errors in the slot-filling. The problem is that Dialogflow doesn\u2019t communicate that directly. The only information that is clearly exposed in the fulfillment is the detected intent (which doesn\u2019t change for the duration of the slot filling). But you can also extract from the contexts the current slot that the dialogue is trying to fill (more on that later). Even if there is no mention of any failed entity extraction, we already have everything we need to implement slot filling error detection.<\/p>\n<p>The idea is to use contexts to leave a trace of every time slot filling is attempted for any given slot. Here are the main steps for slot filling error detection:<\/p>\n<ol>\n<li>Detect if you are in slot filling<\/li>\n<li>If so, construct an error ID from the intent\u2019s name and the current slot\u2019s name<\/li>\n<li>Check if a context with that name already exists:\n<ol type=\"a\">\n<li>If it doesn\u2019t, create it and continue as normal<\/li>\n<li>If it does, you just detected an error<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p>How does this work? Well, by making sure to create a custom context every time your agent tries to fill a slot, you leave evidence of that particular attempt. If the slot is properly filled, the agent will move to the next slot, and your fulfillment will generate another error ID (different from the one from before, since the slot is different). But if a call to your fulfillment is made with your custom context already created, it means that the same slot is trying to be filled again, which means that the user didn\u2019t respond correctly to the slot query. In other words, you just detected an error in slot filling!<\/p>\n<p>Let\u2019s see how each step can be implemented:<\/p>\n<p>One easy way to validate that you are indeed in slot filling is to use the <a href=\"https:\/\/dialogflow.com\/docs\/reference\/fulfillment-library\/webhook-client\" target=\"_blank\" rel=\"noopener\">WebhookClient<\/a> and look in <span style=\"font-family: 'Courier New', Courier, monospace;\">client.contexts<\/span> for a context (automatically generated by Dialogflow) whose name starts with <span style=\"font-family: 'Courier New', Courier, monospace;\">`${INTENT}_dialog_params_`<\/span>, where <span style=\"font-family: 'Courier New', Courier, monospace;\">INTENT<\/span> is the name of the current intent, in lower cases. If the context doesn\u2019t exist, you are not in slot filling. If it does, you are, and you can extract the name of the current slot from the end of that context\u2019s name (immediately after \u201cdialog_params_\u201d).<\/p>\n<p>And now, to create the error ID: since we can find the name of the intent and the name of the current slot, we can use this information to forge a unique error ID for each slot in the dialogue. Doesn\u2019t have to be fancy, something like <span style=\"font-family: 'Courier New', Courier, monospace;\">`error_${INTENT}_${SLOT}`<\/span> will do the trick.<\/p>\n<p>To check if our custom context already exists, we can use the following function from the WebhookClient:<\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-family: 'Courier New', Courier, monospace;\">client.getContext(errorID);<\/span><\/p>\n<p>That\u2019s pretty much self explanatory. As for context creation:<\/p>\n<p style=\"padding-left: 40px; font-family: 'Courier New', Courier, monospace;\">client.setContext({<br \/>\nname: `error_${INTENT}_${SLOT}`,<br \/>\nlifespan: 1<br \/>\n});<\/p>\n<p>Here, we set the lifespan of the custom error context to 1, to make it disappear as soon as possible when it\u2019s not needed anymore.<\/p>\n<p>And that\u2019s it for slot filling context error detection. From there, you already have most of the things you need to implement actual error handling: you just have to override the original bot response with a contextually appropriate message, which can be done with this simple command:<\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-family: 'Courier New', Courier, monospace;\">client.add(message);<\/span><\/p>\n<p>Of course, you now need a way to retrieve or generate these contextually correct messages, from within the fulfillment. In other words, you need to do that programmatically. A good way to implement that while keeping your code clean and language agnostic is to leverage the error ID you created as a key and use a localization library to consolidate all your error messages. From there, it\u2019s a simple matter of calling the localization library with the error ID to have it resolved to a proper error message.<\/p>\n<h2>Going progressive<\/h2>\n<p>Now that we have implemented contextual error handling for the slot filling, let\u2019s improve it by making it progressive. An easy way to do that is to add a <span style=\"font-family: 'Courier New', Courier, monospace;\">count<\/span> parameter to your custom context:<\/p>\n<p style=\"padding-left: 40px; font-family: 'Courier New', Courier, monospace;\">client.setContext({<br \/>\nname: `error_${INTENT}_${SLOT}`,<br \/>\nlifespan: 1<br \/>\nparameters: { count: 1 }<br \/>\n});<\/p>\n<p>From there, if an error occurs, you can append the <span style=\"font-family: 'Courier New', Courier, monospace;\">count<\/span> to the error ID (<span style=\"font-family: 'Courier New', Courier, monospace;\">`${errorID}_${COUNT}`<\/span>) and use that new ID template to identify your error messages in your localization library (or whatever similar strategy you use) and thus have any number of distinct error messages for any given context. Simply don\u2019t forget to increment the count value in the context each time you detect an error by calling <span style=\"font-family: 'Courier New', Courier, monospace;\">setContext<\/span> again. You may also want to implement a cap to that number, to avoid having a user reaching an error message that was not implemented.<\/p>\n<h2>Next steps<\/h2>\n<p>This concludes our short discussion on slot filling error handling in Dialogflow. Of course, the proposed implementation is really bare bone and doesn\u2019t support really useful functionalities like constraints, disambiguation (\u201cDid you mean A or B?\u201d) or certain particular situations (things could be a little more complex if you decided to activate the <a href=\"https:\/\/cloud.google.com\/dialogflow-enterprise\/docs\/knowledge-connectors\" target=\"_blank\" rel=\"noopener\">Knowledge Base feature<\/a>, for example). These issues will most probably be covered in one of our future blog posts about Dialogflow. Thanks for reading!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>We said it before, and we\u2019ll say it again: error handling is a crucial element of the conversational UX for chatbot. In a previous post, we identified two primordial characteristics of good error handling. Firstly, it should be contextual, by avoiding generic messages (like \u201cI\u2019m sorry, I didn\u2019t understand that\u201d) and ensuring that error prompts [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":3928,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-5936","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blogue"],"aioseo_notices":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Dialogflow sous la loupe : la gestion des erreurs (Article en anglais) &#183; AI Virtual Voice Experts with Google Dialogflow CX - CCAI - Nu Echo<\/title>\n<meta name=\"description\" content=\"Does your FAQ stand for Fail to Answer Questions?\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dialogflow sous la loupe : la gestion des erreurs (Article en anglais) &#183; AI Virtual Voice Experts with Google Dialogflow CX - CCAI - Nu Echo\" \/>\n<meta property=\"og:description\" content=\"Does your FAQ stand for Fail to Answer Questions?\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/\" \/>\n<meta property=\"og:site_name\" content=\"AI Virtual Voice Experts with Google Dialogflow CX - CCAI - Nu Echo\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/nuechoinc\/\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-17T18:00:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-09-20T15:27:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/board-game-challenge-chess.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"900\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Guillaume Voisine\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nuecho\" \/>\n<meta name=\"twitter:site\" content=\"@nuecho\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"Guillaume Voisine\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/\"},\"author\":{\"name\":\"Guillaume Voisine\",\"@id\":\"https:\/\/www.nuecho.com\/fr\/#\/schema\/person\/b457d67899e1012c82160eab42562164\"},\"headline\":\"Dialogflow sous la loupe : la gestion des erreurs (Article en anglais)\",\"datePublished\":\"2019-06-17T18:00:11+00:00\",\"dateModified\":\"2021-09-20T15:27:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/\"},\"wordCount\":1917,\"publisher\":{\"@id\":\"https:\/\/www.nuecho.com\/fr\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/board-game-challenge-chess.jpg\",\"articleSection\":[\"Blogue\"],\"inLanguage\":\"fr-FR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/\",\"url\":\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/\",\"name\":\"Dialogflow sous la loupe : la gestion des erreurs (Article en anglais) &#183; AI Virtual Voice Experts with Google Dialogflow CX - CCAI - Nu Echo\",\"isPartOf\":{\"@id\":\"https:\/\/www.nuecho.com\/fr\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/board-game-challenge-chess.jpg\",\"datePublished\":\"2019-06-17T18:00:11+00:00\",\"dateModified\":\"2021-09-20T15:27:06+00:00\",\"description\":\"Does your FAQ stand for Fail to Answer Questions?\",\"breadcrumb\":{\"@id\":\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#primaryimage\",\"url\":\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/board-game-challenge-chess.jpg\",\"contentUrl\":\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/board-game-challenge-chess.jpg\",\"width\":1200,\"height\":900},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.nuecho.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dialogflow sous la loupe : la gestion des erreurs (Article en anglais)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.nuecho.com\/fr\/#website\",\"url\":\"https:\/\/www.nuecho.com\/fr\/\",\"name\":\"AI Virtual Voice Experts with Google Dialogflow CX - CCAI - Nu Echo\",\"description\":\"Nu Echo\",\"publisher\":{\"@id\":\"https:\/\/www.nuecho.com\/fr\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.nuecho.com\/fr\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.nuecho.com\/fr\/#organization\",\"name\":\"Nu Echo - Conversation AI | IA Conversationnelle\",\"url\":\"https:\/\/www.nuecho.com\/fr\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.nuecho.com\/fr\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/03\/bottom-logo.png\",\"contentUrl\":\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/03\/bottom-logo.png\",\"width\":138,\"height\":27,\"caption\":\"Nu Echo - Conversation AI | IA Conversationnelle\"},\"image\":{\"@id\":\"https:\/\/www.nuecho.com\/fr\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/nuechoinc\/\",\"https:\/\/x.com\/nuecho\",\"https:\/\/ca.linkedin.com\/company\/nu-echo\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.nuecho.com\/fr\/#\/schema\/person\/b457d67899e1012c82160eab42562164\",\"name\":\"Guillaume Voisine\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\/\/www.nuecho.com\/fr\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2020\/01\/Guillaume-Voisine-150x150.jpg\",\"contentUrl\":\"https:\/\/www.nuecho.com\/wp-content\/uploads\/2020\/01\/Guillaume-Voisine-150x150.jpg\",\"caption\":\"Guillaume Voisine\"},\"description\":\"Software developer, science-fiction writer and Linux enthusiast.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/guillaume-voisine-116925137\/\"],\"url\":\"https:\/\/www.nuecho.com\/fr\/author\/gvoisine\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Dialogflow sous la loupe : la gestion des erreurs (Article en anglais) &#183; AI Virtual Voice Experts with Google Dialogflow CX - CCAI - Nu Echo","description":"Does your FAQ stand for Fail to Answer Questions?","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/","og_locale":"fr_FR","og_type":"article","og_title":"Dialogflow sous la loupe : la gestion des erreurs (Article en anglais) &#183; AI Virtual Voice Experts with Google Dialogflow CX - CCAI - Nu Echo","og_description":"Does your FAQ stand for Fail to Answer Questions?","og_url":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/","og_site_name":"AI Virtual Voice Experts with Google Dialogflow CX - CCAI - Nu Echo","article_publisher":"https:\/\/www.facebook.com\/nuechoinc\/","article_published_time":"2019-06-17T18:00:11+00:00","article_modified_time":"2021-09-20T15:27:06+00:00","og_image":[{"width":1200,"height":900,"url":"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/board-game-challenge-chess.jpg","type":"image\/jpeg"}],"author":"Guillaume Voisine","twitter_card":"summary_large_image","twitter_creator":"@nuecho","twitter_site":"@nuecho","twitter_misc":{"\u00c9crit par":"Guillaume Voisine","Dur\u00e9e de lecture estim\u00e9e":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#article","isPartOf":{"@id":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/"},"author":{"name":"Guillaume Voisine","@id":"https:\/\/www.nuecho.com\/fr\/#\/schema\/person\/b457d67899e1012c82160eab42562164"},"headline":"Dialogflow sous la loupe : la gestion des erreurs (Article en anglais)","datePublished":"2019-06-17T18:00:11+00:00","dateModified":"2021-09-20T15:27:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/"},"wordCount":1917,"publisher":{"@id":"https:\/\/www.nuecho.com\/fr\/#organization"},"image":{"@id":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#primaryimage"},"thumbnailUrl":"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/board-game-challenge-chess.jpg","articleSection":["Blogue"],"inLanguage":"fr-FR"},{"@type":"WebPage","@id":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/","url":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/","name":"Dialogflow sous la loupe : la gestion des erreurs (Article en anglais) &#183; AI Virtual Voice Experts with Google Dialogflow CX - CCAI - Nu Echo","isPartOf":{"@id":"https:\/\/www.nuecho.com\/fr\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#primaryimage"},"image":{"@id":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#primaryimage"},"thumbnailUrl":"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/board-game-challenge-chess.jpg","datePublished":"2019-06-17T18:00:11+00:00","dateModified":"2021-09-20T15:27:06+00:00","description":"Does your FAQ stand for Fail to Answer Questions?","breadcrumb":{"@id":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/"]}]},{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#primaryimage","url":"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/board-game-challenge-chess.jpg","contentUrl":"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/06\/board-game-challenge-chess.jpg","width":1200,"height":900},{"@type":"BreadcrumbList","@id":"https:\/\/www.nuecho.com\/fr\/dialogflow-distilled-on-error-handling-article-en-anglais\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.nuecho.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Dialogflow sous la loupe : la gestion des erreurs (Article en anglais)"}]},{"@type":"WebSite","@id":"https:\/\/www.nuecho.com\/fr\/#website","url":"https:\/\/www.nuecho.com\/fr\/","name":"AI Virtual Voice Experts with Google Dialogflow CX - CCAI - Nu Echo","description":"Nu Echo","publisher":{"@id":"https:\/\/www.nuecho.com\/fr\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.nuecho.com\/fr\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Organization","@id":"https:\/\/www.nuecho.com\/fr\/#organization","name":"Nu Echo - Conversation AI | IA Conversationnelle","url":"https:\/\/www.nuecho.com\/fr\/","logo":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.nuecho.com\/fr\/#\/schema\/logo\/image\/","url":"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/03\/bottom-logo.png","contentUrl":"https:\/\/www.nuecho.com\/wp-content\/uploads\/2019\/03\/bottom-logo.png","width":138,"height":27,"caption":"Nu Echo - Conversation AI | IA Conversationnelle"},"image":{"@id":"https:\/\/www.nuecho.com\/fr\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/nuechoinc\/","https:\/\/x.com\/nuecho","https:\/\/ca.linkedin.com\/company\/nu-echo"]},{"@type":"Person","@id":"https:\/\/www.nuecho.com\/fr\/#\/schema\/person\/b457d67899e1012c82160eab42562164","name":"Guillaume Voisine","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/www.nuecho.com\/fr\/#\/schema\/person\/image\/","url":"https:\/\/www.nuecho.com\/wp-content\/uploads\/2020\/01\/Guillaume-Voisine-150x150.jpg","contentUrl":"https:\/\/www.nuecho.com\/wp-content\/uploads\/2020\/01\/Guillaume-Voisine-150x150.jpg","caption":"Guillaume Voisine"},"description":"Software developer, science-fiction writer and Linux enthusiast.","sameAs":["https:\/\/www.linkedin.com\/in\/guillaume-voisine-116925137\/"],"url":"https:\/\/www.nuecho.com\/fr\/author\/gvoisine\/"}]}},"_links":{"self":[{"href":"https:\/\/www.nuecho.com\/fr\/wp-json\/wp\/v2\/posts\/5936","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.nuecho.com\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.nuecho.com\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.nuecho.com\/fr\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.nuecho.com\/fr\/wp-json\/wp\/v2\/comments?post=5936"}],"version-history":[{"count":9,"href":"https:\/\/www.nuecho.com\/fr\/wp-json\/wp\/v2\/posts\/5936\/revisions"}],"predecessor-version":[{"id":8964,"href":"https:\/\/www.nuecho.com\/fr\/wp-json\/wp\/v2\/posts\/5936\/revisions\/8964"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.nuecho.com\/fr\/wp-json\/wp\/v2\/media\/3928"}],"wp:attachment":[{"href":"https:\/\/www.nuecho.com\/fr\/wp-json\/wp\/v2\/media?parent=5936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.nuecho.com\/fr\/wp-json\/wp\/v2\/categories?post=5936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.nuecho.com\/fr\/wp-json\/wp\/v2\/tags?post=5936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}