Tres piezas: unos scripts offline que generan los embeddings, una API en Docker que solo codifica la consulta y compara, y esta web en Astro, que llama a la API y muestra los resultados.
Desliza para ver el mapa completo →
- 01
El catálogo
Todo empieza en un catálogo de 9.883 películas con título, fecha, géneros, sinopsis y póster. De cada una se toma el texto título + sinopsis.
- 02
De texto a vector
Ese texto pasa por el modelo all-MiniLM-L6-v2. Con mean pooling y normalización L2, cada película se convierte en un vector que resume su significado.
- 03
Se calcula una sola vez
Los vectores se guardan en
embeddings.npy. La API los carga en memoria al arrancar, así que en producción nunca se recalculan. - 04
Llega una búsqueda
Desde el navegador, la descripción y los filtros viajan a
GET /search, una API hecha con FastAPI que corre en un contenedor Docker en Render. - 05
La consulta, también vector
La descripción se tokeniza y se codifica con ONNX Runtime, con el mismo modelo, pooling y normalización que el catálogo. Así la consulta y las películas viven en el mismo espacio.
- 06
Filtros
Antes de comparar, se descartan las películas que no cumplen el género o el rango de años elegidos.
- 07
Las más parecidas
Se calcula la similitud coseno contra las que quedan y vuelven las top-k en JSON. El navegador las pinta y carga los pósters desde TMDB. En la primera búsqueda de arriba, gana Spider-Man (2002) con 0,752.