Crear Chat Bots
Crear Chat Bots
Crear Chat Bots
Bueno Jiménez, Adrián
Septiembre 2019
2
3
Resumen
Un chatbot es un programa informático capaz de comunicarse con una persona
a través de un chat mediante el uso de lenguaje natural. Aunque los chatbots
llevan existiendo casi desde los inicios de la computación, actualmente están
generando mucho interés. Esto se debe a que la potencia de cómputo actual
nos ha permitido aplicar algoritmos de aprendizaje automático y
procesamiento de lenguaje natural más complejos y utilizar cantidades
mayores de datos para generar mejores modelos. De esta forma obtenemos
cada vez resultados más precisos en el entendimiento del lenguaje humano por
parte de las máquinas. Estos avances tecnológicos han provocado que más
empresas u organizaciones se interesen y entren en el mercado de los chatbots,
y ofrezcan servicios o aplicaciones para crearte el tuyo propio. En este trabajo
se desarrolla una aplicación que también permite crear chatbots usando NLU
(entendimiento del lenguaje natural) y un gestor de diálogo de estados finito
que funciona con reglas. Una de las ventajas que ofrece esta aplicación es la
posibilidad de crear chatbots multi-idioma.
Abstract
A chatbot is a computer program capable of communicating with a person
through a chat using natural language. Although chatbots have existed almost
since the beginning of computing, they are currently generating a lot of
interest. The current computing power has allowed us to apply more complex
machine learning and natural language processing algorithms and to use larger
amounts of data to generate better models. Now machines obtain better and
more precise results in human language understanding. These technological
advances have increase the interest of more companies and organizations in
chatbots. This companies now offer services or applications to create your own
chatbot. In this work we develop an application that also allows us to create
chatbots using NLU (Natural Language Understanding) and a finite state
dialogue manager that works with rules. One of the advantages of this
application is the possibility to create multi-language chatbots.
4
Palabras clave
Chatbot, asistente, virtual, aplicación, construir, generar, crear, NLU, NLP,
procesamiento, lenguaje, natural, entendimiento, gestor, diálogo, chat, web
Keywords
Chatbot, assistant, virtual, application, build, generate, NLU, NLP, natural,
language, processing, understanding, dialog, manager, chat, web
5
6
Índice
1. INTRODUCCIÓN 8
1.1 Motivación 8
1.2 Objetivos 11
1.3 Organización del documento 11
7
4. RESULTADOS 64
6. REFERENCIAS 78
8
1. INTRODUCCIÓN
1.1 Motivación
Un chatbot, o bot conversacional, es un programa informático que interactúa
con personas a través de un chat textual o mediante voz y que ofrece
respuestas y soluciones rápidas a tareas repetitivas y preguntas comunes
susceptibles de ser automatizadas [15, 16].
Aunque los chatbots llevan existiendo casi desde los inicios de la computación
[10], los grandes avances en inteligencia artificial de estos últimos años, han
hecho resurgir el interés en estos; entre otras cosas gracias a las nuevas
técnicas de reconocimiento y análisis del lenguaje natural [1, 14].
9
Algunas de las razones por las que los chatbots están ganando alta popularidad
se debe a que no es necesario descargarse ninguna aplicación específica, lo
habitual es que funcionen dentro de las aplicaciones de mensajería más
conocidas. Se puede utilizar más de un chatbot en la misma aplicación de
mensajería, están siempre disponibles, la interacción con los servicios de
atención al cliente se automatizan y se puede dar respuesta a los usuarios de
forma rápida para las preguntas y tareas más comunes sin que intervenga una
persona. No obstante, cuando el bot no puede ofrecer la ayuda deseada,
algunas plataformas de mensajería permiten pasar el control de la
conversación a una persona. En definitiva, se mejora la experiencia de usuario
porque se ofrecen soluciones de forma rápida y se utiliza una interfaz sencilla y
conocida (un chat) [4, 7]. Otra razón importante por la que las empresas están
apostando en los chatbots se debe a la reducción de costes producida por la
mayor automatización de las tareas más comunes que a su vez ocasiona la
reducción de trabajadores humanos que se encargaban de realizar estas [12,
13].
10
Mantener la misma conversación en varios idiomas se hace complicado. La
mayoría de las aplicaciones para crear chatbots no tienen la posibilidad de
tener varios entornos (ejemplo: desarrollo, producción). Algunos servicios en
la nube de chatbots no tienen ninguna aplicación visual para crear el
diálogo-flujo de la conversación, lo que hace difícil desarrollar conversaciones
un poco más complejas.
1.2 Objetivos
El primer objetivo en este TFM es realizar un estudio extenso del estado del
arte en el campo de bots conversacionales.
11
con Facebook Messenger y Telegram. Soportará al menos mensajes de
texto y botones de respuesta rápida. También se integrará con el servicio
de NLU. El orquestador será desarrollado con Node.js.
12
2. ESTADO DEL ARTE
El sucesor de ELIZA fue PARRY, creado por Kenneth Colby en 1971. Utilizaba
una arquitectura similar y simulaba ser una paciente con paranoia. A diferencia
de ELIZA, PARRY si tenía conocimiento de la conversación y también de su
estado de ánimo. Las respuestas no venían determinadas sólo por la entrada,
sino también por las creencias, deseos e intenciones de PARRY. Algunos trucos
que utilizaba eran admitir ignorancia, cambiar el tema de conversación e
introducir durante la conversación pequeñas historias de la mafia [22].
13
numerosos concursos relacionados con la evaluación del procesamiento del
lenguaje natural y obtuvo muchos honores y premios. Ganó el premio Loebner
3 veces. [20]. Utiliza un reconocimiento de patrones avanzado, AIML (Artificial
Intelligence Markup Language), desarrollado también por Wallace [21].
Albert One, desarrollado por Robby Garner en 1997, fue ganador del premio
Loebner en 1998 y 1999. Se volvió más popular por su comportamiento
humano. Albert figura en el Libro Guinness de los Récords Mundiales de 2001
como el programa informático más humano del mundo. [23] Antes de Albert
One, Garner creó a FRED, un programa que empezaba con un conjunto básico
de frases y aprendía de otras conversaciones para generar respuestas. El
problema de este tipo de aprendizaje no supervisado, es que se pueden
obtener resultados no deseables [22], como fue el caso del chatbot de
Microsoft, Tay, que utilizó Twitter para aprender de los tweets que le
mandaban los usuarios de la plataforma y se volvió racista en menos de un día
(2016) [24].
14
2.2 Técnicas para construir chatbots de manera
más “manual”
Antes del boom de las técnicas de aprendizaje automático el desarrollo de
chatbots consistía principalmente en especificar reglas con las cuales se
generaría la respuesta. Estas reglas pueden ir desde la simple coincidencia de
patrones hasta la inclusión de la estructura gramatical de la oración.
Actualmente, para la construcción de agentes conversacionales suele utilizarse
AIML [31] (descrita en el apartado 2.3) y NLP/NLU (Natural Language
Processing / Natural Language Understanding) [30].
15
2.2.3 Ontologías (redes semánticas)
16
Ejemplo de gestor basado en sistema de estados finitos. Cada círculo representa un estado y
cada flecha la transición de un estado a otro.
También existen otros usos, por ejemplo, se puede utilizar para autocompletar
consultas, prediciendo términos de búsqueda que coincidan con el contenido
de algún documento, sugiriendo al usuario palabras que puede emplear en la
búsqueda [38].
17
2.3.2 Recuperación de información
Muchos trabajos recientes han demostrado que las redes neuronales pueden
utilizarse con éxito en una serie de tareas de procesamiento del lenguaje
natural (NLP). Estos incluyen, pero no se limitan a, modelado de lenguaje,
detección de paráfrasis, extracción de embeddings de palabras y
reconocimiento de voz [48].
18
Con las arquitecturas de capas LSTM (Long Short-Term Memory, memoria a
largo plazo) o capas GRU (Gated Recurrent Unit, unidad recurrente cerrada)
podemos crear redes recurrentes profundas (DRNN). Estas arquitecturas
permiten recordar información por largos periodos de tiempo [43].
También pueden utilizarse otro tipos de redes, como las redes convolucionales
(CNN). Son un tipo de red en donde las neuronas corresponden a campos
receptivos inspiradas por las neuronas de la corteza visual primaria [41]. Esta
arquitectura permite procesar entradas de datos en una dimensión (por
ejemplo, lenguaje natural o series temporales), dos dimensiones (por ejemplo,
imágenes en gris), tres dimensiones (por ejemplo, imágenes a color o imágenes
3D del cerebro en imagen médica), o incluso más dimensiones [42].
[42].
2.3.4 NLP/NLU
El NLP utiliza algunas de las técnicas descritas más arriba para realizar tareas
como: extracción de información, similitud, reconocimiento del habla,
generación de lenguaje natural y voz, resumen de textos, análisis de
sentimientos, extracción de temas, reconocimiento de entidades con nombre,
extracción de relaciones, minería de textos, traducción, respuesta automática a
preguntas [48].
19
A veces cuando se habla de NLP también se habla de NLU (Comprensión del
Lenguaje Natural). NLU es un subconjunto de NLP que engloba métodos de más
alto nivel enfocados, como su nombre indica, en la comprensión del lenguaje.
20
2.4 Preprocesado
Para obtener mejores resultados en los técnicas estadísticas, los textos suelen
ser preprocesados. Las principales técnicas de preprocesado de texto son:
segmentación de textos en frases, tokenización (dividir frases en palabras),
stemming (reducir palabra a su raíz), lematización (hallar el lema de la
palabra), etiquetado de partes del discurso (análisis sintáctico), eliminación de
stopwords (palabras muy comunes y sin contenido semántico, como “a”, “y”,
“como”, “en”, “la”, “para”, etc.), convertir todas las palabras a minúsculas o
mayúsculas, normalizar la ortografía para eliminar faltas de ortografía [49].
Además las máquinas no son capaces de entender las palabras tal cual, es
necesario utilizar una codificación numérica. Para ello se convierten las
palabras a una representación vectorial.
21
2.4.1.2 TF-IDF
2.4.1.3 LSA
2.4.1.4 Word2Vec
22
Relaciones entre palabras obtenida con word2vec [51]
Estas relaciones son útiles para tareas de NLP como el etiquetado de partes del
discurso (part-of-speech tagging) o el reconocimiento de entidades con
nombre [51].
2.5.1 AIML
23
AIML describe una clase de objetos llamados objetos AIML. También describe
parcialmente el comportamiento de los programas informáticos. Los
programas AIML están formados por unidades llamadas temas <topic> y
category>, que contienen datos parseados o no parseados [31].
categorías <
Las categorías son la unidad básica de AIML. Cada categoría consta de una
pregunta de entrada, una respuesta de salida y un contexto opcional. La
pregunta se llama patrón <pattern> y la respuesta plantilla <template>. Los
dos tipos principales de contexto se llaman “eso” <that> y tema <topic> [31].
24
2.5.2 Cleverscript
25
2.5.3 Chatscript
#
# file: food.top
#
topic: ~food []
#! I like spinach
s: ( I like spinach ) Are you a fan of the Popeye cartoons?
a: ( ~yes ) I used to watch him as a child. Did you lust after Olive
Oyl?
b: ( ~no ) Me neither. She was too skinny.
b: ( yes ) You probably like skinny models.
#! I adore kiwi.
s: ( ~like ~fruit ![~animal _bear] ) Vegan, you too...
#! I eat fish.
s: ( I eat _*1 > )
$food = '_0
I eat oysters.
Ejemplo de script de Chatscript [36]
26
2.6 Clasificación de chatbots
Los chatbots pueden clasificarse en varias categorías dependiendo de varios
criterios, su diseño y el propósito por el cual han sido diseñados [30, 54]:
27
2.7 Herramientas y servicios actuales para creación
de chatbots y asistentes con NLP
WordNet. Es una gran base de datos léxica de inglés. Los sustantivos, verbos,
adjetivos y adverbios se agrupan en conjuntos de sinónimos cognitivos
(synsets), cada uno de los cuales expresa un concepto distinto. Los conjuntos
están interrelacionados por medio de relaciones conceptuales-semánticas y
léxicas. La estructura de WordNet hace que sea una herramienta útil para la
lingüística computacional y el procesamiento del lenguaje natural. Es libre de
descarga y modificación [57].
2.7.2 Bibliotecas
28
Scikit-learn. Proporciona una amplia colección de algoritmos de aprendizaje
supervisados y no supervisados. Incluye algoritmos de clasificación, regresión,
clustering, reducción de la dimensión y preprocesado [59].
Rasa. (Antes dividida en Rasa NLU y Rasa Core) Rasa NLU es una herramienta
de procesamiento de lenguaje natural para la clasificación de intenciones y la
extracción de entidades en chatbots. Rasa Core es un motor de diálogo para
construir asistentes inteligentes, en vez de usar condiciones utiliza aprendizaje
automático para predecir qué hacer [61].
2.7.3 Servicios
Dialogflow [65], IBM Watson [66] y Amazon LEX [64] ofrecen una interfaz
gráfica para crear la conversación y conectar el chatbot a aplicaciones de
mensajería populares y no solo crear los conjuntos de datos para la extracción
de intents y entidades. Microsoft LUIS [67] y Wit.ai [68] no, solo ofrecen el
análisis NLU.
29
El gestor de diálogo de Watson Assistant está formado por nodos, se utilizan
condiciones para elegir el siguiente nodo al que ir en la conversación [66]. En
Dialogflow y Amazon Lex un nodo se corresponde con un intent y se puede
acceder a cada nodo desde cualquier otro nodo.
30
Ejemplo de página de Amazon Lex para edición de intents, slots y respuestas [64]
31
En la siguiente gráfica se compara el rendimiento de los servicios en la nube
mencionados junto a Rasa y Snips. Cuanto más alto es el valor, mejor es el
reconocimiento del lenguaje natural. Los resultados son de hace más de un año
(entre agosto de 2017 y enero de 2018), por lo que actualmente estos datos
han podido variar.
32
3. DISEÑO DE LA APLICACIÓN
33
- Builder Web App. Aplicación web para diseñar los chatbots desde un
navegador. Se comunica con el servicio “Builder Service” a través de una
API REST.
- Builder Service. Servicio para obtener y guardar todos los datos de los
chatbots (datasets para NLU, diálogo, configuraciones). También puede
iniciar las aplicaciones “Node.js Assistant” y “NLU Service”.
- Node.js Assistant. Servicio que recibe los mensajes de Telegram y
Facebook Messenger y que utiliza uno o varios “NLU Service” y el diálogo
diseñado con la aplicación web para devolver una respuesta al usuario.
- NLU Service. Usa los datasets creados en la aplicación visual para
analizar y detectar los intents y entidades/slots en los mensajes de los
usuarios. Utiliza la biblioteca “Snips NLU” para ello.
- MinIO Storage. MinIO es un servidor de almacenamiento de objetos
compatible con el servicio de almacenamiento en la nube de Amazon S3.
Los objetos pueden tener un tamaño de hasta 5 TB [75]. Es usado para
guardar los datasets con los intents y las entidades, los diálogos y
configuraciones.
- Base de datos. Se usa una base de datos NoSQL (MongoDB) para
registrar qué aplicaciones ha iniciado el servicio “Builder Service” y los
contextos de las conversaciones.
Para iniciar los servicios en local se usa Docker Compose. Para definir los
servicios se utiliza el fichero docker-compose.yml cuya configuración puede
verse en la siguiente página. En este fichero se definen 4 aplicaciones: “Builder
Web App”, “Builder Service”, el servicio de almacenamiento con MinIO y la base
de datos MongoDB.
34
version: "3.7"
services:
builder-webapp:
build: ./builder-webapp
image: maiara/builder-webapp
ports:
- "3080:80"
restart: always
depends_on:
- builder-service
builder-service:
build:
context: ./
dockerfile: ./Dockerfile.builder-service
image: maiara/builder-service
network_mode: "host"
environment:
NODE_ENV: production
restart: always
depends_on:
- storage
- database
storage:
image: minio/minio:RELEASE.2019-08-21T19-40-07Z
ports:
- "9000:9000"
volumes:
- ~/.maiara/minio/data:/data
command: server /data
environment:
MINIO_ACCESS_KEY: vidsH98hjAKJ
MINIO_SECRET_KEY: jy0n0ASkjs623823jaJAKJSNJKD29239ihK
restart: always
healthcheck:
test: ["CMD", "curl", "-f", "http://storage:9000/minio/health/live"]
interval: 1m30s
timeout: 20s
retries: 3
start_period: 3m
database:
image: mongo:4.2
ports:
- "27017:27017"
restart: always
environment:
MONGO_INITDB_DATABASE: maiara
35
Los servicios “Node.js Assistant” y “NLU Service” no se incluyen en este fichero
porque los inicia el servicio “Builder Service” cuando recibe la petición desde la
aplicación web. No obstante, es necesario crear las imágenes de Docker de
estos dos servicios antes de que el servicio “Builder Service” intente crear los
contenedores con dichas imágenes.
36
Un Skill está formado por uno o varios datasets (un dataset por idioma) y por
flujos de diálogo (un flujo por idioma). Un dataset está formado por un
conjunto de intents y entidades. Un flujo de diálogo está formado por nodos, en
cada nodo se pueden realizar distintas acciones, como enviar una respuesta al
usuario. Cada nodo también puede tener definidas varias condiciones para
cambiar de nodo. Los datasets y los flujos de diálogo tienen exactamente la
misma estructura en todos los idiomas, sólo varía el contenido (frases de
ejemplo de los intents, valores de las entidades y respuestas del diálogo). Por
ejemplo, queremos crear un Skill para español e inglés que reconozca
preguntas como: “¿Qué tiempo hará mañana?”. Cuando se crea un intent el
usuario debe asignarle un nombre único, vamos a llamarle “GetWeather”, este
intent existe en todos los datasets con ese mismo identificador. Sin embargo,
en el dataset en inglés tendremos frases de ejemplo como: “Tell me what the
weather is going to be on Tuesday”, “Is it going to be sunny tomorrow?”, etc. y
en español: “Dime qué tiempo va a hacer el martes”, “¿Va a hacer sol mañana?”,
etc. No hace falta que las frases de ejemplo de cada idioma sean exactamente la
traducción de un idioma a otro, solo que todas las frases tengan el mismo
significado o intención. También puede variar el número de frases de ejemplo
en cada dataset.
37
Algunos chats envían un mensaje especial al iniciar una conversación por
primera vez. Por ejemplo Telegram envía un mensaje con el texto “/start”. Con
Telegram se pueden utilizar comandos para solicitar a un bot que realice
alguna acción. Los comandos siempre tienen el formato: “/textosinespacios”.
Cuando se recibe este mensaje de inicio nuestro asistente puede enviar un
mensaje de bienvenida, algunos bots lo utilizan para contar al usuario que
pueden hacer.
38
3.1.3 Funciones de un nodo del diálogo
39
En la primera condición de la imagen de ejemplo, “#intent1” significa: “Si se
detecta el intent1” y la condición 2, “#intent2 && @entidad4”: “Si se detecta el
intent2 y la entidad4”. Las entidades y las entidades con slots se pueden
comparar también con otros valores, por ejemplo “@datetime[weatherDate]
== ‘today’ ”.
Cuando no se cumple ninguna de las condiciones del nodo, se puede usar una
respuesta de “fallback” para comunicar al usuario que no se le ha entendido y
que vuelva a escribir su mensaje, pudiendole sugerir cosas que puede decir.
Las variables del contexto se pueden utilizar para guardar información. Las
variables son globales y pueden ser accedidas desde cualquier nodo de
cualquier Skill. Se puede usar por ejemplo para guardar el nombre del usuario
y utilizarlo en las respuestas. Para asignar un valor a una variables se utiliza
una acción. En la imagen de abajo se asigna a la variable “name” el valor de la
entidad con el mismo nombre.
40
3.2 Paquetes comunes
Para mejorar la modularidad de las aplicaciones y facilitar la creación de
nuevas funcionalidades, las aplicaciones desarrolladas con Node.js tienen
algunas funcionalidades separadas en paquetes (módulos) independientes de
las aplicaciones.
41
Algunas interfaces definidas en el paquete “core” y cómo se relacionan.
Otras interfaces definidas en este paquete son: Channel, para que todos los
canales de comunicación / chats se comporten de las misma manera, y Storage
para abstraer cómo obtienen y se guardan los datos.
42
Primero se limpian los operadores condicionales (== && ||). Si solo hay un “=”
se convierte en un “===” (en JavaScript el triple igual significa mismo valor y
mismo tipo), si solo aparece un “&” se añade otro “&&”, igual con “|”, se
convierte en “||”. Si aparecen más veces repetidos (====, &&&, |||||, etc.) se
borran los caracteres sobrantes. A continuación se comprueban si se ha escrito
una función. Para comprobar si hay funciones se utiliza una expresión regular
que comprueba si hay una palabra seguida de un paréntesis de apertura, puede
haber espacios entre ambos. En el caso de que haya una posible función, se
genera una función que devuelve siempre el valor “false”. Después de limpiar
caracteres y comprobar si hay funciones se utiliza la biblioteca “Esprima” para
comprobar que el texto de la condición es código JavaScript válido. Esprima es
un parseador de ECMAScript (JavaScript) escrito en JavaScript. Si el código no
es válido se genera también una función que solo devuelve “false”. Si es
correcto se genera una función en donde los “#intentName”, “@entityName”,
“@entityName[slotName]” y “$variableName” de la condición se reemplazan
por unas funciones especiales que obtienen los valores del resultado del
servicio NLU y del contexto. Esta función devuelve “true” o “false” dependiendo
del resultado NLU y las variables guardadas en el contexto.
43
3.3 Almacenamiento
🗑 Bucket
📂 Carpeta
📄 Fichero
📦 Comprimido ZIP
🗑 maiara
📂 assistants
📂 <assistant-id>
📄 info.json
📂 environments
📄 dev.json
📄 prod.json
📄 ...
📂 skills
📂 <skill-id>
📂 <skill-version>
📄 info.json
📂 <language>
📂 dataset
📄 info.json
📂 intents
📄 intent1.json
📄 intent2.json
📄 ...
📂 entities
📄 entity1.json
📄 entity2.json
📄 ...
📄 system-entities.json
📦 train.zip
📂 dialog
📂 nodes
📄 node1.json
📄 node2.json
📄 ...
📄 edges.json
Estructura de ficheros para almacenar datasets, diálogos y configuraciones.
44
He utilizado MinIO como almacenamiento principal por ser un sistema sencillo
de almacenamiento de objetos y por ser compatible con Amazon S3. De esta
manera trasladar la aplicación a la nube será menos costoso. Se puede utilizar
una base de datos NoSQL también, pero el límite máximo de tamaño del
documento es mucho menor, por ejemplo, en MongoDB los documentos
pueden ser de hasta 16 MB, en MinIO de hasta 5 TB. Si en algún momento se
quieren crear datasets muy grandes, MinIO es una mejor opción. Todas las
consultas que se hacen en la aplicación son de tipo clave-valor, por lo que no se
van a percibir diferencias en el rendimiento.
En vez de tener todos los intents, entidades, nodos del diálogo y el resto de la
información en un solo JSON, he decidido crear una estructura de directorios
para que sea menos costoso modificar cada parte, además de que me parece
más fácil encontrar los datos que necesito.
Los skills se encuentra en un directorio con el mismo nombre. Cada skill puede
tener distintas versiones. Dentro de cada versión hay otro directorio por
idioma habilitado en el chatbot. Dentro del directorio del idioma se encuentra
un directorio “dataset” con los intents y las entidades, y un fichero comprimido
“train.zip” con el resultado del entrenamiento del servicio NLU. En el directorio
“dialog” se guardan los nodos del diálogo. En el fichero “edges.json” se guardan
las aristas que conectan los nodos, estas aristas solo se utilizan en la aplicación
web para pintarlas en pantalla, el servicio “Node.js Assistant” solo necesita los
nodos.
45
3.4 Aplicación visual
Un “service worker” es un script de JavaScript, que actúa como proxy del lado
del cliente y permite controlar la caché y cómo responder ante las solicitudes
de recursos [79].
46
Solo barra global de navegación
Para moverse por la aplicación existen tres menús superiores. El de más arriba
es el menú global, con este menú se puede ir a la página principal, a la página
de selección de asistente y a la página de selección de skill. Cada asistente y
skill tiene otra barra de navegación. Con la barra del asistente podemos ir a la
página principal del asistente y a una o varias páginas para editar variables de
entorno. Con la barra de navegación de un skill podemos ir a la página
principal de un skill, a la página de edición de intents, a la página de edición de
entidades y a la página de edición del diálogo. Ambas barras de navegación
tienen un botón para guardar los cambios realizados en el servidor. La barra
del asistente tiene otro botón para iniciar el asistente utilizando un entorno y
otro botón para crear más entornos. La barra del skill permite cambiar el
idioma con el que se está trabajando.
En las siguientes páginas del documento iré mostrando las páginas en más
detalle.
47
Inicio. Esta es la página inicial de la aplicación. Tiene el logo de la aplicación en
grande y muestra el número de asistentes y skills creados. Al pulsar en el
rectángulo con el número de asistentes se cambia a la página de selección de
asistentes, y cuando se pulsa el rectángulo con el de skills se muestra la página
de selección de skills.
48
Selección de asistente. Se muestra una lista de todos los asistentes creados.
Cada ítem de la lista tiene una imagen (genérica por ahora) con el nombre y la
descripción del asistente. Podemos crear un nuevo asistente pulsando el botón
azul. Al pulsar el botón se muestra un modal/popup para introducir el
identificador, el nombre y la descripción del nuevo asistente.
49
Página de inicio de un asistente. En esta página podemos editar el nombre y
la descripción del asistente, podemos habilitar los chats de Telegram y
Facebook Messenger y podemos añadirle o quitarle skills. También se puede
eliminar el asistente con el botón rojo de abajo del todo.
50
Cuando pulsamos el botón de añadir una skill se muestra un modal por encima
de la página con una lista de todos los skills existentes y que no se han añadido
ya.
51
Página de edición de entorno. Si pulsamos en alguno de los entornos creados
(“dev” y “prod” en este ejemplo) se muestra la página de edición de variables
de entorno. Estas variables se usan para añadir la configuración necesaria para
conectarse a servicios externos, en este caso de Telegram y Facebook
Messenger. La razón por la que hay más de un entorno es que de esta manera
puedes tener un asistente funcionando en un chat de pruebas y otro en un chat
que atienda a clientes reales.
52
Página principal de una skill. Se puede editar el nombre y la descripción de la
skill, habilitar o deshabilitar idiomas y borrar la skill. Los idiomas de la imagen
son los idiomas soportados por Snips. También se muestra el número de
intents, entidades y nodos de la skill.
53
Página de edición de intents. En esta página se muestra una lista con los intents
creados. Cada fila de la lista muestra el nombre del intent y el número total de
frases de ejemplo (utterances) del intent. Para crear un nuevo intent
escribimos su nombre en la entrada de texto de arriba a la derecha y pulsamos
el botón azul para crearlo.
Página de edición de entidades. En esta página podemos ver una lista con las
entidades creadas. También podemos crear nuevas con el formulario que se
encuentra encima de la tabla de entidades. A la derecha hay un panel con todas
las entidades del sistema. Las entidades del sistema son entidades especiales
de las que no tenemos que preocuparnos de crear, y sirven para detectar
números, fechas, duración, temperaturas, etc. Las entidades de sistema que se
muestran en la imagen son las entidades de sistema que Snips NLU es capaz de
detectar.
55
Cuando pulsamos en una entidad de las que hemos creado, se abre el editor de
la entidad. En este editor podemos definir todos los valores posibles de la
entidad y sinónimos de cada valor. Al igual que con los intents, cuando se pasa
el ratón por encima de una fila de la tabla, se muestra un icono para poder
borrar el valor.
Página de edición de diálogo. En esta página podemos crear los nodos y las
conexiones entre los nodos que dirigen la conversación. Todos los nodos tienen
una entrada y ninguna o varias salidas. El nodo “Start” solo puede tener salidas.
Es el nodo de entrada a la skill y no se puede borrar. Se crea automáticamente
al crear la skill. Con el botón de arriba a la izquierda podemos crear nuevos
nodos. Los nodos que se crean están vacíos de información. Para editar un
..
56
nodo debemos pulsar en uno de ellos para abrir el editor del nodo.
57
Para conectar un nodo con otro, debemos crear una condición en el nodo
origen. Cuando se crea una condición se muestra un pequeño círculo en el lado
derecho del nodo. Para crear una conexión entre dos nodos pinchamos y
arrastramos el ratón o el dedo desde el círculo de salida hasta el círculo de
entrada del otro nodo.
58
MÉTODO ENDPOINT
GET /assistant
Obtiene todos los identificadores de los asistentes.
GET /assistant/:assistantId
Obtiene los datos de un asistente.
GET /assistant/:assistantId/environment/:environmentId
Obtiene datos de un entorno de un asistente.
POST /assistant/:assistantId
Crea un nuevo asistente o actualiza sus datos si ya existe
POST /assistant/:assistantId/environment/:environmentId
Crea un entorno de un asistente o actualiza sus datos si ya existe.
GET /assistant/:assistantId/environment
Devuelve una lista con todos los entornos de un asistente.
DELETE /assistant/:assistantId
Borra un asistente y sus entornos
GET /skill
Obtiene una lista con todos los identificadores de los skills
GET /skill/:skillId/version
Obtiene el ID, nombre, descripción y versiones de un skill
GET /skill/:skillId/version/:versionId
Obtiene todos los datos de todos los idiomas de la versión de un skill
GET /skill/:skillId/version/:versionId/dialog
Obtiene todos los datos de todos los idiomas de la versión de un skill
(no incluye los datasets)
GET /skill/:skillId/version/:versionId/language
Obtiene una lista con los códigos de todos los idiomas del skill
GET /skill/:skillId/version/:versionId/language/:languageCode
Obtiene todos los datos de un idioma de un skill
GET /skill/:skillId/version/:versionId/language/:languageCode/dialog
Obtiene todos los datos de un idioma de un skill (excepto el dataset)
POST /skill/:skillId/version/:versionId
Crea o actualiza los datos de la versión de un skill
DELETE /skill/:skillId
Borra una skill completamente (todas las versiones e idiomas)
DELETE /skill/:skillId/version/:versionId
Borra una versión de un skill
DELETE /skill/:skillId/version/:versionId/language/:languageCode
Borra los datos de un idioma de una versión de un skill
59
Los siguientes endpoints sirven para iniciar y parar un asistente:
MÉTODO ENDPOINT
POST /assistant/:assistantId/environment/:environmentId/start
Inicia los servicios "NLU Service" y "Node.js Assistant" con el asistente y
entorno especificados
POST /assistant/:assistantId/environment/:environmentId/stop
Detiene los servicios "NLU Service" y "Node.js Assistant" del asistente y
entorno especificados
60
Para realizar el entrenamiento, el contenedor Docker se inicia en modo
“entrenamiento” y recibe como parámetros la localización del dataset dentro
del servicio de almacenamiento (MinIO Storage) con el que entrenar y la
localización donde debe guardar el entrenamiento:
Dataset: skills/<skillId>/<version>/<languageCode>/dataset
Entrenamiento: skills/<skillId>/<version>/<languageCode>/dataset/train.zip
MÉTODO ENDPOINT
GET /nlu?text=<texto>
POST /nlu
{
"input": "Weather in Madrid",
"intent": {
"intentName": "GetWeather",
"probability": 0.8408182096904603
},
"slots": [{
"entity": "location",
"range": {
"end": 17,
"start": 11
},
"rawValue": "Madrid",
"slotName": "weatherLocation",
"value": {
"kind": "Custom",
"value": "Madrid"
}
}]
}
61
En este ejemplo podemos ver que se ha enviado la frase “weather in Madrid” y
ha detectado la intención “GetWeather” y que “Madrid” pertenece a la entidad
“location” y al slot “weatherLocation”.
Para obtener estos resultados tan precisos, Snips NLU utiliza la siguiente
arquitectura:
62
3.7 Servicio de asistente
El servicio “Builder Service” inicia este servicio utilizando como parámetros el
identificador del asistente y las direcciones de los servicios NLU, de los Skills
que utiliza. Utiliza el identificador del asistente para descargarse los ficheros
JSON con la configuración para conectarse a los chats y para descargarse los
diálogos. Para cada diálogo crea un motor de diálogo, dependiendo del Skill y el
idioma selecciona un motor u otro. El resto del flujo ya ha sido explicado en las
secciones anteriores, donde lo nombro como “Node.js Assistant”.
63
4. RESULTADOS
64
Nos aparece la nueva skill en la lista:
65
Por defecto se crea con el idioma inglés y sin ningún dato.
66
Pinchamos en la fila de la tabla con el intent “GetWeather” para abrir el editor
de intents. He introducimos las frases de ejemplo:
67
En cada frase marcamos las entidades existentes. En la primera frase
marcamos “Los Angeles” con la entidad “location” y el slot “weatherLocation” y
“this weekend” con la entidad “snips/datetime” y el slot “weatherDate”.
Para marcar una entidad seleccionamos las palabras de la entidad con el ratón.
Si no seleccionamos todas las letras de una palabra se selecciona la palabra
entera igualmente. Al seleccionar una o varias palabras se abre el formulario
para crear una entidad, donde introducimos su nombre. Una vez creada
podemos añadir el nombre del slot pulsando en su casilla de la tabla.
68
Para editar los valores de una entidad pinchamos en un fila de la tabla y se nos
abre el editor de la entidad. Podemos poner como sinónimo de “Paris”, “City of
light”.
69
Ahora nos vamos a la página de selección de asistente y creamos uno igual que
hicimos con el skill.
70
Rellenamos el formulario:
Y se crea el asistente:
71
Pinchamos en el asistente creado para ir a la página principal. Después
pulsamos el botón “Add Skill”.
Se abre un modal con todos los skills creados, en nuestro caso solo hay uno.
Pinchamos en el skill para añadirlo al asistente.
72
Ahora que tenemos el skill añadido, pulsamos en el botón de tipo “switch”de
Telegram para habilitar ese canal.
Una vez que tenemos todo configurado pulsamos el botón “Guardar cambios”
de arriba a la derecha. Ya podemos pulsar en “Desplegar” también. Al pulsar en
“Desplegar” se entrena el modelo y después se inicia el asistente.
73
Si abrimos la página de administración de MinIO podemos ver que se han
creado todos los ficheros (muestro solo algunas capturas):
74
Entidades creadas en el skill:
75
Aunque se muestren los botones de acción rápida se puede escribir lo que se
quiera por la entrada de texto normal.
76
5. CONCLUSIONES Y TRABAJO FUTURO
Antes de comenzar con el diseño hemos repasado las diferentes formas con las
que podemos crear chatbots actualmente. Para la aplicación creada hemos
utilizado el procesamiento de lenguaje natural (punto 2.3.4) y el gestor de
diálogo de estados finitos (punto 2.2.4). Más aplicaciones como IBM Watson o
Botpress siguen esta misma metodología. La principal mejora que aporta
nuestra aplicación respecto al resto es la posibilidad de utilizar varios idiomas
en el mismo chatbot y poder separar el conocimiento de un chatbot en varias
skills para intentar tener más modularizado el conocimiento.
77
6. REFERENCIAS
78
13. Juniper Research. Chatbot Conversations to deliver $8 billion in cost savings by 2022.
(2017) (Último acceso: 4 de septiembre de 2019)
https://www.juniperresearch.com/analystxpress/july-2017/chatbot-conversations-t
o-deliver-8bn-cost-saving
14. Chen, H.; Liu, X.; Yin, D.; Tang, J. (2018) A Survey on Dialogue Systems: Recent
Advances and New Frontiers. arXiv:1711.01731
15. Wikipedia. Chatbot. (Último acceso: 4 de septiembre de 2019)
https://en.wikipedia.org/wiki/Chatbot
16. Huang, J.; Zhou, M.; Yang, D. (2007): Extracting Chatbot Knowledge from Online
Discussion Forums. Proc. of IJCAI. 423-428.
17. Bradesko, L., & Mladenic, D. (2012). A Survey of Chabot Systems through a Loebner
Prize Competition.
18. Turing, A. M. (1950) Computing Machinery and Intelligence. Mind 49: 433-460.
19. Weizenbaum, J. (1966) ELIZA—a computer program for the study of natural language
communication between man and machine. Commun. ACM 9, 1 (January 1966),
36-45. DOI=http://dx.doi.org/10.1145/365153.365168
20. Chatbots.org. Definición de chatbot. (Último acceso: 4 de septiembre de 2019)
https://www.chatbots.org/chat_bot
21. Chatbots.org A.L.I.C.E. (Último acceso: 4 de septiembre de 2019)
https://www.chatbots.org/chatbot/a.l.i.c.e/
22. Pereira, M. J.; Coheur, L.; Fialho, P.; Ribeiro, R. (2016) Chatbots’ Greetings to
Human-Computer Communication. arXiv:1609.06479
23. Chatbots.org. Albert One. (Último acceso: 4 de septiembre de 2019)
https://www.chatbots.org/chatbot/albert_one/
24. Elle Hunt (The Guardian). Tay, Microsoft's AI chatbot, gets a crash course in racism
from Twitter. (2016) (Último acceso: 4 de septiembre de 2019)
https://www.theguardian.com/technology/2016/mar/24/tay-microsofts-ai-chatbot-
gets-a-crash-course-in-racism-from-twitter
25. Wikipedia. Premio Loebner. (Último acceso: 4 de septiembre de 2019)
https://es.wikipedia.org/wiki/Premio_Loebner
26. AISB. The Society for the Study of Artificial Intelligence and Simulation of Behaviour -
Loebner Price. (Último acceso: 4 de septiembre de 2019)
http://www.aisb.org.uk/events/loebner-prize
27. Wikipedia. Mitsuku. (Último acceso: 4 de septiembre de 2019)
https://en.wikipedia.org/wiki/Mitsuku
28. Steve Worswick Interview - Loebner 2013 winner. (Último acceso: 4 de septiembre de
2019)
https://aidreams.co.uk/forum/index.php?page=Steve_Worswick_Interview_-_Loebne
r_2013_winner#.XVmVK3UvNhE
29. Pandorabots. Mitsuku. (Último acceso: 4 de septiembre de 2019)
https://www.pandorabots.com/mitsuku/
30. Ramesh, Kiran & Ravishankaran, Surya & Joshi, Abhishek & Chandrasekaran, K.
(2017). A Survey of Design Techniques for Conversational Agents. 336-350.
10.1007/978-981-10-6544-6_31.
31. Pandorabots Docs. AIML Fundamentals. (Último acceso: 4 de septiembre de 2019)
https://pandorabots.com/docs/aiml-fundamentals/
32. AIML Docs (Último acceso: 4 de septiembre de 2019)
http://www.aiml.foundation/doc.html
33. AIML 2.0 Reference. (Último acceso: 4 de septiembre de 2019)
http://callmom.pandorabots.com/static/reference/
34. Ahmad, S. (2007) Tutorial on Natural Language Processing.
79
35. Cleverscript. About. (Último acceso: 4 de septiembre de 2019)
https://www.cleverscript.com/about/
36. Repositorio de ChatScript en GitHub (Último acceso: 4 de septiembre de 2019)
https://github.com/ChatScript/ChatScript/blob/master/WIKI/OVERVIEWS-AND-TU
TORIALS/What-is-ChatScript.md
37. Natalya F. Noy and Deborah L. McGuinness (2001) Ontology Development 101: A
Guide to Creating Your First Ontology. Stanford Knowledge Systems Laboratory
Technical Report KSL-01-05 and Stanford Medical Informatics Technical Report
SMI-2001-0880, March 2001.
38. Moyotl-Hernández, E., & Macías-Pérez, M. (2016). Método para autocompletar
consultas basado en cadenas de Markov y la ley de Zipf. Research in Computing
Science, 115, 157-170.
39. Pérez Ortiz, J. A. (2002) Modelos Predictivos Basados en Redes Neuronales
Recurrentes de Tiempo Discreto. Tesis doctoral. Universidad de Alicante.
40. Kathrin. KNIME blog. “Once Upon A Time...” by LSTM Network. (2018) (Último acceso:
4 de septiembre de 2019) https://www.knime.com/blog/text-generation-with-lstm
41. Wikipedia. Redes neuronales convolucionales. (Último acceso: 4 de septiembre de
2019) https://es.wikipedia.org/wiki/Redes_neuronales_convolucionales
42. CS231n Convolutional Neural Networks for Visual Recognition. (Último acceso: 4 de
septiembre de 2019) http://cs231n.github.io/convolutional-networks/
43. Colah’s Blog. Understanding LSTM Networks. (2015) (Último acceso: 4 de septiembre
de 2019) https://colah.github.io/posts/2015-08-Understanding-LSTMs/
44. Sriram, A.; Jun, H.; Satheesh, S.; Coates, A. (2017) Cold Fusion: Training Seq2Seq
Models Together with Language Models. arXiv:1708.06426v1
45. Christopher D. Manning, Prabhakar Raghavan, and Hinrich Schütze. 2008.
Introduction to Information Retrieval. Cambridge University Press, New York, NY,
USA. ISBN:0521865719 9780521865715
46. Qiu, M.; Li, F.; Wang, S.; Gao, X.; Chen, Y.; Zhao, W.; Chen, H.; Huang, J.; Chu, W. (2017)
AliMe Chat: A Sequence to Sequence and Rerank based Chatbot Engine. Proceedings
of the 55th Annual Meeting of the Association for Computational Linguistics (Volume
2: Short Papers) 498-503
47. SAS. Procesamiento del lenguaje natural. Qué es y por qué es importante. (Último
acceso: 4 de septiembre de 2019)
https://www.sas.com/es_ar/insights/analytics/what-is-natural-language-processing
-nlp.html
48. SciForce. NLP vs. NLU: from Understanding a Language to Its Processing. (2019)
(Último acceso: 4 de septiembre de 2019)
https://www.kdnuggets.com/2019/07/nlp-vs-nlu-understanding-language-processi
ng.html
49. Miner, G. Elder, J.; Fast, A.; Hill, T.; Nisbet, R.; Delen, D. (2012) Practical Text Mining
and Statistical Analysis for Non-structured Text Data. ISBN: 978-0-12-386979-1
50. Hunter Heidenreich. Introduction to Word Embeddings. (2018) (Último acceso: 4 de
septiembre de 2019)
http://hunterheidenreich.com/blog/intro-to-word-embeddings/
51. TensorFlow. Vector Representations of Words. (Último acceso: 4 de septiembre de
2019) https://www.tensorflow.org/tutorials/representation/word2vec
52. Landauer, T. K.; Foltz, P. W.; Laham, D. (1998) An introduction to latent semantic
analysis. Discourse Processes. Vol. 25. Number 2-3. 259-284 DOI:
10.1080/01638539809545028
53. Bill MacCartney. Understanding Natural Language Understanding. (2014)
https://nlp.stanford.edu/~wcmac/papers/20140716-UNLU.pdf
80
54. Wu, Y.; Wu, W.; Xing, C.; Zhou, M.; Li, Z. (2016) Sequential Matching Network: A New
Architecture for Multi-turn Response Selection in Retrieval-Based Chatbots.
arXiv:1612.01627v2
55. Braun, D., Hernandez-Mendez, A., Matthes, F., & Langen, M. (2017). Evaluating Natural
Language Understanding Services for Conversational Question Answering Systems.
SIGDIAL Conference.
56. NLTK (Último acceso: 4 de septiembre de 2019) https://www.nltk.org/
57. WordNet(Último acceso: 4 de septiembre de 2019) https://wordnet.princeton.edu/
58. spaCy (Último acceso: 4 de septiembre de 2019) https://spacy.io/
59. Scikit-learn. (Último acceso: 4 de septiembre de 2019)
https://scikit-learn.org/stable/index.html
60. TensorFlow (Último acceso: 4 de septiembre de 2019) https://www.tensorflow.org/
61. Rasa (Último acceso: 4 de septiembre de 2019) https://rasa.com/docs
62. Snips NLU (Último acceso: 4 de septiembre de 2019) https://snips-nlu.readthedocs.io
63. Adrien Ball. An Introduction to Snips NLU, the Open Source Library behind Snips
Embedded Voice Platform. (2018) (Último acceso: 4 de septiembre de 2019)
https://medium.com/snips-ai/an-introduction-to-snips-nlu-the-open-source-library-
behind-snips-embedded-voice-platform-b12b1a60a41a
64. Amazon Lex. (Último acceso: 4 de septiembre de 2019)
https://docs.aws.amazon.com/es_es/lex/latest/dg
65. Documentación Dialogflow (Último acceso: 4 de septiembre de 2019)
https://cloud.google.com/dialogflow/docs
66. Watson Assistant. (Último acceso: 4 de septiembre de 2019)
https://www.ibm.com/cloud/watson-assistant/
67. Microsoft LUIS. (Último acceso: 4 de septiembre de 2019)
https://azure.microsoft.com/es-es/services/cognitive-services/language-understand
ing-intelligent-service/
68. Wit.ai (Último acceso: 4 de septiembre de 2019) https://wit.ai/
69. Google Cloud. Natural Language. (Último acceso: 4 de septiembre de 2019)
https://cloud.google.com/natural-language/
70. IBM Watson Natural Language Understanding. (Último acceso: 4 de septiembre de
2019) https://www.ibm.com/watson/services/natural-language-understanding/
71. Amazon Comprehend. (Último acceso: 4 de septiembre de 2019)
https://aws.amazon.com/es/comprehend/
72. Botpress (Último acceso: 4 de septiembre de 2019) https://botpress.io/
73. Shane Barker. Chatbots Life. 13 of the Best AI Chatbot Platforms to Increase Your
Conversions. (2018) (Último acceso: 4 de septiembre de 2019)
https://chatbotslife.com/13-of-the-best-ai-chatbot-platforms-to-increase-your-conve
rsions-d2ab2c533696
74. Data Monsters. Chatbots Journal. 25 Chatbot Platforms: A Comparative Table. (2017)
(Último acceso: 4 de septiembre de 2019)
https://chatbotsjournal.com/25-chatbot-platforms-a-comparative-table-aeefc932eaff
75. MinIO Docs (Último acceso: 4 de septiembre de 2019) https://docs.min.io
76. Docker (Último acceso: 4 de septiembre de 2019) https://www.docker.com
77. Docker Compose.(Último acceso: 4 de septiembre de 2019)
https://docs.docker.com/compose/
78. Kubernetes. (Último acceso: 4 de septiembre de 2019) https://kubernetes.io
79. Google Developers. Web. Progressive Web Apps. (Último acceso: 4 de septiembre de
2019) https://developers.google.com/web/progressive-web-apps/
80. w3schools. HTML Responsive Web Design. (Último acceso: 4 de septiembre de 2019)
https://www.w3schools.com/html/html_responsive.asp
81
81. Wang L, Wang J, Wang M, Li Y, Liang Y, Xu D. (2012) Using Internet Search Engines to
Obtain Medical Information: A Comparative Study. J Med Internet Res 2012;14(3):e74
82. Cyc’s Knowledge base. (Último acceso: 4 de septiembre de 2019)
https://www.cyc.com/archives/service/cyc-knowledge-base
82