Filtro collaborativo basato sugli elementi per un sistema di raccomandazione musicale
Wanyin App è una community di condivisione musicale basata sull’IA con l’intento di incoraggiare la condivisione della musica e rendere la composizione musicale più facile per gli appassionati di musica.
La libreria di Wanyin contiene un’enorme quantità di musica caricata dagli utenti. Il compito principale è selezionare la musica di interesse in base al comportamento precedente degli utenti. Abbiamo valutato due modelli classici: il filtraggio collaborativo basato sugli utenti (User-based CF) e il filtraggio collaborativo basato sugli elementi (Item-based CF), come potenziali modelli di sistema di raccomandazione.
- User-based CF utilizza statistiche di similarità per ottenere utenti vicini con preferenze o interessi simili. Con l’insieme recuperato dei vicini più prossimi, il sistema può prevedere l’interesse dell’utente target e generare raccomandazioni.
- Introdotto da Amazon, item-based CF, o item-to-item (I2I) CF, è un noto modello di filtraggio collaborativo per sistemi di raccomandazione. Calcola le similarità tra elementi invece che tra utenti, basandosi sull’assunto che gli elementi di interesse debbano essere simili agli elementi con punteggi elevati.
User-based CF può portare a tempi di calcolo proibitivamente più lunghi quando il numero di utenti supera una certa soglia. Tenendo in considerazione le caratteristiche del nostro prodotto, abbiamo deciso di procedere con I2I CF per implementare il sistema di raccomandazione musicale. Dato che non possediamo molti metadati sui brani, dobbiamo occuparci dei brani in sé, estraendo da essi vettori di caratteristiche (embedding). Il nostro approccio consiste nel convertire questi brani in cepstrum a frequenza mel (MFC), progettare una rete neurale convoluzionale (CNN) per estrarre gli embedding delle caratteristiche dei brani, e poi formulare raccomandazioni musicali tramite ricerca di similarità tra embedding.
🔎 Selezionare un motore di ricerca per similarità tra embedding
Ora che abbiamo i vettori di caratteristiche, la questione rimanente è come recuperare, dal grande volume di vettori, quelli simili al vettore target. Per quanto riguarda il motore di ricerca per embedding, stavamo valutando Faiss e Milvus. Ho notato Milvus mentre consultavo i repository di tendenza di GitHub a novembre 2019. Ho dato un’occhiata al progetto e mi ha colpito per le sue API astratte. (All’epoca era alla v0.5.x e ora è alla v0.10.2.)
Preferiamo Milvus a Faiss. Da un lato, abbiamo già usato Faiss in passato e quindi vorremmo provare qualcosa di nuovo. Dall’altro lato, rispetto a Milvus, Faiss è più una libreria di base, quindi non è particolarmente comoda da usare. Man mano che abbiamo approfondito Milvus, abbiamo infine deciso di adottarlo per le sue due caratteristiche principali:
- Milvus è molto facile da usare. Tutto ciò che devi fare è scaricare la sua immagine Docker e aggiornare i parametri in base al tuo scenario.
- Supporta più indici e dispone di documentazione di supporto dettagliata.
In breve, Milvus è molto intuitivo per gli utenti e la documentazione è piuttosto dettagliata. Se incontri un problema, di solito puoi trovare soluzioni nella documentazione; altrimenti, puoi sempre ottenere supporto dalla community di Milvus.
Servizio cluster Milvus ☸️ ⏩
Dopo aver deciso di usare Milvus come motore di ricerca per vettori di caratteristiche, abbiamo configurato un nodo standalone in un ambiente di sviluppo (DEV). Aveva funzionato bene per alcuni giorni, quindi abbiamo pianificato di eseguire test in un ambiente di test di accettazione in fabbrica (FAT). Se un nodo standalone si arrestasse in modo anomalo in produzione, l’intero servizio diventerebbe non disponibile. Pertanto, dobbiamo distribuire un servizio di ricerca ad alta disponibilità.
Milvus fornisce sia Mishards, un middleware di sharding per cluster, sia Milvus-Helm per la configurazione. Il processo di distribuzione di un servizio cluster Milvus è semplice. Dobbiamo solo aggiornare alcuni parametri e impacchettarli per la distribuzione in Kubernetes. Il diagramma sottostante dalla documentazione di Milvus mostra come funziona Mishards:
Un diagramma del meccanismo di funzionamento di Mishards.
Mishards inoltra una richiesta dall’upstream verso i suoi sotto-moduli suddividendo la richiesta upstream, quindi raccoglie e restituisce all’upstream i risultati dei sotto-servizi. L’architettura complessiva della soluzione cluster basata su Mishards è mostrata di seguito:
Architettura complessiva di Mishards.
La documentazione ufficiale fornisce una chiara introduzione a Mishards. Puoi fare riferimento a Mishards se sei interessato.
Nel nostro sistema di raccomandazione musicale, abbiamo distribuito un nodo scrivibile, due nodi di sola lettura e un’istanza middleware Mishards in Kubernetes, utilizzando Milvus-Helm. Dopo che il servizio aveva funzionato stabilmente in un ambiente FAT per un certo periodo, lo abbiamo distribuito in produzione. Finora è stato stabile.
🎧 Raccomandazione musicale I2I 🎶
Come menzionato sopra, abbiamo costruito il sistema di raccomandazione musicale I2I di Wanyin utilizzando gli embedding estratti dei brani esistenti. Per prima cosa, abbiamo separato la voce e il BGM (separazione delle tracce) di un nuovo brano caricato dall’utente ed estratto gli embedding del BGM come rappresentazione delle caratteristiche del brano. Questo aiuta anche a individuare le cover dei brani originali. Successivamente, abbiamo archiviato questi embedding in Milvus, cercato brani simili in base ai brani ascoltati dall’utente, quindi ordinato e riorganizzato i brani recuperati per generare raccomandazioni musicali. Il processo di implementazione è mostrato di seguito:
Implementazione del sistema di raccomandazione musicale I2I di Wanyin.
🚫 Filtro dei brani duplicati
Un altro scenario in cui utilizziamo Milvus è il filtraggio dei brani duplicati. Alcuni utenti caricano lo stesso brano o clip più volte, e questi brani duplicati possono apparire nella loro lista di raccomandazioni. Ciò significa che generare raccomandazioni senza pre-elaborazione influirebbe sull’esperienza utente. Pertanto, dobbiamo individuare i brani duplicati e assicurarci che non compaiano nella stessa lista tramite pre-elaborazione.
Un altro scenario in cui utilizziamo Milvus è il filtraggio dei brani duplicati. Alcuni utenti caricano lo stesso brano o clip più volte, e questi brani duplicati possono apparire nella loro lista di raccomandazioni. Ciò significa che generare raccomandazioni senza pre-elaborazione influirebbe sull’esperienza utente. Pertanto, dobbiamo individuare i brani duplicati e assicurarci che non compaiano nella stessa lista tramite pre-elaborazione.
Come nello scenario precedente, abbiamo implementato il filtraggio dei brani duplicati tramite la ricerca di vettori di caratteristiche simili. Per prima cosa, abbiamo separato la voce e il BGM e recuperato una serie di brani simili utilizzando Milvus. Per filtrare accuratamente i brani duplicati, abbiamo estratto le impronte audio del brano target e dei brani simili (con tecnologie come Echoprint, Chromaprint, ecc.), calcolato la similarità tra l’impronta audio del brano target e ciascuna delle impronte dei brani simili. Se la similarità supera la soglia, definiamo un brano come duplicato del brano target. Il processo di corrispondenza delle impronte audio rende più accurato il filtraggio dei brani duplicati, ma richiede anche molto tempo. Pertanto, quando si tratta di filtrare brani in una libreria musicale enorme, utilizziamo Milvus per filtrare i nostri brani duplicati candidati come passaggio preliminare.
Utilizzo di Milvus per ottenere il filtraggio dei brani duplicati.
Per implementare il sistema di raccomandazione I2I per l’enorme libreria musicale di Wanyin, il nostro approccio consiste nell’estrarre gli embedding dei brani come loro feature, richiamare embedding simili all’embedding del brano target, quindi ordinare e riorganizzare i risultati per generare liste di raccomandazioni per l’utente. Per ottenere una raccomandazione in tempo reale, scegliamo Milvus rispetto a Faiss come nostro motore di ricerca di similarità per vettori di feature, poiché Milvus si dimostra più intuitivo e sofisticato. Per lo stesso motivo, abbiamo anche applicato Milvus al nostro filtro per brani duplicati, migliorando l’esperienza utente e l’efficienza.
Puoi scaricare Wanyin App 🎶 e provarla. (Nota: potrebbe non essere disponibile su tutti gli app store.)
📝 Autori:
Jason, Algorithm Engineer presso Stepbeats Shiyu Chen, Data Engineer presso Zilliz
📚 Riferimenti:
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
🤗 Non fare lo sconosciuto, seguici su Twitter o unisciti a noi su Slack!👇🏻
Continua a leggere

DeepSeek-OCR Explained: Optical Compression for Scalable Long-Context and RAG Systems
Discover how DeepSeek-OCR uses visual tokens and Contexts Optical Compression to boost long-context LLM efficiency and reshape RAG performance.

DeepRAG: Thinking to Retrieval Step by Step for Large Language Models
Discover DeepRAG, an advanced retrieval-augmented generation (RAG) model that improves LLM accuracy by retrieving only essential data through step-by-step reasoning.

Zilliz Cloud BYOC Upgrades: Bring Enterprise-Grade Security, Networking Isolation, and More
Discover how Zilliz Cloud BYOC brings enterprise-grade security, networking isolation, and infrastructure automation to vector database deployments in AWS



