Blog de Amazon Web Services (AWS)
Chatbot con respuestas personalizadas en Español usando Amazon Lex y Amazon Personalize
Por Cristian Romero, Arquitecto Senior de Soluciones para Sector Público en AWS
Los bots de charla, bots conversacionales o en inglés, chatbots, simulan una conversación humana dando respuestas automáticas, generalmente estipuladas en una plataforma digital a través de texto o voz. Estas interacciones optimizan el tiempo de comunicación entre una institución pública y sus ciudadanos, o entre una compañía privada y sus clientes.
Con un diseño personalizado de estas conversaciones se puede aumentar el número de usuarios, recortar los tiempos de los flujos de conversación y al final, permitir una entrega efectiva de la misión de cada una de las organizaciones. Este tipo de diseños tiene múltiples vías para ser implementado y una opción es Amazon Personalize que permite a los desarrolladores integrar respuestas en los chatbots con la misma tecnología de aprendizaje automático (ML) utilizada por Amazon.com para obtener recomendaciones personalizadas en tiempo real, sin necesidad de experiencia en aprendizaje automático.
Para construir este tipo de herramientas y extendiendo sus funcionalidades, Amazon Web Services anunció Amazon Lex V2 con nuevas características, incluyendo la creación de interacciones en Español, la asociación de palabras comunes cuando se hace un intento de conversación, entendimiento del contexto, entre otros. Desde la consola de Amazon Lex V2 se puede consolidar todo el flujo de conversación, integrando en un mismo lugar distintos idiomas para interactuar con un mismo chatbot.
Construir soluciones con Amazon Lex V2 y Amazon Personalize permitirá el diseño de interacciones personalizadas a los usuarios finales. Algunos ejemplos incluyen: recomendación de nuevos ítems para compra basado en preguntas anteriores, personalizar servicios interesantes para un ciudadano, o ayudar a descubrir asignaturas interesantes de acuerdo al perfil de un estudiante.
El último de estos ejemplos (descubrimiento de asignaturas interesantes para un estudiante) será usado para mostrar el flujo de construcción de esta solución. En esta interacción, un estudiante que haya cursado una o más asignaturas con anterioridad en una institución académica podrá descubrir otras asignaturas acordes a sus gustos.
Definiciones relevantes
Dentro de esta publicación, se usarán los siguientes términos para algunas descripciones. Aparecen en esta sección como una referencia en caso de ser necesaria:
- Intent: (por definición de la documentación oficial)una intención representa una acción que el usuario desea realizar. Puede crear un bot que admita una o más intenciones relacionadas. Por ejemplo, puede crear un bot que pida pizza y bebidas. Para cada intención, debe proporcionar la siguiente información obligatoria:
- Nombre de la intención–: nombre descriptivo de la intención. Por ejemplo, OrderPizza. Los nombres de intención deben ser únicos dentro de su cuenta.
- Enunciados de muestra–: formas en que un usuario podría comunicar la intención. Por ejemplo, un usuario puede decir «¿Puedo pedir una pizza, por favor?» o «Deseo pedir una pizza».
- Cómo llevar a cabo la intención–: manera en que desea llevar a cabo la intención después de que el usuario proporcione la información necesaria (por ejemplo, realizar el pedido en una pizzería local). Es recomendable crear una función Lambda para el cumplimiento de la intención.
- De forma opcional, puede configurar la intención para que Amazon Lex simplemente devuelva la información a la aplicación cliente y que esta se ocupe del cumplimiento.
- Utterance: (por definición de la documentación oficial) formas en que un usuario podría comunicar la intención. Por ejemplo, un usuario puede decir «¿Puedo pedir una pizza, por favor?» o «Deseo pedir una pizza».
Creación del Bot usando Amazon Lex V2
En la consola de Amazon Web Services se debe seleccionar el servicio de Lex, y si no se ha hecho previamente, dar click en el link: Start building! para probar la nueva consola de Lex V2 como se muestra en la siguiente imagen.
Imagen 100. Consola de Amazon Lex
Luego, se deberá seleccionar la opción de crear un bot. Si se ha hecho uso previo de esta consola, los bots anteriores estarán en dicha lista.
Imagen 200. Consola de creación del bot
Al seleccionar la opción de creación, el formato estándar será desplegado. Dentro de las opciones solicitadas se pueden seleccionar valores a discreción. En el ejemplo provisto, se usarán:
- Bot name:
chatbotUniversidad
- Description:
chatbot de prueba para universidades
- IAM Permissions:
Create a role with basic Amazon Lex permissions
- COPPA:
No
- Session Timeout:
5 minutes
Imagen 300. Configuración del bot
Finalmente, se agrega el (o los) lenguaje(s) asociados con el chatbot creado. En esta publicación se usará la opción de Español. Esto quiere decir que la interpretación de la conversación y los diccionarios relacionados tendrán este lenguaje incluido, así:
- Dado un único intentcon esta entrada: ¿Cuál es el horario de la biblioteca?
- … y ante un usuario preguntando por: ¿A qué hora puedo ir a la biblioteca?
- Amazon Lex será capaz de asociar estos dos intentos y dar la respuesta configurada para la primera de ellas. Esto aplicará según sean las palabras usadas y el porcentaje de confianza asignado para escoger la exactitud con la que el usuario final debe realizar las interacciones.
Imagen 400. Configuración del lenguaje del bot
Configurando una conversación en Amazon Lex V2
En esta guía se puede encontrar la documentación asociada para la creación de interacciones dentro de un bot en Amazon Lex V2, además de la definición de los componentes más importantes. Esta publicación se enfocará en la integración de elementos para personalizar resultados e interacciones con Amazon Personalize.
Dentro de la consola de Amazon Lex V2, en el menú desplegable ubicado a la izquierda se encuentra la opción de visualización de intents. Dentro de esta pantalla, aparece la opción de creación de un nuevo intent: Add intent. En este ejemplo se ha elegido ClasesRecomendadas como el nombre para esta interacción. Una vez creado, será listado junto a otros intents creados dentro del bot. Si se esta siguiendo esta guía de partida, dicha lista sólo tendrá ClasesRecomendadas.
Imagen 500. Configuración de los intents
Dentro del formato de creación se establecen los utterances que correspondan a las posibles interacciones con los usuarios finales. En este ejemplo se busca que un estudiante pueda solicitar recomendaciones personalizadas al chatbot de acuerdo a otras asignaturas que haya cursado anteriormente. Por ello, se esperan interacciones como:
- “¿Qué clase me recomiendas?”
- “¿Qué clases me recomiendas?”
- “¿Cuáles clases puedo tomar?”
- “¿Cuáles clases podría tomar?”
Importante incluir aquellas opciones de lenguaje local que puedan ser usadas por estudiantes para hacer la misma pregunta.
Imagen 600. Configuración de los Utterances
Luego, se deberá obtener el ID de dicho estudiante. En este ejemplo, se integra como una variable capturada por medio del chatbot. Si se cuenta con manejo de sesiones integrado a un portal estudiantil, dicho valor podría ser usado como variables de inicialización del bot y enviarlo como parámetro en posteriores interacciones.
Imagen 700. Configuración de un slot
El intent creado deberá integrarse a AWS Lambda para invocar Amazon Personalize. Para invocar una función lambda cada vez que esta interacción sea invocada basta con activar esta opción en la parte inferior: Use a Lambda Function for fullfilment. Una vez se complete la interacción con las opciones buscadas, se debe guardar mediante el botón: Save the intent.
Imagen 800. Adición de AWS Lambda al bot de Amazon Lex
Integración con Amazon Personalize
Se pueden crear interacciones y slots que contribuyan a crear una lógica robusta de un chatbot. En este ejemplo, se escogió una interacción simple diseñada en Amazon Lex V2 integrada con Amazon Personalize. El objetivo final será recomendar las asignaturas que mayor similaridad puedan tener con un perfil histórico de un estudiante y sus cursos anteriores.
De Amazon Personalize: “Amazon Personalize utiliza un modelo de aprendizaje automático que está entrenado con sus datos. Los datos utilizados para entrenar el modelo se almacenan en conjuntos de datos relacionados en un grupo de conjuntos de datos. Cada modelo se entrena mediante una receta que contiene un algoritmo para un caso de uso específico. En Amazon Personalize, un modelo entrenado se denomina versión de solución. Una versión de solución se implementa para su uso en una campaña. Los usuarios de sus aplicaciones pueden recibir recomendaciones a través de la campaña. Por ejemplo, una campaña puede mostrar recomendaciones de películas en un sitio web o aplicación donde el título que se muestra se basa en los hábitos de visualización que forman parte del conjunto de datos.”
Siguiendo estas capas, usaremos para este ejemplo el archivo ratings.csv
disponible en este link. La estructura de este archivo contiene: USER_ID, ITEM_ID, TIMESTAMP
. Se asumirá que los estudiantes tiene una identificación y esta corresponde al USER_ID
, los códigos de las asignaturas corresponden al ITEM_ID
y cuándo fue cursada a TIMESTAMP. El detalle de cada paso para configurar Amazon Personalize esta disponible en este link. Para realizar esta integración, es importante seguir estos pasos previamente.
El tipo de receta que se requiere para este ejemplo es de tipo USER_PERSONALIZATION, dado que se esta creando un sistema de recomendaciones que las proporcione de forma personalizada para cada estudiante. Si no se contara con la suficiente información o datos de los estudiantes, la recomendación del tipo de receta sería RELATED_ITEMS.
Con la ejecución previa de la guía de inicio de Amazon Personalize, se tiene:
- Un Modelo de datos, para este ejemplo denominado:
unibot-dataset
- Una solución, para este ejemplo llamada:
unibot-solution
- Una campaña, denominada:
unibot-campaign
cuyo ARN será útil para invocar la solicitud de recomendaciones desde AWS Lambda e integrarlo con el chatbot de Amazon Lex.
Luego, desde la Consola de AWS, en el servicio de AWS Lambda se crea una función llamada para este ejemplo UniBotSpanish
, escogiendo Python 3.8 y especificando el handler:
def lambda_handler(event, context):
response = dispatch(event)
return response
Los permisos definidos de IAM que debe tener dicha función de AWS Lambda varian de acuerdo al caso de uso. En este caso se aplican permisos de lectura a Amazon DynamoDB, permisos de consulta a Amazon Personalize y permisos de publicación de logs a AWS Cloudwatch.
Siguiendo las mejores prácticas, se tiene una función dispatch que refiere la lógica respectiva según sea el intent invocado desde el chatbot. El intent_name debe ser equivalente al nombre que se asignó al mismo en la Consola de AWS dentro de la segunda sección de esta publicación.
def dispatch(intent_request):
intent_name = intent_request['sessionState']['intent']['name']
response = None
session_attributes = get_session_attributes(intent_request) print(intent_request['sessionState'])
# Distribuir según sea el intent requerido
if intent_name == 'ClasesRecomendadas':
return ClasesRecomendadas(intent_request)
raise Exception('Intent with name ' + intent_name + ' not supported')
Luego, en este ejemplo, se hará uso de una Tabla en Amazon DynamoDB que contiene el equivalente en nombre a los códigos de las asignaturas que serán recomendadas. Para una demostración, estos valores podrían ser simulados dentro del código pero en escenarios de producción esta equivalencia estará en un repositorio de información externo como buena práctica. Es importante resaltar que el esquema de datos de Personalize no incluye en su preparación del modelo de Aprendizaje de Máquina el nombre de la asignatura y estas equivalencias deben ser hechas externamente.
En la lógica descrita a continuación:
- Se busca la tabla de equivalencias entre códigos y asignaturas en Amazon DynamoDB.
- Desde el intent_request se extrae la identificación del estudiante provista en la interacción con el usuario final.
- Este valor es usado para obtener las recomendaciones de Amazon Personalize a través de un comando simple. En este ejemplo se limita a tres el número de resultados para visualizarlo apropiadamente, pero esto puede variar según el caso de uso.
- Finalmente, se extraen las equivalencias y a lo largo del código se arma el mensaje de vuelta para el estudiante.
def ClasesRecomendadas(intent_request):
session_attributes = get_session_attributes(intent_request)
slots = get_slots(intent_request)
personalizeRt = boto3.client('personalize-runtime')
#Reemplazar el valor de la región por la usada
dynamodb = boto3.resource('dynamodb', endpoint_url="http://dynamodb.REGION.amazonaws.com")
#Busqueda de la tabla de equivalencias
table = dynamodb.Table('Asignaturas')
#Extracción de identificación del estudiante
idestudiante = get_slot(intent_request, 'IDEstudiante')
#Invocación de la campaña creada en Personalize para obtener recomendaciones personalizadas
response = personalizeRt.get_recommendations(
#Reemplazar el los valores del ARN según corresponda
campaignArn = 'arn:aws:personalize:REGION:ACCOUNT_ID:campaign/CAMPAIGN-NAME',
userId = idestudiante,
numResults = 3
)
#Composición del mensaje para el usuario final
text = "Te podrían interesar estas asignaturas: "
for item in response['itemList']:
response = table.query(
KeyConditionExpression=Key('IDAsignatura').eq(item['itemId'])
)
text += ""+response['Items'][0]['NombreAsignatura']+" con ID "+item['itemId']+" | "
message = {
'contentType': 'PlainText',
'content': text
}
fulfillment_state = "Fulfilled"
return close(intent_request, session_attributes, fulfillment_state, message)
Llamado de la función de AWS Lambda desde Amazon Lex V2
En este punto, se tiene una función de AWS Lambda preparada para invocar a Amazon Personalize según sean los códigos de estudiantes provistos desde el chatbot. También, el bot configurado desde Amazon Lex V2 tiene activa la función de invocar a AWS Lambda para esa interacción puntual.
Ahora, en el menú lateral de Amazon Lex V2 en la sección de Deployment se deberá crear un Alias.
Imagen 900. Creación de un Alias en la consola de Amazon Lex
Los valores escogidos para esta publicación son:
- Alias name:
unibot-alias
- Description:
Alias para invocación de función Lambda en chat de Universidades
Dentro de la sección de Languages del Alias creado se deberá incluir la función AWS Lambda que hará el dispatch de los diferentes intents contenidos en dicho lenguaje del bot. Haciendo click sobre Spanish (US) aparecerá en la consola la configuración de la función, que en el presente ejemplo se ha denominado: UniBotSpanish. También se podrá escoger la versión de dicha función, en caso de que tengamos un sistema de versionamiento y se quiera usar una específica. Para este ejemplo, la versión es $LATEST.
Imagen 1000. Ingreso a la integración con AWS Lambda.
Posteriormente, y regresando en la consola de Amazon Lex V2 a Bot versions > VERSION_DEL_BOT > Spanish(US) > Intents > ClasesRecomendadas
están todos los elementos listos para realizar la integración. Para probar que funciona, se debe hacer Build y Test. Se puede ver el resultado del ejercicio en la siguiente pantalla.
Imagen 1100. Consola de pruebas del chatbot
Conclusiones y Limpieza de recursos de la Consola
En esta publicación se creo un bot con características de personalización en español usando Amazon Lex V2, Amazon Personalize, AWS Lambda y Amazon DynamoDB. Posibles nuevas integraciones usando estos servicios pasan por tener un sitio web con identidades que automatice la captura de la identificación de estudiante u otras características que de forma transparente presenten opciones personalizadas según sea el caso de uso. Si se quieren usar modelos propios de Aprendizaje de Máquina, AWS Lambda podrá invocar endpoints de Amazon Sagemaker o servicios web disponibles para tal fin.
Para evitar consumos innecesarios asociados al despliegue de recursos de demostración, se sugiere eliminar los recursos creados en la consola de AWS enunciados anteriormente:
- Elimine el chatbot creado totalmente en Amazon Lex V2. Esto se puede hacer directamente en la consola de AWS.
- Elimine la función lambda creada desde la consola de AWS en la sección del servicio AWS Lambda.
- Elimine cualquier fuente de información creada para ser consultada por la función lambda. En este ejemplo se uso una tabla de DynamoDB pero puede variar dependiendo de cada caso.
- Elimine el bucketen el servicio de S3 que contiene la información de Personalize.
- Elimine el conjunto de datos, el modelo de solución y la campaña del servicio de Amazon Personalize.
Sobre el Autor
Cristian David Romero es Arquitecto de Soluciones en Amazon Web Services para Sector Público. Cristian ha ayudado múltiples instituciones de Sector Público y Privado en la adopción tecnológica de nube en los últimos 9 años y ha llevado acabo de manera satisfactoria proyectos que marcan impacto social a nivel de ciudadanos y estudiantes alrededor de América Latina.
Revisores técnicos
Mauricio Romero es Arquitecto de Soluciones Sr. en Amazon Web Services para el Sector Público. Mauricio ha trabajado en diferentes proyectos de gobierno electrónico y transformación digital. Le apasionan los temas de transformación digital, adopción de nube y seguridad de la información.
Manuel Cuellar es Arquitecto de Soluciones para Amazon Web Services en Sector Público. Manuel colabora con Dependencias de Gobierno, Instituciones Educativas y Organizaciones sin fines de lucro en el territorio de Centro América y Caribe, apoyándolos en su camino a la innovación y adopción tecnológica