Como proyecto paralelo, estoy creando un asistente virtual de IT interno que facilitará cosas como poner en marcha sistemas, establecer temporizadores, hacer un seguimiento de los costes y elaborar presupuestos. Para que este proyecto pueda ser utilizado por el mayor número de personas posible, he decidido construirlo como un chatbot, que es una interfaz fácil de usar que se ha hecho muy popular en los últimos años.
Sin embargo, he observado que la mayoría de los chatbots disponibles hoy en día no alcanzan el potencial prometido. O bien plantean a los usuarios unas cuantas preguntas sencillas y luego los envían a una persona real, o bien se parecen a toscos menús de sitios web y hacen que los usuarios pasen por una serie de opciones antes de enviarlos a una página web. No pude evitar preguntarme quién preferiría utilizar un chatbot para encontrar una página en lugar de un menú bien estructurado.
El éxito viral de modelos como ChatGPT ha demostrado el enorme potencial de la IA conversacional. Sin embargo, la tecnología actual de los chatbot aún deja margen de mejora. Esto me ha motivado a profundizar en el mundo de los chatbots y explorar oportunidades para construir un chatbot mejor y más avanzado, el cual realmente cumpla sus promesas.
Tabla de contenidos
Componentes básicos de un chatbot
Si quitamos todas las tecnologías de apoyo, un chatbot típico tiene tres tareas principales: hacer coincidir la intención, resolver entidades y gestionar el contexto. Además de estas funciones, hay muchas otras, como las bases de conocimiento para apoyar las preguntas y respuestas, pero estas tres son esenciales.
Según DialogFlow, una de las principales plataformas de chatbot, la definición oficial de intent matching es la siguiente:
Una intención categoriza la intención de un usuario final para un turno de conversación. Para cada agente, se definen muchas intenciones, donde sus intenciones combinadas pueden manejar una conversación completa. Cuando un usuario final escribe o dice algo, lo que se conoce como una expresión del usuario final, Dialogflow hace coincidir la expresión del usuario final con la mejor intención de su agente. La correspondencia de una intención también se conoce como clasificación de intenciones.
Y el término “entidad” se refiere a las palabras clave o jerga de entrada del usuario final. El concepto general de “entidad” se compone de tipo de entidad, entidad y sinónimo. Como se cita de nuevo en Dialogflow, un ejemplo de entidad es:
Si vegetal es un tipo de entidad, podría definir estas tres entradas de entidad:
- zanahoria
- cebolleta, cebolla verde
- pimiento, pimiento dulce
Hasta ahora, el chatbot ha sido capaz de entender las peticiones del usuario final y extraer información de las entradas con la ayuda y uso de la intención y las entidades. Ten en cuenta que una intención es sólo una ronda de conversación entre el usuario final y la máquina. Aun así, el chatbot necesita una forma de conectar todas las intenciones en una conversación fluida. Este mecanismo se conoce como gestión del contexto. En un sistema sofisticado, la gestión del contexto se implementaba como una máquina de estados. En un sistema más sencillo, la gestión del contexto consiste en pasar parámetros de una intención a la siguiente.
Cómo desarrollar un chatbot
Como ya tenemos los conocimientos necesarios sobre el funcionamiento de un chatbot, pasemos a ver cómo desarrollar uno.
Un chatbot necesita categorizar las peticiones de los usuarios según su intención para saber cómo reaccionar. Por ejemplo, si mi agente virtual va a ofrecer servicios para “parar un servidor”, “pausar un servidor” y “desmontar un servidor”, entonces necesito definir tres intenciones para cada tarea. ¿Cómo podemos, como desarrolladores, ayudar al chatbot a saber qué pregunta del usuario corresponde a cada intención? La respuesta es la clasificación de texto NLP. Tenemos que proporcionar una lista de mensajes de ejemplo, también conocidos como datos de entrenamiento, para que el chatbot aprenda el patrón.
Por ejemplo, para entrenar la intención “detener un servidor”, necesitamos datos de entrenamiento como los siguientes:
- detener un servidor
- apagar un servidor
- apagar un servidor
- apagar un servidor
- cerrar un servidor
- matar un servidor
- terminar un servidor
- terminar un servidor
- desactivar un servidor
Sabemos que la clasificación NLP no es precisa al 100%. La forma de mejorar la precisión de la concordancia de intención es proporcionar datos de entrenamiento cada vez más diversos. En muchos casos, esto se hace por intuición. En el ejemplo anterior, podemos ampliar el tamaño de los datos de entrenamiento cambiando el término “servidor” por “sistema”, “máquina”, “proceso” o “caja”. ¿Y cuándo sabemos que el número de datos de entrenamiento es suficiente? Se aplica la técnica general de aprendizaje automático. Dividimos todo el conjunto de datos en conjuntos de entrenamiento y de prueba. Luego utilizamos el conjunto de entrenamiento para entrenar al chatbot y el conjunto de prueba para evaluar su rendimiento.
La definición de la entidad es muy tradicional: para capturar la entidad, necesitamos una lista completa de valores o un patrón de expresiones regulares. Y el tratamiento de los datos contextuales está codificado. El desarrollador del chatbot debe definir qué parámetros deben pasarse al contexto y qué otros intentos pueden consumirlos.
Es difícil desarrollar un buen chatbot
Echemos otro vistazo a nuestro intento de “detener un servidor”. Tenemos que proporcionar bastantes indicaciones para entrenar incluso una intención tan simple. Imagina que vamos a ampliar nuestros servicios a “pausar un servidor” y “desmontar un servidor”. No sólo triplicaremos la cantidad de datos de entrenamiento, sino que además notaremos la sutil diferencia entre las tres intenciones: “Pausar un servidor” significa que dejará de servir nuevas peticiones pero seguirá manteniendo todos los recursos; “Detener un servidor” significa que liberará CPU y memoria; “Destruir un servidor” significa que acabará con un servidor de forma permanente. Es difícil elaborar una larga lista de instrucciones para entrenar a un chatbot a distinguir entre estas tres intenciones. Por eso la sabiduría general del diseño de chatbot es:
No configures demasiadas intenciones.
Por un lado, demasiados intentos hacen que el chatbot sea inestable; por otro, limitar el número de intentos significa que tenemos que restringir el alcance de los servicios de nuestro chatbot.
La extracción de entidades también es un problema. Como ya se ha mencionado, la entidad tiene que estar claramente definida, de lo contrario el chatbot no puede descifrarla. Si le pedimos al chatbot que “compruebe el coste semanal del servidor X234”, “apáguelo”. El chatbot estará realmente confuso. Porque en un chatbot, cada pregunta sólo debe clasificarse con una intención y no con varias, y el chatbot no puede decidir qué servidor apagar porque la palabra “it” no puede resolverse con un nombre de servidor válido.
La gestión del contexto es otro problema. Porque, literalmente, el chatbot no sabe nada sobre el contexto. El desarrollador debe encadenar explícitamente las intenciones en una conversación.
Por ejemplo, pensemos que estamos desarrollando un chatbot de reserva de vuelos. Somos lo suficientemente inteligentes como para saber que la conversación no siempre es fluida. Hemos creado una branch intent que permite al usuario cambiar las fechas de inicio y fin mientras se desarrolla la conversación. Tenemos que analizar la información obtenida y enviarla como parámetros contextuales o parámetros de sesión para que la intent de cambiar fecha de inicio/finalización pueda entender lo que se ha hablado. ¿Y si decidimos crear una nueva intent y dejar que el usuario cambie tanto la intent como el destino? Entonces, tenemos que utilizar el mismo patrón en la nueva intent, o perderá rápidamente la información.
Por último, pero no por ello menos importante, el desarrollo de un chatbot requiere una combinación de desarrollo de software y experiencia en machine learning. El proyecto necesita codificación para procesar parámetros e integrarse con el mundo exterior. También requiere un buen conocimiento del aprendizaje automático para ajustar la concordancia de intenciones y evaluar los resultados. Esto último es especialmente importante cuando los algoritmos incorporados no funcionan como se esperaba. En ese caso, el ingeniero debe ser capaz de resolver el problema con soluciones de NLP. Y no hay que olvidar que el chatbot también necesita mantenimiento, lo que también requiere desarrolladores cualificados e ingenieros de aprendizaje automático.
En general, la tecnología de los chatbot no se ha actualizado con los últimos avances en NLP. El proceso de desarrollo es bastante manual, requiere habilidades especiales y el producto final no es tan flexible como debería.
Cómo puede ayudar GPT
GPT son las siglas de Generative Pre-trained Transformer. Transformer es un tipo de técnica de modelado para el Deep Learning que permite a los modelos lingüísticos buscar información relevante muy atrás en el tiempo. Generativo significa que el modelo utiliza la probabilidad condicional para optimizar el proceso de formación.
Preentrenado significa que el modelo se ha entrenado a partir de un enorme conjunto de datos. A diferencia de los modelos tradicionales de NLP, que requieren un ajuste fino con conocimiento del dominio, el último GPT-3 demuestra que un modelo lingüístico entrenado con suficientes datos puede resolver tareas de NLP con las que nunca se ha topado. Es decir, GPT-3 estudia el modelo como solución general para muchas tareas posteriores sin necesidad de ajuste fino. En otras palabras, los modelos GPT son más inteligentes que los modelos antiguos. Como consecuencia, los modelos GPT también son costosos de entrenar. GPT-3 tiene 175.000 millones de parámetros y su entrenamiento requeriría 355 años y 4.600.000 dólares, incluso con la nube de GPU más barata del mercado.
Aunque ChatGPT es el nombre por el que la mayoría de la gente lo conoce, en realidad es una versión mejorada de GPT-3, que salió en 2020. A continuación, utilizaré GPT-3 y ChatGPT indistintamente porque son muy similares.
Mejor creación de intenciones
Detrás de cada chatbot, hay modelos NLP, los cuales no son tan potentes como GPT. En efecto, el proceso de preparación de los datos de entrenamiento de intención consiste en afinar el modelo para adaptarlo a las necesidades del proyecto. El modelo GPT-3, revolucionario y potente, comprende mejor el lenguaje natural. Detectar la intención de un usuario es mucho más fácil con GPT. Hagamos un experimento:
En nuestro experimento, no proporcionamos ningún conocimiento previo. Inmediatamente formulamos nuestra pregunta. La GPT demostró una capacidad impresionante para entender las preguntas y puede clasificar las indicaciones como de bastante buena calidad. GPT no sólo es capaz de identificar la intención, sino también de clasificar las preguntas desconocidas en la categoría de “poco claras”, tal y como le pedimos. Desde el punto de vista de la ingeniería, esto es realmente excepcional. Muchos modelos tradicionales de aprendizaje automático no son capaces de identificar escenarios inciertos. Se limitan a intentar por todos los medios dar una etiqueta a cada punto de datos.
Mejor resolución de entidades
Como segundo experimento, hagamos una pregunta más a GPT:
GPT puede decir que Bill equivale a William, y sabe que “él” y “su” se refieren a la misma persona. Esto es imposible para un chatbot tradicional.
Mejor comprensión contextual
Gracias a su mecanismo transformador, GPT es capaz de razonar basándose en datos históricos. Aunque sólo puede analizar un máximo de 4.000 palabras, es suficiente para cubrir muchos escenarios de conversación. Veámoslo de nuevo:
ChatGPT es capaz de recordar conversaciones anteriores. Puede utilizar la conversación anterior para entender peticiones incompletas. Como resultado, aunque la pregunta era de una sola palabra, ChatGPT fue capaz de reconocer la intención basándose en el contexto. Este es otro superpoder que hace que ChatGPT sea superior a un chatbot. Gracias a su capacidad para entender el contexto, ChatGPT puede mantener una conversación más parecida a la humana.
Menor barrera técnica
A pesar de que GPT es un motor potente, crear una aplicación basada en él es increíblemente sencillo. El desarrollo tradicional de la NLP requiere que los desarrolladores tengan un profundo conocimiento de multitud de algoritmos y bibliotecas específicos, entornos y pipelines, tratamiento de datos y entrenamiento de modelos, etcétera. La interacción con GPT se realiza a través de una única API y su funcionamiento es similar al de una conversación: el usuario proporciona una pregunta y GPT responde con un resultado.
Entonces, ¿qué ocurre si el resultado no es el deseado por el usuario? Pues ocurre. Pero la forma de torcer el resultado es un poco diferente. Como la GPT es un modelo tan sofisticado que ya es capaz de entender muy bien los matices del lenguaje, el desarrollador no necesita entrenar al modelo para que entienda el lenguaje. El truco para obtener una respuesta mejor es, adivina, formular la pregunta.
Creo que la reducción de la barrera técnica hace que la próxima generación de IA conversacional basada en GPT sea más accesible para muchas empresas y, quién sabe, incluso para los particulares.
Hace muchos años, la gente tenía que comprar su propio servidor físico, dirección IP y nombre de dominio cuando quería crear un nuevo sitio web. También tenían que contar con un equipo cualificado para desarrollar el HTML, Javascript y otros elementos del backend. La barrera técnica para crear un sitio web se fue reduciendo progresivamente. Y ahora, crear un sitio web no es una gran molestia ni siquiera para un adolescente. Lo mismo ocurre hoy con la IA conversacional.
Conclusión
El chatbot ha sido una aplicación muy prometedora de las tecnologías de NLP. Sin embargo, también se ha visto frenada por las limitaciones de la NLP tradicional. Con los innovadores modelos GPT de hoy, una nueva generación de chatbots entrará muy pronto en la corriente dominante. Y esta vez, esperamos que el desarrollo y el uso de los chatbots sean mucho más eficientes y agradables.