AGENTE DE IA PARA SOPORTE AL USUARIO
Español

0
fa 1 mes
202 vistes
Professional
#artificialintelligence #engineering #plaudere
Mostrar menys
Mostrar més
Antecedentes:
Con el lanzamiento de ChatGPT sentí que la tecnología había alcanzado un punto de inflexión para quienes desarrollamos aplicaciones. Un sistema capaz de organizar grandes cantidades de texto, tener mecanismos para detectar lo importante y poder simular una respuesta humana y además impulsar la comunicación en lenguaje natural con el ordenador y añadir esta funcionalidad para dotar de inteligencia los procesos de transformación de datos y respuesta es sin duda un hito tecnológico del siglo XXI.
Es evidente que este avance es el resultado de años de investigación y del esfuerzo conjunto de grandes empresas y miles de contribuidores independientes que comparten un objetivo común: lograr que los dispositivos entiendan el lenguaje natural humano. Mientras seguía estas noticias trabajaba en la programación de este sitio web y me preguntaba si existía una forma de aplicar estas tendencias a una plataforma "tradicional" construida de forma individual. Busqué un problema específico en Plaudere que un modelo de lenguaje pudiera resolver. Tras un periodo de reflexión y tras explorar de nuevo versiones anteriores de la web me di cuenta de que al haber perdido el contacto con la lógica y el uso de aquellas iteraciones me resultaba difícil entender y seguir el flujo de la aplicación. A pesar de haber evolucionado el sitio para que fuera más intuitivo siempre existirá una barrera de uso si el usuario no está familiarizado con la interfaz o no encuentra rápidamente las opciones que le permitan cumplir sus objetivos de uso con la web. Así identifiqué que tanto la curva de aprendizaje en la navegación como la falta de claridad sobre el propósito fundamental de la web eran fricciones típicas que podrían minimizarse mediante la implementación de modelos de lenguaje.
Navegando entre restricciones: Cloud vs. Local:
Para abordar la aplicación de modelos de lenguaje en el sitio web investigué los fundamentos de la inteligencia artificial generativa. Aunque existen muchos modelos disponibles, estos suelen conllevar costes por llamada a sus APIs o límites estrictos de uso que no encajaban con un proyecto en fase inicial como Plaudere. Al no contar con información sobre el volumen de demanda real, depender de terceros suponía un riesgo de incurrir en errores o interrupciones que frustrarían la experiencia del usuario. Mi objetivo principal era construir capacidades propias sin dependencias externas siempre que una solución local fuera viable. Reflexioné que, para el caso de uso específico de Plaudere, donde la precisión no era extremadamente exigente, carecía de sentido recurrir a modelos masivos o costosos si uno pequeño podía cumplir con los requisitos. Así comencé a buscar en Hugging Face modelos open source compatibles con Node.js, ya que mi prioridad era integrar la IA dentro de la arquitectura actual del sitio y evitar, en esta fase, la complejidad de gestionar componentes externos adicionales más allá de los servicios básicos de autenticación.
Exploré varios modelos intentando mantener el servicio dentro de los límites de 3GB de RAM y 3vCPUs. Probé Flan-T5, TinyLlama, Llama y GPT-2, pero la mayoría excedía los 3GB una vez cargados en memoria o generaban errores de Node.js al combinarse con los procesos propios de la web, una frustración común en el desarrollo. Tras varios intentos, el único modelo que funcionó fue Qwen 1.5 0.5B (desarrollado por Alibaba Cloud). Es extremadamente eficiente: requiere menos de 3GB de RAM y 3vCPUs utilizando una versión quantizada. Con aproximadamente 500 millones de parámetros, se clasifica como un Small Language Model (SLM) y, a pesar de su tamaño, maneja una ventana de contexto de 25,000 palabras. Utiliza una arquitectura de transformer decoder-only y soporta 12 idiomas, con un rendimiento destacado en inglés y una solvencia sorprendente en otras lenguas pese a sus dimensiones reducidas.
Repositorio del modelo Qwen1.5 0.5B en Hugging Face.
Documentación oficial del modelo Qwen 1.5 0.5B (en inglés).
Antes de decidirme por Qwen, investigué arquitecturas de procesamiento de lenguaje natural (NLP) más antiguas. Aunque eficientes para tareas de clasificación, estas carecían de la fluidez del lenguaje natural y de la capacidad de entender el contexto o la conjugación. Los modelos tradicionales podían identificar el sentido general de un texto, pero a menudo se limitaban a respuestas binarias de "Sí" o "No", sin una verdadera estructura gramatical. Para crear un agente de acompañamiento en Plaudere, la rigidez de estos modelos los hacía inviables. Esta es la razón por la que opté por los LLMs basados en Transformers, los cuales han dejado obsoletas las arquitecturas de preguntas y respuestas (Q&A) convencionales, permitiendo una interacción mucho más humana y adaptativa.
La solución: Arquitectura desacoplada con FastAPI y Qwen 1.5
El siguiente paso fue migrar el modelo Qwen a un servicio independiente de FastAPI. Al separar el SLM del servidor web, evitamos conflictos de memoria. Esta API dedicada se activa cuando el usuario realiza una consulta; el sitio web espera la respuesta remota y, si no hay más actividad, el servicio entra en modo de suspensión para ahorrar recursos del servidor.
Implementación del Contexto (RAG):
Para integrar el modelo, añadimos un chat emergente que envía el prompt del usuario al servidor. Definimos tres casos de uso para el soporte:
- Ayuda general del sitio web.
- Consultas sobre artículos creados en la plataforma.
- Información sobre usuarios (solo si estos la han compartido).
Aunque Qwen acepta una ventana de contexto de 25,000 palabras intentar meter todo ese volumen de datos en un servidor con solo 3GB de RAM es simplemente imposible. En cuanto cargas el modelo el espacio que queda para procesar el texto es tan pequeño que si le mandas párrafos enormes el servicio se cae al segundo por falta de memoria. Para solucionar este lío monté una arquitectura de Generación Aumentada por Recuperación pensada para ahorrar recursos al máximo. En lugar de marear al modelo con información que no necesita uso Fuse.js para encontrar las frases que de verdad tienen que ver con lo que pregunta el usuario. Fuse.js es una librería de búsqueda difusa muy ligera que hace el trabajo sucio sin necesitar servidores externos ni instalaciones raras. Su gran ventaja es que corre totalmente en memoria y es superrápida lo que me permite pasar de bases de datos vectoriales por ahora ya que no tengo latencia de red y el consumo de RAM es casi cero. Si la función no encuentra una coincidencia clara saca un resumen del contenido para dar una respuesta general.
Soy consciente de que esta función de búsqueda difusa tiene sus límites porque se basa en encontrar palabras exactas y no entiende el significado profundo como lo haría una base de datos vectorial. Pero para lo que es Plaudere ahora mismo montar una infraestructura vectorial con lo que gasta y lo que cuesta mantenerla no tenía sentido. He preferido este RAG artesanal que es práctico y me permite ver qué tal se porta el Small Language Model sin reventar el servidor. El modelo recibe un prompt mejorado con este contexto y así no tiene que inventarse las cosas basándose solo en lo que sabe de antes sino que se apoya en el contenido que le pasa Fuse.js. La única pega importante es que FastAPI tiene que gestionar las preguntas de una en una con una cola de espera porque si intenta procesar varias a la vez nos pasamos de los 3GB pero es un trato que acepto para que todo siga funcionando de forma equilibrada.
Conclusiones y hoja de ruta:
El objetivo inicial de proporcionar mejores herramientas para entender la web ha sido superado. La clave de los buenos resultados reside en la calidad del contexto. Aunque el modelo ocasionalmente presenta "alucinaciones" o errores factuales básicos (propios de un SLM frente a un LLM), responde con éxito basándose en la información de soporte.
Nuestros objetivos futuros incluyen, entre otros:
- Reducir alucinaciones migrando a versiones más recientes de Qwen o a otros modelos mejores.
- Enriquecer las respuestas de la IA incluyendo imágenes y videos.
- Refinar las reglas de contexto para el contenido generado por usuarios.
- Garantizar la consistencia multilingüe para que la IA responda en el mismo idioma de la interfaz.
- Uso de base de datos vectorial embebida para aumentar la coherencia y el contexto de las respuestas a los prompts.
Este proyecto ha sido fundamental para experimentar con GenAI bajo restricciones reales de hardware, aplicando la metodología RAG para que un modelo responda sobre un contexto que nunca vio en su entrenamiento original. Ha merecido la pena el esfuerzo: me ha servido para entender de verdad los límites de mi propia arquitectura y demostrar que, con un poco de ingenio, se pueden montar soluciones inteligentes sin necesidad de recursos infinitos.