Kabosu - Creando cosas

Logo de la página. Gato esférico con colores verdoso.

El bot traductor y los prompts

Publicado: 2025-02-08

Etiquetas: IA, Proyectos, Python


Buenos días, tardes o noches:

Tras escribir el artículo de hace una semana quejándome de la IA de OpenAI que usaba en el bot de telegram que tengo en el chat familiar para que vaya traduciendo mensajes me propuse solucionar el problema definitivamente y de paso aprender un poco de ingeniería de prompts o como se llame al hecho de conseguir que un LLM haga lo que le dices.

Mi objetivo es que el bot vaya leyendo los mensajes de un chat de Telegram y si están en el idioma A los traduzca al idioma B y viceversa. Así los miembros de mi familia que hablan idiomas distintos se pueden comunicar (más o menos) sin que tengamos que hacer de intérpretes.

Aprendiendo ingeniería de prompts

Empecé a leer el libro Prompt Engineering for LLMs: The Art and Science of Building Large Language Model-Based Applications. Se publicó en noviembre de 2024 así que supongo que cuenta lo último de lo último. Todavía voy por la mitad. Cuando lo termine de leer supongo que escribiré una reseña pero de momento estuve poniendo en práctica todo lo que explican para que mi bot tenga el prompt definitivo.

Para poder evaluar los cambios, lo primero que hice fue recopilar 100 frases en cada idioma. Escribí un script en Python que llamaba a la API de OpenAI para cada frase y así pude ir probando prompts y modelos de manera fácil. Probé diversas técnicas y trucos con los modelos gpt-3.5-turbo, gpt-4o y gpt-4o-mini calculando qué porcentaje de las frases se traducían. No me puse a mirar si traducían bien, simplemente que traducían algo en vez de dejar la frase en el idioma original que era el problema que estaba teniendo con el bot.

Me di cuenta de que mi prompt inicial con gpt-3.5-turbo traducía aproximadamente el 80% de las frases. El resto las dejaba igual o a veces cambiaba palabras pero no traducía. Con gpt-4o el porcentaje de "acierto" era del 99% así que tampoco era necesario aplicar todos los trucos del libro pero los fui probando para practicar.

No voy a ponerme a explicar en detalle mis experimentos porque no sirvieron realmente para nada. Simplemente cambiando al modelo más nuevo lo hacía bien prácticamente siempre con el prompt básico. Bueno, sirvieron para darme cuenta de un error garrafal que había cometido durante meses: descubrí que había estado desplegando el bot mal. Lo tengo en un contenedor de Docker y, a pesar de haber ido actualizando el prompt y el modelo durante los últimos meses, no se estaba actualizando la imagen y siempre estaba usando el código original que escribí el año pasado. Lo que escribí en el artículo anterior de que los modelos de OpenAI cada vez iban peor con el mismo prompt no era verdad porque realmente estuve siempre usando el mismo modelo gpt-3.5-turbo. La solución para el bot era simplemente cambiar al modelo gpt-4o. Cosa que había hecho pero no desplegué la nueva versión del bot por soy tonto.

Esta ha sido la primera vez que he estado estudiando en detalle cómo funciona un LLM, cómo procesa los prompts y cómo optimizarlos. Me ha servido conocer más la tecnología pero a la vez me ha defraudado un poco. Por una lado me parece increíble que una red neuronal que básicamente está entrenada para predecir la siguiente palabra de un texto sea capaz de realizar tareas. Por otro lado no me gusta que para que funcionen correctamente necesitemos estudiar tan a fondo el modelo, aprender técnicas sobre cómo escribir las instrucciones y, en general, que exista todo este tema de la ingeniería de prompts. Me da la sensación de que más que hablar con la IA es como si estuviera aprendiendo a programar en un lenguaje nuevo. Además en un lenguaje que no me garantiza que vaya a funcionar lo que escribo aunque esté bien escrito. O que a veces vaya a funcionar y a veces no. No lo veo fiable.

Al menos había "arreglado" el bot y según mis métricas ahora debería traducir alrededor de un 99% de las veces.

El bot traductor, ¿mejorado?

Durante mis experimentos automáticos con prompts, para saber si una frase se había traducido o no tuve que implementar un detector de idioma sencillo. No tener uno fue lo que me hizo decantarme por usar un LLM cuando creé el bot en vez de usar un modelo de traducción. Un error por mi parte.

Como ya tenía el detector y además mis múltiples pruebas prácticamente habían consumido todo el crédito que teníamos en OpenAI decidí que por fin era hora de dejarse de LLMs y usar un modelo de traducción. Monté el servicio de LibreTranslate en mi servidor casero (el mismo que tiene el bot) y modifiqué el bot que escribí en Python para que, en vez de llamar a OpenAI con un prompt, enviara una petición de traducción a mi instancia de LibreTranslate. Esta vez sí que inicié bien el servicio con Docker y ahora estamos usando por fin un traductor ejecutándose en local sin enviar los datos a una empresa externa. Obviamente Telegram tiene las conversaciones porque es la plataforma pero hemos quitado a OpenAI de la ecuación.

Sí que he de comentar que me parece que LibreTranslate traduce bastante peor que el LLM de OpenAI (cuando funciona). Es una de las cosas inexplicables de la tecnología LLM: se ha descubierto que para muchas tareas de procesado del lenguaje funcionan mejor que los modelos especializados más avanzados.

En principio para un chat familiar donde se dan los buenos días o hablan de si nieva o hace sol no es necesario una traducción profesional así que no me preocupa demasiado si LibreTranslate es peor. Valoro más la eficiencia y privacidad de traducir en mi servidor casero. Si en un futuro veo que traduce muy muy mal ya investigaré si puedo utilizar algún LLM local o algo así pero de momento estamos servidos. El modelo chino de DeepSeek está muy de moda estas últimas semanas. Podría ser una opción. Pero siempre ejecutándose en local. No quiero depender más de APIs externas que ejecutan modelos gigantescos y consumen montones de recursos para traducir cosas como "oh que foto más bonita".


Artículo siguiente: Contribuyendo código a Alpine Linux
Artículo anterior: Información de contacto