Integrando Amazon Nova Lite en una Alexa Skill

Integrando Amazon Nova Lite en una Alexa Skill

Amazon Nova Lite es un modelo multimodal de muy bajo costo que es increíblemente rápido para procesar entradas de imágenes, video y texto para generar salidas de texto que esta disponible a través de Amazon Bedrock. En este tutorial aprenderemos a integrarlo en una Alexa Skill para poder generar respuestas más dinámicas, creativas y relevantes para tus usuarios.

Desarrollar una Alexa Skill que se conecte con un modelo de inteligencia artificial como AWS Nova Lite representa una excelente oportunidad —y también un reto— para crear asistentes conversacionales verdaderamente inteligentes. En este artículo, te guiaré paso a paso en el proceso de integración del Modelo Fundacional “Nova Lite” en una Alexa Skill, utilizando la Alexa Developer y la AWS Console.

Pero antes de comenzar, conozcamos un poco sobre Nova Lite:

¿Qué es Nova Lite?

Amazon Nova Lite es uno de los modelos de IA de la familia de Amazon Nova. Su principal caracteristica es que al ser un modelo mutimodal puede procesar y entender diferentes tipos de datos a la vez, como texto, imagenes y videos. Lo cual lo hace muy versatil para diferentes aplicaciones.

Prerrequisitos

Antes de comenzar, asegúrate de tener lo siguiente:

  • Cuenta en Alexa Developer Console
  • Cuenta en Amazon Management Console

Paso 1: Crear la Alexa Skill

Vayamos a la Alexa Developer Console, en donde procederemos a generar una nueva Skill donde clic en el boton “Crear skill”:

image

Ingresemos un nombre para nuestra Skill e indiquemos la ubicación primaria:

image

Posteriormente:

  • Escojamos el tipo de experiencia
  • Indiquemos el modelo
  • Seleccionemos el servicio de aprovisionamiento

image

image

Por último seleccionemos la plantilla a utilizar, en este caso usaremos la de Start from Scratch.

image

Revisemos que todo esté en orden con respecto a lo previamente indicado y demos click en el botón de Create Skill

image

Esperemos unos minutos en lo que se genera la Skill.

image

Paso 2: Construyendo la Skill

Una vez creada, demos click en el botón de Invocation Name, puesto que al generarse por primera vez, no cuenta con el nombre con el cual el usuario la podrá invocar.

image

Cambiemos el texto por el nombre con el cual queremos que se invoque nuestra Alexa Skill, en mi caso le puse: terra nova

image

Salvemos nuestro cambio haciendo click en el botón de Save

image

Paso 3: Crea un Intent personalizado

En la sección de Intents (que está dentro de Interaction Model), demos click en el botón de +Add Intent

image

Acto seguido configuremos un nuevo Intent llamado GenerarTextoNova

image

En los Sample Utterances añadamos algunas expresiones de ejemplo que los usuarios podrian decir para activar esta intención. Asegurate de crear un Slot, el cual pueden nombrarlo como gusten, en mi caso lo llamare consulta y por último hay que setearlo como de tipo AMAZON.SearchQuery

- Quisiera saber {consulta}
- Genera texto sobre {consulta}
- Cuéntame algo sobre {consulta}
- Dime {consulta}
- Explícame {consulta}
- Qué sabes de {consulta}
- Responde {consulta}
- Quiero saber {consulta}

image

Nuevamente guardemos nuestros cambios haciendo click en el botón de Save

Por último y como punto obligatorio debemos de construir la Skill (habilidad), para esto hagamos click en el botón Build skill que se encuentra en la parte superior derecha.

image

Paso 4: Hora del Código

Lo siguiente que debemos de realizar, es configurar una función de AWS Lambda, para ello deberemos de navegar a la consola de Amazon Management Console y seleccionar Lambda o buscarlo si es que no se tiene como visitado recientemente.

image

Una vez dentro, si no tenemos ninguna función creada previamente, se nos mostrará de la siguiente manera, en donde haremos clic en Crear una función:

image

En la siguiente vista, seleccionemos Crear desde cero e ingresemos los siguientes datos:

  • Nombre: alexaNovaBackend
  • Tiempo de ejecución: Python 3.13
  • Arquitectura: x86_64
  • Permisos: Creación de un nuevo rol con permisos básicos de Lambda

image

Hagamos clic en el botón de Crear una función.

image

Una vez creada, nos encontraremos en la vista de edición de la función Lambda.

image

- Integración con Boto3 en Lambda -

Posteriormente desplacémonos a la pestaña Código fuente que se encuentra en la parte inferior y reemplacemos el código existente con el siguiente:


import json
import boto3

bedrock = boto3.client('bedrock-runtime', region_name="us-east-1")

def lambda_handler(event, context):
    try:
        intent_name = event['request']['intent']['name']

        if intent_name == 'GenerarTextoNova':
            prompt = event['request']['intent']['slots']['consulta']['value']
            response = invoke_titan_text(prompt)
            speech_text = response
        else:
            speech_text = "Lo siento, no entiendo esa solicitud."

        return {
            'version': '1.0',
            'response': {
                'outputSpeech': {
                    'type': 'PlainText',
                    'text': speech_text
                },
                'shouldEndSession': True
            }
        }
    except Exception as e:
        print(f"Error: {e}")
        return {
            'version': '1.0',
            'response': {
                'outputSpeech': {
                    'type': 'PlainText',
                    'text': "Lo siento, hubo un problema al procesar tu solicitud."
                },
                'shouldEndSession': True
            }
        }

def invoke_titan_text(prompt):
    model_id = 'amazon.titan-text-lite-v1'
    accept = 'application/json'
    content_type = 'application/json'

    body = json.dumps({
        "inputText": prompt,
        "textGenerationConfig": {
            "maxTokenCount": 200,
            "temperature": 0.7,
            "topP": 0.9
        }
    })

    response = bedrock.invoke_model(
        body=body,
        modelId=model_id,
        accept=accept,
        contentType=content_type
    )

    response_body = json.loads(response['body'].read())
    generated_text = "Nova Lite responde: " + response_body['results'][0]['outputText']

    return generated_text

A grandes rasgos lo que hace este código de Python es que la función Lambda interactue con Amazon Bedrock.

Nota: el código de igual manera se encuentra en el siguiente Gist

image

Por último, hagamos clic en “Deploy (Desplegar)”

image

Paso 5: Conecta la Skill con la Lambda

Para que la función Lambda pueda comunicarse con la Alexa Skill, lo que debemos de hacer primero será copiar el ARN (Amazon Resource Name) de la función y pégarlo en el campo correspondiente en la Consola de Alexa.


arn:aws:lambda:us-east-1:842676015954:function:alexaNovaBackend

image

En la consola de Alexa, vayamos a la seccion de “Endpoint” en la Skill y borremos lo que se encuentra en Default Region

image

Para poder pegar el ARN del paso anterior:

image

Que no se nos olvide guardar los cambios haciendo click en el boton Save

Paso 6: Configurar el trigger de Alexa Skills Kit:

Nuevamente en la vista de nuestra función Lambda, hagamos clic en + Agregar desencadenador

image

En la nueva vista, del dropdown seleccionemos Alexa

image

Acto seguido, dejemos seleccionado el producto de Alexa que viene por default (Kit de habilidades de Alexa) y en la sección de Verificación del ID de la habilidad peguemos el ID de nuestra Alexa Skill (lo encuentras en la consola de desarrolladores de Alexa).

image

image

image

Finalmente, hagamos clic en Agregar.

Paso 7: Añadiendo Permisos

Nuevamente en nuestra función Lambda, ahora vayamos a la pestaña de Configuración y seleccionemos la opción de Permisos, puesto que aqui configuraremos los consentimientos necesarios:

image

Aqui, lo que haremos sera buscar el rol de IAM asociado a la función Lambda (generalmente tiene un nombre similar al de la función). Una vez localizado, hagamos clic en el nombre del rol.

image

Nos abrira una nueva ventana en nuestro navegador, ubiquemos Agregar permisos y del dropdown elijamos Crear política insertada

image

En el Editor de políticas seleccionamos JSON y peguemos la siguiente política:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "bedrock:InvokeModel"
            ],
            "Resource": "arn:aws:bedrock:<REGION>::foundation-model/amazon.titan-text-lite-v1"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:REGION:ACCOUNT_ID:log-group:/aws/lambda/YOUR_LAMBDA_FUNCTION_NAME:*"
        }
    ]
}

Importante: Asegúrate de reemplazar con la región de AWS donde estás trabajando.

La región trabajada en este ejemplo es: us-east-1

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "bedrock:InvokeModel",
			"Resource": "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-text-lite-v1"
		},
		{
			"Effect": "Allow",
			"Action": [
				"logs:CreateLogGroup",
				"logs:CreateLogStream",
				"logs:PutLogEvents"
			],
			"Resource": "arn:aws:logs:*:*:*"
		}
	]
}

Nota: En este ejemplo, estamos utilizando “amazon.titan-text-lite-v1”, que es parte de la familia de modelos Titan Text Lite ofrecidos a través de Bedrock. Si requieres hacer uso de otro FM como “Nova Micro” asegúrate de actualizar el “Resource” en la política de IAM. Para esto, consulta la documentación de Amazon Bedrock para obtener el ARN exacto del modelo Nova que necesites cuando esté disponible.

Hagamos clic en “Siguiente”.

image

Posteriormente en la nueva ventana denominada Revisar y Crear, tocara asignarle un nombre a la política (ej. BedrockAlexaNovaPolicy) y haz clic en “Crear política”.

image

Paso 7: Configurar el tiempo de espera

Ya por último, en la función Lambda, seleccionemos la pestaña de Configuración, y si hacemos clic en “Configuración general” podremos observar que el tiempo de espera es de 3 segundos:

image

Pasemos a modificar esto, por ende hagamos clic en Editar y cambiemos el tiempo de espera a 10 segundos, posteriormente hagamos clic en Guardar.

image

image

Paso 8: Probar la Skill en la Consola de Alexa

  • Hagamos clic en la pestaña Test

image

  • Activemos el entorno de pruebas seleccionando “Development”

image

  • Lanza la Skill escribiendo el nombre que le diste en el Invocation Name, en mi caso seria terra nova y súmale un ejemplo de frase que haga que ingrese a nuestro Intent, por ejemplo:

Abre terra nova y genera texto sobre los power rangers

  • Esperemos unos segundos y deberíamos de ver la respuesta generada por Nova Lite:

image

Y ¡listo!, hemos logrado integrar Amazon Nova Lite en una Alexa Skill.

Conclusión

Integrar Amazon Nova Lite en una Alexa Skill puede transformar la experiencia del usuario al proporcionar respuestas más inteligentes y contextuales. Con los pasos descritos en este tutorial, ahora tienes las herramientas necesarias para comenzar a experimentar con esta poderosa combinación de tecnologías.

¿Tienes dudas? ¡Déjalas en los comentarios! 🚀

¿Lo quieres ver en video?

Aquí les dejo la grabación de mi participación al lado de mi colega Uriel Arellano en el AWS Community Day de Bolivia:

Más información:

Recursos:

¡Happy Coding!


Made with ❤ by Vicente Guzmán © 2021. All rights reserved.