在 Alexa Skill 中处理重新提示时如何回退到错误

How to fallback into error when reprompt is processed in Alexa Skill

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

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

I've upload a demo project to emulate this behaviour

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

这是 "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"
    }
}
}

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

谢谢

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

ErrorHandler 代码 中的实际错误不在 try/catch 内或没有意图处理程序(包括 UnhandledIntentHandlers) 可以满足请求。不要混淆 ErrorHandlersUnhandledIntentHandlersErrorHandlers 用于处理错误,UnhandledIntentHandler are/should 是 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。对此要非常小心,不要这样做,除非你知道自己在做什么并且别无他法。 不推荐

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

总的来说,建议是:

  1. 为每个 Intent 提供 7 到 50 个话语,尝试提供具有代表性的话语样本,以确保您能捕捉到同一意图的大量变体

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

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

  4. 不要创建带有大量随机话语的意图,因为您可能会搞乱技能模型,为此目的创建插槽也是如此。权衡是不值得的。如果您仍然想要解决方法,请尝试 this or this.

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

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

    [=48 中的实际错误时触发=]

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