
Hace un año, nuestro querido departamento de recursos humanos nos pidió que creáramos un chatbot que ayudara en la integración de los nuevos empleados en la empresa.
Aclaremos que no desarrollamos productos propios, pero ofrecemos a los clientes un catálogo completo de servicios de desarrollo. Esta historia se trata de nuestro proyecto interno, cuyo cliente no es una empresa externa, sino nuestro propio departamento de recursos humanos. La tarea principal, dado el acceso limitado a personas, recursos y tiempo, es completar el proyecto a tiempo y lanzar el producto.
Para comenzar, describiremos las tareas que debían resolverse.
Los desarrolladores son en su mayoría personas introvertidas y no les gusta hablar, prefieren escribir su pregunta en un chat electrónico. Con el bot, no es necesario pensar a quién preguntar, a quién llamar, a dónde ir y, en general, dónde buscar información y si aún es relevante.
El segundo problema es la información: hay mucha, proviene de diferentes fuentes, no siempre está disponible y requiere constante complemento y actualización.
En la empresa hay casi 500 empleados, ubicados en diferentes oficinas, zonas horarias, ciudades de Rusia e incluso en el extranjero; generalmente hay muchas preguntas, por lo que otra tarea es reducir la carga sobre el personal de recursos humanos relacionada con las preguntas más frecuentes de los empleados.
También era necesario automatizar los procesos: la llegada de nuevos empleados a la empresa, el envío de mensajes a los gerentes y mentores de los nuevos empleados, y el envío de recordatorios automáticos sobre los cursos y pruebas que los nuevos empleados deben completar para una integración exitosa.
Se formaron requisitos técnicos basados en las necesidades comerciales.
El bot debe funcionar en Skype (históricamente así es como se utiliza en la empresa), por lo que se eligió el servicio en Azure.
Para las restricciones de acceso, comenzamos a utilizar el mecanismo de autorización a través de Skype.
Para el reconocimiento de texto, utilizamos la biblioteca ParlAI.
También se necesita un portal web administrativo para la configuración, el entrenamiento, la depuración, la configuración de envíos y otras tareas.

Durante el desarrollo del proyecto, nos encontramos con una serie de problemas y dificultades.
Por ejemplo, hubo problemas técnicos con la cuenta de Azure. Microsoft no quería activar nuestra suscripción debido a algunas complicaciones técnicas dentro de su servicio. Durante casi dos meses no pudimos hacer nada al respecto; el soporte de Microsoft al final se encogió de hombros y nos envió a socios que configuraron todo satisfactoriamente y nos proporcionaron la cuenta.
La etapa más complicada fue el inicio del proyecto, cuando había que elegir qué utilizar, cuál sería la arquitectura, cómo y dónde almacenar los datos y cómo los componentes y módulos del sistema interactuarían entre sí.
En nuestro caso, los problemas comunes del inicio de cualquier proyecto se complicaban aún más con la falta de personal calificado. La naturaleza de nuestro negocio es tal que, a diferencia de los proyectos comerciales, en los proyectos internos a menudo trabajan desarrolladores que no poseen el conocimiento suficiente en las áreas necesarias; simplemente estaban esperando el siguiente gran proyecto comercial. Es lógico que la motivación en tales situaciones también era bastante complicada. La productividad caía, había mucho tiempo muerto en el equipo, y en última instancia, era necesario persuadir (motivar) o cambiar a la persona. Al cambiar de desarrollador, era necesario capacitar, transferir conocimientos y de nuevo, en esencia, reiniciar el proyecto. Cada nuevo desarrollador veía la arquitectura de manera diferente y criticaba las decisiones tomadas por los anteriores y el código ajeno. Comenzaba la reescritura desde cero.
Esto continuó durante aproximadamente seis meses. Simplemente nos estancamos, refactorizamos el código y no escribimos nada nuevo.
Además, en los proyectos internos, por lo general, no hay casi ninguna documentación, y era difícil entender qué hacer en cada momento, y cuáles eran las prioridades actuales. Era necesario crear un equipo permanente, establecer procesos, llevar a cabo una planificación y evaluación, al menos para tres meses. Pero, ¿cómo hacer esto cuando el proyecto no es comercial, y eso significa que se deben invertir el mínimo de horas-hombre, y al mismo tiempo obtener un resultado que no sea peor que para un cliente externo?
Hemos definido un grupo de recursos que participaron en el desarrollo del proyecto, están familiarizados con él y quieren trabajar en él. Elaboramos un cronograma de ocupación de personas en los proyectos. Llevamos a cabo una evaluación y un acuerdo sobre los trabajos, y los incorporamos en los "huecos" entre los proyectos principales. Después de 4 meses, obtuvimos un prototipo funcional de la aplicación.
Ahora hablemos más sobre la funcionalidad del bot, la arquitectura y las soluciones técnicas.
Uno de los principales requisitos de RRHH era el reconocimiento del texto escrito por el usuario para proporcionar una respuesta adecuada a la pregunta. Se le puede escribir: "quiero irme de vacaciones", "quiero de vacaciones" o "me gustaría ir de vacaciones", y él entenderá y responderá en consecuencia. O si, de repente, un empleado tiene una silla rota y quiere escribir: "la silla está rota" o "tengo una silla agrietada" o "el respaldo de la silla se ha caído", con un entrenamiento adecuado, el bot reconocerá tales solicitudes. La calidad del reconocimiento del texto, por supuesto, depende del entrenamiento del bot, del cual hablaremos más adelante.
El siguiente requisito y parte de la funcionalidad es el sistema de diálogos del bot. Se desarrolló un sistema mediante el cual el bot puede mantener un diálogo y comprender el contexto de la pregunta actual. Puede, en respuesta a su pregunta, hacer alguna pregunta aclaratoria y continuar la conversación, si hemos entrenado al bot para hacerlo. Skype admite elementos de menú simples para sugerir a los usuarios posibles opciones para continuar los diálogos. Además, si hemos llevado a cabo un diálogo, pero de repente decidimos hacer una pregunta fuera de tema, el bot también lo entenderá.
El bot permite enviar varios artefactos al usuario, basándose en sus datos personales. Por ejemplo, en su ubicación. Supongamos que una persona quiere encontrar un baño, se le mostrará un mapa de la oficina que lo conduce al baño. Y el mapa será seleccionado en función de en qué oficina de la empresa se encuentra el empleado.
Una de las tareas más importantes es proteger la información personal de los usuarios. No podemos permitir que cualquier persona tenga acceso a los datos confidenciales que maneja nuestro bot. La necesidad de autorización para dicho bot es una parte indispensable de su funcionamiento. El bot pide al usuario que pase por una autorización antes de que pueda entablar cualquier diálogo con él. Esto ocurre en el primer contacto del empleado con el bot. La propia autorización redirige al usuario a la página correspondiente, donde recibe un token que luego inserta en el mensaje de Skype. Si la autorización se realiza con éxito, se puede comenzar a interactuar con el bot.

La autorización se lleva a cabo a través de Skype, el servicio de autorización del portal, la red corporativa y LDAP. De este modo, la autorización depende de los datos actuales del usuario en la red corporativa.
Durante el proceso de desarrollo del bot, nos dimos cuenta de que se necesitaba un sistema integrado en la funcionalidad del portal que pudiera ayudar a los Recursos Humanos a depurar rápidamente el bot. Añadimos una página al portal donde los HR pueden ver los errores registrados por los usuarios al interactuar con el bot y corregirlos mediante reentrenamiento o dejarlos para los desarrolladores.
La posibilidad de entrenar al bot directamente en el portal no estaba contemplada desde el principio. Durante el proceso de desarrollo, entendimos que entrenar al bot sería la tarea más frecuente que realizarían los empleados del departamento de Recursos Humanos al trabajar con él, y enviar archivos de texto a los desarrolladores para el entrenamiento adicional del bot es completamente inaceptable. Esto consume demasiado tiempo y genera demasiados errores y problemas.

Desarrollamos una interfaz de usuario en el portal para un entrenamiento amigable del bot. Permite a los Recursos Humanos ver el estado actual del entrenamiento del bot, adicionalmente entrenarlo e introducir correcciones en el entrenamiento actual. El entrenamiento se presenta en una estructura jerárquica, en la que los nodos, es decir, las ramas, son extensiones del diálogo con el bot. Se pueden crear simples preguntas-respuestas, así como diálogos más elaborados, dependiendo de las necesidades de los HR.
Unas palabras sobre la arquitectura de la solución.

La arquitectura de la solución es modular. Incluye servicios que son responsables de diversas tareas, a saber:
• Servicio de bot de Skype en Azure: recibe y procesa solicitudes de los usuarios. Es un servicio bastante simple que primero recibe la solicitud y realiza su procesamiento inicial.
• Portal de administración: servicio que proporciona una interfaz web para configurar el portal y para el propio bot. El bot siempre se dirige primero al portal, y el portal decide qué hacer con la solicitud a continuación.
• Servicio de autorización: proporciona mecanismos de autenticación para el bot y para el portal de administración. La autorización se realiza mediante el protocolo Oauth2. Con una autorización positiva, el servicio completa la autorización en la red corporativa según los datos válidos del usuario, de modo que el sistema puede controlar errores relacionados con la desincronización de datos.
• Módulo AI de reconocimiento de texto, escrito en Python y utilizando el marco ParlAI para el reconocimiento de texto. Es una red neuronal, al menos en la implementación actual. Usamos el algoritmo tfDiff para entender preguntas. El módulo proporciona una API para comunicarse con él y para el aprendizaje.
En conclusión, quiero decir que esta es nuestra primera experiencia en la creación de un chatbot, y hemos intentado hacer el sistema lo más simple posible, pero funcional, con un mínimo de esfuerzo dedicado. Creo que hemos logrado un producto bastante interesante. Con su propio sistema de aprendizaje, registro de errores y envío de notificaciones, también se puede integrar con cualquier otro mensajero.
Fuente: habr.com
