- Vivir del cuento y no morir en el intento
- Posts
- #38 - El mochuelo de Minerva
#38 - El mochuelo de Minerva
Plandemia, tomarse días libres y hacer webs con GPT-4
Buenos miércoles y bienvenidos a la treintaochea… treintóche… trigésimocha… estooo, a la newsletter que hace treinta y ocho de VDCYNMEEI (pedazo siglas), ”la newsletter de este colgao” para los amigos.
Hoy vamos a empezar filosofando sobre el autoodio, progresaremos hablando de moquetas de polvo en superficies varias y de repente os meteré un empacho de API de OpenAI que os vais a quedar con el culo torcido.
Píllate un paquete de pipas, que tiene selenio, y un Red Bull, que tiene gasolina, y al lío.
🧘 El Caótico
Ya he explicado otras veces por aquí que el caos es parte de mi esencia. Me gusta el caos. O mejor, me tiene que gustar quiera o no, más me vale, porque no puedo escapar de él.
Si me hago rico me compro un Jeep Wrangler del 92
Hace unas semanas tuve una reunión de co-founders. Suena grandilocuente pero en resumen me comí unas pizzas y bebí unas birras con los que montamos un proyecto hace un tiempo.
Una persona en particular hacía bastante que no la veía. Y para sorpresa de los presentes resulta que durante todo este tiempo ha estado metiéndose en la parte honda de la internet, decapando la fosa séptica de bits y bytes, esnifándose el sudor del entretete de la red global. Vamos que nos salió con la retahíla conspiranoica estándar de alguien que ha abusado del 4chan, las revistas new-age y pegamento de barra.
Me faltó hacer un Bingo. Se tocaron todos los palos. La dictadura del CO2. El movimiento woke como estrategia de reducción de la natalidad. Los microchips en las vacunas. El nuevo orden mundial.
Los putos chemtrails.
Imagen de archivo del gobierno haciendo a las ranas gays
Los demás comensales (que me están leyendo ahora mismo) sintieron el fuego de la injusticia y la desinformación arder en sus estómagos, alzándose paladines de La Verdad™ y enarbolando el estandarte de La Ciencia y El Sentido Común.
¿Qué hice yo?
Yo le pregunté por la tierra plana.
Ahí lo dejo.
💭 Reflexión — Conócete a ti mismo
En la primera temporada ya lo dije. En latín incluso. Hay que conocerse a uno mismo.
Yo me conozco bastante. Se que soy caótico. Por eso te contaba lo de antes.
Pero yendo un poco a esto de la autoayuda, sabed que nada lleva a la frustración más rápido que el ignorar nuestra propia naturaleza y embarcarnos en proyectos antitéticos a nosotros mismos.
Y yo lo se porque lo hago sistemáticamente. Parte de lo de caótico. Pero estoy trabajando en ello.
Por ejemplo en mi empresa hemos tenido oficina propia durante mucho tiempo. Ahora, por motivos ajenos a la obra, ya no. No verás en mi ni una gota de frustración. Porque yo no soy capaz de tener una oficina. Y mi socio, tampoco. Somos incapaces en lo más profundo de nuestra existencia de llevarla con la más mínima soltura. Incapaces de encargarnos de la intendencia, el mantenimiento y la organización. Incapaces incluso de delegarla.
El más mínimo periodo de alto estrés derivaba en el acúmulo de movidas en la nevera en tal estado de abandono y putrefacción que la única forma científicamente honesta de describirlas era con el término ectoplasma.
La gente que limpió la oficina cuando nos fuimos nosotros
Es por eso que ahora en la empresa uno de mis roles no oficiales es el de recordar esta realidad. Recordar que hay cosas que no podemos hacer. Recordar cómo somos. Y busco siempre cómo hacerlo también en mi vida privada y profesional.
Una forma de recordármelo, o tal vez de no tener que acordarme, es construyendo sistemas y rutinas que me permitan evitar los las recaídas.
Entre estos sistemas tengo uno que he empezado a entender recientemente que es el permitirse fallar. Por ejemplo, yo voy de culo en el trabajo. No me da la vida, no tiene más, me he metido como de costumbre en demasiadas cosas y no tengo horas en el día de hacerlas todas en tiempo y forma.
Que por cierto, hago un inciso, otro de mis sistemas es el de ser realista con el tiempo, que en mi caso significa planificar toda mi vida profesional asumiendo que sólo tengo 4 horas productivas al día. Y obligándome sólo a hacer estas 4 para hacer el check mental de haber cumplido. Y así cuando se me va la olla todavía tengo margen.
El caso es que, como decía, ahora se me ha ido la olla y recientemente le estoy metiendo un buen montón de horas a cada día para salvar los muebles. Pero no es sostenible. Ni a largo plazo ni tampoco a corto. Porque me conozco. Esto acaba reventando por alguna costura e igual que me puede dar por encerrarme en casa y partir en dos el teléfono para huir de la responsabilidad, me puede dar también por raparme la cabeza, ponerme una túnica e irme a Sudamérica a hervir peyote en una cantimplora.
Así que por el bien de mi familia y coincidiendo con un viernes que la logística me llevaba a pasar la mañana en casa de mis padres me he tomado un día de desintoxicación consistente en hablar de política, beber kefir y investigar algún side project que me desempalague.
Y el truco del sistema es aceptarlo como parte del plan. Ya había hecho (con creces por desgracia) las 4×5=20 horas productivas que me había planteado para la semana. Y además he dedicado el tiempo extra a cosas medianamente útiles. He cumplido. Nada que objetar. Nada de lo que arrepentirse.
Así que dos conclusiones:
La primera, que llevo repitiéndote machaconamente todo este tiempo, conócete y acéptate.
La segunda, ¡que tengo material de #AprendeCosasDeIA camuflado de #BuildInPublic para daros la turra!
Así que hold onto your butts que nos tiramos a nadar sin manguitos.
🔧 #BuildInPublic — Generando JSON con GPT-4
En alguna edición anterior os comenté que había hecho una serie de scripts para generar páginas web con IA. Hay un montón por ahí que lo hacen pero suelen funcionar a base de pedirle a la API de OpenAI que genere HTML. Bien tuneado, pero HTML.
Yo quería algo más molón y que me diese pie a poder editar luego estas páginas de una forma más estructurada y sin tener que tocar HTML ni CSS. Para ello me basé en un concepto que ya usamos en ydevs que es el de montar páginas a base de bloques. En mi caso, generé unos cuantos al tuntún copiando ejemplos de TailwindCSS buscados en Google:
Estos bloques tienen dos componentes fundamentales:
El código necesario para renderizarlos. Estos son componentes de React.
La definición de los tipos (de Typescript) y una descripción legible.
La segunda parte es crítica, porque para generar una web le paso a GPT-4 los tipos de TS y la descripción de todos los bloques que tiene a su disposición y le pido que me genere un YAML que describa la web entera, diciéndole también por supuesto cómo debe ser este YAML.
El problema de esta estrategia es doble y en ambos casos la limitación viene dada por el límite de tokens de contexto y respuesta del modelo:
No es posible generar una web grande porque un YAML de tamaño significativo consume muchísimos tokens (e.g. uno por espacio de indentación).
Hacerlo de forma progresiva pidiéndole cambios a la web existente es complicado porque o bien nos devuelve en nuevo YAML completo o una parte que tenemos que integrar manualmente en el existente.
Buscando una solución al segundo punto me dediqué a trabajar hace unas semanas en lograr que ChatGPT generara diffs. Y tuve un éxito relativo:
Mi pequeña UI para enviar a GPT-4 mis peticiones de cambios
¡Uuuuuyyyy casi!
Parece un diff correcto ahí detrás, ¿no? Pues no. Se ha inventado las líneas
El caso es que genera diffs, sí, pero el 90% de las veces es ligeramente inválido. Porque generar diffs es droga dura de alto nivel, por desgracia, y entra dentro del reto imposible para un LLM de contar líneas y letras.
Pero entonces se me ocurrió que podría adaptar la nueva funcionalidad de llamada a funciones de OpenAI para hacerle la vida más fácil al pobre modelo.
¿Lo qué? Te lo explico.
☎️ Generando llamadas a funciones con GPT-4
Para los despistados esta actualización permite comunicarle a GPT una lista de funciones a las que puede (¡o debe!) “llamar” como respuesta. Es decir, tu por ejemplo le especificas que existe una función get_current_weather
que acepta un objeto con dos parámetros location
y unit
. Y entonces le pides que te diga el tiempo en una ciudad.
El payload que le envías a la API de OpenAI
Y entonces el modelo en lugar de generar texto como respuesta te devuelve una llamada a la hipotética función que ha entendido que sería la forma de darte la respuesta:
El señor Gepeté respondiendo con “ejecuta esto, socio”
¿Para qué sirve esto? Para que la respuesta del LLM sea algo que hacer en lugar de algo que decir.
Con esto aclarado, vamos a aplicarlo a este caso.
🙏 GPT-4, porfa, modifícame el YAML con esta función
Lo primero es inventarnos una hipotética función de “aplicar diff” en la que los parámetros de la función serían una array de adiciones o eliminaciones. Sabemos que el sistema tiene problemas contando en general, pero bueno, siempre hay esperanza.
Narrador: no había esperanza.
Le paso una función a la que debe “llamar” (esto es, de nuevo, devolver “qué parámetros le pasaría”) donde el argumento es una lista de cambios, y cada uno definido por la línea a sustituir y por qué líneas hacerlo.
Esta es la definición de la función:
Haz zoom, que hay cosas
Pues manos a la obra. Le empiezo a pedir cosas y…
Nada de nada. No hay manera. Se inventa las líneas igual que con los diffs. Se niega a incluir la indentación en las respuestas. Incluso se niega a seguir la especificación que le he pasado, ignorando la parte de la lista de nuevas líneas y devolviendo siempre una sola cadena de texto.
Vamos a probarlo de otra forma. Estructuradamente. Con paths en lugar de números de líneas. Probemos con esta definición:
Ponte las gafas de cerca anda
Y….. ¡sigue sin saber contar! Qué suplicio. Al menos ahora devuelve cosas razonables. Pidiéndole esto:
Nos sugiere este cambio:
Que vale, está bien. Pero es que el bloque de Testimonials que debía reemplazar es el anterior. Off-by-one como de costumbre. Y así sistemáticamente. Se me ocurre probar pidiéndolo muy mucho:
Be sure to count properly any array accesses. Remember, arrays are zero-indexed. This is of utmost importance. Triple check it, pretty please. Otherwise a kitten dies.
Pero nada. Así que viendo que es completamente imposible hacer contar a GPT-4 desisto y elimino cualquier rastro de arrays. Todo objetos.
Y ahora sí. Lloro.
Ese diff hace valer la pena las cien mil horas que me ha costado hacerlo funcionar
Lo único malo, que el vídeo está baneado por copyright así que no era divertido. ¡Casi!
👋 Y hasta aquí
Ya paro. Que sí. Que no es #BuildInPublic, ya lo se, que soy yo a las tantas de la noche aquí comiendo chocolate ecuatoriano y gastándome dinero en la API de OpenAI por puro vicio.
Y es que no es #BuildInPublic ni queriendo porque existen herramientas como Framer que hacen todo esto cien mil veces mejor, con un pedazo de editor no-code nivel Webflow y con un millón de features que yo no podría implementar en la vida.
Así que se queda en experimento casero que ya veremos cómo despiezo y uso algún día para algo.
Pero bueno, si al menos os ha servido para ver cosas interesantes de esto de la IA, bien está.
Esta semana no hay sección de herramientas porque la verdad es que no me he encontrado con nada decente y todavía no tengo organizado mi backlog de herramientas interesantes como para sacar cosas útiles del baúl. Así que quedaros con el tip de Framer en su lugar. Echadle un ojo.
Y con esto me despido hasta la semana que viene.
A disfrutar de lo votado.
Nos leemos pronto.