Filtrado colaborativo basado en ítems para un sistema de recomendación de música
Wanyin App es una comunidad de intercambio de música basada en IA con la intención de fomentar el intercambio de música y facilitar la composición musical para los entusiastas de la música.
La biblioteca de Wanyin contiene una enorme cantidad de música subida por los usuarios. La tarea principal es clasificar la música de interés en función del comportamiento previo de los usuarios. Evaluamos dos modelos clásicos: filtrado colaborativo basado en usuarios (User-based CF) y filtrado colaborativo basado en ítems (Item-based CF), como posibles modelos de sistema de recomendación.
- El User-based CF utiliza estadísticas de similitud para obtener usuarios vecinos con preferencias o intereses similares. Con el conjunto recuperado de vecinos más cercanos, el sistema puede predecir el interés del usuario objetivo y generar recomendaciones.
- Introducido por Amazon, el item-based CF, o item-to-item (I2I) CF, es un modelo de filtrado colaborativo muy conocido para sistemas de recomendación. Calcula similitudes entre ítems en lugar de usuarios, basándose en la suposición de que los ítems de interés deben ser similares a los ítems con puntuaciones altas.
El User-based CF puede provocar tiempos de cálculo prohibitivamente más largos cuando el número de usuarios supera cierto punto. Teniendo en cuenta las características de nuestro producto, decidimos optar por I2I CF para implementar el sistema de recomendación musical. Dado que no poseemos muchos metadatos sobre las canciones, tenemos que trabajar con las canciones en sí, extrayendo vectores de características (embeddings) de ellas. Nuestro enfoque consiste en convertir estas canciones en cepstrum de frecuencia mel (MFC), diseñar una red neuronal convolucional (CNN) para extraer los embeddings de características de las canciones y luego hacer recomendaciones musicales mediante búsqueda de similitud de embeddings.
🔎 Seleccionar un motor de búsqueda de similitud de embeddings
Ahora que tenemos vectores de características, el problema restante es cómo recuperar, del gran volumen de vectores, aquellos que son similares al vector objetivo. En cuanto al motor de búsqueda de embeddings, estábamos sopesando entre Faiss y Milvus. Me fijé en Milvus cuando estaba revisando los repositorios en tendencia de GitHub en noviembre de 2019. Eché un vistazo al proyecto y me atrajo por sus API abstractas. (Entonces estaba en la v0.5.x y ahora en la v0.10.2.)
Preferimos Milvus a Faiss. Por un lado, ya hemos usado Faiss antes y, por lo tanto, nos gustaría probar algo nuevo. Por otro lado, en comparación con Milvus, Faiss es más bien una biblioteca subyacente, por lo que no es tan conveniente de usar. A medida que aprendimos más sobre Milvus, finalmente decidimos adoptar Milvus por sus dos características principales:
- Milvus es muy fácil de usar. Todo lo que necesitas hacer es extraer su imagen de Docker y actualizar los parámetros según tu propio escenario.
- Admite más índices y cuenta con documentación de soporte detallada.
En pocas palabras, Milvus es muy amigable para los usuarios y la documentación es bastante detallada. Si te encuentras con algún problema, normalmente puedes encontrar soluciones en la documentación; de lo contrario, siempre puedes obtener soporte de la comunidad de Milvus.
Servicio de clúster de Milvus ☸️ ⏩
Después de decidir usar Milvus como motor de búsqueda de vectores de características, configuramos un nodo independiente en un entorno de desarrollo (DEV). Había estado funcionando bien durante unos días, así que planeamos ejecutar pruebas en un entorno de prueba de aceptación en fábrica (FAT). Si un nodo independiente fallara en producción, todo el servicio dejaría de estar disponible. Por lo tanto, necesitamos desplegar un servicio de búsqueda de alta disponibilidad.
Milvus proporciona tanto Mishards, un middleware de sharding de clúster, como Milvus-Helm para la configuración. El proceso de desplegar un servicio de clúster de Milvus es sencillo. Solo necesitamos actualizar algunos parámetros y empaquetarlos para el despliegue en Kubernetes. El siguiente diagrama de la documentación de Milvus muestra cómo funciona Mishards:
Un diagrama del mecanismo de funcionamiento de Mishards.
Mishards propaga una solicitud desde el upstream hacia sus submódulos dividiendo la solicitud upstream, y luego recopila y devuelve los resultados de los subservicios al upstream. La arquitectura general de la solución de clúster basada en Mishards se muestra a continuación:
Arquitectura general de Mishards.
La documentación oficial proporciona una introducción clara de Mishards. Puedes consultar Mishards si te interesa.
En nuestro sistema de recomendación musical, desplegamos un nodo con capacidad de escritura, dos nodos de solo lectura y una instancia de middleware Mishards en Kubernetes, usando Milvus-Helm. Después de que el servicio hubiera estado funcionando de manera estable en un entorno FAT durante un tiempo, lo desplegamos en producción. Hasta ahora se ha mantenido estable.
🎧 Recomendación musical I2I 🎶
Como se mencionó anteriormente, construimos el sistema de recomendación musical I2I de Wanyin usando los embeddings extraídos de las canciones existentes. Primero, separamos la voz y el BGM (separación de pistas) de una nueva canción subida por el usuario y extrajimos los embeddings del BGM como representación de características de la canción. Esto también ayuda a identificar versiones cover de canciones originales. A continuación, almacenamos estos embeddings en Milvus, buscamos canciones similares en función de las canciones que escuchó el usuario, y luego ordenamos y reorganizamos las canciones recuperadas para generar recomendaciones musicales. El proceso de implementación se muestra a continuación:
Implementación del sistema de recomendación musical I2I de Wanyin.
🚫 Filtro de canciones duplicadas
Otro escenario en el que usamos Milvus es el filtrado de canciones duplicadas. Algunos usuarios suben la misma canción o clip varias veces, y estas canciones duplicadas pueden aparecer en su lista de recomendaciones. Esto significa que generar recomendaciones sin preprocesamiento afectaría la experiencia del usuario. Por lo tanto, necesitamos identificar las canciones duplicadas y asegurarnos de que no aparezcan en la misma lista mediante preprocesamiento.
Otro escenario en el que usamos Milvus es el filtrado de canciones duplicadas. Algunos usuarios suben la misma canción o clip varias veces, y estas canciones duplicadas pueden aparecer en su lista de recomendaciones. Esto significa que generar recomendaciones sin preprocesamiento afectaría la experiencia del usuario. Por lo tanto, necesitamos identificar las canciones duplicadas y asegurarnos de que no aparezcan en la misma lista mediante preprocesamiento.
Al igual que en el escenario anterior, implementamos el filtrado de canciones duplicadas mediante la búsqueda de vectores de características similares. Primero, separamos la voz y el BGM y recuperamos una serie de canciones similares usando Milvus. Para filtrar canciones duplicadas con precisión, extrajimos las huellas digitales de audio de la canción objetivo y de las canciones similares (con tecnologías como Echoprint, Chromaprint, etc.), y calculamos la similitud entre la huella digital de audio de la canción objetivo y cada una de las huellas digitales de las canciones similares. Si la similitud supera el umbral, definimos una canción como duplicada de la canción objetivo. El proceso de coincidencia de huellas digitales de audio hace que el filtrado de canciones duplicadas sea más preciso, pero también consume mucho tiempo. Por lo tanto, cuando se trata de filtrar canciones en una biblioteca musical masiva, usamos Milvus para filtrar nuestras canciones duplicadas candidatas como paso preliminar.
Uso de Milvus para lograr el filtrado de canciones duplicadas.
Para implementar el sistema de recomendación I2I para la enorme biblioteca musical de Wanyin, nuestro enfoque consiste en extraer los embeddings de las canciones como su característica, recuperar embeddings similares al embedding de la canción objetivo y luego ordenar y reorganizar los resultados para generar listas de recomendaciones para el usuario. Para lograr recomendaciones en tiempo real, elegimos Milvus en lugar de Faiss como nuestro motor de búsqueda de similitud de vectores de características, ya que Milvus demuestra ser más fácil de usar y sofisticado. Por la misma razón, también hemos aplicado Milvus a nuestro filtro de canciones duplicadas, lo que mejora la experiencia del usuario y la eficiencia.
Puedes descargar Wanyin App 🎶 y probarla. (Nota: puede que no esté disponible en todas las tiendas de aplicaciones.)
📝 Autores:
Jason, ingeniero de algoritmos en Stepbeats Shiyu Chen, ingeniera de datos en Zilliz
📚 Referencias:
Mishards Docs: https://milvus.io/docs/v0.10.2/mishards.md Mishards: https://github.com/milvus-io/milvus/tree/master/shards Milvus-Helm: https://github.com/milvus-io/milvus-helm/tree/master/charts/milvus
🤗 No seas un extraño, síguenos en Twitter o únete a nosotros en Slack!👇🏻
Sigue leyendo

A Few Notes from Databricks Data + AI Summit 2026: Why the Data Layer Matters Again
James Luan shares notes from Databricks Data + AI Summit 2026 on why production AI is pushing the data layer back to the center of infrastructure.

My Wife Wanted Dior. I Spent $600 on Claude Code to Vibe-Code a 2M-Line Database Instead.
Write tests, not code reviews. How a test-first workflow with 6 parallel Claude Code sessions turns a 2M-line C++ codebase into a daily shipping pipeline.

Vector Databases vs. Document Databases
Use a vector database for similarity search and AI-powered applications; use a document database for flexible schema and JSON-like data storage.



