

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Uso de puntuaciones de confianza para mejorar la precisión de la conversación
<a name="confidence-scores"></a>

Amazon Lex V2 utiliza dos pasos para determinar lo que dice un usuario. El primero, el reconocimiento automático de voz (ASR), crea una transcripción del enunciado de audio del usuario. El segundo, la comprensión del lenguaje natural (NLU), determina el significado del enunciado del usuario para reconocer su intención o el valor de los slots.

De forma predeterminada, Amazon Lex V2 devuelve el resultado más probable de ASR y NLU. En algunos casos, puede resultar difícil para Amazon Lex V2 determinar el resultado más probable. En ese caso, devuelve varios resultados posibles junto con una *puntuación de confianza* que indica la probabilidad de que el resultado sea correcto. Una puntuación de confianza es una calificación que proporciona Amazon Lex V2 y que muestra la confianza relativa que tiene en un resultado. Las puntuaciones de confianza están comprendidas entre 0,0 y 1,0.

Puede utilizar sus conocimientos del dominio con la puntuación de confianza para ayudar a determinar la interpretación correcta del resultado de la ASR o la NLU.

La puntuación de confianza, ASR, o transcripción, es una valoración sobre el grado de confianza de Amazon Lex V2 en que una transcripción concreta es correcta La puntuación de confianza en la NLU, o intención, es una valoración de la confianza que tiene Amazon Lex V2 en cuanto a que la intención especificada en la transcripción superior es correcta. Utilice la puntuación de confianza que mejor se adapte a su aplicación.

**Topics**
+ [Uso de puntuaciones de confianza en la intención para mejorar la selección de intenciones con Lex V2](using-intent-confidence-scores.md)
+ [Uso de las puntuaciones de confianza en la transcripción de voz para mejorar las conversaciones con su bot Lex V2](using-transcript-confidence-scores.md)

# Uso de puntuaciones de confianza en la intención para mejorar la selección de intenciones con Lex V2
<a name="using-intent-confidence-scores"></a>

Cuando un usuario hace un enunciado, Amazon Lex V2 utiliza la comprensión del lenguaje natural (NLU) para entender la solicitud del usuario y devolverle la intención correcta. De forma predeterminada, Amazon Lex V2 devuelve la intención más probable definida por su bot.

En algunos casos, puede resultar difícil para Amazon Lex V2 determinar la intención más probable. Por ejemplo, el usuario puede hacer un enunciado ambiguo o puede haber dos intenciones similares. Para ayudar a determinar la intención correcta, puede combinar sus conocimientos del dominio con las *puntuaciones de confianza de la NLU* en una lista de interpretaciones. Una puntuación de confianza es una calificación que proporciona Amazon Lex V2 y que muestra el grado de confianza en que una intención es la correcta.

Para determinar la diferencia entre dos intenciones en una interpretación, puede comparar sus puntuaciones de confianza. Por ejemplo, si una intención tiene una puntuación de confianza de 0,95 y otra tiene una puntuación de 0,65, la primera intención probablemente sea correcta. Sin embargo, si una intención tiene una puntuación de 0,75 y otra tiene una puntuación de 0,72, existe una ambigüedad entre las dos intenciones y es posible que pueda discriminar utilizando el conocimiento del dominio en su aplicación.

También puede utilizar las puntuaciones de confianza para crear aplicaciones de prueba que determinen si los cambios en los enunciados de una intención marcan una diferencia en el comportamiento del bot. Por ejemplo, puede obtener las puntuaciones de confianza de las intenciones de un bot utilizando un conjunto de enunciados y, a continuación, actualizar las intenciones con nuevos enunciados. A continuación, puede comprobar las puntuaciones de confianza para ver si se ha producido una mejora.

Las puntuaciones de confianza que devuelve Amazon Lex V2 son valores comparativos. No debe confiar en ellos como puntuación absoluta. Los valores pueden cambiar en función de las mejoras de Amazon Lex V2.

Amazon Lex V2 devuelve la intención más probable y hasta 4 intenciones alternativas con sus puntuaciones asociadas en la estructura de `interpretations` de cada respuesta. El siguiente código JSON muestra la `interpretations` estructura de la respuesta de la [RecognizeText](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_RecognizeText.html)operación:

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

## AMAZON. FallbackIntent
<a name="nluconfidence-fallbackintent"></a>

Amazon Lex V2 devuelve `AMAZON.FallbackIntent` al ser la intención principal en dos situaciones:

1.  Si las puntuaciones de confianza de todas las intenciones posibles son inferiores al umbral de confianza. Puede utilizar el umbral predeterminado o puede definir el suyo propio. Si tiene `AMAZON.KendraSearchIntent` configurado, Amazon Lex V2 también lo devuelve en esta situación. 

1.  Si la confianza en la interpretación `AMAZON.FallbackIntent` es superior a la confianza en la interpretación de todos los demás intentos. 

 Tenga en cuenta que Amazon Lex V2 no muestra una puntuación de confianza para `AMAZON.FallbackIntent`. 

## Establecer y cambiar el umbral de confianza
<a name="nluconfidence-threshold"></a>

El umbral de confianza debe ser un número entre 0,00 y 1,00. Puede definir el umbral para cada idioma de su bot de las siguientes maneras:

**Usar la consola de Amazon Lex V2**
+  Para establecer el umbral al añadir un idioma a su bot con **Añadir idioma**, puede insertar el valor que desee en el panel del **Umbral de puntuación de confianza**. 
+  Para actualizar el umbral, puede seleccionar **Editar** en el panel de **Detalles del idioma** en el idioma de su bot. A continuación, introduzca el valor que desee en el panel del **Umbral de puntuación de confianza**. 

**Usar operaciones de API**
+  Para establecer el umbral, defina el `nluIntentConfidenceThreshold` parámetro de la [CreateBotLocale](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_CreateBotLocale.html)operación.
+  Para actualizar el umbral de confianza, defina el `nluIntentConfidenceThreshold` parámetro de la [UpdateBotLocale](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_UpdateBotLocale.html)operación. 

## Administración de sesiones
<a name="confidence-scores-session-management"></a>

Para cambiar la intención que Amazon Lex V2 utiliza en una conversación con el usuario, puede utilizar la respuesta de la función Lambda del enlace de código del cuadro de diálogo o puede utilizar la administración de sesiones APIs en su aplicación personalizada. 

### Uso de una función de Lambda con su bot Lex V2
<a name="session-management-lambda"></a>

Cuando utiliza una función de Lambda, Amazon Lex V2 la llama con una estructura JSON que contiene la entrada a la función. La estructura JSON contiene un campo denominado `currentIntent` que incluye la intención que Amazon Lex V2 ha identificado como la intención más probable del enunciado del usuario. La estructura JSON también incluye un campo `alternativeIntents` que contiene hasta cuatro intenciones adicionales que pueden satisfacer la intención del usuario. Cada intención incluye un campo denominado `nluIntentConfidenceScore` que contiene la puntuación de confianza que Amazon Lex V2 asignó a la intención.

Para utilizar la intención alternativa, debe especificarla en la `ConfirmIntent` o la acción de diálogo `ElicitSlot` de la función de Lambda.

Para obtener más información, consulte [Integración de una AWS Lambda función en su bot Amazon Lex V2](lambda.md).

### Uso de la API de administración de sesiones con su bot Lex V2
<a name="session-management-API"></a>

Para utilizar una intención diferente de la intención actual, utilice la operación [PutSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_PutSession.html). Por ejemplo, si decide que la primera alternativa es preferible a la intención que eligió Amazon Lex V2, puede utilizar la operación `PutSession` para cambiar las intenciones para que la siguiente intención con la que interactúe el usuario sea la que usted seleccionó.

Para obtener más información, consulte [Introducción a las sesiones de bots Amazon Lex V2](managing-sessions.md).

# Uso de las puntuaciones de confianza en la transcripción de voz para mejorar las conversaciones con su bot Lex V2
<a name="using-transcript-confidence-scores"></a>

 Cuando un usuario hace un enunciado de voz, Amazon Lex V2 utiliza el reconocimiento de voz automático (ASR) para transcribir la solicitud del usuario antes de interpretarla. De forma predeterminada, Amazon Lex V2 utiliza la transcripción más probable del audio para la interpretación. 

En algunos casos, es posible que haya más de una transcripción del audio. Por ejemplo, un usuario puede hacer un enunciado con un sonido ambiguo, como «Me llamo John», que podría entenderse como «Me llamo Juan». En este caso, puede utilizar técnicas de desambiguación o combinar sus conocimientos del dominio con la *puntuación de confianza de la transcripción* para determinar qué transcripción de una lista de transcripciones es la correcta. 

Amazon Lex V2 incluye la transcripción superior y hasta dos transcripciones alternativas para que el usuario las introduzca en la solicitud a la función de enlace de códigos de Lambda. Cada transcripción contiene una puntuación de confianza que indica que es la transcripción correcta. Cada transcripción también incluye cualquier valor de slot inferido de la entrada del usuario.

Puede comparar las puntuaciones de confianza de dos transcripciones para determinar si hay ambigüedad entre ellas. Por ejemplo, si una transcripción tiene una puntuación de confianza de 0,95 y la otra tiene una puntuación de confianza de 0,65, es probable que la primera transcripción sea correcta y que la ambigüedad entre ambas sea baja. Si las dos transcripciones tienen puntuaciones de confianza de 0,75 y 0,72, la ambigüedad entre ellas es alta. Es posible que pueda discriminar entre ellas utilizando sus conocimientos de dominio.

Por ejemplo, si los valores de slot inferidos en dos transcripciones con una puntuación de confianza de 0,75 y 0,72 son «John» y «Juan», puede consultar a los usuarios de su base de datos para comprobar la existencia de estos nombres y eliminar una de las transcripciones. Si «John» no es un usuario de la base de datos y «Juan» sí lo es, puede usar el enlace de códigos del diálogo para cambiar el valor de slot inferido para el nombre a «Juan».

Las puntuaciones de confianza que devuelve Amazon Lex V2 son valores comparativos. No confíe en ellas como puntuación absoluta. Los valores pueden cambiar en función de las mejoras de Amazon Lex V2.

Las puntuaciones de confianza en la transcripción de audio solo están disponibles en los idiomas inglés (GB) (en\$1GB) e inglés (US) (en\$1US). Las puntuaciones de confianza solo se admiten para entradas de audio de 8 kHz. Las puntuaciones de confianza de la transcripción no se proporcionan para la entrada de audio desde la [ventana de prueba](https://docs.aws.amazon.com/lexv2/latest/dg/test-bot.html) de la consola de Amazon Lex V2 porque utiliza una entrada de audio de 16 kHz.

**nota**  
Para poder utilizar las puntuaciones de confianza en la transcripción de audio con un bot existente, primero debe volver a compilar el bot. Las versiones existentes de un bot no admiten las puntuaciones de confianza en la transcripción. Debe crear una nueva versión del bot para usarlas.

Puede usar las puntuaciones de confianza para varios patrones de diseño de conversación:
+ Si la puntuación de confianza más alta cae por debajo de un umbral debido a un entorno ruidoso o a una mala calidad de la señal, puede preguntar al usuario con la misma pregunta para capturar un audio de mejor calidad.
+ Si varias transcripciones tienen puntuaciones de confianza similares para los valores de los slots, como «John» y «Juan», puede comparar los valores con una base de datos preexistente para eliminar las entradas, o puede pedirle al usuario que seleccione uno de los dos valores. Por ejemplo, «di 1 para John o di 2 para Juan».
+ Si su lógica empresarial requiere un cambio de intención en función de palabras clave específicas en una transcripción alternativa con una puntuación de confianza cercana a la transcripción superior, puede cambiar la intención mediante el enlace de código de diálogo, la función de Lambda o mediante las operaciones de administración de sesiones. Para obtener más información, consulte [Gestión de sesiones](#transcription-confidence-session-management).

Amazon Lex V2 envía la siguiente estructura JSON con hasta tres transcripciones para que el usuario introduzca en la función de enlace de código de 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"
                                ]
                            }
                        }
                    ]
                }
            }
        }
    ]
```

La estructura JSON contiene el texto de la transcripción, la intención que se resolvió para el enunciado y los valores de los slots detectados en el enunciado. En cuanto al texto introducido por el usuario, las transcripciones contienen una sola transcripción con una puntuación de confianza de 1.0.

El contenido de las transcripciones depende del giro de la conversación y de la intención reconocida. 

Para el primer turno, la obtención de intenciones, Amazon Lex V2 determina las tres transcripciones principales. En el caso de la transcripción superior, devuelve la intención y cualquier valor de slot inferido en la transcripción.

En los turnos subsiguientes, es decir, los resultados dependen de la intención inferida para cada una de las transcripciones, tal y como se indica a continuación.
+ Si la intención inferida de la transcripción superior es la misma que en el turno anterior y todas las demás transcripciones tienen la misma intención, entonces
  + Todas las transcripciones contienen valores de slot inferidos.

     
+ Si la intención inferida de la transcripción superior es diferente a la del turno anterior y todas las demás transcripciones tienen la intención anterior, entonces
  + La transcripción superior contiene los valores de slot inferidos para la nueva intención.
  + Otras transcripciones tienen la intención anterior y los valores de slot inferidos para la intención anterior.

     
+ Si la intención inferida de la transcripción superior es diferente a la del turno anterior, una transcripción es la misma que la de la intención anterior y una transcripción es una intención diferente, entonces
  + La transcripción superior la nueva intención inferida y cualquier valor de slot inferido en el enunciado.
  + La transcripción que tiene la intención inferida anterior contiene los valores de slot inferidos para esa intención.
  + La transcripción con la intención diferente no tiene un nombre de intención inferido ni valores de slot inferidos.

     
+ Si la intención inferida de la transcripción superior es diferente a la del turno anterior y todas las demás transcripciones tienen intenciones diferentes, entonces
  + La transcripción superior la nueva intención inferida y cualquier valor de slot inferido en el enunciado.
  + Otras transcripciones no contienen intenciones inferidas ni valores de slot inferidos.

     
+ Si la intención inferida de las dos transcripciones superiores es la misma y diferente a la del turno anterior, y la tercera transcripción es una intención diferente, entonces
  + Las dos transcripciones superiores contienen la nueva intención inferida y cualquier valor de slot inferido en el enunciado.
  + La tercera transcripción no tiene ningún nombre de intención ni valores de slot resueltos.

## Gestión de sesiones
<a name="transcription-confidence-session-management"></a>

Para cambiar la intención que Amazon Lex V2 utiliza en una conversación con el usuario, utilice la respuesta del enlace de código del cuadro de diálogo (función de Lambda). O bien, puede usar la administración de sesiones APIs en su aplicación personalizada.

### Uso de una función de Lambda con su bot Lex V2
<a name="transcription-confidence-lambda"></a>

Cuando utiliza una función de Lambda, Amazon Lex V2 la llama con una estructura JSON que contiene la entrada a la función. La estructura JSON contiene un campo denominado `transcriptions` que contiene las posibles transcripciones que Amazon Lex V2 ha determinado para el enunciado. El campo `transcriptions` contiene de una a tres posibles transcripciones, cada una con una puntuación de confianza.

Para utilizar la intención de una transcripción alternativa, debe especificarla en la `ConfirmIntent` o la acción de diálogo `ElicitSlot` de la función de Lambda. Para utilizar un valor de slot de una transcripción alternativa, defina el valor en el campo `intent` de la respuesta de la función de Lambda. Para obtener más información, consulte [Integración de una AWS Lambda función en su bot Amazon Lex V2](lambda.md).

#### Ejemplo de código con Lambda con Lex V2
<a name="asr-lambda-function"></a>

El siguiente ejemplo de código es una función de Lambda de Python que utiliza transcripciones de audio para mejorar la experiencia de conversación del usuario. 

Para utilizar el código de ejemplo, debe disponer de lo siguiente:
+ Un bot con un idioma, inglés (GB) (en\$1GB) o inglés (US) (en\$1US).
+ Una intención, OrderBirthStone. Asegúrese de que la opción **Utilizar una función de Lambda para la inicialización y la validación** esté seleccionada en la sección **Enlaces de códigos** de la definición de intención.
+ La intención debe tener dos espacios, «BirthMonth» y «Nombre», ambos de tipo`AMAZON.AlphaNumeric`.
+ Un alias con la función de Lambda definida. Para obtener más información, consulte [Creación de una AWS Lambda función para su 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 de la API de administración de sesiones para elegir un valor de ranura o intención diferente
<a name="transcription-confidence-session"></a>

Para utilizar una intención diferente de la intención actual, utilice la operación [PutSession](https://docs.aws.amazon.com/lexv2/latest/APIReference/API_runtime_PutSession.html). Por ejemplo, si decide que la primera alternativa es preferible a la intención que eligió Amazon Lex V2, puede utilizar la operación `PutSession` para cambiar las intenciones. De esta forma, la siguiente intención con la que interactúe el usuario será la que usted haya seleccionado.

También puede usar la operación `PutSession` para cambiar el valor del slot en la estructura `intent` y usar un valor de una transcripción alternativa.

Para obtener más información, consulte [Introducción a las sesiones de bots Amazon Lex V2](managing-sessions.md).