¿La era de la Inteligencia artificial?

Tengo que reconocer que con el advenimiento de chatGPT y las muestras de la IA generativa en campos como la programación de un tiempo a esta parte las expectativas se han disparado con respecto a lo que se puede esperar de una Inteligencia Artificial. Sin embargo, no es oro todo lo que reluce.

La disciplina de Inteligencia Artificial existe desde hace muchísimos años, yo mismo, como estudiante de mi facultad fui miembro del Laboratorio de Inteligencia Artificial desde el año 1989 hasta que salí del mismo (esa es una historia para contar en otro momento) y me dediqué a otros proyectos de IA como la traducción automática. Pero la IA es anterior a estas fechas incluso. La verdad es que el avance «real» de la IA no ha sido expectacular estos años pasados excepto en la imaginación de algunos autores de ciencia ficción.

¿Porqué, entonces, se ha notado un avance tan importante estos últimos años? Bueno, lo que yo os puedo decir es que no toda la IA ha avanzado por igual, la que ahora mismo disfutamos es la IA generativa basada en aprendizaje profundo «Deep Learning». Para que se entienda, se trata de un sistema que «aprende» en base a miles de millones de muestras a generar «algo», una imagen, un texto, una respuesta ante una entrada determinada. Y el problema está en que al utilizar esa IA simplemente estamos recombinando los elementos de su entrenamiento de manera que sea más o menos adecuado a la pregunta o solicitud de entrada, no hay lógica, no hay algoritmo, es simple aprendizaje.

Si tu le preguntas algo a chatGPT no se desencadenan procedimientos lógicos que luego se puedan auditar, lo que se produce es una generación de lo que más probablemente, según los documentos que ya aprendió, se parezca a una respuesta a esa pregunta. Lo más parecido a un papagayo al que se le han enseñado miles de frases, te dará una respuesta tenga ésta sentido o no lo tenga.

De hecho, uno de los efectos más curiosos de las IAs generativas es que se inventan cosas – «alucinaciones» -, y no hay forma de que sepan si es cierto o no lo que están contando, por lo que es complicado, por no decir imposible, fiarse al 100% de lo que podamos obtener de una IA de este estilo. A diferencia de las imágenes que ilustran esta entrada, que han sido generadas por IA y podemos verlas como una simple muestra más o menos estética, si hacemos caso de lo que nos recomienda chatGPT, Gemini o cualquier otra AI generativa estaremos haciendo caso a un papagayo con mucho entrenamiento.

Este resurgir de la IA ha sido, básicamente, consecuencia de la acumulación de cientos de miles de millones de datos proporcionados por los usuarios de internet, unos conscientemente y otros inconscientemente en pago por el uso de alguna red social o alguna herramienta «gratuita». De hecho, la disponibilidad de estos conjuntos de entrenamiento tan inmensamente grande es lo único que ha permitido la ilusión de disponer de un asistente inteligente de verdad y, repito, es una ilusión. Nunca te fíes de quien no puede explicarte porqué ha hecho o dicho algo… Y las IAs generativas no pueden.

¿Hay que descartar entonces el uso de estas IAs? No, en ningún caso, disponer de una herramienta entrenada con datos que nos son útiles (como todos los códigos de github que su copilot ha usado en su entrenamiento) nos pueden ahorrar mucho tiempo en disponer de versiones preliminares o códigos sin refinar. Pero siempre necesitaremos alguien para refinar los resultados de cualquier IA generativa. Simplemente porque la IA no sabe realmente qué es lo que está diciendo (y nunca lo sabrá). El hecho de que haya gente planeándose reemplazar personas humanas por IAs (o incluyo que ya lo han hecho) demuestra que hay trabajos de bajo valor añadido que no necesitan siquiera razonar correctamente para ser desempeñados, esos trabajos si que pueden ser reemplazados, pero igual es que la necesidad de éstos ya era algo anecdótico.

Banco Sabadell ¿Empresas?

Día 17 de noviembre, una carta llega a mi buzón, en ella el Banco Sabadell me indica que tiene la obligación legal de comprobar que mi empresa justifique su actividad profesional y su capacidad económica. Le acompaña una lista de documentos que, a su parecer, justificaría estos aspectos… Al final pone un párrafo interesante:

La documentación podrá ser remitida a través de la web del Banco Sabadell, desde su área de cliente de banca digital. Acceda a la web de Banco Sabadell con su usuario y contraseña, desde su ordenador personal. Pulse sobre su nombre, el enlace está en la sección Perfil>Documentación digital>Documentos compartidos

Bueno, pues uno que es obediente hace lo que le dicen.

Nada, no hay forma de subir ningún documento allí… En fin, qué se puede esperar de un banco en el que no funcionan las transferencias desde el navegador porque «patata» y tienes que usar la versión vieja que si que funciona… Venga, llamemos a ver que me dicen al teléfono que acompaña la notificación.

Primera llamada: selecciona una opción (ninguna adecuada), me pasan con un operador, me pregunta mis datos, le cuento el problema… le paso

Segundo operador: le paso con un robot para que meta la contraseña… ¡como si darle la contraseña a un robot fuese más seguro…! Fallo1, acierto al 2… Le vuelvo a comentar el problema… le paso

Tercer operador: ¿me oye?¿me oye? deben tener algún problema con los auriculares o algo… Obviamente, ya con la paciencia mermada, me piden de nuevo que les cuente lo que me pasa (ya soy un experto resumidor…) y, oh sorpresa! me dice que esa operación la tengo que hacer desde la web de particulares… what!?

Pero es que esto es una cuenta de empresa, la notificación viene a nombre de la empresa y yo no tengo cuenta particular en el Sabadell… Respuesta: a mamarla… Que te pases por una oficina y pierdas media mañana para darles unos papeles (que solo tengo en digital) ¿qué les doy un usb? ¿grabo un dvd? ¿lo imprimo todo para que luego ellos lo escaneen de nuevo? Pero que coj****

A ver, que ya sabéis que a mi los bancos me caen mal TODOS, pero es que un banco de este tamaño no tenga una forma «buena» de que las empresas puedan subir documentos que según ellos son obligatorios pues, bueno, como poco produce estupor y vergüenza a partes iguales. ¿También le piden a Juan Roig que se abra una cuenta personal para subir papeles de Mercadona? ¿Se lo piden a quien sea el administrador de la empresa?… Bueno, supongo que a esos ya les visitarán en persona o les permitirán que se lo manden por mail, que la pela es la pela.

Volveremos a hablar de esto cuando me bloqueen la cuenta por no aportar los papeles, grrrrrrr.

Cuando se está viendo cometer un genocidio se dice y ya

Hoy es el último día del mes de noviembre y mi «disciplina» me obliga a escribir algo antes de que termine el mes (va a estar muuuuuuy al límite) y a la hora de ponerme a escribir tenía dos opciones:

  • Contaros cómo funciona la blockchain de bitcoin, que es con lo que ahora mismo estoy más entretenido
  • Dar una charla intrascendente sobre liderazgo, emprendimiento o estoicismo
  • Hablar de lo que me está indignando ahora mismo…

Y voy a optar por la tercer opción… Y no es una indignación política, como otras veces, es una indignación como ser humano, como habitante del planeta que se horrorizó de la existencia del holocausto y que no cree que, generalmente, la gente tenga que ser cruel. Pero si se está cometiendo un genocidio se dice y ya.

Me pueden acusar de antisionista (si quieren), de antisemita (los lerdos que no saben distinguir) o de simpatizante de hamás (si eso les mola, pues adelante), pero las cifras no engañan. Miles de muertos, la inmensa mayoría civiles y la mitad de ellos niños, masacrados como venganza por un acto abyecto de terrorismo. Tengo judíos en las redes que no hacen más que hacerse pasar por víctimas y justificar que una vida Israelí equivale a varias cientos de vidas palestinas (con toda su pachorra) y no deseas más que baje otra vez Jesús a machacar a los filisteos en plan peli de acción…

¿Estoy justificando lo que hizo Hamás? No, nunca, de ninguna manera… El terrorismo es violencia y yo soy contrario a toda la violencia, venga del IRA, de ETA o de Trump… Lo que hay que entender es que este terrorismo es una consecuencia y no la causa de los desmanes Israelíes. Veamos un poco de historia:

mapa cronologico

En 1947 Palestina era un país como cualquier otro, con su territorio, su gobierno, sus buenos y malos, sus leyes, su gobierno, sus jueces y… sobre todo, su territorio. En ese año los sionistas decidieron tomar al asalto (o haciéndose los tontos, que para el caso) su tierra prometida… Y las potencias aliadas, bueno, quisieron compensar el holocausto de alguna manera. Una manada de inmigrantes de todas partes de Europa se asentaron sin pedir permiso (ni perdón) en tierras que no eran suyas y decidieron, por su cuenta, pasar de la ONU y de todo formando su propio estado. Los que antes eran propietarios del territorio pasaron a ser solo parte de un país conquistado. A los que vivían ahí desde hacía generaciones se les negó todo derecho fundamental y durante años fueron oprimidos por la nueva fuerza de ocupación cuyo único objetivo era echar a los impuros de su estado religioso (como Irán, pero con otra religión)… Y en estas llegamos a los planes actuales. A estas alturas, con la mitad de la franja de Gaza destruida, la población diezmada y desplazada, sin electriidad, agua ni forma de recibir ayuda lo único que tiene interés para el estado de Israel es repoblar Gaza con asentamientos Judíos… Lo que nos venden como una guerra no es más que una conquista más, un Putin anexionándose Ukrania sin que nadie diga ni mu…

No quiero hacer más referencia a las posturas de unos y otros en la política nacional porque la mayor parte me producen una verguenza profunda pero, ya que tenía que escribir algo, te lo vuelvo a decir: Cuando se está viendo cometer un genocidio, se dice y ya…

AMAZON SES y cómo enviar correos desde un servidor ubuntu

Enviar correo desde una máquina virtual en Amazon siempre ha sido un castigo. Las limitaciones al puerto 25 y a los controles de tráfico de Amazon hacían poco recomendable poner un servidor de correo «normal» en la infraestructura. Sin embargo – y pagando, claro está – Amazon ha puesto a disposición de todo el mundo un servicio para poder enviar correos sin demasiada complicación (aunque, como veremos, también tiene sus limitaciones).

Lo primero es lo primero, si quieres mandar correos usando Amazon SES. La información general la puedes ver aquí: https://aws.amazon.com/es/ses/ y create una identidad verificada (tendrás que cambiar cosas en el dns para que puedas enviar correo desde cuentas de tu dominio. Lo siguiente será crear una configuración de SMTP para tu cuenta, eso te dará un servidor, usuario y contraseña que usar para mandar correos (y los puertos correspondientes)… Anotalos muy bien que será lo que vamos a utilizar.

Al principio tendrás unas limitaciones muy importantes (para probar no nos afectan demasiado) y tendrás que crear direcciones de correo validada, hazlo y prueba que puedes enviar correos a esas cuentas antes de continuar. Los pasos para poder enviar correo desde un servidor ubuntu serían los siguientes:

  1. Instala postfix
sudo apt install -y postfix libsasl2-modules
  1. Añade estas líneas a /etc/postfix/sasl_passwd
smtp_tls_note_starttls_offer = yes 
smtp_tls_security_level = encrypt 
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd 
smtp_sasl_security_options = noanonymous 
relayhost = [email-smtp.xx-xxxx-xx.amazonaws.com]:587 
smtp_sasl_auth_enable = yes 
smtp_use_tls = yes 
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt 
mydestination = 
  1. En /etc/postfix/sasl_passwd
[email-smtp.xx-xxxx-x.amazonaws.com]:587 USUARIO:PASSWORD
  1. Lanza las modificaciones
sudo newaliases 
sudo postmap hash:/etc/postfix/sasl_passwd 
sudo systemctl restart postfix

Y ya estaría, ya puedes enviar correos desde cuentas de tu dominio con sendmail. Si ves algún problema siempre puedes consultar el log en /var/log/mail.log

Si todo va bien lo siguiente es pedir a Amazon que, por favor, os pongan en producción el sistema para poder enviar correos a todo el mundo. Y ya si eso, en otro post, os cuento como configurar una imagen docker para que lo use…

Hacer un bot de telegram sin usar ninguna librería de telegram

Entiendo que conoces la aplicación telegram, lleva con nosotros mucho tiempo y, aunque en nuestro país es mucho más usada whatsapp, telegram tiene también sus adeptos, sobre todo para canales de distribución o para uso secundario con aquellos que ya usan esta herramienta.

Una de las características más importantes de esta plataforma es la separación entre usuarios y bots, los usuarios tienen que tener un número de teléfono registrado y no es tan sencillo hacerse con una cuenta adicional si no tienes otro teléfono, la plataforma distingue perfectamente entre personas y bots, que serían los programas a los que solo se permite interacturar con personas que hayan hablado con ellos antes o con canales de distribución a los que se hayan añadido como administradores (antes podían añadirse como miembros, pero esa posibilidad ya no existe). El caso es que llevo un tiempo desarrollando bots para esta plataforma, usando diversas librerías y después de tantear todos los límites de telegram y de las librerías me he visto obligado a ir directo al api de telegram para bots… Y resulta que no solo es sencillo, sino muy sencillo iniciarse en la creación de bots sin ninguna librería adicional… En este caso vamos a crear un bot de cero y sin librerías de por medio.

Pero, como decía Jack el destripador: vayamos por partes…

Lo primero es crear un bot, telegram pone a nuestra disposición el bot llamado botfather que nos permite crear bots asociados a nuestra cuenta (un máximo de 20 por si os sentís tentados de crear armadas de bots) y se crean simplemente con el comando /newbot y responder unas pocas preguntas… Como podemos ver en la imagen:

Lo importante, y fundamental, es el token que nos genera botfather, esto será todo lo que necesitamos para acceder al api, que como bien nos indican está en https://core.telegram.org/bots/api

Lo segundo será decidir en qué lenguaje y para qué plataforma vamos a crear nuestro bot, en nuestro caso y para simplificar las cosas vamos a hacerlo en python que puede correr en cualquier sitio (linux, mac, windows o incluso serverless), en mi caso vamos a crear un bot que, cuando se lo pedimos, nos genere una nueva contraseña (luego ya veremos si queremos mejorarlo). Por cierto, todo el código que generemos aquí estará en el repositorio https://github.com/yoprogramo/nomorepassbot para que podáis usarlo y modificarlo a voluntad.

Hemos dicho que no tendría dependencias de ninguna librería telegram, pero no hemos dicho que no la tuviese de alguna otra, así que es momento de decidir si queremos usar alguna librería http, en mi caso, por simplicidad he elegido la librería httpx, como tampoco quiero ir instalando cosas de más voy a utilizar pipenv para crear mi entorno de trabajo (vosotros podéis hacerlo como queráis)

La lógica del programa será sencilla, simplemente preguntaremos periódicamente a telegram si tenemos updates, y si los tenemos, miraremos a ver si alguna petición contiene la cadena «password» y si la contiene devolveremos una nueva contraseña generada por nosotros en ese momento. Para recuperar los updates haremos un bucle infinito en donde llamaremos a la función getUpdates y si recibimos elementos los recorreremos uno a uno para tratarlos.

La función para generar una contraseña aleatoria será esta:

def generatePassword(num=10):
    # Generamos una contraseña aleatoria de num caracteres
    letras = string.ascii_letters + string.digits
    password = ''.join(random.choice(letras) for i in range(num))
    return password

Lo primero que tenemos que hacer es dar un valor a nuestro token y establecer la url del api de telegram:

token = 'TOKEN'
url_base = f'https://api.telegram.org/bot{token}/'

Y la función que recupera las actualizaciones será, por tanto esta:

r = httpx.get(url_base + 'getUpdates')
    updates = r.json()['result']

La función para enviar un mensaje a un usuario (o a un chat) se llama sendMessage y recibe como parámetros (entre otros) chat_id y text, así que poniendo todo junto nos quedaría esta función:

while True:
    r = httpx.get(url_base + 'getUpdates')
    updates = r.json()['result']
    for update in updates:
        if 'message' in update:
            message = update['message']
            if 'text' in message:
                text = message['text']
                if 'from' in update['message']:
                    user = update['message']['from']
                    if 'password' in text:
                        respuesta = 'La contraseña es ' + generatePassword(10)
                        r = httpx.post(url_base + 'sendMessage', data={'chat_id': user['id'], 'text': respuesta})
                else:
                    continue 
    time.sleep(1) 

Si ejecutamos esto (y tenemos el token que nos ha dado godfather) ya podremos pedir la contraseña y recibiremos respuesta (al hablar con nuestro bot, claro):

Claro que si dejamos el código así el bot se empeñará en darnos contraseñas una detrás de otra sin parar, y es que telegram no sabe si hemos tratado o no el update que nos ha enviado, para ello hay que usar el parámetro offset para indicar cual será la siguiente actualización a tratar y cambiando el código un poco nos quedaría:

offset = 0
while True:
    r = httpx.get(url_base + 'getUpdates', params={'offset': offset+1})
    updates = r.json()['result']
    for update in updates:
        offset = update['update_id']
        if 'message' in update:
            message = update['message']
            if 'text' in message:
                text = message['text']
                if 'from' in update['message']:
                    user = update['message']['from']
                    if 'password' in text:
                        respuesta = 'La contraseña es ' + generatePassword(10)
                        r = httpx.post(url_base + 'sendMessage', data={'chat_id': user['id'], 'text': respuesta})
                else:
                    continue
    time.sleep(1)

Obviamente nos falta tratar las respuestas incorrectas y los timeouts y demás (y alguna respuesta adicional que nos puede dar telegram si hacemos demasiadas peticiones), pero eso lo dejo para que lo mejoréis en el repositorio https://github.com/yoprogramo/nomorepassbot