Как вернуться к ошибке, когда повторная обработка обрабатывается в Alexa Skill - PullRequest
0 голосов
/ 16 ноября 2018

Я новичок в разработке Alexa Skills. Я работаю над Skill для испанского магазина, поэтому использую голос es-ES. Я использую Node.js ASK-SDK, и я столкнулся с этой проблемой:

Когда я пытаюсь развить диалог с повторной репликой, если пользователь говорит «бред», который не должен вызывать ни одно из моих высказываний, я ожидаю войти в обработчик ошибок, так как он с canHandle == true, но фактический результат состоит в том, что это тарабарщина обнаружена и отсортирована Алекса как одно из правильных высказываний Я видел, что в en-US у вас есть AMAZON.Fallback для предотвращения этой проблемы, но, поскольку ни один из испанских SDK не имеет этого, как я могу обнаружить это?

Я загрузил демонстрационный проект для эмуляции этого поведения

Вы можете попробовать с этим рабочий процесс:

  • Запустить навык
  • Умение возвращает текст «Номер один» и продолжает слушать (так как есть повторная реплика)
  • Вы пишете номер два
  • Умение возвращает текст «Номер два» и продолжает слушать с другим повторением
  • Вы говорите бред, например, "d" или "бла-бла-бла"
  • Вы отсортированы по явно случайному высказыванию.

Вот пример ввода 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"
    }
}
}

Как я могу предотвратить это? Я ожидаю ввести ошибку, так как это единственный обработчик, который может вернуть true для высказывания «бла-бла-бла», и, таким образом, сообщить пользователю, что в его речи произошла ошибка, но поскольку она классифицируется по высказыванию, она возвращает некоторую информацию, которую пользователь не запрашивал.

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Рекомендуемая стратегия для обработки высказываний вне домена в локалях, которые не имеют FallbackIntent , но должна быть настолько обширной, насколько это возможно, с намерениями, которые ваша модель действительно может обработать ипопытайтесь распознать некоторые высказывания, которые люди могут захотеть задать вашим навыкам за пределами домена, и поймать их в отдельном намерении, которое в конечном итоге даст дополнительные ответы именно для этих случаев.

Таким образом, в целом рекомендуется:

  1. Предоставьте от 7 до 50 высказываний для каждого намерения, попробуйте предоставить репрезентативную выборку высказываний, чтобы убедиться, что вы поймаете много вариаций для одного и того же намерения

  2. Убедитесь, что у вас нет высказываний с разными намерениями, которые одинаковы или схожи (это даст непредсказуемые результаты, когда модель выберет намерение)

  3. Если у вашего намерения есть слоты,проверьте их и уведомите пользователя, если значения не соответствуют ожидаемым.Вы можете самостоятельно проверять слоты в бэк-энде или, только что добавленные недавно, вы также можете проверять слоты с помощью диалогового управления .Обратите внимание, что вы можете использовать извлечение слотов , если вам нужно получить действительное значение слота от пользователя после сбоя проверки

  4. Не создавать намерения с большим количеством случайных высказыванийтак как вы рискуете испортить модель для навыка, как и создание слотов для этой цели.Компромисс не стоит.Если вам все еще нужен обходной путь, попробуйте this или this .

  5. Вы можете создать намерение обрабатывать высказывания вне домена, которые выможет отчасти предвидеть.Например, многие навыки в en-US имеют намерение, которое может справиться с бла бла бла , как обычно говорят люди

  6. Не полагайтесь на перехватить все обработчики (canHandle() установлено всегда возвращать true), чтобы помочь вам в этом.Некоторые примеры используют UnhandledIntentHandler и вводят людей в заблуждение, полагая, что высказывания вне домена будут обрабатываться им, что не имеет место, если нет FallbackIntent.Точно так же не полагайтесь на ErrorHandler, добавленный через addErrorHandlers(), так как он будет срабатывать только в том случае, если в коде есть настоящая ошибка, которой нет внутри try / catch

Как толькокак только Amazon.FallbackIntent станет доступным в вашей локали, внедрите его и избавьтесь от собственных внешних намерений и / или обходных путей, если они у вас есть

0 голосов
/ 16 ноября 2018

Поскольку нет AMAZON.FallbackIntent Alexa всегда пытается сопоставить его с ближайшим намерением.

ErrorHandler срабатывает, когда в коде есть фактическая ошибка *1006*, которой нет внутри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.Будьте очень осторожны с этим, не делайте этого, если вы не знаете, что делаете и другого пути нет.Это не рекомендуется .

...