Escribir en redes sociales me ayudó a darle dirección y propósito a mis ideas, pero también descubrí sus limitaciones: publicaciones efímeras, dependencia de plataformas y dificultad para organizarlas. Por eso, decidí transformar mis publicaciones en un blog personal, un espacio más duradero y organizado para mis ideas. Utilicé herramientas de software libre como Hugo y Python, combinadas con modelos de lenguaje extenso (LLMs, por sus siglas en inglés) para la curaduría del contenido. En este artículo, comparto mi motivación, el proceso y los aprendizajes que surgieron al crear un espacio independiente para mis ideas.
Contexto y motivación
Desde hace unos años, encontré en la escritura un ejercicio interesante que implica un proceso de pensamiento distinto al de simplemente consumir contenido. Plasmar mis ideas en palabras me obliga a estructurarlas, cuestionarlas y entenderlas a profundidad. Además, disfruto la escritura por:
- Me gusta compartir información, desde reflexiones sobre libros, documentales o museos hasta herramientas y tecnologías que he aprendido o proyectos que he realizado.
- Me ayuda a identificar y llenar vacíos en mi conocimiento al profundizar en los temas antes de compartirlos.
- Me permite conectar con personas interesantes a través de las ideas que comparto.
Elegí como medio para mis ejercicios de escritura las redes sociales, y en un inicio resultaron ser un buen punto de partida. Sin embargo, con el tiempo me di cuenta de que el contenido que compartía estaba sujeto a las limitaciones de estas plataformas. Depender de servicios de terceros significaba que mis escritos podían desaparecer. Además, en redes sociales mi contenido terminaba mezclado con el flujo de información constante, perdiéndose fácilmente. El siguiente paso era un espacio donde pudiera darle a mis ideas la atención y el contexto que merecen.
Por eso, decidí crear un blog personal, un espacio que no solo me ofreciera independencia, sino también estabilidad y control sobre mi contenido. Mi plan no es abandonar las redes sociales, sino complementar su inmediatez con la estabilidad de un sitio web propio.
Con esta idea en mente, y aprovechando mi contenido existente, decidí usar mis publicaciones en redes sociales como base para construir mi blog, mientras aplicaba LLMs para curar la información de forma eficiente.
Elección de herramientas
Para la construcción del blog elegí tres proyectos de software libre que se adaptaron a mis necesidades:
- Hugo, un generador de sitios web estáticos escrito en Go, ideal para crear páginas fáciles de mantener.
- PaperMod, un tema minimalista para Hugo, diseñado para crear blogs.
- Umami, una herramienta para obtener métricas de tráfico e interacción en sitios web que respeta la privacidad de los visitantes.
A diferencia de plataformas como Medium, estas herramientas me permiten controlar completamente cómo se organiza, presenta y conserva mi trabajo, sin depender de terceros. Además, al alojar el contenido por mi cuenta, puedo garantizar que mis ideas no solo perduren, sino que sean accesibles a largo plazo en proyectos como el Internet Archive o archive.today.
La elección de Umami como plataforma de monitoreo se debe, entre otras cosas, a que es software libre y a su flexibilidad. Por ahora, utilizaré su servicio gratuito hospedado por ellos, pero tengo la opción de migrar a una solución autohospedada.
Por otro lado, aunque Hugo y PaperMod ofrecen control y flexibilidad, su configuración requiere conocimientos técnicos, lo que puede ser un desafío para quienes buscan una solución más simple. Además, el hospedaje propio implica costos recurrentes y la necesidad de administrar la infraestructura.
Para curar el contenido con la ayuda de LLMs, decidí experimentar con plataformas como Vertex AI de Google y Bedrock de Amazon, utilizando sus modelos Gemini Pro y Claude Sonnet, respectivamente. Todos los scripts para transformar mis publicaciones de redes sociales en artículos para Hugo y curar mi contenido los escribí en Python, un lenguaje que conozco bien y que ofrece la flexibilidad necesaria para este tipo de proyectos.
La elección de Python, múltiples plataformas de inteligencia artificial y diferentes modelos no solo respondió a la necesidad de procesar y estructurar contenido, sino que también se convirtió en un excelente ejercicio práctico para explorar estas tecnologías y aplicar programación de manera creativa.
Con las herramientas definidas, comencé a diseñar un flujo que me permitiera recopilar y clasificar mis publicaciones, transformándolas en artículos organizados que reflejaran lo mejor de mi contenido en redes sociales.
Transformando publicaciones en artículos
Empecé con un breve análisis de mis publicaciones en redes sociales. A partir de 2020, comencé a publicar con mayor constancia y enfoque temático en Twitter (me niego a decirle X) y Facebook. Por otro lado, más recientemente en LinkedIn publiqué algunos artículos con un tono más profesional. Observé que Twitter era la plataforma donde concentraba la mayoría de mis publicaciones, mientras que en LinkedIn solo tenía cuatro artículos exclusivos. Esto me llevó a priorizar el contenido de Twitter, automatizando su recopilación y trabajar manualmente con las publicaciones de LinkedIn debido a su menor volumen.
Todo el código que desarrollé para este proyecto está disponible en el repositorio posts_to_blog. Estos son los pasos que seguí para convertir y curar mis publicaciones de Twitter en artículos para Hugo:
1. Convertir hilos en artículos
Descargué mi archivo de datos de Twitter, que incluía todas mis publicaciones en formato JSON. Escribí el script tweets_to_hugo.py
, diseñado para convertir tweets e hilos en artículos compatibles con Hugo. El script descarta respuestas y retweets, aplica un filtro por fecha de publicación y organiza el contenido multimedia asociado a cada hilo.
Como resultado, de un total de 4,108 tweets publicados desde 2020, identifiqué 263 hilos con 611 respuestas que formaron la base inicial del blog.
2. Clasificación temática
Para filtrar el contenido, utilicé LLMs para clasificar mis publicaciones en dos temas principales: cultura y tecnología, además de dos clasificaciones auxiliares: otros (contenido menos relevante) y dudosos (contenido cuya calidad o tema no estaba claro).
Para este proceso, desarrollé el script curate_posts.py
, que permite configurar diferentes plataformas de inteligencia artificial y LLMs mediante archivos como engines/bedrock.yaml
y engines/vertexai.yaml
, junto con el prompt prompts/categorize.yaml
, que define las solicitudes de clasificación al LLM.
Además, para asegurar la calidad de las clasificaciones, realicé una verificación manual que evitara perder contenido valioso o incluir material irrelevante. Para esto, escribí el script fix_categories.py
, que facilita la edición masiva de categorías a partir de un archivo CSV.
Al finalizar, logré organizar el contenido en:
- Cultura: 71 artículos.
- Tecnología: 8 artículos.
- Borradores: 16 artículos que necesitan más trabajo antes de su publicación.
3. Etiquetado y metadatos
Para los artículos clasificados como cultura, utilicé LLMs para generar títulos, resúmenes y etiquetas relevantes para cada pieza de contenido. En el caso de los contenidos clasificados como tecnología, opté por etiquetar manualmente debido a la menor cantidad de artículos.
El script curate_posts.py
, junto con el prompt prompts/label-cultura.yaml
, automatizó este paso para el contenido de cultura. Como resultado, se generaron las siguientes etiquetas según el tema tratado en el contenido:
- Documentales: 49 artículos.
- Libros: 13 artículos.
- Exposiciones: 3 artículos.
- Museos: 2 artículos.
- Podcasts: 2 artículos.
- Proyectos: 2 artículos.
Además, se añadieron etiquetas adicionales relacionadas con la ubicación geográfica y los temas específicos del contenido. Aunque el etiquetado no quedó perfecto, es lo suficientemente bueno para usarlo sin demasiados ajustes inmediatos. Sin embargo, en las próximas semanas lo revisaré a detalle y ajustaré según lo considere necesario.
Reflexiones y aprendizajes
Contar con un sitio web que reúne y organiza las ideas que he compartido a lo largo de los últimos cuatro años es un logro del que me siento satisfecho. Es un espacio completamente independiente de terceros, lo que me da control total sobre su presentación y conservación.
Este proyecto también fue una excelente oportunidad para aplicar inteligencia artificial generativa a un caso práctico. Aprendí mucho sobre plataformas, modelos y la importancia de diseñar prompts efectivos, obteniendo lecciones valiosas sobre cómo aprovechar esta tecnología de manera práctica y eficiente.
No profundicé en temas relacionados con la privacidad al utilizar servicios de inteligencia artificial, pero es un aspecto importante que debemos considerar. En mi caso, no fue una prioridad porque el contenido que estoy trabajando es público y, con alta probabilidad, ya ha sido o será procesado por LLMs.
En términos de costos, el uso de LLMs fue económico para mi contexto y el alcance del proyecto. Gasté menos de $1 USD en VertexAI y $2.3 USD en Bedrock. Aunque es difícil compararlos directamente, ya que estos costos incluyen pruebas de desarrollo de código y prompts, ambos servicios están en el mismo orden de magnitud.
Aunque automatizar la recopilación y clasificación fue interesante, también me enfrenté a retos inesperados. Diseñar prompts efectivos y la disponibilidad limitada de LLMs avanzados, fueron los principales. Tanto Google como Amazon restringen el uso de ciertos LLMs por ubicación y además aplican rate limiters bastante estrictos. Implementar un algoritmo de exponential backoff fue clave para completar la clasificación y el etiquetado.
El desarrollo en Python fue una pieza esencial, no solo para automatizar tareas, sino también para practicar y aplicar patrones de diseño. Este proceso me permitió reforzar conceptos clave y descubrir áreas de mejora, convirtiéndolo en un aprendizaje adicional muy valioso.
Este proyecto me deja con muchas más ideas y aprendizajes que los plasmados aquí, especialmente en cuanto a los detalles de implementación. Espero compartir este trabajo en grupos de usuarios y conferencias, profundizando en los detalles y generando conversaciones que enriquezcan tanto mi experiencia como la de otros.
Aún estoy evaluando si replicaré mis próximos escritos en redes sociales o simplemente los enlazaré al blog. Lo más importante es que ahora cuento con un espacio independiente donde mis publicaciones pueden seguir conectando con otros a lo largo del tiempo.