Costruire un sistema di raccomandazione basato su grafi con Milvus, PinSage, DGL e i dataset MovieLens
I sistemi di raccomandazione sono alimentati da algoritmi che hanno umili origini nell'aiutare gli esseri umani a setacciare le email indesiderate. Nel 1990, l'inventore Doug Terry utilizzò un algoritmo di filtraggio collaborativo per separare le email desiderabili dalla posta indesiderata. Semplicemente mettendo "mi piace" o "non mi piace" a un'email, in collaborazione con altri che facevano la stessa cosa con contenuti email simili, gli utenti potevano addestrare rapidamente i computer a determinare cosa inoltrare alla casella di posta di un utente e cosa isolare nella cartella della posta indesiderata.
In senso generale, i sistemi di raccomandazione sono algoritmi che forniscono suggerimenti pertinenti agli utenti. I suggerimenti possono essere film da guardare, libri da leggere, prodotti da acquistare o qualsiasi altra cosa a seconda dello scenario o del settore. Questi algoritmi sono ovunque intorno a noi, influenzando i contenuti che consumiamo e i prodotti che acquistiamo da grandi aziende tecnologiche come Youtube, Amazon, Netflix e molte altre.
I sistemi di raccomandazione ben progettati possono essere generatori di ricavi essenziali, riduttori di costi e fattori di differenziazione competitiva. Grazie alla tecnologia open-source e alla diminuzione dei costi di calcolo, i sistemi di raccomandazione personalizzati non sono mai stati così accessibili. Questo articolo spiega come utilizzare Milvus, un database vettoriale open-source; PinSage, una rete neurale convoluzionale su grafi (GCN); deep graph library (DGL), un pacchetto python scalabile per il deep learning sui grafi; e i dataset MovieLens per costruire un sistema di raccomandazione basato su grafi.
Vai a:
- Come funzionano i sistemi di raccomandazione?
- Strumenti per costruire un sistema di raccomandazione
- Costruire un sistema di raccomandazione basato su grafi con Milvus
Come funzionano i sistemi di raccomandazione?
Esistono due approcci comuni per costruire sistemi di raccomandazione: il filtraggio collaborativo e il filtraggio basato sui contenuti. La maggior parte degli sviluppatori utilizza uno o entrambi i metodi e, sebbene i sistemi di raccomandazione possano variare per complessità e costruzione, in genere includono tre elementi fondamentali:
- Modello utente: I sistemi di raccomandazione richiedono la modellazione delle caratteristiche, delle preferenze e delle esigenze degli utenti. Molti sistemi di raccomandazione basano i propri suggerimenti su input impliciti o espliciti a livello di elemento da parte degli utenti.
- Modello dell'oggetto: I sistemi di raccomandazione modellano anche gli elementi per formulare raccomandazioni sugli elementi basate sui profili degli utenti.
- Algoritmo di raccomandazione: Il componente centrale di qualsiasi sistema di raccomandazione è l'algoritmo che alimenta le sue raccomandazioni. Gli algoritmi comunemente utilizzati includono il filtraggio collaborativo, la modellazione semantica implicita, la modellazione basata su grafi, la raccomandazione combinata e altro ancora.
A un livello generale, i sistemi di raccomandazione che si basano sul filtraggio collaborativo costruiscono un modello a partire dal comportamento passato degli utenti (inclusi gli input comportamentali di utenti simili) per prevedere ciò a cui un utente potrebbe essere interessato. I sistemi che si basano sul filtraggio basato sui contenuti utilizzano tag discreti e predefiniti basati sulle caratteristiche degli elementi per consigliare elementi simili.
Un esempio di filtraggio collaborativo sarebbe una stazione radio personalizzata su Spotify basata sulla cronologia di ascolto, sugli interessi, sulla libreria musicale e altro ancora di un utente. La stazione riproduce musica che l'utente non ha salvato o per cui non ha altrimenti espresso interesse, ma che altri utenti con gusti simili ascoltano spesso. Un esempio di filtraggio basato sui contenuti sarebbe una stazione radio basata su una canzone o un artista specifico che utilizza gli attributi dell'input per consigliare musica simile.
Strumenti per costruire un sistema di raccomandazione
In questo esempio, la costruzione da zero di un sistema di raccomandazione basato su grafi dipende dai seguenti strumenti:
Pinsage: Una rete convoluzionale su grafi
PinSage è una rete convoluzionale su grafi basata su random walk in grado di apprendere embedding per nodi in grafi su scala web contenenti miliardi di oggetti. La rete è stata sviluppata da Pinterest, un'azienda di bacheche online, per offrire raccomandazioni visive tematiche ai suoi utenti.
Gli utenti di Pinterest possono "fissare" contenuti che li interessano su "bacheche," che sono raccolte di contenuti fissati. Con oltre 478 milioni di utenti attivi mensili (MAU) e oltre 240 miliardi di oggetti salvati, l'azienda dispone di un'immensa quantità di dati utente per la quale deve sviluppare nuove tecnologie per stare al passo.
Grafo bipartito pin-bacheche.
PinSage utilizza grafi bipartiti pin-bacheche per generare embedding di alta qualità dai pin, che vengono usati per raccomandare agli utenti contenuti visivamente simili. A differenza degli algoritmi GCN tradizionali, che eseguono convoluzioni sulle matrici delle feature e sull'intero grafo, PinSage campiona i nodi/Pin vicini ed esegue convoluzioni locali più efficienti tramite la costruzione dinamica di grafi computazionali.
Eseguire convoluzioni sull'intero vicinato di un nodo produrrebbe un grafo computazionale enorme. Per ridurre i requisiti di risorse, gli algoritmi GCN tradizionali aggiornano la rappresentazione di un nodo aggregando informazioni dal suo vicinato a k-hop. PinSage simula random-walk per impostare i contenuti visitati frequentemente come vicinato chiave e poi costruisce una convoluzione basata su di esso.
Poiché spesso vi è sovrapposizione nei vicinati a k-hop, la convoluzione locale sui nodi comporta calcoli ripetuti. Per evitarlo, in ogni passaggio di aggregazione PinSage mappa tutti i nodi senza calcoli ripetuti, poi li collega ai corrispondenti nodi di livello superiore e infine recupera gli embedding dei nodi di livello superiore.
Deep Graph Library: un pacchetto python scalabile per il deep learning sui grafi
Framework DGL.
Deep Graph Library (DGL) è un pacchetto Python progettato per costruire modelli di reti neurali basate su grafi sopra framework di deep learning esistenti (ad es., PyTorch, MXNet, Gluon e altri). DGL include un'interfaccia backend intuitiva, rendendo facile l'integrazione in framework basati su tensori e che supportano la generazione automatica. L'algoritmo PinSage menzionato sopra è ottimizzato per l'uso con DGL e PyTorch.
Milvus: un database vettoriale open-source creato per l'AI e la ricerca di similarità
Come funziona la ricerca di similarità in Milvus?
Milvus è un database vettoriale open-source creato per alimentare la ricerca di similarità vettoriale e applicazioni di intelligenza artificiale (AI). A livello generale, l'uso di Milvus per la ricerca di similarità funziona come segue:
- I modelli di deep learning vengono utilizzati per convertire dati non strutturati in vettori di feature, che vengono importati in Milvus.
- Milvus archivia e indicizza i vettori di feature.
- Su richiesta, Milvus cerca e restituisce i vettori più simili a un vettore di input.
Costruire un sistema di raccomandazione basato su grafi con Milvus
Flusso di lavoro di base di un sistema di raccomandazione basato su grafi in Milvus.
Flusso di lavoro di base di un sistema di raccomandazione basato su grafi in Milvus.
Costruire un sistema di raccomandazione basato su grafi con Milvus comporta i seguenti passaggi:
Step 1: Preelaborare i dati
La preelaborazione dei dati consiste nel trasformare i dati grezzi in un formato più facilmente comprensibile. Questo esempio utilizza i set di dati aperti MovieLens[5] (m1–1m), che contengono 1.000.000 di valutazioni di 4.000 film fornite da 6.000 utenti. Questi dati sono stati raccolti da GroupLens e includono descrizioni dei film, valutazioni dei film e caratteristiche degli utenti.
Nota che i dataset MovieLens utilizzati in questo esempio richiedono una pulizia o organizzazione minima dei dati. Tuttavia, se utilizzi dataset diversi, i risultati possono variare.
Per iniziare a costruire un sistema di raccomandazione, crea un grafo bipartito utente-film a fini di classificazione utilizzando i dati storici utente-film dal dataset MovieLens.
graph_builder = PandasGraphBuilder()
graph_builder.add_entities(users, 'user_id', 'user')
graph_builder.add_entities(movies_categorical, 'movie_id', 'movie')
graph_builder.add_binary_relations(ratings, 'user_id', 'movie_id', 'watched')
graph_builder.add_binary_relations(ratings, 'movie_id', 'user_id', 'watched-by')
g = graph_builder.build()
Passaggio 2: Addestra il modello con PinSage
I vettori di embedding dei pin generati utilizzando il modello PinSage sono vettori di caratteristiche delle informazioni sui film acquisite. Crea un modello PinSage basato sul grafo bipartito g e sulle dimensioni personalizzate del vettore di caratteristiche dei film (256-d per impostazione predefinita). Quindi, addestra il modello con PyTorch per ottenere gli embedding h_item di 4.000 film.
# Define the model
model = PinSAGEModel(g, item_ntype, textset, args.hidden_dims, args.num_layers).to(device)
opt = torch.optim.Adam(model.parameters(), lr=args.lr)
# Get the item embeddings
for blocks in dataloader_test:
for i in range(len(blocks)):
blocks[i] = blocks[i].to(device)
h_item_batches.append(model.get_repr(blocks))
h_item = torch.cat(h_item_batches, 0)
Passaggio 3: Carica i dati
Carica gli embedding dei film h_item generati dal modello PinSage in Milvus, che restituirà gli ID corrispondenti. Importa gli ID e le informazioni sui film corrispondenti in MySQL.
# Load data to Milvus and MySQL
status, ids = milvus.insert(milvus_table, h_item)
load_movies_to_mysql(milvus_table, ids_info)
Passaggio 4: Esegui la ricerca di similarità vettoriale
Ottieni gli embedding corrispondenti in Milvus in base agli ID dei film, quindi usa Milvus per eseguire la ricerca di similarità con questi embedding. Successivamente, identifica le informazioni sui film corrispondenti in un database MySQL.
# Get embeddings that users like
_, user_like_vectors = milvus.get_entity_by_id(milvus_table, ids)
# Get the information with similar movies
_, ids = milvus.search(param = {milvus_table, user_like_vectors, top_k})
sql = "select * from " + movies_table + " where milvus_id=" + ids + ";"
results = cursor.execute(sql).fetchall()
Passaggio 5: Ottieni raccomandazioni
Il sistema ora raccomanderà i film più simili alle query di ricerca degli utenti. Questo è il flusso di lavoro generale per costruire un sistema di raccomandazione. Per testare e distribuire rapidamente sistemi di raccomandazione e altre applicazioni di IA, prova il bootcamp di Milvus.
Milvus può alimentare più dei sistemi di raccomandazione
Milvus è uno strumento potente in grado di alimentare una vasta gamma di applicazioni di intelligenza artificiale e ricerca di similarità vettoriale. Per saperne di più sul progetto, consulta le seguenti risorse:
Continua a leggere

Introducing Loon: A New Storage Engine for Vector Data That Never Stops Changing
Loon is a new storage engine for Milvus 3.0 and Zilliz Vector Lakebase, built to manage evolving vector datasets with ColumnGroups, row ID alignment, and Manifests.

Milvus 2.6.x Now Generally Available on Zilliz Cloud, Making Vector Search Faster, Smarter, and More Cost-Efficient for Production AI
Milvus 2.6.x is now GA on Zilliz Cloud, delivering faster vector search, smarter hybrid queries, and lower costs for production RAG and AI applications.

8 Latest RAG Advancements Every Developer Should Know
Explore eight advanced RAG variants that can solve real problems you might be facing: slow retrieval, poor context understanding, multimodal data handling, and resource optimization.



