Presentamos no24: un sistema web que, al escanear un código QR, sugiere una canción de Spotify usando únicamente señales de contexto no personales: el estado del clima, la hora del día y el día de la semana. El “cerebro” de la decisión es un clasificador multi-etiqueta en TensorFlow expuesto detrás de una API de baja latencia. La ruta completa incluye: tomar el contexto, hacer la inferencia, filtrar candidatos según calidad y popularidad usando la Spotify Web API y, por último, redirigir mediante deep link. En pruebas de campo, el tiempo total está en cientos de milisegundos y el diseño prioriza la privacidad por defecto: no se pide identificación, no se construyen perfiles y no se requiere consentimiento adicional.
La idea de diseño es sencilla: señales ambientales de grano grueso del clima, hora y día, tienden a correlacionar con patrones agregados de gustos musicales. A diferencia de los recomendadores que dependen del historial personal, buscamos una respuesta “plug-and-play” para espacios públicos: posters con QR que generan una sugerencia plausible para cualquiera, sin fricción. Esto marca la pauta técnica: baja latencia para que la experiencia sea inmediata, robustez para operar en calle o eventos, y ausencia de datos sensibles para mantener la privacidad.
Al escanear el QR se invoca un endpoint público. Un backend para frontend (BFF, una capa delgada que habla con el navegador y coordina servicios) toma la fecha y hora del servidor, estima la ciudad de manera aproximada a partir de la IP y consulta un proveedor meteorológico con caché de 60–120 s por ciudad para evitar gastos y picos. Con esas señales armamos un vector de características (la versión numérica del contexto) y lo enviamos a un servicio de inferencia en TensorFlow Serving ejecutando en contenedor. La salida es una distribución de probabilidades sobre géneros y subgéneros. El BFF toma el top-k de géneros, consulta la Spotify Web API (búsqueda y catálogos locales), aplica filtros heurísticos y calcula un puntaje combinado; el ganador se devuelve como redirección 302 hacia spotify:// o https://open.spotify.com/track/. Los recursos estáticos se sirven vía CDN y se cachean en el borde para combinaciones repetidas de (ciudad, hora_bin, weather_bin), reduciendo latencia y carga.
Para entrenar el modelo consolidamos un catálogo curado de canciones etiquetadas por género y subgénero y lo enriquecemos con metadatos públicos de popularidad por región. No almacenamos ni procesamos identificadores personales. Las variables de entrada se codifican de forma explícita: día de la semana en one-hot (un vector con un “1” en el día correspondiente), hora en bines (madrugada, mañana, tarde, noche), condición climática en one-hot (despejado, nublado, lluvia, tormenta, nieve), temperatura en bines (frío, templado, cálido) y, opcionalmente, estación del año. La salida es multi-hot sobre el espacio de géneros (pueden activarse varios a la vez). Dividimos en entrenamiento/validación/prueba con estratificación por género para evitar sesgos.
El modelo es un perceptrón multicapa (MLP) de 3–4 capas densas con activación ReLU y dropout 0.2–0.4 para mejorar generalización. La capa de salida usa sigmoides y se optimiza con binary cross-entropy y Adam. Durante validación calibramos umbrales por género (τ_g) para balancear precisión y cobertura: algunos géneros necesitan señales más fuertes que otros. Medimos F1 micro y macro como métricas principales offline; las matrices de confusión por género nos guían para ajustar bines y pesos de clase. Versionamos el artefacto como model:vX.Y.Z empaquetado para TensorFlow Serving y sincronizamos la normalización de features entre entrenamiento e inferencia para que el modelo vea en producción exactamente el mismo tipo de datos que vio al aprender.
Para cada género candidato interrogamos la Spotify Web API con consultas específicas y restricciones regionales. Aplicamos filtros de calidad: popularidad mínima, presencia en listas locales y recencia para evitar temas obsoletos. El ranking final se calcula con score = α·p_modelo + β·popularidad + γ·recencia + δ·diversidad, donde diversidad penaliza repeticiones recientes mediante un TTL por (ciudad, hora_bin). Usamos muestreo con temperatura T para introducir variación controlada y evitar determinismo total. Los parámetros (α, β, γ, δ, T) se ajustan con experimentación A/B sobre eventos anónimos hasta lograr un buen equilibrio entre acierto y frescura.
El endpoint GET /v1/recommendation?qr= en producción responde con un 302 que abre Spotify directamente. En modo diagnóstico devuelve JSON con el contexto discretizado, las probabilidades por género, la pista elegida, la latencia y la versión del modelo; esto facilita depuración y auditoría. Los códigos 204 señalan que, de forma temporal, no hubo candidatos válidos y que se activaron playlists de respaldo para preservar la experiencia. La API incluye rate limiting para proteger recursos, circuit breakers para degradaciones de proveedores externos y CORS restringido para limitar orígenes.
El sistema muestra que combinar señales ambientales de bajo costo con un clasificador ligero permite una recomendación musical inmediata y sin fricción para espacios públicos. La arquitectura separa de forma clara la adquisición de contexto, la inferencia y la selección de catálogo, lo que simplifica operación, observabilidad y evolución a futuro. La latencia lograda es compatible con la experiencia “escaneo-y-escucha” y el diseño respeta principios de privacidad al evitar datos personales desde el origen.
Al final, comprende un frontend ultra-ligero disparado por QR (HTML/JS mínimo sin dependencias pesadas) que abre directamente la app o la web de Spotify, una API pública con cachés agresivas en CDN y en el borde usando claves compuestas por (ciudad, hora_bin, weather_bin) y políticas como stale-while-revalidate para mantener la latencia en el orden de cientos de milisegundos, y un servicio de inferencia en TensorFlow Serving empacado y versionado semánticamente (model:vX.Y.Z) con compatibilidad hacia atrás y capacidad de despliegue canary para probar modelos en un subconjunto de tráfico. La integración con la Spotify Web API incluye gestión segura de credenciales, manejo de cuotas y retrocesos automáticos (reintentos con jitter y circuit breakers), así como playlists de respaldo cuando no hay candidatos válidos; todo ello preservando la privacidad al no persistir identificadores personales y al anonimizar/recortar metadatos operativos. La plataforma se entrega instrumentada de extremo a extremo con métricas, logs estructurados y trazas distribuidas; tableros de observabilidad con latencia P50/P95/P99, tasa de aciertos y errores por ruta y proveedor; alertas basadas en SLOs y error budgets; y perfiles de caché para detectar misses calientes.