【问题标题】:How to fallback into error when reprompt is processed in Alexa Skill在 Alexa Skill 中处理 reprompt 时如何回退到错误
【发布时间】:2019-04-19 09:49:09
【问题描述】:

我是开发 Alexa Skills 的新手。我正在为西班牙商店开发技能,所以我使用的是 es-ES 语音。我使用 Node.js ASK-SDK,我遇到了这个问题:

当我尝试使用 reprompt 进行对话时,如果用户说胡言乱语,那不应该触发我的任何话语,我希望进入错误处理程序,因为它是带有 canHandle == true 的错误处理程序,但实际结果是 Alexa 检测到该胡言乱语并将其分类为正确的话语之一。我已经看到在 en-US 你有 AMAZON.Fallback 来防止这个问题,但由于没有西班牙 SDK 有这个,我怎么能检测到这个?

I've upload a demo project to emulate this behaviour

你可以试试这个工作流程:

  • 开始技能
  • 技能返回“第一”文本并保持聆听(因为有重新提示)
  • 你写第二个
  • 技能返回“二号”文本并继续聆听并再次提示
  • 你说胡话,例如“d”或“blah blah blah”
  • 您是按照明显随机的话语排序的。

这是“blah blah blah”的 JSON 输入示例

{
"version": "1.0",
"session": {
    "new": false,
    "sessionId": "amzn1.echo-api.session.55b928a6-ecb2-4b55-857e-af6a76dee6fe",
    "application": {
        "applicationId": "amzn1.ask.skill.dd0b7ffd-b408-489a-ab5e-a7d7b8d05da3"
    },
    "user": {
        "userId": "amzn1.ask.account.AFWPOWCRQULHUVKQTTX7JIS3O264CCHSUY4MPHCSJS4LKLQX45YARJ67LTGHPMS7RWUXVNYUTXT6JMT3DICTL5YZ7QHSLZ3QIHEKDP5YRPLCAEFXTD4BRY6WJIKC36UO3QU4F5X5BLFAGX6C3KN76MQJETO5PY6I65CVNOFBQLGNZ3P4YN4IOLYBCC7NDGAQ6LFAWMWTKT6DWQY"
    }
},
"context": {
    "System": {
        "application": {
            "applicationId": "amzn1.ask.skill.dd0b7ffd-b408-489a-ab5e-a7d7b8d05da3"
        },
        "user": {
            "userId": "amzn1.ask.account.AFWPOWCRQULHUVKQTTX7JIS3O264CCHSUY4MPHCSJS4LKLQX45YARJ67LTGHPMS7RWUXVNYUTXT6JMT3DICTL5YZ7QHSLZ3QIHEKDP5YRPLCAEFXTD4BRY6WJIKC36UO3QU4F5X5BLFAGX6C3KN76MQJETO5PY6I65CVNOFBQLGNZ3P4YN4IOLYBCC7NDGAQ6LFAWMWTKT6DWQY"
        },
        "device": {
            "deviceId": "amzn1.ask.device.AETBPXRLKFDMVR23WFUFQ3HOFTGHQDISLOQAPWS4BDBD4FAGXUKW2P56RJ3G74C75HG63MS52UV7KFYJAENEVT6VIRZUEKWCQQHNGV3FMP6BM3A5JZCUXH2LRYDHLQLBH5ABDJ7EYRWUI5532NYEZLUCYIGMRZCM2WKQ3XG6NX5VZPOELTKUO",
            "supportedInterfaces": {}
        },
        "apiEndpoint": "https://api.eu.amazonalexa.com",
        "apiAccessToken": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjEifQ.eyJhdWQiOiJodHRwczovL2FwaS5hbWF6b25hbGV4YS5jb20iLCJpc3MiOiJBbGV4YVNraWxsS2l0Iiwic3ViIjoiYW16bjEuYXNrLnNraWxsLmRkMGI3ZmZkLWI0MDgtNDg5YS1hYjVlLWE3ZDdiOGQwNWRhMyIsImV4cCI6MTU0MjM1OTg1NCwiaWF0IjoxNTQyMzU2MjU0LCJuYmYiOjE1NDIzNTYyNTQsInByaXZhdGVDbGFpbXMiOnsiY29uc2VudFRva2VuIjpudWxsLCJkZXZpY2VJZCI6ImFtem4xLmFzay5kZXZpY2UuQUVUQlBYUkxLRkRNVlIyM1dGVUZRM0hPRlRHSFFESVNMT1FBUFdTNEJEQkQ0RkFHWFVLVzJQNTZSSjNHNzRDNzVIRzYzTVM1MlVWN0tGWUpBRU5FVlQ2VklSWlVFS1dDUVFITkdWM0ZNUDZCTTNBNUpaQ1VYSDJMUllESExRTEJINUFCREo3RVlSV1VJNTUzMk5ZRVpMVUNZSUdNUlpDTTJXS1EzWEc2Tlg1VlpQT0VMVEtVTyIsInVzZXJJZCI6ImFtem4xLmFzay5hY2NvdW50LkFGV1BPV0NSUVVMSFVWS1FUVFg3SklTM08yNjRDQ0hTVVk0TVBIQ1NKUzRMS0xRWDQ1WUFSSjY3TFRHSFBNUzdSV1VYVk5ZVVRYVDZKTVQzRElDVEw1WVo3UUhTTFozUUlIRUtEUDVZUlBMQ0FFRlhURDRCUlk2V0pJS0MzNlVPM1FVNEY1WDVCTEZBR1g2QzNLTjc2TVFKRVRPNVBZNkk2NUNWTk9GQlFMR05aM1A0WU40SU9MWUJDQzdOREdBUTZMRkFXTVdUS1Q2RFdRWSJ9fQ.H50aG2L-K_AH-vRQ4ueu6n8GY_3T14KVjJysJjpWaAJEMfVlkx6CNwnQjDQJZHd1GQ1UpqcT3AkpqGDg86Z2J50RDmRp5ScUqqMQu0ZjrCxG9hItwT02ca4wxEo_hFrMb5VTTgqSORbfgzmDHJMOVaWjb_zJAcAFCJrF3qxzYzEo-E2ptBdRb7xKY0y_3MisF302HTUiZC3uTiRvWxv3jMT0_vq9cXDoHOar_WDf7Q6afF4DrEj6naX_vRpHT-63nWug1TiKRaJY4sEEaTlX0BVDigJ7t1LuH76ULeDEpJrSNW3mQtrHqUCnFNRYe9_-ru-rf-NkMpotYE7glWNnZg"
    },
    "Viewport": {
        "experiences": [
            {
                "arcMinuteWidth": 246,
                "arcMinuteHeight": 144,
                "canRotate": false,
                "canResize": false
            }
        ],
        "shape": "RECTANGLE",
        "pixelWidth": 1024,
        "pixelHeight": 600,
        "dpi": 160,
        "currentPixelWidth": 1024,
        "currentPixelHeight": 600,
        "touch": [
            "SINGLE"
        ]
    }
},
"request": {
    "type": "IntentRequest",
    "requestId": "amzn1.echo-api.request.fef2e2fc-b404-4729-85b4-e8ced71b6ecd",
    "timestamp": "2018-11-16T08:17:34Z",
    "locale": "es-ES",
    "intent": {
        "name": "NumberTwoIntent",
        "confirmationStatus": "NONE"
    }
}
}

如何防止这种情况发生?我希望输入错误,因为它是唯一一个可以为“blah blah blah”话语返回 true 的处理程序,因此,告诉用户他们的语音有错误,但由于它被归类为话语,它返回一些用户没有要求的信息。

谢谢

【问题讨论】:

    标签: alexa alexa-skills-kit alexa-skill


    【解决方案1】:

    在没有 FallbackIntent 的语言环境中处理域外话语的推荐策略是尽可能广泛地包含您的模型确实可以处理并尝试识别的意图人们可能想在域外询问您的某些表达,并以单独的意图捕获它们,最终将为这些情况提供额外的答案。

    所以总的来说,建议是:

    1. 为每个 Intent 提供 7 到 50 条话语,尽量提供有代表性的话语样本,以确保您能捕捉到相同意图的大量变化

    2. 确保在不同意图中没有相同或相似的话语(这将在模型选择意图时提供不可预测的结果)

    3. 如果您的意图有插槽,请验证它们并通知用户如果值不是您所期望的。您可以在后端自己验证插槽,或者,最近刚刚添加,您也可以validate slots via dialog management。注意,如果验证失败后需要从用户那里获取有效的槽值,可以使用slot elicitation

    4. 不要创建包含大量随机话语的意图,因为您可能会弄乱该技能的模型,就像为此目的创建槽一样。折衷是不值得的。如果您仍需要解决方法,请尝试 this 或 this。

    5. 您可以创建一个意图来处理您可以预料到的域外话语。例如,en-US 中的许多技能都有一个可以处理 bla bla bla 的意图,正如人们倾向于说的那样

    6. 不要依赖catch all handlers(canHandle() 设置为始终返回 true)来帮助您。一些示例使用UnhandledIntentHandler 并误导人们认为域外话语将由它处理,如果没有FallbackIntent,情况并非如此。同样,不要依赖通过addErrorHandlers() 添加的ErrorHandler,因为它只会在代码中存在不在try/catch 中的实际错误时触发

    一旦Amazon.FallbackIntent 在您的语言环境中可用,请实施它并摆脱您自己的域外意图和/或解决方法(如果有的话)

    【讨论】:

      【解决方案2】:

      由于没有AMAZON.FallbackIntent,Alexa 总是尝试将其映射到最接近的意图。

      ErrorHandler 在代码中存在 实际错误 时触发,该错误不在 try/catch 中,或者没有可以满足请求的意图处理程序(包括 UnhandledIntentHandlers)。不要混淆ErrorHandlers 和UnhandledIntentHandlers。 ErrorHandlers 用于处理错误,UnhandledIntentHandler 是/应该是IntentHandler 用于处理未处理的意图。

      在您的情况下,即使是胡言乱语,每次都会映射意图。结果总是有一个意图处理程序,并且永远不会调用ErrorHandler。

      由于AMAZON.Fallback不能使用,试试这些:

      1.验证槽:
      考虑以下话语:

      [BuyProductIntent]
      Utterances:
      I want a large pizza
      give me a large pizza
      

      可以改成

      I want a {size} {product}
      give me a {size} {product}
      

      在哪里

      size-> regular, medium, large
      product->pizza, burger
      

      现在,每当您的后端收到 BuyProductIntent 请求时,验证插槽并以适当的消息进行响应。如果BuyProductIntent 被一些乱码触发,则插槽将不会被填充,因此您可以假设某些事情是不正确的。然后你可以这样回应。

      "Sorry, I didn't understand. Do you want to order pizza"
      

      这不是一个完整的解决方案,但这肯定会帮助您减少此问题。此外,验证插槽总是一个好主意。

      2。添加 OutOfDomainIntent
      创建一个OutOfDomainIntent 并添加一些您的技能不支持的完全随机的胡言乱语和话语,并以适当的错误消息进行响应。确保这不会影响您的交互模型设计或 VUI。对此要非常小心,除非您知道自己在做什么,否则不要这样做并且没有其他办法。这是不推荐。

      【讨论】:

      • Cicil 这个答案很好,但是关于你所说的 ErrorHandler 有一个错误。 ErrorHandler,通常通过 addErrorHandlers() 添加,当没有更多可以满足请求的处理程序时不会触发,它会在代码中抛出错误时触发(不在 try/catch 中)。您所描述的听起来更像是一个 UnhandledIntentHandler ,其中 canHandle() 设置为返回 true。一些示例使用 UnhandledIntentHandler 并误导人们认为域外话语将由它处理,如果没有 FallbackIntent,情况并非如此。
      • @German 我仔细检查了一遍。如果没有可以处理请求的意图处理程序,则会触发能够处理它的错误处理程序,并显示错误消息"message":"Could not find handler that can handle the request" 和"name":"AskSdk.DefaultRequestDispatcher Error"。正如你所说,我描述ErrorHandler 的方式看起来更像UnhandledIntentHandler。谢谢指出,我会更新的。
      • Cicl:这是间接发生的,我相信这是一个 RequestChain not found 错误。所以,是的,ErrorHandler 将被触发,但我不会依赖它来检测未处理的意图,它是非常间接的(它是附带损害)。感谢您在 Stackoverflow 关于 Alexa 的大力帮助,非常棒
      • @German 我已经更新了我的答案。因此,未处理的意图不应由ErrorHandler 处理,而应由IntentHandler 本身处理。感谢您的信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多