

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Uso de pontuações de confiança para melhorar a precisão da conversa
<a name="confidence-scores"></a>

Há duas etapas que o Amazon Lex V2 usa para determinar o que um usuário diz. A primeira, o reconhecimento automático de fala (ASR), cria uma transcrição do enunciado do usuário em áudio. A segunda, a compreensão de linguagem natural (NLU), determina o significado do enunciado do usuário para reconhecer a intenção do usuário ou o valor dos slots.

Por padrão, o Amazon Lex V2 retorna o resultado mais provável do ASR e da NLU. Às vezes, pode ser difícil para o Amazon Lex V2 determinar o resultado mais provável. Nesse caso, ele retorna vários resultados possíveis junto com uma *pontuação de confiança* que indica a probabilidade de o resultado estar correto. Uma pontuação de confiança é uma classificação fornecida pelo Amazon Lex V2 que demonstra a confiança relativa que ele tem no resultado. As pontuações de confiança variam de 0,0 a 1,0.

Você pode usar seu conhecimento de domínio com a pontuação de confiança para ajudar a determinar a interpretação correta do resultado de ASR ou NLU.

A pontuação de confiança do ASR, ou transcrição, é uma classificação do nível de confiança do Amazon Lex V2 na precisão de uma transcrição específica. A pontuação de confiança da NLU, ou intenção, é uma classificação do nível de confiança do Amazon Lex V2 na precisão da intenção especificada pela transcrição principal. Use a pontuação de confiança que melhor se adequa à aplicação.

**Topics**
+ [Uso de pontuações de confiança de intenção para melhorar a seleção de intenção com o Lex V2](using-intent-confidence-scores.md)
+ [Uso de pontuações de confiança na transcrição de voz para melhorar as conversas com seu bot do Lex V2](using-transcript-confidence-scores.md)

# Uso de pontuações de confiança de intenção para melhorar a seleção de intenção com o Lex V2
<a name="using-intent-confidence-scores"></a>

Quando um usuário faz um enunciado, o Amazon Lex V2 usa a compreensão de linguagem natural (NLU) para entender a solicitação do usuário e retornar a intenção correta. Por padrão, o Amazon Lex V2 retorna a intenção mais provável definida pelo bot.

Em alguns casos, pode ser difícil para o Amazon Lex V2 determinar a intenção mais provável. Por exemplo, o usuário pode fazer um enunciado ambíguo ou pode haver duas intenções semelhantes. Para ajudar a determinar a intenção correta, você pode combinar seu conhecimento de domínio com as *pontuações de confiança da NLU* em uma lista de interpretações. Uma pontuação de confiança é uma classificação fornecida pelo Amazon Lex V2 que mostra o nível de confiança na correta identificação da intenção.

Para determinar a diferença entre duas intenções em uma interpretação, você pode comparar suas pontuações de confiança. Por exemplo, se uma intenção tem uma pontuação de confiança de 0,95 e outra tem uma pontuação de 0,65, é provável que a primeira intenção esteja correta. No entanto, se uma intenção tiver uma pontuação de 0,75 e outra tiver uma pontuação de 0,72, haverá ambiguidade entre as duas intenções que você poderá discriminar usando o conhecimento do domínio em seu aplicativo.

Você também pode usar pontuações de confiança para criar aplicativos de teste que determinam se as mudanças nas declarações de uma intenção fazem diferença no comportamento do bot. Por exemplo, você pode obter as pontuações de confiança das intenções de um bot usando um conjunto de declarações e, em seguida, atualizar as intenções com novas declarações. Você pode verificar as pontuações de confiança para ver se houve alguma melhora.

As pontuações de confiança que o Amazon Lex V2 retorna são valores comparativos. Não confie nelas como uma pontuação absoluta. Os valores podem mudar com base em melhorias no Amazon Lex V2.

O Amazon Lex V2 retorna a intenção mais provável e até quatro intenções alternativas com suas pontuações associadas na estrutura `interpretations` em cada resposta. O código JSON a seguir mostra a `interpretations` estrutura na resposta da [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html)operação:

```
   "interpretations": [
      {
         "intent": {
            "confirmationState": "string",
            "name": "string",
            "slots": {
               "string" : {
                  "value": {
                     "interpretedValue": "string",
                     "originalValue": "string",
                     "resolvedValues": [ "string" ]
                  }
               }
            },
            "state": "string"
         },
         "nluConfidence": number
      }
   ]
```

## AMAZÔNIA. FallbackIntent
<a name="nluconfidence-fallbackintent"></a>

O Amazon Lex V2 retorna `AMAZON.FallbackIntent` como a principal intenção em duas situações:

1.  Se as pontuações de confiança de todas as possíveis intenções forem menores que o limite de confiança. Você pode usar o limite padrão ou definir seu próprio limite. Se você tiver o `AMAZON.KendraSearchIntent` configurado, o Amazon Lex V2 também o retornará nessa situação. 

1.  Se a confiança na interpretação do `AMAZON.FallbackIntent` for maior do que a confiança na interpretação de todas as outras intenções. 

 Observe que o Amazon Lex V2 não exibe uma pontuação de confiança para `AMAZON.FallbackIntent`. 

## Definir e alterar o limite de confiança
<a name="nluconfidence-threshold"></a>

O limite de confiança deve ser um número entre 0,00 e 1,00. Você pode definir o limite para cada idioma do bot das seguintes maneiras:

**Usar o console do Amazon Lex V2**
+  Para definir o limite ao adicionar um idioma ao bot com **Adicionar idioma**, você pode inserir o valor desejado no painel **Limite de pontuação de confiança**. 
+  Para atualizar o limite, você pode selecionar **Editar** no painel **Detalhes do idioma** em um idioma para o bot. Insira o valor desejado no painel **Limite da pontuação de confiança**. 

**Usar operações de API**
+  Para definir o limite, defina o `nluIntentConfidenceThreshold` parâmetro da [CreateBotLocale](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateBotLocale.html)operação.
+  Para atualizar o limite de confiança, defina o `nluIntentConfidenceThreshold` parâmetro da [UpdateBotLocale](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateBotLocale.html)operação. 

## Gerenciamento de sessões
<a name="confidence-scores-session-management"></a>

Para alterar a intenção que o Amazon Lex V2 usa em uma conversa com o usuário, você pode usar a resposta da função Lambda do gancho de código de diálogo ou usar o gerenciamento de sessões APIs em seu aplicativo personalizado. 

### Uso de uma função do Lambda com seu bot do Lex V2
<a name="session-management-lambda"></a>

Quando você usa uma função do Lambda, o Amazon Lex V2 a chama com uma estrutura JSON que contém a entrada para a função. A estrutura JSON contém um campo chamado `currentIntent` que contém a intenção que o Amazon Lex V2 identificou como a intenção mais provável para a expressão do usuário. A estrutura JSON também inclui um campo `alternativeIntents` que contém até quatro intenções adicionais que podem satisfazer a intenção do usuário. Cada intenção inclui um campo chamado `nluIntentConfidenceScore` que contém a pontuação de confiança que o Amazon Lex V2 atribuiu à intenção.

Para usar uma intenção alternativa, especifique-a na ação `ConfirmIntent` ou na caixa de diálogo `ElicitSlot` na função do Lambda.

Para obter mais informações, consulte [Integrando uma AWS Lambda função ao seu bot Amazon Lex V2](lambda.md).

### Uso da API de gerenciamento de sessões com seu bot do Lex V2
<a name="session-management-API"></a>

Para usar uma intenção diferente da intenção atual, utilize a operação [PutSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_PutSession.html). Por exemplo, se você decidir que a primeira alternativa é preferível à intenção escolhida pelo Amazon Lex V2, use a operação `PutSession` para alterar as intenções de forma que a próxima intenção com a qual o usuário vai interagir seja aquela que você selecionou.

Para obter mais informações, consulte [Noções básicas sobre sessões de bots do Amazon Lex V2](managing-sessions.md).

# Uso de pontuações de confiança na transcrição de voz para melhorar as conversas com seu bot do Lex V2
<a name="using-transcript-confidence-scores"></a>

 Quando um usuário faz um enunciado por voz, o Amazon Lex V2 usa o reconhecimento automático de fala (ASR) para transcrever a solicitação do usuário antes que ela seja interpretada. Por padrão, o Amazon Lex V2 usa a transcrição mais provável do áudio para interpretação. 

Em alguns casos, pode haver mais de uma possível transcrição do áudio. Por exemplo, um usuário pode fazer um enunciado com um som ambíguo, como “Meu nome é John”, que pode ser entendido como “Meu nome é Juan”. Nesse caso, você pode usar técnicas de desambiguação ou combinar seu conhecimento de domínio com a *pontuação de confiança da transcrição* para ajudar a determinar qual transcrição é a correta em uma lista de transcrições. 

O Amazon Lex V2 inclui a transcrição principal e até duas transcrições alternativas para a entrada do usuário na solicitação da função de hook de código Lambda. Cada transcrição contém uma pontuação de confiança que indica a probabilidade de ser a transcrição correta. Cada transcrição também inclui quaisquer valores de slot inferidos a partir da entrada do usuário.

Você pode comparar as pontuações de confiança de duas transcrições para determinar se há ambiguidade entre elas. Por exemplo, se uma transcrição tem uma pontuação de confiança de 0,95 e a outra tem uma pontuação de confiança de 0,65, a primeira transcrição provavelmente está correta e a ambiguidade entre elas é baixa. Se as duas transcrições tiverem pontuações de confiança de 0,75 e 0,72, a ambiguidade entre elas é alta. Talvez você consiga discriminá-las usando seu conhecimento de domínio.

Por exemplo, se os valores de slot inferidos em duas transcrições com uma pontuação de confiança de 0,75 e 0,72 forem “John” e “Juan”, você poderá consultar os usuários no banco de dados para verificar a existência desses nomes e eliminar uma das transcrições. Se “John” não for um usuário no banco de dados e “Juan” for, você poderá usar o hook de código de diálogo para alterar o valor do slot inferido para “Juan”, o primeiro nome.

As pontuações de confiança que o Amazon Lex V2 retorna são valores comparativos. Não confie nelas como uma pontuação absoluta. Os valores podem mudar com base em melhorias no Amazon Lex V2.

As pontuações de confiança da transcrição de áudio estão disponíveis somente nos idiomas inglês (GB) (en\$1GB) e inglês (EUA) (en\$1US). As pontuações de confiança são compatíveis somente com entradas de áudio de 8 kHz. As pontuações de confiança da transcrição não são fornecidas para entrada de áudio da [janela de teste](https://docs.aws.amazon.com/lexv2/latest/dg/test-bot.html) no console do Amazon Lex V2 porque ele usa entrada de áudio de 16 kHz.

**nota**  
Antes de usar as pontuações de confiança da transcrição de áudio com um bot existente, é preciso primeiro reconstruir o bot. As versões existentes de um bot não oferecem suporte a pontuações de confiança na transcrição. É necessário criar uma nova versão do bot para usá-las.

Você pode usar pontuações de confiança para vários padrões de design de conversas:
+ Se a pontuação de confiança mais alta cair abaixo de um limite devido a um ambiente ruidoso ou à baixa qualidade do sinal, você poderá solicitar que o usuário faça a mesma pergunta para capturar um áudio de melhor qualidade.
+ Se várias transcrições tiverem pontuações de confiança semelhantes para valores de slot, como “John” e “Juan”, você poderá comparar os valores com um banco de dados preexistente para eliminar entradas ou solicitar que o usuário selecione um dos dois valores. Por exemplo, “diga 1 para John ou 2 para Juan”.
+ Se a lógica de negócios exigir a troca de intenção com base em palavras-chave específicas em uma transcrição alternativa com uma pontuação de confiança próxima à transcrição principal, você poderá alterar a intenção usando a função do Lambda do hook de código de diálogo ou usando operações de gerenciamento de sessão. Para obter mais informações, consulte [Gerenciamento de sessões](#transcription-confidence-session-management).

O Amazon Lex V2 envia a seguinte estrutura JSON com até três transcrições para a entrada do usuário na função de hook de código Lambda:

```
    "transcriptions": [
        {
            "transcription": "string",
            "rawTranscription": "string",
            "transcriptionConfidence": "number",
            },
            "resolvedContext": {
                "intent": "string"
            },
            "resolvedSlots": {
                "string": {
                    "shape": "List",
                    "value": {
                        "originalValue": "string",
                        "resolvedValues": [
                            "string"
                        ]
                    },
                    "values": [
                        {
                            "shape": "Scalar",
                            "value": {
                                "originalValue": "string",
                                "resolvedValues": [
                                    "string"
                                ]
                            }
                        },
                        {
                            "shape": "Scalar",
                            "value": {
                                "originalValue": "string",
                                "resolvedValues": [
                                    "string"
                                ]
                            }
                        }
                    ]
                }
            }
        }
    ]
```

A estrutura JSON contém texto de transcrição, a intenção que foi identificada para o enunciado e valores para quaisquer slots detectados no enunciado. Para a entrada de texto do usuário, as transcrições contêm uma única transcrição com uma pontuação de confiança de 1,0.

O conteúdo das transcrições depende do rumo da conversa e da intenção reconhecida. 

Na primeira etapa, a escolha da intenção, o Amazon Lex V2 determina as três principais transcrições. Para a transcrição principal, ele retorna a intenção e quaisquer valores de slot inferidos na transcrição.

Nas etapas subsequentes, na escolha de slots, os resultados dependem da intenção inferida para cada uma das transcrições, conforme a seguir.
+ Se a intenção inferida para a transcrição principal for a mesma da etapa anterior e todas as outras transcrições tiverem a mesma intenção, então:
  + Todas as transcrições contêm valores de slot inferidos.

     
+ Se a intenção inferida para a transcrição principal for diferente da etapa anterior e todas as outras transcrições tiverem a mesma intenção, então:
  + A transcrição principal contém os valores de slot inferidos para a nova intenção.
  + As outras transcrições contêm a intenção anterior e valores de slot inferidos para ela.

     
+ Se a intenção inferida para a transcrição principal for diferente da etapa anterior, uma transcrição for igual à intenção anterior e uma transcrição tiver uma intenção diferente, então
  + A transcrição principal contém a nova intenção inferida e quaisquer valores de slot inferidos no enunciado.
  + A transcrição que tem a intenção inferida anterior contém valores de slot inferidos para essa intenção.
  + A transcrição com a intenção diferente não possui um nome de intenção inferida nem valores de slot inferidos.

     
+ Se a intenção inferida para a transcrição principal for diferente da etapa anterior e todas as outras transcrições tiverem intenções diferentes, então:
  + A transcrição principal contém a nova intenção inferida e quaisquer valores de slot inferidos no enunciado.
  + Outras transcrições não contêm intenções inferidas nem valores de slots inferidos.

     
+ Se a intenção inferida para as duas transcrições principais for a mesma e diferente da etapa anterior, e a terceira transcrição tiver uma intenção diferente, então:
  + As duas transcrições principais contêm a nova intenção inferida e quaisquer valores de slot inferidos no enunciado.
  + A terceira transcrição não tem nome de intenção nem valores de slot resolvidos.

## Gerenciamento de sessões
<a name="transcription-confidence-session-management"></a>

Para alterar a intenção que o Amazon Lex V2 usa em uma conversa com o usuário, use a resposta da função do Lambda do hook de código de diálogo. Ou você pode usar o gerenciamento de sessões APIs em seu aplicativo personalizado.

### Uso de uma função do Lambda com seu bot do Lex V2
<a name="transcription-confidence-lambda"></a>

Quando você usa uma função do Lambda, o Amazon Lex V2 a chama com uma estrutura JSON que contém a entrada para a função. A estrutura JSON contém um campo chamado `transcriptions` que contém as possíveis transcrições que o Amazon Lex V2 determinou para o enunciado. O campo `transcriptions` contém de uma a três transcrições possíveis, cada uma com uma pontuação de confiança.

Para usar a intenção de uma transcrição alternativa, especifique-a na ação de diálogo `ConfirmIntent` ou `ElicitSlot` na função do Lambda. Para usar um valor de slot de uma transcrição alternativa, defina o valor no campo `intent` na resposta da função do Lambda. Para obter mais informações, consulte [Integrando uma AWS Lambda função ao seu bot Amazon Lex V2](lambda.md).

#### Exemplo de código usando Lambda com o Lex V2
<a name="asr-lambda-function"></a>

O exemplo de código a seguir é uma função do Lambda em Python que usa transcrições de áudio para melhorar a experiência de conversação do usuário. 

Para usar o código de exemplo, é necessário ter:
+ Um bot com um idioma, inglês (GB) (en\$1GB) ou inglês (EUA) (en\$1US).
+ Uma intenção, OrderBirthStone. Certifique-se de que a opção **Usar uma função do Lambda para inicialização e validação** esteja selecionada na seção **Hooks de código** da definição da intenção.
+ A intenção deve ter dois slots, "BirthMonth" e “Nome”, ambos do tipo`AMAZON.AlphaNumeric`.
+ Um alias com a função do Lambda definida. Para obter mais informações, consulte [Criação de uma AWS Lambda função para seu bot Amazon Lex V2](lambda-attach.md).

```
import time
import os
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)


# --- Helpers that build all of the responses ---

def elicit_slot(session_attributes, intent_request, slots, slot_to_elicit, message):
    return {
        'sessionState': {
            'dialogAction': {
                'type': 'ElicitSlot',
                'slotToElicit': slot_to_elicit
            },
            'intent': {
                'name': intent_request['sessionState']['intent']['name'],
                'slots': slots,
                'state': 'InProgress'
            },
            'sessionAttributes': session_attributes,
            'originatingRequestId': 'e3ab4d42-fb5f-4cc3-bb78-caaf6fc7cccd'
        },
        'sessionId': intent_request['sessionId'],
        'messages': [message],
        'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None
    }


def close(intent_request, session_attributes, fulfillment_state, message):
    intent_request['sessionState']['intent']['state'] = fulfillment_state
    return {
        'sessionState': {
            'sessionAttributes': session_attributes,
            'dialogAction': {
                'type': 'Close'
            },
            'intent': intent_request['sessionState']['intent'],
            'originatingRequestId': '3ab4d42-fb5f-4cc3-bb78-caaf6fc7cccd'
        },
        'messages': [message],
        'sessionId': intent_request['sessionId'],
        'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None
    }


def delegate(intent_request, session_attributes):
    return {
        'sessionState': {
            'dialogAction': {
                'type': 'Delegate'
            },
            'intent': intent_request['sessionState']['intent'],
            'sessionAttributes': session_attributes,
            'originatingRequestId': 'abc'
        },
        'sessionId': intent_request['sessionId'],
        'requestAttributes': intent_request['requestAttributes'] if 'requestAttributes' in intent_request else None
    }


def get_session_attributes(intent_request):
    sessionState = intent_request['sessionState']
    if 'sessionAttributes' in sessionState:
        return sessionState['sessionAttributes']

    return {}


def get_slots(intent_request):
    return intent_request['sessionState']['intent']['slots']


""" --- Functions that control the behavior of the bot --- """


def order_birth_stone(intent_request):
    """
    Performs dialog management and fulfillment for ordering a birth stone.
    Beyond fulfillment, the implementation for this intent demonstrates the following:
    1) Use of N best transcriptions to re prompt user when confidence for top transcript is below a threshold
    2) Overrides resolved slot for birth month from a known fixed list if the top transcript
    is not accurate.
    """

    transcriptions = intent_request['transcriptions']

    if intent_request['invocationSource'] == 'DialogCodeHook':
        # Disambiguate if there are multiple transcriptions and the top transcription
        # confidence is below a threshold (0.8 here)
        if len(transcriptions) > 1 and transcriptions[0]['transcriptionConfidence'] < 0.8:
            if transcriptions[0]['resolvedSlots'] is not {} and 'Name' in transcriptions[0]['resolvedSlots'] and \
                    transcriptions[0]['resolvedSlots']['Name'] is not None:
                return prompt_for_name(intent_request)
            elif transcriptions[0]['resolvedSlots'] is not {} and 'BirthMonth' in transcriptions[0]['resolvedSlots'] and \
                    transcriptions[0]['resolvedSlots']['BirthMonth'] is not None:
                return validate_month(intent_request)

    return continue_conversation(intent_request)


def prompt_for_name(intent_request):
    """
    If the confidence for the name is not high enough, re prompt the user with the recognized names
    so it can be confirmed.
    """
    resolved_names = []
    for transcription in intent_request['transcriptions']:
        if transcription['resolvedSlots'] is not {} and 'Name' in transcription['resolvedSlots'] and \
                transcription['resolvedSlots']['Name'] is not None:
            resolved_names.append(transcription['resolvedSlots']['Name']['value']['originalValue'])
    if len(resolved_names) > 1:
        session_attributes = get_session_attributes(intent_request)
        slots = get_slots(intent_request)
        return elicit_slot(session_attributes, intent_request, slots, 'Name',
                           {'contentType': 'PlainText',
                            'content': 'Sorry, did you say your name is {} ?'.format(" or ".join(resolved_names))})
    else:
        return continue_conversation(intent_request)


def validate_month(intent_request):
    """
    Validate month from an expected list, if not valid looks for other transcriptions and to see if the month
    recognized there has an expected value. If there is, replace with that and if not continue conversation.
    """

    expected_months = ['january', 'february', 'march']
    resolved_months = []
    for transcription in intent_request['transcriptions']:
        if transcription['resolvedSlots'] is not {} and 'BirthMonth' in transcription['resolvedSlots'] and \
                transcription['resolvedSlots']['BirthMonth'] is not None:
            resolved_months.append(transcription['resolvedSlots']['BirthMonth']['value']['originalValue'])

    for resolved_month in resolved_months:
        if resolved_month in expected_months:
            intent_request['sessionState']['intent']['slots']['BirthMonth']['resolvedValues'] = [resolved_month]
            break

    return continue_conversation(intent_request)


def continue_conversation(event):
    session_attributes = get_session_attributes(event)

    if event["invocationSource"] == "DialogCodeHook":
        return delegate(event, session_attributes)


# --- Intents ---


def dispatch(intent_request):
    """
    Called when the user specifies an intent for this bot.
    """

    logger.debug('dispatch sessionId={}, intentName={}'.format(intent_request['sessionId'],
                                                               intent_request['sessionState']['intent']['name']))

    intent_name = intent_request['sessionState']['intent']['name']

    # Dispatch to your bot's intent handlers
    if intent_name == 'OrderBirthStone':
        return order_birth_stone(intent_request)

    raise Exception('Intent with name ' + intent_name + ' not supported')


# --- Main handler ---


def lambda_handler(event, context):
    """
    Route the incoming request based on intent.
    The JSON body of the request is provided in the event slot.

    """
    # By default, treat the user request as coming from the America/New_York time zone.
    os.environ['TZ'] = 'America/New_York'
    time.tzset()
    logger.debug('event={}'.format(event))

    return dispatch(event)
```

### Uso da API de gerenciamento de sessões para escolher uma intenção ou um valor de slot diferente
<a name="transcription-confidence-session"></a>

Para usar uma intenção diferente da intenção atual, utilize a operação [PutSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_PutSession.html). Por exemplo, se você decidir que a primeira alternativa é preferível à intenção escolhida pelo Amazon Lex V2, use a operação `PutSession` para alterar as intenções. Dessa forma, a próxima intenção com a qual o usuário interagirá será aquela que você selecionou.

Você também pode usar a operação `PutSession` para alterar o valor do slot na estrutura `intent` para usar um valor de uma transcrição alternativa.

Para obter mais informações, consulte [Noções básicas sobre sessões de bots do Amazon Lex V2](managing-sessions.md).