Asistente Virtual para Un Sistema de Informacion GUIJARRO MARCO PABLO
Asistente Virtual para Un Sistema de Informacion GUIJARRO MARCO PABLO
Asistente Virtual para Un Sistema de Informacion GUIJARRO MARCO PABLO
un sistema de
información
Grado en Ingeniería Multimedia
Autor:
Pablo Guijarro Marco
Tutor/es:
Gustavo Candela Romero
María Dolores Sáez Fernández
Enero 2020
Asistente virtual para un sistema
de información
Desarrollo de un asistente virtual que facilite la comunicación con el
usuario en la Biblioteca Virtual Miguel de Cervantes
Autor
Pablo Guijarro Marco
Directores
Gustavo Candela Romero
Departamento del Lenguajes y Sistemas Informáticos
Marı́a Dolores Sáez Fernández
Departamento del Lenguajes y Sistemas Informáticos
Actualmente, el acceso a los sistemas de información debe ser fácil, rápido e intuitivo.
Numerosas instituciones han publicado sus datos en abierto como por ejemplo bibliotecas
nacionales, instituciones de patrimonio cultural, agencias estatales de meteorologı́a, redes
sociales, Wikidata y ayuntamientos. Sin embargo, el acceso a estos nuevos repositorios de
datos abiertos no es sencillo por la necesidad de saber utilizar el lenguaje de consulta de
base de datos SPARQL y ser capaz de entender cómo está la información estructurada
para poder comprender cómo acceder a la que se necesita. Este Trabajo Fin de Grado
(TFG) se basa en bibliotecas virtuales/digitales que ofrecen contenido mediante datos
abiertos como información sobre obras y autores.
El trabajo pretende reutilizar y facilitar el acceso a estos recursos que ofrecen las
bibliotecas virtuales. En la última década están cobrando relevancia los chatbots y los
asistentes virtuales en el mundo del e-learning ya que permiten al usuario interactuar
mediante lenguaje natural con ellos. Estos son capaces de ofrecer el contenido de las
bibliotecas virtuales de manera rápida al igual que de informar al usuario de lo que ofrece
la biblioteca con tan solo mantener una conversación con ellos. Empresas como Google,
Apple o Amazon están apostando por esta nueva tecnologı́a aplicándola en algunos de
sus productos ya que el uso de un asistente virtual va más allá de poder ofrecer los
recursos de una biblioteca virtual o de un sitio web en especı́fico. Pueden tener otras
funcionalidades que usan repositorios externos para enriquecer las respuestas que ofrece
el asistente.
El objetivo principal de este TFG es crear un asistente virtual que ofrezca tanto
funcionalidades que permitan acceder a los recursos de un sistema de información como
funcionalidades que ofrezcan información útil para la vida cotidiana de los usuarios.
Además, se ha añadido una funcionalidad adicional con el objetivo de permitir a los
administradores del sistema monitorizar mediante cuadros de mando la frecuencia de
uso del asistente y de sus funcionalidades.
Para llevar a cabo este asistente virtual se ha utilizado tanto el repositorio de datos
abiertos de la Biblioteca Virtual Miguel de Cervantes (BVMC), ya que se ha elegido
como sistema de información para el cual realizar el asistente, como también Wikidata.
del frontend y que hace uso de numerosos servicios de terceros para ello.
Preámbulo
Vivimos en una sociedad en la cual la gente está acostumbrada a obtener lo que desea
de una manera simple, cómoda y sencilla gracias a la evolución de la tecnologı́a. Por
ejemplo, el acceso a Internet ha facilitado el consumo de todo tipo de productos de una
forma flexible y rápida.
En este contexto, actualmente están teniendo mucho éxito los asistentes virtuales,
ya que facilitan la obtención de información y el trámite dentro de una web o de una
app. En resumen, ofrecen facilidad y rapidez para que las personas encuentren lo que
buscan o realicen la acción que quieren dentro de un sitio web. En este sentido, un
asistente virtual permite interactuar con el usuario mediante el uso del lenguaje natural
simulando el comportamiento de una persona.
Por este motivo principalmente he decidido realizar un asistente virtual que facilite el
acceso de informacion a los usuarios de la BVMC, entre otros servicios. El objetivo de
este TFG es diseñar e implementar una API para darle sustento al asistente, entrenar al
asistente para que pueda responder correctamente a las peticiones del usuario, consumir
datos de terceros como, por ejemplo, de la propia biblioteca y dotarle de un buen diseño
para mejorar la experiencia de usuario.
A mis padres, a mi hermana y a mis abuelos por haber creı́do desde el principio en mı́ y que
sin su apoyo no habrı́a podido llegar hasta este punto de la carrera. A mis amigos por estar
siempre ahı́ cuando les he necesitado y me han orientado cuando no encontraba como salir del
paso en situaciones difı́ciles que se me han presentado durante el transcurso de esta carrera.
También agradecer a mis tutores por formar parte de este último proyecto antes de salir al
mundo laboral y a todos los profesores con los que he aprendido y han hecho que hoy en dı́a sea
capaz de realizar este trabajo.
ix
Algún dı́a seremos capaces de alcanzar la inmortalidad.
Haremos copias de nuestros cerebros. Puede que los creemos
en un laboratorio o que, simplemente, descarguemos su contenido
en un ordenador.
Marvin Minsky.
xi
Índice general
Resumen V
1. Introducción 1
2. Viabilidad 5
2.1. Modelo de negocio, Lean Canvas . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.1. Segmentos de mercado . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.2. Problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.3. Propuesta de valor única . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.4. Solución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.1.5. Canales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.1.6. Estructura de costes . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.1.7. Métricas clave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.1.8. Fuentes de ingreso . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1.9. Ventaja especial . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2. Análisis DAFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.1. Debilidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2.2. Amenazas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.3. Fortalezas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.4. Oportunidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3. Análisis de los riesgos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3. Objetivos 15
3.1. Generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2. Especı́ficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
4. Marco Teórico 17
4.1. Asistentes virtuales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2. Fuentes de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2.1. La Web Semántica y la definición de los datos . . . . . . . . . . . . 20
4.2.2. Bibliotecas digitales . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2.3. Wikidata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
4.3. Tecnologı́as para implementar un asistente virtual . . . . . . . . . . . . . 27
4.3.1. Dialogflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.4. Tecnologı́as para implementar el backend y el frontend . . . . . . . . . . . 30
4.4.1. Servicios a utilizar de terceros . . . . . . . . . . . . . . . . . . . . . 32
xiii
xiv Índice general
4.5. UX y diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5. Metodologı́a 35
6. Análisis y especificación 39
6.1. Perspectiva de producto . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.2. Funciones del producto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.3. Restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.4. Requisitos especı́ficos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.4.1. Requerimientos funcionales . . . . . . . . . . . . . . . . . . . . . . 41
6.4.2. Requerimientos no funcionales . . . . . . . . . . . . . . . . . . . . 45
6.4.3. Diagrama de casos de uso . . . . . . . . . . . . . . . . . . . . . . . 46
7. Diseño 49
7.1. Arquitectura seleccionada . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
7.2. Tecnologı́as . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
7.3. Diagrama de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
7.4. Mockups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
8. Implementación 63
8.1. Backend Parte 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
8.2. Frontend Parte 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
8.3. Backend Parte 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
8.4. Frontend Parte 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
8.5. Backend Parte 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
8.6. Frontend Parte 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
8.7. Backend Parte 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9. Pruebas y validación 93
9.1. Pruebas unitarias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
9.2. Casos de prueba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
9.2.1. Evaluación a nivel de sesión . . . . . . . . . . . . . . . . . . . . . . 96
9.2.2. Evaluación a nivel de turno . . . . . . . . . . . . . . . . . . . . . . 97
10.Resultados 99
11.Conclusiones 107
11.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
11.2. Lı́neas de trabajo futuras . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Bibliografı́a 113
xvii
xviii Índice de figuras
xix
Índice de Listados
xxi
xxii Índice de Listados
Esto ha supuesto un gran impacto hacia el lado del cliente sobre todo debido a la
constante disponibilidad, a su respuesta instantánea y a su fácil acceso. Los chatbots
pueden estar operativos los 365 dı́as del año y las 24 horas del dı́a, lo que les permite
atender a sus clientes incluso mientras los miembros realizan otras tareas.
1
2
Hoy en dı́a podemos contar con asistentes virtuales que aprovechan dicha información
para ofrecer una mejor experiencia de usuario. Son capaces de encontrar y acceder a in-
formación de manera rápida y eficaz con tan sólo pedı́rselo mediante el lenguaje natural,
es decir, mediante un mensaje de texto que escribe el usuario. Además, los asistentes
virtuales pueden proporcionar muchos otros tipos de servicios de soporte a los usuarios
o clientes, como soporte administrativo, resolución de problemas técnicos, ayuda con
aportes creativos y adquisición de clientes potenciales.
Las caracterı́sticas principales de los asistentes virtuales son que se encuentran dispo-
nibles las 24 horas del dı́a a diferencia de las personas y que además, con las innovaciones
más recientes en sus habilidades y servicios, facilitan la expansión de cualquier negocio.
Tienen las habilidades y la experiencia necesarias para realizar tareas que los asistentes
normales no pueden hacer, y han demostrado ser capaces de manejar trabajos de manera
efectiva y rápida. Este año ha habido una creciente competencia en los negocios en lı́nea,
y cada vez más personas asumen el riesgo de convertirse en emprendedores. Debido a
que los asistentes virtuales son tan efectivos y útiles, especialmente para las pequeñas
empresas, tendrán aún más demanda de aquı́ en adelante. Tener un asistente virtual
puede agilizar el proceso de trabajo hasta el punto en el que este fluye casi sin problemas,
y para un negocio que acaba de comenzar, esto es algo crucial. [Squarefishinc.com, 2018]
Existen tres diferencias fundamentales entre los asistentes virtuales y los chatbots: la
forma de desarrollo de estas tecnologı́as es distinta, no llevan a cabo las mismas funciones
y no se desarrollan en el mismo entorno.
La principal diferencia es que los asistentes virtuales son creados por las grandes
compañı́as tecnológicas con una ambición muy concreta: convertirse en nuestro asistente
personal, resolviendo todas las dudas que puedan surgir en cualquier momento. De todas
formas, cualquier compañı́a puede poner en marcha un chatbot. Para ello lo único que
necesita es ponerse en contacto con empresas especializadas que se encarguen de su
creación y entrenamiento. El objetivo de estas empresas a la hora de crear el asistente
es dinamizar sus comunicaciones empresariales y automatizar la relación con los cliente
en un formato conversacional al que todos estamos acostumbrados, el chat.
Otra de las diferencias es que si bien el objetivo de los asistentes virtuales es amplio, el
de los chatbots es más especı́fico. Los chatbots se crean con la finalidad de resolver una
acción clara con un objetivo concreto. Suele estar enfocada a la resolución de preguntas
Introducción 3
Y además la otra diferencia se resume en que a pesar de que ambos han nacido como
consecuencia del auge de la tecnologı́a conversacional, chatbots y asistentes virtuales
no se integran en los mismos entornos. Mientras que los asistentes virtuales nacen en
sı́ mismos como una nueva aplicación en el móvil y se alojan en un entorno completa-
mente novedoso que ya se conoce como Home Speakers o Home Devices, como Google
Home, Amazon Echo o HomePod de Apple, los chatbots se desarrollan en páginas webs,
apps de mensajerı́a, redes sociales o aplicaciones. Estos dispositivos son una nueva pla-
taforma por explotar para la introducción de chatbots y convertirse en el alma de los
Smart Speakers, que pronto formarán parte del mobiliario habitual de cualquier hogar.
[Foromarketing.com, 2018]
Existen, además, multitud de instituciones que publican datos abiertos. Tanto algunos
asistentes virtuales como chatbots consumen este tipo de datos para ofrecer respuestas
al usuario más elaboradas y con información actualizada[Link.springer.com, 2019]. Un
ejemplo son las bibliotecas digitales, como la BVMC, y Wikidata. Estos datos son com-
plejos de reutilizar debido a que se precisan conocimientos del lenguaje de consulta para
web semántica SPARQL. Hay una nueva tendencia que promueve la reutilización de las
colecciones digitales publicadas por organizaciones de patrimonio cultural como archivos,
museos y bibliotecas denominada GLAM Labs2 .
La propuesta, por tanto, está enfocada a integrar un asistente virtual para optimizar
los procesos de búsqueda de la BVMC. Principalmente para ayudar a las personas que
tienen dificultades para orientarse en su web pero también para agilizar este trabajo
a cualquier usuario que utilice sus servicios. Al asistente se le ha llamado Catalina en
honor a quien fue la esposa de Miguel de Cervantes. El asistente facilita el acceso a toda
la información de la biblioteca y además la completa gracias a lo que nos ofrece Wikidata
y a varias APIs externas con las que se comunica.
2
https://glamlabs.io/
2. Viabilidad
Para ello se utiliza Lean Canvas, que es una plantilla de plan de negocios de 1 pági-
na que ayuda a deconstruir una idea en sus supuestos clave utilizando 9 bloques de
5
6 2.1. Modelo de negocio, Lean Canvas
Los segmentos de mercado es una especie de clasificación de los clientes que va a tener
nuestro negocio. Básicamente es responder a la pregunta ¿Qué caracterı́sticas debe
tener una persona o empresa para convertirse en mi cliente potencial?
[Emprender-facil.com, 2018]
Tal como señala su nombre, los early adopters son aquellos primeros clientes que
adoptan un producto determinado. Los early adopters tienen problemas especı́ficos y
están a la búsqueda de productos que puedan solucionarlos, por ello son los primeros
clientes. A ellos no les importa si el producto es perfecto, incluso están dispuestos a
escribir acerca del producto para dar ideas de cómo mejorarlo, es decir crean un
feedback con la empresa. [Destinonegocio.com, 2015]
Para el asistente los early adopters, o usuarios ideales, serı́an clientes de bibliotecas
virtuales con un catálogo online. Básicamente son usuarios de las bibliotecas.
Este asistente virtual va a estar diseñado en concreto para la BVMC pero también
podrı́a modficarse ligeramente para poder ser utilizado en otras bibliotecas virtuales.
2.1.2. Problema
Básicamente en esta sección se trata de identificar cuales son los problemas que mi
producto resuelve al usuario y al cliente ya que los problemas de los clientes serán
distintos a los problemas de los usuarios. En este caso el problema que podrı́an tener
los clientes serı́a tener interfaces costosas y difı́ciles de adaptar a la actualidad para dar
a nuestros usuarios mucha información que no se sabe que está. Por ello la decisión de
integrar el asistente puede arreglar esto.
En cambio los problemas que el asistente resuelve a los usuarios son la dificultad de
encontrar la información que el usuario desea, además de agilizar el proceso, y el
desconocimiento por parte del mismo de conocer qué les ofrece la web.
La propuesta de valor única debe definir los productos o servicios que se ofrecen a un
segmento de clientes pero, sin embargo, no se han de destacar sus caracterı́sticas sino
más bien se ha de hacer hincapié en los beneficios que les aportamos a los clientes y en
los factores que nos diferencian de la competencia. [Emprender-facil.com, 2019]
Por ello indicar que el asistente ofrece acceso rápido a la información de la biblioteca,
otros servicios para uso cotidiano, monitorización del uso del asistente a los
administradores y resolución de dudas. Todo esto es lo que propone el proyecto que
aportará ese beneficio al usuario y que nos diferenciará de otros asistentes virtuales y
chatbots para bibliotecas virtuales.
2.1.4. Solución
Para obtener una solución al problema con el que se pueden encontrar los clientes
está el realizar una interfaz atractiva de cara al usuario y trabajar su funcionamiento
interno para poder ofrecer la información, la cual puede desconocer el usuario, de una
manera sencilla y eficaz mejorando ası́ la UX (experiencia de usuario).
Respecto a solucionar los problemas que podrı́an tener los usuarios, el asistente
agiliza las búsquedas de los recursos que tiene la biblioteca mediante el uso del lenguaje
natural ya que la base de toda relación humana es la comunicación y si dotamos a la
web de esta ayudará no solo a personas con un gran desconocimiento de la informática
y la web sino también a aquellos usuarios más cómodos y que deseen tenerlo todo a su
alcance con el menor número de clics posibles. Además tiene la capacidad de resolver
dudas al usuario acerca del sitio web. Es necesario entrenar al asistente virtual para
mejorar el número de respuestas válidas que este sea capaz de devolver al usuario.
Registrar y poder analizar los eventos o interacciones que hacen los usuarios es
necesario para que la comunidad de la biblioteca virtual siga creciendo ya que permite
saber si realmente el asistente está siendo utilizado o no y lo mismo para cada uno de
los servicios que este ofrece. Conocer esta información ayuda a los administradores a
plantearse si el asistente necesita ser modificado, actualizado o está teniendo éxito.
Esta información recogida es monitorizada mediante cuadros de mando para facilitar
su visualización y entendimiento.
Además hay diversas funcionalidades exclusivas del asistente que ofrecen información
para uso cotidiano como, por ejemplo, la posibilidad de obtener la predicción del
tiempo en España o de traducir un texto a otro idioma.
8 2.1. Modelo de negocio, Lean Canvas
2.1.5. Canales
Además se utilizaran las RRSS (Redes sociales) para anunciar la disponibilidad del
nuevo servicio de asistencia virtual para aquellos que no sepan de su existencia. Esto
último se realizará en cuanto esté disponible dicho asistente. Esto se anunciará sobre
todo a través de Twitter ya que es una de las redes sociales más utilizadas por la
biblioteca.
El mayor coste para este trabajo se centra en el valor del tiempo. Estudio de la
tecnologı́a, el tiempo que dura el desarrollo del mismo y la realización de pruebas para
ası́ validar el proyecto.
La cantidad de veces que se han solicitado las diferentes ediciones del quijote
almacenadas en la biblioteca a través del asistente virtual durante un cierto
periodo de tiempo.
Viabilidad 9
Se comenzará a ver si hay o no hay una mayor interacción con el contenido a través
del asistente. Si hay una mayor interacción con el contenido significará que se habrán
mejorado alguna de sus decadencias y ahora es una web que ha facilitado el acceso a
sus recursos y que estos son consultados con más frecuencia. Si aumentan las visitas a
la web y el tiempo de estancia de los usuarios en la misma significará que el asistente
ha cumplido con su fin.
Añadir que el periodo de tiempo del que se muestren los datos referenciados en los
KPIs se podrá modificar libremente en los cuadros de mando resultantes de los
mismos. Estos fueron implementados con la ayuda de la herramienta Grafana a la cual
se hará referencia más adelante.
podrı́an solicitar un servicio similar para ellas. Tan sólo habrı́a que adaptar ligeramente
el asistente y sin mucho trabajo contarı́an con una nueva versión para cada una de ellas.
Empresas de gran relevancia han apostado por esta tecnologı́a como Google, Apple,
Amazon o Microsoft con sus asistentes virtuales (Asistente de Google, Siri, Alexa y
Cortana respectivamente). Además se cuenta con contenido de la BVMC y de
Wikidata de donde el asistente sacará toda la información necesaria sobre los autores y
sus obras literarias.
2.2.1. Debilidades
Aun está en desarrollo este tipo de tecnologı́a y por lo tanto puede evolucionar
mucho de aquı́ a futuros años. Además es bastante innovador el tener un asistente
virtual disponible para la página web de una empresa y no muchas lo tienen, por ello
las empresas todavı́a no creen que pueda ser un canal. Además creen que pueden quitar
puestos de trabajo de los departamentos de Call Center.
Viabilidad 11
2.2.2. Amenazas
2.2.3. Fortalezas
2.2.4. Oportunidades
Desde el asistente virtual se puede saber cuáles son los trámites y búsquedas más
realizadas por los usuarios desde este al igual que otra información valiosa para los
administradores de la biblioteca. Este servicio que ofrece el asistente también
aumentará la satisfacción de los usuarios con respecto a lo que ofrece la web sin el
mismo. El asistente además completará la información de la biblioteca con los datos
que ofrece la API de Wikidata. Añadir que encima los usuarios están, ya hoy en dı́a,
acostumbrados a usar los chats.
ORGANIZACIONAL
Posible riesgo Probabilidad Efectos
Mala planificación Moderada Serio
REQUERIMIENTOS
Posible riesgo Probabilidad Efectos Estrategias
1.Prevención:
Testeo y
corregir errores.
2.Minimización:
Hacerla lo más
BBDD: modificaciones en datos o tablas Moderada Catastrófico
flexible posible
3.Plan de
contingencia: se
rediseña el
modelo.
Tabla 2.2.: Riesgos sobre los requerimientos
Viabilidad 13
TECNOLOGÍA
Posible riesgo Probabilidad Efectos Estrategias
1.Prevención:
Hacer estudio
exhaustivo y
testeo.
2.Minimización:
Hacer una
Dialogflow Baja Catastrófico planificación a
corto plazo
3.Plan de
contingencia:
pedir opinión a
una persona
externa.
Laravel Baja Serio
Angular Baja Serio
Express.js+Node.js Baja Serio
MySQL Baja Serio
SPARQL Moderada Serio
Grafana Baja Serio
Three.js Baja Serio
ESTIMACIÓN
Posible riesgo Probabilidad Efectos
Mala organización de preferencias Baja Serio
Adición de nuevas tareas Moderada Serio
HERRAMIENTAS
Posible riesgo Probabilidad Efectos
Toggl: Versión gratuita incompleta Alta Tolerable
Git: Falta de formación Moderada Tolerable
Visual Studio Code: Mal manejo del programa Baja Tolerable
Postman: Falta de experiencia al utilizarlo Baja Tolerable
Apache y MySQL: Errores con el servidor y la BBDD locales Baja Serio
Blender: Necesidad de trabajar el modelado 3D Moderada Tolerable
PERSONAS
Posible riesgo Probabilidad Efectos
Errores en programación Moderada Tolerable
Falta de conocimientos Moderada Serio
Tiempo limitado Moderada Serio
Enfermedad Muy baja Tolerable
3.1. Generales
El objetivo general del proyecto es crear un asistente virtual para la BVMC que
mejore la experiencia de usuario del sitio web y facilite el acceso a los usuarios.
3.2. Especı́ficos
15
4. Marco Teórico
Según una encuesta realizada a principios de 2019 cerca del 90 por ciento de los
encuestados afirman que prefieren el asistente virtual Siri, propiedad de Apple, en su
vida diaria, mientras que un 11,6 por ciento opta por el asistente de Google, un 9,8 por
ciento por Alexa (Amazon), un 8,9 por ciento Cortana (Microsoft), un 6,5 por ciento
Bixby (Samsung) y un 2,5 por ciento Aura (Movistar). [Ipmark.com, 2019]
Si comparamos los 4 asistentes más utilizados según esta encuesta podemos sacar
ciertas conclusiones. Todos están siendo mejorados en cuanto a su comprensión como
en cuanto a las respuestas que ofrecen a los usuarios para sus preguntas. Esta
constante mejora es posible gracias a las empresas internacionales más grandes que
utilizan a personas para mejorar su IA.
17
18 4.1. Asistentes virtuales
Ası́ que se realizó una prueba similar de inteligencia, pero esta vez se centró
únicamente en las capacidades de asistente en el teléfono y además ya no evaluaron a
Cortana porque Microsoft decidió el año pasado que ya no era un competidor con
Alexa, Google Assistant y Siri.
El Asistente de Google sigue en la cima, pero ahora con un puntaje de 92.9 por
ciento por responder preguntas correctamente. Siri responde correctamente el 83.1 por
ciento de las preguntas, mientras que Alexa obtiene el 79.8 por ciento de respuestas
Marco Teórico 19
Como se puede observar en la Figura 4.2, Google Assistant supera a los otros dos en
todo excepto a Siri en comandos. A Alexa se le permite quedar por debajo de los demás
por el hecho de no estar integrada en dispositivos móviles, cosa que tanto Google
Assistant en Android como Siri en iOS lo están. Alexa vive en una aplicación de
terceros que puede enviar mensajes de voz y llamar a otros dispositivos Alexa pero no
puede enviar mensajes de texto, correos electrónicos o realizar una llamada telefónica.
Los asistentes virtuales también son muy útiles en el área de la educación. Pueden
mejorar la comunicación entre alumnos y profesores además de falicitar ciertos
trámites. Dos ejemplos son:
Instituciones de todo tipo han comenzado a publicar sus datos en abierto pudiendo
ser reutilizados de múltiples formas. Los repositorios basados en Web Semántica
proporcionan una fuente rica para alimentar y entrenar un asistente virtual. Un claro
ejemplo son las bibliotecas nacionales que ofrecen su contenido para que aplicaciones
de terceros puedan acceder a él y utilizarlo.
La Web Semántica permite a los usuarios delegar tareas en software resolviendo ası́
estos dos problemas. El software es capaz de procesar, razonar y combinar con su
contenido además de realizar deducciones lógicas para resolver de manera automática
problemas cotidianos.
La Web Semántica es, por lo tanto, una Web extendida dotada de mayor significado
en la que cualquier usuario en Internet podrá encontrar respuestas a sus preguntas de
forma más sencilla y veloz gracias a una información mucho mejor definida. Al dotar a
la Web de más semántica se pueden obtener soluciones a problemas habituales en la
búsqueda de información gracias a que este tipo de webs utilizan una infraestructura
común. Esta arquitectura hace posible compartir, procesar y transferir información de
forma sencilla. Todos los problemas que puede ocasionar una Web carente de
semántica, debido a la dificultad que algunas veces puede tener el buscar cierta
información, se resuelven gracias a esta Web extendida y basada en el significado que
se apoya en lenguajes universales. [W3c.es, 2005]
Para obtener una adecuada definición de los datos, la Web Semántica utiliza
esencialmente RDF, SPARQL y OWL, mecanismos que ayudan a convertir la Web en
una infraestructura global con la posibilidad de compartir y reutilizar documentos y
datos entre diferentes tipos de usuarios:
Figura 4.3.: Ejemplo que muestra cómo se convierte una consulta SQL a SPARQL
En la Figura 4.3 se observa como serı́a tanto con el lenguaje de consulta SQL
(arriba) como con el lenguaje de consulta SPARQL (abajo) solicitar el nombre, la edad
y el tipo de empleado de las personas registradas en la base de datos (en el caso de
SQL) o en el repositorio de datos abiertos (en el caso de SPARQL). En el caso de la
consulta SQL se relacionan las tablas Persona y Empleado mediante el identificador ya
que se tiene una clave ajena. En el caso de SPARQL se basa en las tripletas RDF para
llegar a conectar los datos y mostrar finalmente lo que se solicita.
Numerosas bibliotecas han publicado sus datos en abierto con el objetivo de ser
reutilizadas y enriquecidas como por ejemplo:
Biblioteca Nacional de Francia (BNF)4 : Se estima que cuenta con treinta millones
de volúmenes. La BNF ofrece sus recursos reuniendo en una sola página toda la
información de sus diversos catálogos, ası́ como su biblioteca digital Gallica. Para
ello se utilizan herramientas basadas en Web Semántica, como SPARQL, desde
las cuales se tiene acceso a sus datos abiertos.
4
https://data.bnf.fr/
5
http://data.cervantesvirtual.com/blog/
6
https://bnb.data.bl.uk/
Marco Teórico 25
Los repositorios de datos abiertos publicados por las bibliotecas pueden ser una fuente
de conocimiento para poder proporcionar información a los usuarios y ofrecerles sus
servicios. Sin estas bases de conocimiento los asistentes no tendrı́an ninguna forma
rápida, sencilla y efectiva de obtener información actualizada sobre obras y autores por
lo que serı́an mucho más tediosos de desarrollar. Las bibliotecas todavı́a no explotan en
forma de chatbot sus repositorios semánticos. Sin embargo, algunos ejemplos como KB
Lab bot7 sı́ lo hacen. KB Lab bot accede a una selección de imágenes que están
disponibles en el sitio web Geheugen van Nederland (Memoria de los Paı́ses Bajos).
Este sitio web es una base de datos que contiene pinturas, dibujos, fotografı́as,
esculturas, cerámicas, sellos, carteles y recortes de periódicos de más de un centenar de
museos, archivos y bibliotecas holandesas. Además, las imágenes mostradas desde KB
Lab Bot están libres de derechos de autor.
7
https://lab.kb.nl/tool/kb-lab-bot
26 4.2. Fuentes de datos
8
https://www.kb.nl/blogs/digitale-geesteswetenschappen/the-making-of-the-kb-lab-bot
Marco Teórico 27
4.2.3. Wikidata
Wikidata es una base abierta de conocimiento libre que puede ser leı́da y editada por
tanto seres humanos como por boots. [Wikidata.org, 2019] Sus principales objetivos
son el almacenamiento central para los datos estructurados de sus proyectos hermanos
Wikimedia (Wikipedia, Wikivoyage. . . ), proporcionar un sistema colaborativo para
almacenar información estructurada, incluye interrelaciones con otros conjuntos de
datos abiertos y proporcionar una interfaz pública para realizar consultas ricas en
datos.
Para bots pequeños o que se basen principalmente en proveer contenido, utilizar una
plataforma es ideal, la lógica del bot es muy sencilla de estructurar, en muchas se
facilita un motor de entendimiento y se puede publicar en varios canales con solo
pulsar un botón.
9
https://www.xenioo.com/en/
10
https://www.voiceflow.com/
28 4.3. Tecnologı́as para implementar un asistente virtual
Por otro lado, Tensorflow es una librerı́a de código abierto desarrollada por Google
para aprendizaje automático. [Tensorflow.org, 2020] Esta librerı́a fue creada para poder
satisfacer las necesidades de aquellos sistemas que buscan ser capaces de detectar y
descifrar correlaciones y patrones análogos al aprendizaje y razonamiento utilizado por
los seres humanos. Por ello, utilizando Tensorflow, es posible construir y entrenar redes
neuronales. Actualmente es utilizado tanto en la investigación como en los productos
de Google frecuentemente reemplazando el rol de su predecesor de código cerrado,
DistBelief. TensorFlow fue originalmente desarrollado por el equipo de Google Brain
para uso interno en Google antes de ser publicado bajo la licencia de código abierto
Apache 2.0 en 2015.
4.3.1. Dialogflow
Dialogflow tiene soporte para varios idiomas y edición de código en lı́nea además de
un SDK en múltiples lenguajes de programación. [Dialogflow.com, 2020]
11
https://dev.botframework.com/
12
https://dialogflow.com/
13
https://aws.amazon.com/es/lex/
Marco Teórico 29
Detect Intent API: para consultar la intención del usuario en un texto desde
cualquier medio externo.
Hay multitud de frameworks que permiten implementar hoy en dı́a tanto la parte del
backend como la del frontend en una aplicación web. Para seleccionar las tecnologı́as
más adecuadas para un proyecto se han de estudiar las diferentes caracterı́sticas que
ofrecen los frameworks y cuáles son los objetivos del proyecto que se va a desarrollar.
Cada framework se basa en un lenguaje de programación en especı́fico. Es muy
importante tener en cuenta este lenguaje y valorar si facilitará o complicará el
desarrollo del proyecto que se quiere llevar a cabo, pero también hay que ser consciente
de cuál es el grado de conocimiento que se tiene del mismo a la hora de elegir una
tecnologı́a. Por último se ha considerar el nivel de compatibilidad que tiene la
tecnologı́a elegida para desarrollar el backend con la elegida para el frontend.
A continuación se muestran las distintas tecnologı́as que pueden ser utilizadas para
el desarrollo del backend:
Grafana: Grafana es un software libre que está basado en licencia de Apache 2.0.
Este permite la visualización y el formato de datos métricos. Además se pueden
crear cuadros de mando y gráficos a partir de múltiples fuentes, incluidas bases
de datos de series de tiempo como Graphite, InfluxDB y OpenTSDB.
[Grafana.com, 2020]
Con respecto a las tecnologı́as que existen para implementar la parte del frontend se
detallan las siguientes:
15
https://www.mysql.com/
16
https://www.mongodb.com/es
32 4.4. Tecnologı́as para implementar el backend y el frontend
React: Es una biblioteca Javascript de código abierto. Fue diseñada para poder
crear interfaces de usuario. Su principal objetivo es el de facilitar el desarrollo de
aplicaciones en una sola página. React trata de ayudar a los desarrolladores a
construir aplicaciones que usan datos que van cambiando todo el tiempo. Su
objetivo es ser fácil de combinar, sencillo y declarativo. React sólo maneja la
interfaz de usuario en una aplicación ya que serı́a la Vista en un contexto en el
que se use el patrón MVC o Modelo-vista-modelo de vista (MVVM). También
puede ser utilizado con las extensiones de React-based que se encargan de las
partes no-UI (que no forman parte de la interfaz de usuario) de una aplicación
web. [Es.reactjs.org, 2020]
Horoscopo-cli17 : API REST que permite visualizar el horóscopo del dı́a para un
signo especı́fico en los siguientes aspectos: amor, dinero y salud.
Twitter API: Twitter permite acceder a partes de sus servicios mediante su API
para permitir a las personas crear software que se integre con Twitter. Los datos
de Twitter son únicos y se extraen a partir de datos de la mayorı́a de las otras
plataformas sociales porque reflejan información que los usuarios deciden
compartir de forma pública. Su API ofrece acceso amplio a los datos de Twitter
que los usuarios han decidido compartir con el mundo. Twitter también es
compatible con APIs que permiten a los usuarios administrar su propia
información de Twitter que no es pública (como los Mensajes directos) y
ofrecerla a los desarrolladores que ellos han autorizado a administrarla.
[Developer.twitter.com, 2020]
Bing Web Search API: API desarrollada por Microsoft. Permite incorporar el
servicio de búsqueda inteligente a las aplicaciones. También permite combinar
millones de páginas web, imágenes, vı́deos y noticias en los resultados de las
búsquedas. [Azure.microsoft.com, 2020]
17
https://github.com/joacorandom/horoscopo-cli
34 4.5. UX y diseño
4.5. UX y diseño
18
https://rapidapi.com/faroo/api/faroo-web-search/
5. Metodologı́a
Esta metodologı́a permite abordar proyectos complejos que exigen una flexibilidad y
una rapidez esencial a la hora de ejecutar los resultados. La estrategia irá orientada a
gestionar y normalizar los errores que se puedan producir en desarrollos demasiado
largos a través de reuniones frecuentes para asegurar el cumplimiento de los objetivos
establecidos. [Iebschool.com, 2019]
Estas reuniones presenciales se han llevado a cabo con los tutores asignados al
proyecto con una frecuencia mensual. También se ha tenido comunicación con ellos
mediante correo electrónico semanalmente.
35
36
1
https://github.com/PabloGuijarroMarco/APIRestful
Metodologı́a 37
Para la gestión del proyecto se utilizó un control de versiones que permite registrar
los cambios realizados sobre el proyecto a lo largo del tiempo de tal manera que es
posible recuperar versiones especı́ficas más adelante. Dicho control de versiones se usa
para acceder al registro de modificaciones sobre un fichero. Esto permite ver los
comentarios asociados a cada modificación y la persona que la ha realizado. Además
existe la posibilidad de regresar al estado anterior de un fichero o conjunto de ficheros
y se pueden crear ramas para gestionar cambios que finalmente se mezclarán con la
rama principal. La herramienta que se utiliza es GitKraken, una interfaz gráfica
multiplataforma para git desarrollada con Electron. De forma muy sencilla se puede
llevar el completo seguimiento de los repositorios, gestionar las ramas y tags existentes,
consultar el historial de trabajo y commits, entre otras acciones. Esta se enlaza con
GitHub para evitar el uso de la consola ya que de forma visual y por medio de clicks se
realizan de una manera mucho más sencilla. Finalmente la visualizacion de las ramas y
el historial de commits se mejora con esta herramienta que por consola resulta complejo
de entender. [Platzi.com, 2017] La Figura 5.1. muestra los últimos commits realizados
en el proyecto en el momento en el que se realizó la captura. Además se aprecia que el
repositorio estaba totalmente actualizado a lo que habı́a en local en ese momento.
6. Análisis y especificación
En este capı́tulo se describen todos aquellos factores que afectan al producto y a sus
requisitos sin describir los requerimientos. Además, este capı́tulo también incluye la
descripción de los requisitos especı́ficos.
Se puede estudiar la frecuencia de uso por parte de los usuarios del asistente y de sus
funcionalidades gracias a los cuadros de mando. Esto permite poder sacar conclusiones
para futuras mejoras del asistente. Para ofrecer las distintas funcionalidades, el sistema
se nutrirá tanto de APIs e información de terceros como de la misma biblioteca.
El asistente virtual dispone de distintas funcionalidades que son accesibles para todo
aquel que visite el sitio web de la BVMC:
Pedir la previsión del tiempo del dı́a de hoy o del dı́a siguiente para España.
39
40 6.3. Restricciones
Ofrecer una interfaz gráfica que combina elementos 2D con elementos 3D.
Además, los administradores del sistema tendrán acceso a cuadros de mandos que les
permitirán monitorizar el uso del asistente virtual y de sus distintas funcionalidades.
De esta manera, se podrán identificar las funcionalidades más utilizadas y la frecuencia
para realizar mejoras.
6.3. Restricciones
El sistema necesita de una base de datos (BD) para registrar la actividad de los
usuarios a través del asistente y ası́ poder generar los cuadros de mando.
Requisito RF-1
Nombre Mantener una conversación
Descripción Es la posibilidad de enviar mensajes al asistente y recibir las respuestas del mismo.
Estas respuestas han de ser acordes a lo expresado por el usuario.
Prioridad Muy alta
Requisito RF-2
Nombre Resolver dudas
Descripción Resolver dudas acerca de la web realizando una pregunta al asistente.
Prioridad Alta
Requisito RF-3
Nombre Conocer predicción del tiempo
Descripción Solicitar la predicción del tiempo del dı́a o del dı́a siguiente.
Prioridad Media
Requisito RF-4
Nombre Informar sobre Miguel de Cervantes
Descripción Solicitar información sobre Miguel de Cervantes.
Prioridad Alta
Requisito RF-5
Nombre Consultar obras disponibles en cierto idioma
Descripción Dar acceso a las obras almacenadas en la BVMC en un idioma en concreto.
Prioridad Muy alta
Requisito RF-6
Nombre Consultar ediciones del Quijote
Descripción Solicitar todas las ediciones de El Quijote almacenadas en la BVMC.
Prioridad Muy alta
Requisito RF-7
Nombre Solicitar predicción horóscopo
Descripción Solicitar la predicción diaria del horóscopo.
Prioridad Media
Requisito RF-8
Nombre Realizar traducciones
Descripción Posibilidad de traducir un texto a otro idioma.
Prioridad Media
Requisito RF-9
Nombre Realizar búsquedas de contenido de la BVMC
Descripción Posibilidad de buscar autores, obras y las obras de un autor registradas en la BVMC.
Prioridad Muy Alta
Requisito RF-10
Nombre Mostrar últimos tweets de la BVMC
Descripción Mostrar los últimos tweets publicados en la cuenta de Twitter de la BVMC.
Prioridad Alta
Requisito RF-11
Nombre Mostrar vı́deos del canal de YouTube de la BVMC
Descripción Mostrar vı́deos subidos al canal de YouTube de la BVMC.
Prioridad Alta
Tabla 6.11.: Requerimiento funcional mostrar vı́deos del canal de YouTube de la BVMC
44 6.4. Requisitos especı́ficos
Requisito RF-12
Nombre Solicitar noticias de actualidad
Descripción Solicitar noticias actuales publicadas en Internet.
Prioridad Media
Requisito RF-13
Nombre Realizar búsquedas de páginas web
Descripción Solicitar resultados web utilizando el motor de búsqueda integrado en el asistente.
Prioridad Media
Requisito RF-14
Nombre Registrar acción
Descripción Registrar en la base de datos las acciones que realiza el usuario.
Prioridad Alta
Requisito RF-15
Nombre Generar cuadros de mando
Descripción Mostrar el registro almacenado en la base de datos de forma visual.
Prioridad Alta
Requisito RNF-1
Nombre Disponibilidad
Descripción El sistema podrá ser utilizado 24 horas al dı́a, 7 dı́as a la semana y por infinitud de usuarios a la vez.
Prioridad Muy alta
Requisito RNF-2
Nombre Seguridad
Descripción Todas las peticiones son a APIs externas con una gran seguridad (API Keys, permisos...)
Prioridad Muy alta
Requisito RNF-3
Nombre Rendimiento
Descripción Capacidad del asistente de responder en tiempo real a los mensajes del usuario.
Prioridad Muy alta
Requisito RNF-4
Nombre Multiplataforma
Descripción Interfaz preparada para ser visualizada en escritorio y dispositivos móviles.
Prioridad Muy alta
Requisito RNF-5
Nombre Ofrecer interfaz atractiva
Descripción Implementar la interfaz combinando elementos 2D con otros 3D.
Prioridad Alta
Además, el protocolo REST facilita que los desarrollos de las diferentes partes de un
proyecto se puedan dar de manera independiente.
49
50 7.1. Arquitectura seleccionada
7.2. Tecnologı́as
Laravel: En este proyecto se ha utilizado para desarrollar una API RESTful para
poder almacenar en una base de datos MySQL todas las acciones que realizan los
usuarios para su posterior monitorización mediante cuadros de mando.
MySQL: Se ha creado una base de datos de este tipo para obtener un registro de
las acciones realizadas por los usuarios a través del asistente virtual. Este registro
se utiliza para generar cuadros de mando para que los administradores analicen y
estudien el uso que se le da al asistente.
Grafana: Este software se utiliza para generar los cuadros de mando basándose en
los datos recogidos en la base de datos comentada anteriormente.
Con respecto a las tecnologı́as que se han utilizado en la parte del frontend se
detallan las siguientes:
Twitter API: Se ha utilizado para que el asistente sea capaz de mostrar los
últimos Tweets publicados por la BVMC en su cuenta de Twitter.
1
data.cervantesvirtual.com/sparql
54 7.3. Diagrama de clases
En la figura 7.3 se puede observar la estructura del proyecto. La clase interfaz está
conectada con el resto de clases en las que se almacenan las acciones realizadas por el
usuario desde el asistente.
7.4. Mockups
2
https://app.botsociety.io/s/5dbacacaf7e56854c74ab005?p=9964926023bd4fdeec1dc6861197c48b6461f92fdesktop=false
3
https://app.botsociety.io/s/5dbacacaf7e56854c74ab005?p=9964926023bd4fdeec1dc6861197c48b6461f92fdesktop=true
56 7.4. Mockups
En primer lugar, se instaló el software necesario para poder desarrollar esta parte del
proyecto y las herramientas necesarias para más adelante desarrollar el frontend (PHP
con XAMPP, Composer, Visual Studio Code, Node, NPM y Postman). Después se
obtuvo la estructura completa de Laravel y se instalaron todas sus dependencias por
medio de composer obteniendo como resultado la estructura básica de la API RESTful.
Se copió el proyecto dentro de la carpeta xampp/htdocs/ de XAMPP, programa que
me permite utilizar Apache y MySQL para el proyecto en local.
Tras esto, se actualizó el archivo .env del proyecto Laravel agregando el dominio de
desarrollo del sistema y configurando las variables de entorno para ası́ permitir al
proyecto conectarse con el servidor y base de datos locales que ofrece XAMPP.
Listado 8.1: Primeras lı́neas del archivo .env del proyecto Laravel
1 APP_NAME = Laravel
2 APP_ENV = local
3 APP_KEY =...
4 APP_DEBUG = true
5 APP_LOG_LEVEL = debug
6 APP_URL = http :// localhost :4200
7 API_URL = http :// apirestful . test
8
9 DB_CONNECTION = mysql
10 DB_HOST =127.0.0.1
11 DB_PORT =3306
12 DB_DATABASE = homestead
13 DB_USERNAME = root
14 DB_PASSWORD =
15 ...
63
64 8.2. Frontend Parte 1
Para que esta conexión se diese también se modificó un archivo del sistema de
Windows y otro de XAMPP agregándoles también el dominio de desarrollo del
sistema. También se modificó la configuración de las rutas para el proyecto Laravel y
ası́ poder distinguir las rutas para hacer peticiones a la API de las rutas de la web. De
esta manera se dejó configurada la estructura del proyecto.
Para ello se comenzó a crear la estructura inicial de la API RESTful, es decir, tanto
la estructura inicial de los modelos y sus migraciones como la de los controladores y las
rutas de recurso para cada controlador. Se decidió crear tan solo un modelo y un
controlador para comprobar que funcionaba la API, el resto se dejaron para más
adelante. Además se prepararon sus rutas correspondientes para realizar las peticiones.
En este momento se instaló GitKraken para conectarlo con un nuevo repositorio en
GitHub para este proyecto y ası́ poder mantener un control de las versiones del mismo
durante su desarrollo. Se añadieron entonces los atributos al modelo de ejemplo que se
habı́a creado y se preparó la migración del mismo para poder crear su tabla
correspondiente en la base de datos. También se implementó una semilla para probar a
insertar datos a la tabla una vez creada. Estos datos a insertar mediante la semilla se
generan automáticamente gracias a la librerı́a faker de Laravel. Se cambió la zona
horaria del proyecto modificando en la lı́nea ’timezone’ su valor ’UTC’ por
’Europe/Madrid’ situada en el archivo app.php dentro de la carpeta config. Tras esto
se comprobó que funcionaba correctamente la migración a la base de datos y se
implementaron los métodos Index y Store del controlador de ejemplo. Estos son los
métodos que se ejecutan al realizar las peticiones GET y POST respectivamente.
Se comprobó utilizando Postman que las rutas para realizar las peticiones GET y
POST del controlador de ejemplo funcionaban correctamente. Al realizar la petición
GET se obtenı́an todos los datos de la tabla creada en la base de datos local y al
realizar la petición POST se insertaba una nueva fila de datos en la tabla con éxito. En
este momento se decidió comenzar con el desarrollo del Frontend.
Lo primero que se hizo fue crear un nuevo agente en Dialogflow. Al agente o asistente
virtual se le añadieron un conjunto de intents conocidos en Dialogflow como Small Talk
que conforman las preguntas básicas que se le podrı́an realizar al asistente. Varios
ejemplos serı́an preguntas como ¿Cómo te llamas?, ¿Quién es tu jefe? o ¿Tienes novio?.
Implementación 65
Este tipo de preguntas suelen ser habituales en la interacción con un asistente virtual.
5. Para añadir nuevos valores al array se utiliza un operador ‘scan’. Cada vez que se
emita un mensaje, se concatenará al anterior.
6. En el HTML del componente chat se usa ‘ngClass’ para cada mensaje para
aplicar en él una clase condicional ‘to’ o ‘from’ para determinar si el mensaje
proviene del usuario o del chatbot. Con ‘ngModel’ creamos un formulario que
envı́a el mensaje cuando se pulse la tecla ‘Enter’.
7. Por último se le dio un estilo sencillo a la interfaz mediante CSS el cual se ha ido
puliendo y actualizando constantemente. Se tuvo en cuenta el diseño previo
realizado en los Mockups mostrados en el capı́tulo 7.
Se crearon un total de 14 intents que sacaban datos de Wikidata para informar sobre
Miguel de Cervantes Saavedra. Por ejemplo, el asistente da respuesta a preguntas sobre
él como cuál fue la causa de su muerte, cuándo y dónde nació, cuáles fueron las obras
que escribió...
Fue necesario instalar un módulo de Angular para hacer peticiones HTTP llamado
HttpClient. Este módulo permite crear una variable (en este caso se llama http) desde
la que se puede realizar una petición de cualquier tipo, en este caso una petición GET.
En la url de la petición se ha puesto ... en dos partes ya que ahı́ variará la información
de una petición a otra. En los primeros puntos suspensivos se aclararı́a qué es lo que
estás solicitando de la API de AEMET y en los segundos se pondrı́a la API Key
facilitada por AEMET en el correo electrónico para poder ası́ consumir datos de su
API.
España del dı́a siguiente al actual. Los datos devueltos en JSON de la petición GET se
almacenan en la variable resultData y más adelante se almacena en otra variable una
url (por eso se ha llamado ası́ a la nueva variable) que nos envı́a a la predicción del
tiempo solicitada. En vez de dar la información en formato JSON para posteriormente
ser parseada y tratada, AEMET manda un enlace que redirige a un texto en el que se
explica la predicción solicitada. Este enlace es el que devuelve el asistente cuando se le
solicita la predicción del tiempo.
Al igual que para hacer peticiones a Wikidata, la BVMC utiliza SPARQL por lo que
en la variable sparqlQuery va la consulta pertinente. Los resultados (el JSON devuelto
por la petición) se almacenan en la variable resultData. En un primer momento, no
funcionaba este código debido a que saltaba un error de AccessControlCors por usar
diferentes dominios. Esto sucedı́a por haber creado un pequeño servicio que realizaba
la petición y lo devolvı́a como respuesta. La forma en la que se solucionó el problema
fue con la implementación de un proxy en el proyecto Angular:
Este código permite que el navegador deje que se reciban datos del sitio web de la
BVMC y se encuentra en un archivo que se creó entonces situado en la raı́z del
Implementación 69
proyecto Angular (en la carpeta frontend) al que se le llamó proxy.conf.json. Tras esto
se modificó en el archivo package.json, situado también en la raı́z del proyecto Angular,
la lı́nea ”start”: ”ng serve”quedándose ”start”: ”ng serve –proxy-config
proxy.conf.json”. Esto se modificó para que cada vez que se inicie el proyecto Angular
con el comando npm start en la consola, este tome en cuenta el proxy desarrollado y
ası́ evitar el error de AccessControlCors. Antes de este arreglo el comando que se
utilizaba para ejecutar el proyecto Angular era ng serve.
Teniendo este error solucionando y cogiendo ası́ datos de la BVMC sin ningún
problema se continuó con la implementación de intents. Se comenzó por uno para
ofrecer al usuario todas las versiones registradas en la BVMC del Quijote. Después se
entrenó al asistente para que fuese capaz de ofrecer las obras almacenadas en el idioma
que pida el usuario en la BVMC. Es decir, si el usuario le pide al asistente las obras
almacenadas en la BVMC en valenciano este le ofrecerá acceder a sólo las obras que la
biblioteca posee en valenciano. Esto lo hace con todos los idiomas disponibles en la
totalidad de obras almacenadas en la biblioteca. También a modo informativo el
usuario le puede preguntar por este número total de idiomas en los que posee obras la
biblioteca.
Aclarar que tanto para los datos obtenido de la BVMC como para los de Wikidata o
los de la API de AEMET se sigue el siguiente proceso para que el asistente sea capaz
de mostrar estos datos en sus respuestas:
4. Dependiendo de cuál sea el mensaje se realiza una petición para Wikidata, para
la BVMC o para AEMET. Esta petición se realiza y, tras ello, se elabora una
respuesta fija con ciertos datos o enlaces variables que dependerán de los
resultados de la petición. Por ejemplo: Miguel de Cervantes nació en el año X en
Y. Parte del mensaje es estático pero el año (la X) y el lugar (la Y) son datos
cogidos del resultado de la petición, por lo que si estos datos son actualizados en
el sitio del que se han solicitado también se actualiza esta respuesta. Esto
también sucede con enlaces como los de la predicción del tiempo. Por eso si se le
pide al asistente la predicción de dı́a de hoy siempre devuelve el enlace que ofrece
la predicción del dı́a actual ya que esto es lo que le devuelve la API de AEMET y
esta se actualiza cada dı́a.
En los resultados devuelve la predicción diaria de cada uno de los signos. Dependiendo
de cuál haya pedido el usuario, desde TypeScript se prepara la respuesta del asistente
con la predicción de un signo u otro.
1
https://github.com/joacorandom/horoscopo-cli
Implementación 71
En el primer método los puntos suspensivos representan a la API Key que proporciona
Yandex al registrarse para utilizar su API y los segundos el texto del que se quiere
detectar el idioma. En el segundo método los primeros puntos suspensivos representan
a la API Key ya mencionada, los segundos el texto a traducir y los terceros el idioma
al que se quiere traducir el texto. La variable this.resultData.lang contiene el idioma
detectado en el primer método y por tanto es el idioma en el que se encuentra el texto
del que se va a realizar la traducción.
Tras esto se arreglaron algunos fallos de la interfaz del asistente como evitar que se
puedan mandar mensajes en blanco. También se implementaron las funcionalidades de
buscar autor y de buscar obra de las almacenadas en la BVMC. Para ello se utilizaron
nuevas consultas SPARQL, como en las funcionalidades de buscar obras en cierto
idioma o de solicitar las ediciones de la obra El ingenioso hidalgo Don Quijote de la
Mancha, que se comentan en el Anexo III (C). El código de TypeScript para realizar
las llamadas es el mismo utilizado en las otras funcionalidades que solicitan datos a la
biblioteca.
Los resultados en ambos casos son filtrados ya que devuelven algunos resultados que
no son lo que se desea mostrar. En el primer caso, tras filtrar, sólo imprime noticias que
72 8.2. Frontend Parte 1
estén en castellano y en el segundo caso sólo muestra vı́deos que han sido subidos al
canal oficial de la BVMC. Si no se filtrasen mostrarı́a noticias en multitud de idiomas y
se mostrarı́an vı́deos que, aunque tengan en su mayorı́a que ver con la BVMC, no están
subidos en el canal oficial de la biblioteca. Añadir que en los puntos suspensivos de
ambas llamadas va el token que trawlingweb.com ofrece al desarrollador.
Para realizar la llamada a FAROO API se utiliza el método fetch(). En él se indica
la url a la que se va a realizar la llamada, que va a ser una petición GET, las cabeceras
y cors. Si falla la petición se muestra el error en la consola. Si por lo contrario se
realiza con éxito se devuelve text del contenido de la respuesta y se parsea a JSON
para el posterior uso y manejo de los resultados. Añadir que en los primeros puntos
suspensivos van las palabras clave con las que realizar la búsqueda de páginas web y en
los segundos va la API Key necesaria para utilizar la API. El uso de FAROO API es
facilitado por RapidAPI2 que es un buscador de APIs gratuitas para desarrolladores y
hace de intermediario en las llamadas de este servicio.
2
https://rapidapi.com/
Implementación 73
Lo primero que se hizo fue crear una nueva carpeta llamada backend dentro de
resources/frontend. En esta carpeta se instaló Express.js y algunos comandos que se
iban a utilizar ejecutando en la consola ’npm install express request body-parser
–save-dev’. Express.js es un framework para Node.js que sirve para ayudarnos a crear
aplicaciones web en menos tiempo ya que nos proporciona funcionalidades como el
enrutamiento, opciones para gestionar sesiones y cookies... Tras la instalación se creó
un nuevo archivo dentro de la carpeta backend llamado server.js en el que se indicó
todo lo que se debe ejecutar al iniciar este servidor y las rutas disponibles con sus
respectivas funciones a ejecutar cuando se les llama.
Listado 8.13: Backend creado para hacer llamadas a la API de Twitter (server.js)
1 var express = require ( ’ express ’) ;
2 var bodyParser = require ( ’ body - parser ’) ;
3 var cors = require ( ’ cors ’) ;
4 var functions = require ( ’./ functions ’) ;
5
6 var app = express () ;
7
8 app . use ( bodyParser . urlencoded ({ extended : true }) ) ;
9 app . use ( cors () ) ;
10 app . post ( ’/ authorize ’ , functions . authorize ) ;
11 app . post ( ’/ search ’ , functions . search ) ;
12
13 app . listen (3000) ;
Tras esto se creó otro archivo en la carpeta backend al que se le llamó config.js en el
que se escribieron las API Keys que Twitter habı́a dado en su correo. Estas se ponen
en donde se encuentran los puntos suspensivos. La variable bearertoken se deja vacı́a
puesto que es donde se almacena posteriormente la clave de autorización que tras
enviar las API Keys Twitter nos devuelve y con la que ya se nos permite realizar
llamadas a la API de Twitter.
Listado 8.14: Backend creado para hacer llamadas a la API de Twitter (config.js)
1 var appsettings = {
2 consumerKey : ’... ’ ,
3 consumersecret : ’... ’ ,
4 bearertoken : ’’
5 };
6
7 module . exports = appsettings ;
Listado 8.15: Backend creado para hacer llamadas a la API de Twitter (functions.js)
1 var request = require ( ’ request ’) ;
2 var config = require ( ’./ config ’) ;
3
4 functions = {
5 authorize : function ( req , res ) {
6 var header = config . consumerKey + ’: ’+ config . consumersecret ;
7 var encheader = new Buffer ( header ) . toString ( ’ base64 ’) ;
8 var finalheader = ’ Basic ’ + encheader ;
9 request . post ( ’ https :// api . twitter . com / oauth2 / token ’ , { form
: { ’ grant_type ’: ’ client_credentials ’} ,
10 headers : { Authorization : finalheader }} , function ( error ,
response , body ) {
11 if ( error )
12 console . log ( error ) ;
13 else {
14 config . bearertoken = JSON . parse ( body ) . access_token ;
15 res . json ({ success : true , data : config . bearertoken })
;
16 }
17 })
18 },
19 search : function ( req , res ) {
20 var bearerheader = ’ Bearer ’ + config . bearertoken ;
21 request . get ( ’ https :// api . twitter . com /1.1/ statuses /
user_timeline . json ? screen_name = FBVMC ’ , { headers :{
Authorization : bearerheader }} , function ( error , body ,
response ) {
22 if ( error )
23 console . log ( error ) ;
24 else {
25 res . json ({ success : true , data : JSON . parse ( body .
body ) }) ;
26 }
27 })
28 }
29 }
30
Para ejecutar este servidor y que la funcionalidad de obtener los últimos tweets de la
cuenta de la BVMC vaya correctamente se ha de abrir un segundo terminal en la
consola (el primero estarı́a ejecutando el proyecto Angular), situarse en la carpeta
resources/frontend/backend del proyecto y ejecutar el comando ’node server.js’. En
este momento se estará ejecutando el servidor y en consecuencia la funcionalidad de
Twitter puede ser utilizada desde el frontend sin ningún problema.
Una vez se tuvo el backend para consumir de la API de Twitter listo para ser
utilizado se procedió a preparar las llamadas desde el frontend a este backend.
Listado 8.16: Llamadas al backend para obtener los últimos tweets de la BVMC
1 var headers = new Headers () ;
2 headers . append ( ’ Content - Type ’ , ’ application /x - www - form - urlencoded
’) ;
3 this . http . post ( ’ http :// localhost :3000/ authorize ’ ,{ headers : headers
}) . subscribe ( data = > {
4 var headers = new Headers () ;
5 headers . append ( ’ Content - Type ’ , ’ application /x - www - form -
urlencoded ’) ;
6 this . http . post ( ’ http :// localhost :3000/ search ’ , { headers :
headers }) . subscribe ( data = > {
7 this . resultData = data ;
8 }) ;
9 }) ;
Después se añadieron dos intents informativos en Dialogflow sobre cuáles son las
redes sociales de la BVMC y sobre dónde se pueden ver las últimas novedades de la
biblioteca. También se realizaron unos ajustes en las búsquedas de autores y de obras
implementados anteriormente.
Listado 8.17: Código HTML para poner un ancla a una respuesta del asistente
1 <a href ="# Ancla " id = ’ idancla ’ > < span id = ’ anclado ’ > </ span > </a >
En cada ancla tiene que variar tanto el href como los id, por ejemplo añadiendoles un
número que se incremente en cada ancla nueva (Ancla1, idancla1, anclado1). Siguiendo
con el ejemplo, en el TypeScript lo que se ha de añadir es lo siguiente:
Listado 8.18: Código TypeScript para poner un ancla a una respuesta del asistente
1 document . getElementById ( ’... ’) . innerHTML = ’ < a name =" Ancla " id =" a
" > </a > ’+...;
Como hay que esperar a que se haya mostrado el mensaje de respuesta del asistente
modificado por pantalla para que funcione el ancla se utiliza la función de TypeScript
setTimeout(). Esta permite que el ancla funcione porque si se intenta utilizar la
función click() del DOM antes de que se le haya añadido el ancla a la respuesta del
asistente esta fallará y será como si no hubiera un ancla (al usuario se le mostrarı́a el
final del mensaje en la interfaz en vez del principio).
Listado 8.19: Código TypeScript para hacer funcionar el enlace ancla añadido
1 setTimeout (() = > {
2 document . getElementById ( ’ anclado ’) . click () ;
3 } , 10) ;
El párametro con valor 10 del ejemplo son los milisegundos que se espera el programa a
ejecutar el código del interior de la función setTimeout. Este número se puede cambiar
por uno mayor u otro menor dependiendo del tiempo de espera que se quiera. También
se mejoró el flujo conversacional del asistente desde Dialogflow para que resultase
todavı́a más natural seguir una conversación con el mismo.
Tras esto se comenzó a pulir el diseño del asistente mediante el CSS del componente
del chat en Angular. Se optó por el uso de los colores corporativos de la BVMC (sobre
todo el color con identificador b21f1f) y su diseño se hizo tan simple e intuitivo como el
de un chat. De esta forma el usuario sabe donde ha de escribir los mensajes y cómo
enviarlos sin tener que pensar demasiado. Además las respuestas por parte del
asistente aparecen englobadas de un color diferente a las preguntas del usuario para
que sean fáciles de distinguir unas de otras. Aparte de por el color también se
diferencian unos mensajes de otros por su posición dentro de la caja del chat (unos
pegados a la izquierda y los otros pegados a la derecha). También se añadió una
78 8.4. Frontend Parte 2
pequeña animación a la hora de abrir el asistente. Esta consiste en una transición que
permite que la caja del chat vaya apareciendo suavemente desde no haber nada hasta
aparecer por completo (justo lo contrario a cuando algo se va desvaneciendo).
Entonces se utilizó la librerı́a Three.js para cuando la caja del chat está cerrada
darle un toque llamativo y diferente. Three.js es una librerı́a escrita en JavaScript para
crear y mostrar gráficos animados por ordenador en 3D en un navegador Web y puede
ser utilizada en conjunción con el elemento canvas de HTML5, SVG o WebGL. Para
instalar la librerı́a Three.js en el proyecto Angular se ejecutó el siguiente comando en la
consola ’npm i ng-three’. También cambié en el archivo tsconfig.app.json situado en la
raı́z del proyecto Angular la lı́nea ”types”: [] por ”types”: [”webgl2”] para poder
instalar WebGL2 (la última versión) en el proyecto y ası́ permitir que funcione la
librerı́a al completo. WebGL es una especificación estándar que define una API
implementada en JavaScript para la renderización de gráficos en 3D dentro de
cualquier navegador web[Khronos.org, 2020]. Esta tecnologı́a es en la que se basa la
librerı́a Three.js para funcionar.
En el HTML del componente chat se creó un elemento canvas para poder visualizar
en él el elemento 3D a añadir.
11 ...
12 this . engServ . createScene ( this . rendererCanvas ) ;
13 this . engServ . animate () ;
14 }
Listado 8.22: Usar clickOutside para saber si se ha hecho click fuera del asistente
1 < div ( clickOutside ) =" o n C l i c k e d O u t s i d e C h a t ( $event ) " >
2 ...
3 </ div >
El servicio del motor gráfico tiene varios métodos pero antes se ha de importar la
librerı́a Three.js en el servicio y preparar todos los elementos que se van a utilizar en la
escena 3D que posteriormente se mostrará en el elemento canvas situado en el HTML.
Después se encuentra el método para crear la escena. Este método lo primero que hace
es coger la referencia del elemento canvas y lo preparamos para que se puedan mostrar
elementos 3D en él. Después se le indica el ancho y el alto, se crea la escena y se crea
una cámara con vista en perpectiva. Se le indica la posición que va a tener la cámara
dentro de la escena y se añade la cámara a la escena. Después se crea una luz de
ambiente para iluminar toda la escena. También se le indica una posición y se añade a
la escena. Tras esto se carga la textura que tendrá el elemento 3D y se crea un material
con la misma. Tras esto se procede a cargar el objeto 3D de un archivo JSON
exportado desde el programa Blender. Por último se crea una malla con la geometrı́a
cargada del archivo JSON y con el material que contiene la textura cargada también
previamente. Se esperan 400 milisegundos con la función setTimeout() para que le de
tiempo al programa a cargar la geometrı́a y la textura para formar la malla y entonces
se añade esta a la escena.
Implementación 81
En este momento se decidió continuar con la parte de Laravel del backend para ası́
registrar las acciones de los usuarios en el asistente y poder implementar con estos
datos los cuadros de mando con Grafana.
84 8.5. Backend Parte 3
Puesto que en todas las tablas se va a almacenar lo mismo (solo cambian sus
nombres) se va a tomar de ejemplo busquedasautor y se van a mostrar todos los pasos
que se han seguido hasta crear la tabla, añadirle unas filas iniciales y hacer que
funcionen las llamadas a la API desde Angular.
Primero se crearon los modelos en el proyecto Laravel para cada una de las tablas.
Para ello se utilizó un comando, que para el ejemplo serı́a ’php artisan make:model
BusquedasAutor’, el cual se ejecuta en la consola estando situado en la carpeta raı́z del
proyecto. Como no se necesita enviar datos posteriormente a la hora de crear una
nueva fila en la tabla, el modelo queda vacı́o sin ningún atributo.
12 ];
13 }
crear filas nuevas en las tablas es más correcto utilizar el método GET create(). El
método index() recoge todo el contenido de la tabla y lo muestra. Se pensaba que
Grafana lo iba a utilizar y por eso se implementó pero al final no era necesario. Al
tratar de realizar las llamdas desde Angular daba un error de CORS y por eso se
añadió en la respuesta dada por el controlador el header(’Access-Control-Allow-Origin’,
’*’) arreglando ası́ el problema.
Tras esto se crearon las rutas para cada controlador. Para ello se añadió la siguiente
lı́nea para cada controlador en el archivo api.php situado en la carpeta routes:
1 <? php
2
3 use Illuminate \ Support \ Facades \ Schema ;
4 use Illuminate \ Database \ Schema \ Blueprint ;
5 use Illuminate \ Database \ Migrations \ Migration ;
6
7 class C r e a t e B u s q u e d a s a u t o r T a b l e extends Migration
8 {
9 /**
10 * Run the migrations .
11 *
12 * @return void
13 */
14 public function up ()
15 {
16 Schema :: create ( ’ busquedasautor ’ , function ( Blueprint
$table ) {
17 $table - > increments ( ’ id ’) ;
18 $table - > timestamps () ;
19 }) ;
20 }
21
22 /**
23 * Reverse the migrations .
24 *
25 * @return void
26 */
27 public function down ()
28 {
29 Schema :: dropIfExists ( ’ busquedasautor ’) ;
30 }
31 }
Implementación 87
En este momento se empezaron a preparar los factories y los seeders que permiten
añadir varias filas a las distintas tablas de la base de datos. Ası́ se puede probar si
funciona el añadir filas a las tablas recién creadas. Para ello se han de modificar dos
archivos. En el primero, que es el archivo ModelFactory.php situado en la carpeta
database/factories, se ha de añadir el siguiente código para cada una de las tablas.
1 ...
2 use App \ BusquedasAutor ;
3 ...
4 BusquedasAutor :: truncate () ;
5 $ c a n t i d a d B u s q u e d a s A u t o r = 10;
6 factory ( BusquedasAutor :: class , $ c a n t i d a d B u s q u e d a s A u t o r ) -> create () ;
7 ...
Tras esto se ejecutó el comando ’php artisan migrate:refresh –seed’ (teniendo Apache y
MySQL funcionando con XAMPP) para crear las tablas y probar la inserción de las
filas. Como todo funcionaba correctamente se procedió a realizar las llamadas en el
frontend para que cuando los usuarios solicitasen las funcionalidades al asistente se
registraran estas en la base de datos.
88 8.6. Frontend Parte 3
Se crearon los servicios en el proyecto Angular para poder realizar las llamadas al
proyecto Laravel. Para ello se utilizó el comando ’ng generate service busquedasautor’
(continuamos con el ejemplo de la tabla busquedasautor). De los dos archivos que se
crean para cada servicio en el proyecto Angular el que hay que modificar es
busquedasautor.service.ts.
Estos métodos son a los que se debe llamar desde el archivo TypeScript del
componente chat, más concretamente al de newBusquedaAutor() que registra en la
base de datos cada vez que se utiliza la funcionalidad de buscar autores del asistente
(crea una nueva fila en la tabla busquedasautor). El otro método no se llega a utilizar
aunque se implementó por si acaso Grafana necesitaba que se le enviasen los datos
desde la API pero finalmente no fue ası́. Más adelante se explica el funcionamiento de
Grafana y cómo este accede a los datos almacenados en la base de datos.
Implementación 89
Tras preparar los servicios para todas las tablas se actualizó el archivo TypeScript
del componente chat para que justo al realizar cada una de las funcionalidades del
asistente se llamara al servicio y se registrase la acción en la base de datos. En el caso
del ejemplo de busquedasautor se añadió el siguiente código:
A falta de alguna pequeña mejora del diseño y del arreglo de algunos pequeños errores
de funcionamiento encontrados durante el testeo del proyecto, el frontend se
encontraba terminado. Se procedió a integrar Grafana en el proyecto y a hacer que este
se conectara con la base de datos MySQL.
Una buena forma de saber si el asistente realizado en este proyecto está cumpliendo
su cometido es mediante la monitorización a través de cuadros de mando del uso del
mismo. Por ello se realizó una API con el framework Laravel para ası́ poder almacenar
en una base de datos las acciones que los usuarios realizan a través del asistente virtual
Catalina.
Tras esto se añadió la base de datos a Grafana, se le indicó que era MySQL y que su
host era localhost:3306 (como está configurado en el archivo .env situado en la raı́z del
proyecto Laravel). Por último se le indicó cuál era el nombre de la base de datos del
proyecto. Tras esto se guardó la configuración con éxito y ya se tenı́a Grafana
conectado a la base de datos del proyecto.
Sólo faltaba crear los dashboards o cuadros de mando con los datos de cada tabla. A
la izquierda hay un signo + en el que al hacer click da la opción de crear un nuevo
dashboard. Se va a explicar de ejemplo el cuadro de mando al que se le llamó Usuarios
que han utilizado el asistente. Su consulta SQL serı́a la siguiente:
Listado 8.34: Consulta SQL para obtener datos de la tabla interactions desde Grafana
1 SELECT
2 $__ timeGr oupAli as ( created_at ,1 h ) ,
3 count ( id ) AS " Usuarios "
4 FROM interactions
5 WHERE
6 $__timeFilter ( created_at )
7 GROUP BY 1
8 ORDER BY $__timeGroup ( created_at ,1 h )
Esto se hizo con cada tabla y en algún caso se muestran los resultados de varias tablas
en un mismo cuadro de mando. Un ejemplo serı́a un cuadro de mando llamado
Búsquedas reallizadas en la BVMC a través del asistente. En este se realizan 3
consultas SQL independientes para mostrar los registros almacenados en las tablas de
busquedasautor, busquedasobras y busquedasobrasdeautor. Como son 3
funcionalidades que utilizan datos de la BVMC y todas consisten en realizar búsquedas
se decidió mostrarlas en el mismo cuadro de mando. El otro caso en el que se muestran
datos de más de una tabla de la base de datos serı́a el cuadro de mando llamado
Consultas al contenido de las redes sociales de la BVMC a través del asistente. En este
se muestran tanto lo que se ha registrado en la tabla twitter y en la tabla youtube. En
total se implementaron 11 cuadros de mando o dashboards.
tiempo del que se muestran los datos en el eje X) para poder analizar y llegar a
conclusiones sobre la efectividad real del asistente virtual y su uso. En estos cuadros de
mando se plasman todas las acciones que se han realizado utilizando el asistente y en
qué momento.
Todos estos datos que se muestran en los cuadros de mando son la visualización del
registro de las acciones realizadas por el usuario a través del asistente. Toda nueva
acción que realicen los usuarios se verá reflejada automáticamente en el cuadro de
mando correspondiente sin necesidad de realizar cambio alguno. En la Figura 8.1 se
pueden observar 3 de estos cuadros de mando implementados. Con esto la
implementación del proyecto quedó completamente terminada y ya sólo faltaba realizar
las pruebas y la validación, las cuales se ven en el siguiente capı́tulo.
92 8.7. Backend Parte 4
Se deben cumplir los siguientes requisitos para que una prueba unitaria tenga la
calidad suficiente:
Profesionales: Las pruebas deben ser consideradas igual que el código, con la
misma profesionalidad, documentación, etc.
A pesar de que estos requisitos no tienen que ser cumplidos al pie de la letra, se
recomienda siempre seguirlos o de lo contrario las pruebas pierden parte de su función.
93
94 9.1. Pruebas unitarias
[Wikipedia.org, 2019c]
Para los test cases de este proyecto se utilizó el mismo estándar que siguieron los
creadores de Chatbol, mencionado previamente en la subsección 4.2.3.
Las pautas seguidas a la hora de realizar los test cases han sido:
Además indicar que, al igual que chatbol, el protocolo de evaluación utilizado para el
asistente sigue el marco de evaluación de tareas compartidas de WOCHAT1 :
1
http://workshop.colips.org/wochat/main sharedtask.html
96 9.2. Casos de prueba
En las preguntas abiertas, los usuarios comentaron las fortalezas y las debilidades del
asistente. Respecto a las fortalezas, los usuarios mencionaron que el asistente pudo
proporcionar de forma rápida el contenido de la BVMC y que también pudo ofrecerles
información práctica para el dı́a a dı́a (sus vidas cotidianas). Respecto a las debilidades,
los usuarios mencionaron que para saber utilizar sin dificultades el asistente se necesita
algo de tiempo ya que al principio les cuesta un poco familiarizarse con él.
Pruebas y validación 97
Para la evaluación a nivel de turno, se han juntado las puntuaciones a las respuestas
del asistente que los usuarios anotaban en cada turno de la sesión de diálogo con el
asistente. La puntuación dada a cada respuesta podı́a ser válida, aceptable o no válida.
Esta puntuación variaba de acuerdo a su idoneidad percibida y con respecto a la
respuesta recibida y el contexto del diálogo.
Los resultados del testeo fueron los que se muestran en la Tabla 9.1:
Como se puede observar en la Figura 10.1, se han adoptado los estilos de la web de
desarrollo de la BVMC1 .
1
http://data.cervantesvirtual.com/blog/
99
100
Cuando el asistente está cerrado su icono va rotando sobre sı́ mismo para capturar la
atención del usuario. Esta rotación la hace de forma suave para que tampoco resulte
molesta para el mismo:
Al hacer clic sobre este icono el asistente se abre mostrando la caja del chat para
comenzar a ser utilizado:
En la Figura 10.6 se puede ver respuestas del asistente sobre Miguel de Cervantes
Saavedra elaboradas con información obtenida desde Wikidata.
En la Figura 10.8 se puede ver la funcionalidad de mostrar los últimos tweets que ha
publicado la BVMC en su cuenta oficial de Twitter.
En la Figura 10.9 se puede ver las funcionalidades de solicitar las obras almacenadas
en la BVMC en un idioma concreto y la predicción del tiempo para España.
Figura 10.9.: Buscar obras en un idioma concreto y predicción del tiempo en España
104
También ha sido testeado por varios usuarios reales los cuales han salido muy
satisfechos de la experiencia. Todas las acciones realizadas por los usuarios en el
asistente quedan registradas en la base de datos MySQL del proyecto permitiendo
mostrar a los administradores estos datos en forma de gráficos (cuadros de mando o
dashboards) a través de la herramienta Grafana añadida en el proyecto.
Los costes temporales planificados y los reales han sido muy similares puesto que se
planificó dejando algo de margen para el error y este ha permitido que se llegue a los
plazos planificados desde el comienzo. A nivel de funcionalidades implementadas no se
han tenido que limitar puesto que conforme se ha ido desarrollando el asistente estas se
han ido eligiendo e integrando una a una.
E-Learning.
Negocio y Multimedia.
Sistemas Distribuidos.
Usabilidad y Accesibilidad.
Proyectos Multimedia.
Resultados 105
11.1. Conclusiones
Es un proyecto que utiliza multitud de tecnologı́as tanto para su parte del backend
como para la del frontend como también numerosos servicios de terceros. Además, se
ha creado una API RESTful y una base de datos que permiten registrar las acciones
que los usuarios realizan a través del asistente. El frontend se comunica tanto con la
propia API RESTful del proyecto como con los servicios de terceros. En lo que respecta
a los servicios de terceros, cabe destacar la BVMC y Wikidata de los cuales se obtienen
datos mediante consultas SPARQL.
Mejorar el flujo conversacional del asistente para que este devuelva una mayor
cantidad de respuestas válidas o al menos aceptables al usuario.
107
108 11.2. Lı́neas de trabajo futuras
Hacer que el asistente sea capaz de obtener recursos de otras bibliotecas virtuales
también.
[Bbvaopen4u.com, 2016] Bbvaopen4u.com (2016). Api rest: qué es y cuáles son sus
ventajas en el desarrollo de proyectos. https://bbvaopen4u.com/es/actualidad/api-
rest-que-es-y-cuales-son-sus-ventajas-en-el-desarrollo-de-proyectos. Online; last
updated 23-march-2016.
109
110 Bibliografı́a
[Mahey et al., 2019] Mahey, M., Al-Abdulla, A., Ames, S., Bray, P., Candela, G.,
Chambers, S., Derven, C., Dobreva-McPherson, M., Gasser, K., Karner, S., Kokegei,
K., Laursen, D., Potter, A., Straube, A., Wagner, S.-C., Wilms, L. with forewords
by: Al-Emadi, T. A., Broady-Preston, J., Landry, P., and Papaioannou, G. (2019).
Open a GLAM Lab. Digital Cultural Heritage Innovation Labs, Book Sprint, Doha,
Qatar, 23-27 September 2019.
[Segura et al., 2018] Segura, C., Palau, À., Luque, J., Costa-jussà, M. R., and Banchs,
R. E. (2018). Chatbol, a chatbot for the spanish ”la liga”. In 9th International
Workshop on Spoken Dialogue System Technology, IWSDS 2018, Singapore, April
18-20, 2018, pages 319–330.
[Zdnet.com, 2019] Zdnet.com (2019). Apple siri vs amazon alexa vs google assistant:
Tests reveal which is smartest. https://www.zdnet.com/article/apple-siri-vs-amazon-
alexa-vs-google-assistant-tests-reveal-which-is-smartest/. Online; last updated
16-august-2019.
A. Anexo I. Esquema de base de datos
115
116
Añadir que se trata de una base de datos no relacional puesto que no existe ninguna
relación entre sus tablas. Aunque MySQL se suele utilizar para bases de datos
relacionales, se escogió debido a lo sencillo que resulta su uso y a su buena
compatibilidad con Laravel. Esta información almacenada en la base de datos se utiliza
para generar cuadros de mando, mediante la herramienta Grafana, para los
administradores de la biblioteca. Esto les permite observar y analizar de forma gráfica
las interacciones que han tenido los usuarios con el asistente y ası́ estudiar qué
funcionalidades del asistente desechar por su poco uso y cuáles mejorar por su gran
demanda.
B. Anexo II. Informe de Toggl
Summary Report
September 09, 2019 – December 29, 2019
TOTAL HOURS: 301:47:55
40:57
32:16
32:02
41.7 h
31:12
23:24
33.3 h
19:01
18:18
17:38
16:09
16:03
25.0 h
10:52
9:55
9:51
9:46
16.7 h
7:20
6:57
8.3 h
0.0 h
9/9 - 9/23 - 10/7 - 10/21 - 11/4 - 11/18 - 12/2 - 12/16 -
9/15 9/29 10/13 10/27 11/10 11/24 12/8 12/22
PROJECT DURATION
TFG 301:47:55
117
118
Aprender a consumir datos de la BVMC e intentando coger los datos desde 5:10:37
Angular
Desarrollo del comportamiento básico del asistente virtual (Small Talk etc) 4:34:29
Nuevos itents para la BVMC 4:09:54
Consumir del twitter de la BVMC 3:39:05
Hacer e integrar modelo 3D para cuando esté el asistente minimizado 3:32:56
Implementar base de datos final 3:20:16
Mejorando el comportamiento del asistente (nuevos itents con o sin 3:18:02
Wikidata)/Consumir api AEMET para el tiempo
Plantilla latex; comenzar a redactar 3:02:31
Other time entries 56:13:26
TFG 301:47:55
Aprender a consumir datos de la BVMC e intentando coger los datos desde Angular 5:10:37
Arreglar fallos de algunas funcionalidades del asistente tras incorporar lo de Twitter 0:32:15
Bloquear el enviar un mensaje hasta que se pueda hacer una búsqueda de nuevo 0:33:12
Consumir del twitter de la BVMC+Itent informativo de las redes sociales de la BVMC 1:44:16
Desarrollo del comportamiento básico del asistente virtual (Small Talk etc) 4:34:29
Diseño chat component y hacer que Angular consuma desde la API de Dialogflow 0:59:19
Ir viendo cómo conectar Grafana a la base de datos hecha desde Laravel 0:22:05
Mejorando el comportamiento del asistente (nuevos itents con o sin Wikidata)/Consumir api AEMET para el tiempo 3:18:02
Nuevos itents informativos de la BVMC y del mismo asistente. Fix de errores. 1:52:44
Objetivos 0:44:59
Realizar búsquedas de webs (Como Google desde el asistente)+Empezar a preparar consumir del twitter de la BVMC 8:49:44
Ver cómo conectar grafana a la base de datos MySQL y crear cuadros de mando (Dashboards) 2:43:01
Se han utilizado distintas consultas SPARQL para obtener los recursos de la BVMC
y para obtener la información de Wikidata. A continuación se muestran estas consultas.
123
124 C.1. Para Wikidata
Listado C.6: Consulta SPARQL a Wikidata (Información variada sobre Miguel de Cer-
vantes Saavedra)
1 PREFIX entity : < http :// www . wikidata . org / entity / >
2 # partial results
3
Listado C.9: Consulta SPARQL a la BVMC (Buscar obra; Ejemplo El ingenioso hidalgo
Don Quijote de la Mancha)
1 PREFIX rdam : < http :// rdaregistry . info / Elements / m / >
2 PREFIX rdfs : < http :// www . w3 . org /2000/01/ rdf - schema # >
3 SELECT ? obra ? nombreobra
4 WHERE {
5 ? obra rdfs : label ? nombreobra . FILTER regex ((? nombreobra ) , " El
ingenioso hidalgo Don Quijote de la Mancha " , " i ") .
6 }
Listado C.10: Consulta SPARQL a la BVMC (Buscar autor; Ejemplo Lope de Vega)
1 PREFIX rdam : < http :// rdaregistry . info / Elements / m / >
2 PREFIX rdfs : < http :// www . w3 . org /2000/01/ rdf - schema # >
3 SELECT ? autor ? nombreautor
4 WHERE {
5 ? autor rdfs : label ? nombreautor . FILTER regex ((? nombreautor ) , "
Vega , Lope de " , " i ") .
6 }
Listado C.11: Consulta SPARQL a la BVMC (Buscar obras de cierto autor; Ejemplo
Lope de Vega)
1 PREFIX rdfs : < http :// www . w3 . org /2000/01/ rdf - schema # >
2 SELECT ? autor ? nombreautor ? obra ? titulo
3 WHERE {
4 ? autor rdfs : label ? nombreautor . FILTER regex ((? nombreautor ) , "
Vega , Lope de " , " i ") .
5 ? autor < http :// rdaregistry . info / Elements / a / authorOf > ? obra
.
6 ? obra rdfs : label ? titulo .
7 }
D. Anexo IV. Intenciones implementadas
Como se puede observar en las siguientes Figuras el asistente está formado por 176
intenciones/intents distintos (8 páginas de 20 intents y una última de 16 intents).
Algunos tienen en su nombre el prefijo agent, otros bib, otros Default y otros smalltalk.
Cada uno de estos grupos se explica a continuación de las Figuras.
127
128
Los que comienzan con el prefijo agent son los encargados de las funcionalidades
para uso cotidiano, como por ejemplo solicitar la predicción del tiempo, y otros para
ofrecer información al usuario sobre el asistente o para completar los intents de
SmallTalk. Los del prefijo bib son los que componen las funcionalidades relacionadas
con la BVMC y con Wikidata. Los precedidos por Default son intents que vienen en
Dialogflow para su uso por defecto, uno para dar la bienvenida al usuario y otro para
ser capaz de responder al usuario cuando el asistente no entiende el mensaje del
mismo. Por último tenemos los de prefijo smalltalk que dan respuesta a preguntas más
habituales, las cuales añaden inteligencia a nuestro asistente.
También se podrı́an agrupar los intents en los siguientes 3 grupos, por un lado los de
uso general y por otro los de consumo de datos abiertos de la BVMC y Wikidata. Los
de consumo de datos abiertos de la BVMC serı́an el intent bib.info.cuantosidiomas,
bib.obrasdeunautor, bib.quijote.ediciones y los precedidos por bib.obras y por
bib.search. Los de consumo de datos abiertos de Wikidata serı́an los intents de nombre
bib.info.migueldecervantes.x (variando x dependiendo de qué información muestra el
intent) y el intent bib.info.migueldecervantesobras. El resto son los de uso general
(información sobre la BVMC y el uso del asistente, resto de funcionalidades y
SmallTalk).
E. Anexo V. Paso a producción
Para hacer un primer despliegue del proyecto primero se clona el proyecto de Git.
Para ello antes que nada se ha de tener configurado el servidor all que vamos a subirlo.
Para hacer la clonación, nos ubicamos en el directorio del servidor donde lo queremos y
ejecutamos el comando:
Lo primero es modificar las variables de entorno del archivo .env cambiando las urls
del servidor local por las del servidor de producción.
Con estas variables globales podemos indicarle a la API tanto la dirección web donde
se visualizará el proyecto como la conexión con la base de datos.
Ya se tiene el proyecto listo para migrar las tablas de las bases de datos. Podemos
migrar tablas en caso de que se haya añadido una nueva o en general cualquier tabla de
la base de datos haya sido modificada y se necesite nuevos campos, aunque en este caso
al tratarse del primer despliegue, ejecutaremos simplemente el comando: ’php artisan
migrate’.
También se han que configurar e instalar las dependencias tanto de Grafana, para
que los administradores puedan visualizar los cuadros de mando, como del pequeño
backend que funciona con Node.js y Express, para que el frontend pueda consumir
datos de la API de Twitter.
137
138 E.2. Configurar e instalar el frontend. Angular.
Una vez se han realizado las tareas anteriores se tiene que comprobar si el sistema
funciona correctamente. Para ello se comprobará que la API rest sigue funcionando
como deberı́a ejecutando los test unitarios de los que se dispone (unit testing). Si todos
ellos funcionan perfectamente significará que la API funciona correctamente.
E.4. Building.
139