Accélérer la génération de candidats dans les systèmes de recommandation avec Milvus associé à PaddlePaddle
Si vous avez de l’expérience dans le développement d’un système de recommandation, vous avez probablement été confronté à au moins l’un des problèmes suivants :
- Le système est extrêmement lent lors du renvoi des résultats en raison de la quantité considérable de jeux de données.
- Les données nouvellement insérées ne peuvent pas être traitées en temps réel pour la recherche ou la requête.
- Le déploiement du système de recommandation est intimidant.
Cet article vise à résoudre les problèmes mentionnés ci-dessus et à vous fournir quelques éclairages en présentant un projet de système de recommandation de produits qui utilise Milvus, une base de données vectorielle open-source, associée à PaddlePaddle, une plateforme de deep learning.
Cet article se propose de décrire brièvement le workflow minimal d’un système de recommandation. Il présente ensuite les principaux composants et les détails de mise en œuvre de ce projet.
Le workflow de base d’un système de recommandation
Avant d’entrer dans le détail du projet lui-même, examinons d’abord le workflow de base d’un système de recommandation. Un système de recommandation peut renvoyer des résultats personnalisés selon les intérêts et les besoins uniques de l’utilisateur. Pour formuler de telles recommandations personnalisées, le système passe par deux étapes, la génération de candidats et le classement.
Figure 1.
La première étape est la génération de candidats, qui renvoie les données les plus pertinentes ou similaires, comme un produit ou une vidéo correspondant au profil de l’utilisateur. Lors de la génération de candidats, le système compare les caractéristiques de l’utilisateur avec les données stockées dans sa base de données, puis récupère celles qui sont similaires. Ensuite, lors du classement, le système attribue un score aux données récupérées et les réordonne. Enfin, les résultats situés en haut de la liste sont présentés aux utilisateurs.
Dans notre cas de système de recommandation de produits, il compare d’abord le profil de l’utilisateur avec les caractéristiques des produits en stock afin de filtrer une liste de produits répondant aux besoins de l’utilisateur. Ensuite, le système attribue un score aux produits en fonction de leur similarité avec le profil de l’utilisateur, les classe, puis renvoie finalement les 10 meilleurs produits à l’utilisateur.
Figure 2.
Architecture du système
Le système de recommandation de produits de ce projet utilise trois composants : MIND, PaddleRec et Milvus.
MIND
MIND, abréviation de "Multi-Interest Network with Dynamic Routing for Recommendation at Tmall", est un algorithme développé par Alibaba Group. Avant la proposition de MIND, la plupart des modèles d’IA courants pour la recommandation utilisaient un seul vecteur pour représenter les intérêts variés d’un utilisateur. Cependant, un seul vecteur est loin de suffire à représenter précisément les intérêts d’un utilisateur. Par conséquent, l’algorithme MIND a été proposé pour transformer les multiples intérêts d’un utilisateur en plusieurs vecteurs.
Plus précisément, MIND adopte un multi-interest network avec routage dynamique pour traiter les multiples intérêts d’un utilisateur pendant l’étape de génération de candidats. Le multi-interest network est une couche d’extracteur multi-intérêts construite sur un mécanisme de routage par capsules. Il peut être utilisé pour combiner les comportements passés d’un utilisateur avec ses multiples intérêts, afin de fournir un profil utilisateur précis.
Le schéma suivant illustre la structure du réseau de MIND.
Figure 3.
Pour représenter les caractéristiques des utilisateurs, MIND prend les comportements utilisateur et les intérêts utilisateur comme entrées, puis les transmet à la couche d’embedding afin de générer des vecteurs utilisateur, notamment des vecteurs d’intérêts utilisateur et des vecteurs de comportements utilisateur. Ensuite, les vecteurs de comportements utilisateur sont transmis à la couche d’extracteur multi-intérêts afin de générer des capsules d’intérêts utilisateur. Après avoir concaténé les capsules d’intérêts utilisateur avec les embeddings de comportements utilisateur et utilisé plusieurs couches ReLU pour les transformer, MIND produit plusieurs vecteurs de représentation utilisateur. Ce projet a défini que MIND produira finalement quatre vecteurs de représentation utilisateur.
D’autre part, les caractéristiques des produits passent par la couche d’embedding et sont converties en vecteurs d’articles épars. Ensuite, chaque vecteur d’article passe par une couche de pooling pour devenir un vecteur dense.
Lorsque toutes les données sont converties en vecteurs, une couche d’attention supplémentaire sensible aux labels est introduite pour guider le processus d’entraînement.
PaddleRec
PaddleRec est une bibliothèque de modèles de recherche à grande échelle pour la recommandation. Elle fait partie de l’écosystème Baidu PaddlePaddle. PaddleRec vise à fournir aux développeurs une solution intégrée pour construire un système de recommandation de manière simple et rapide.
Figure 4.
Comme mentionné dans le paragraphe d’ouverture, les ingénieurs qui développent des systèmes de recommandation doivent souvent faire face aux défis d’une mauvaise utilisabilité et d’un déploiement compliqué du système. Cependant, PaddleRec peut aider les développeurs dans les aspects suivants :
Facilité d’utilisation : PaddleRec est une bibliothèque open source qui encapsule divers modèles populaires dans l’industrie, y compris des modèles pour la génération de candidats, le classement, le reclassement, le multitâche, et plus encore. Avec PaddleRec, vous pouvez tester instantanément l’efficacité du modèle et améliorer son efficience par itération. PaddleRec vous offre un moyen simple d’entraîner des modèles pour des systèmes distribués avec d’excellentes performances. Il est optimisé pour le traitement de données à grande échelle de vecteurs épars. Vous pouvez facilement mettre à l’échelle PaddleRec horizontalement et accélérer sa vitesse de calcul. Par conséquent, vous pouvez rapidement construire des environnements d’entraînement sur Kubernetes en utilisant PaddleRec.
Prise en charge du déploiement : PaddleRec fournit des solutions de déploiement en ligne pour ses modèles. Les modèles sont immédiatement prêts à l’emploi après l’entraînement, offrant flexibilité et haute disponibilité.
Milvus
Milvus est une base de données vectorielle dotée d’une architecture cloud-native. Elle est open source sur GitHub et peut être utilisée pour stocker, indexer et gérer d’immenses volumes de vecteurs d’embedding générés par des réseaux neuronaux profonds et d’autres modèles d’apprentissage automatique (ML). Milvus encapsule plusieurs bibliothèques de recherche de plus proches voisins approximatifs (ANN) de premier ordre, notamment Faiss, NMSLIB et Annoy. Vous pouvez également étendre Milvus selon vos besoins. Le service Milvus est hautement disponible et prend en charge le traitement unifié par lots et en flux. Milvus s’engage à simplifier le processus de gestion des données non structurées et à fournir une expérience utilisateur cohérente dans différents environnements de déploiement. Il possède les fonctionnalités suivantes :
Hautes performances lors de la recherche vectorielle sur d’immenses jeux de données.
Une communauté axée sur les développeurs qui offre une prise en charge multilingue et une chaîne d’outils.
Évolutivité cloud et grande fiabilité même en cas de perturbation.
Recherche hybride réalisée en associant le filtrage scalaire à la recherche par similarité vectorielle.
Milvus est utilisé pour la recherche par similarité vectorielle et la gestion des vecteurs dans ce projet, car il peut résoudre le problème des mises à jour fréquentes des données tout en maintenant la stabilité du système.
Mise en œuvre du système
Pour construire le système de recommandation de produits dans ce projet, vous devez suivre les étapes suivantes :
- Traitement des données
- Entraînement du modèle
- Test du modèle
- Génération de candidats d’articles produits
- Stockage des données : les vecteurs d’articles sont obtenus grâce au modèle entraîné et sont stockés dans Milvus.
- Recherche de données : quatre vecteurs utilisateur générés par MIND sont transmis à Milvus pour une recherche par similarité vectorielle.
- Classement des données : chacun des quatre vecteurs possède ses propres vecteurs d’articles similaires
top_k, et quatre ensembles de vecteurstop_ksont classés afin de renvoyer une liste finale destop_kvecteurs les plus similaires.
Le code source de ce projet est hébergé sur la plateforme Baidu AI Studio. La section suivante est une explication détaillée du code source de ce projet.
Étape 1. Traitement des données
Le jeu de données original provient du jeu de données de livres Amazon fourni par ComiRec. Toutefois, ce projet utilise les données téléchargées depuis PaddleRec et traitées par celui-ci. Consultez le jeu de données AmazonBook dans le projet PaddleRec pour plus d’informations.
Le jeu de données d’entraînement doit se présenter au format suivant, chaque colonne représentant :
Uid: ID utilisateur.item_id: ID de l’article produit qui a été cliqué par l’utilisateur.Time: L’horodatage ou l’ordre du clic.
Le jeu de données de test doit se présenter au format suivant, chaque colonne représentant :
Uid: ID utilisateur.hist_item: ID de l’article produit dans le comportement historique de clics de l’utilisateur. Lorsqu’il y a plusieurshist_item, ils sont triés selon l’horodatage.eval_item: La séquence réelle dans laquelle l’utilisateur clique sur les produits.
Étape 2. Entraînement du modèle
L’entraînement du modèle utilise les données traitées à l’étape précédente et adopte le modèle de génération de candidats, MIND, construit sur PaddleRec.
1. Entrée du modèle
Dans dygraph_model.py, exécutez le code suivant pour traiter les données et les transformer en entrée du modèle. Ce processus trie les articles cliqués par le même utilisateur dans les données originales selon l’horodatage, et les combine pour former une séquence. Ensuite, sélectionnez aléatoirement un item``_``id dans la séquence comme target_item, et extrayez les 10 articles précédant target_item comme hist_item pour l’entrée du modèle. Si la séquence n’est pas assez longue, elle peut être définie à 0. seq_len doit être la longueur réelle de la séquence hist_item.
def create_feeds_train(self, batch_data):
hist_item = paddle.to_tensor(batch_data[0], dtype="int64")
target_item = paddle.to_tensor(batch_data[1], dtype="int64")
seq_len = paddle.to_tensor(batch_data[2], dtype="int64")
return [hist_item, target_item, seq_len]
Consultez le script /home/aistudio/recommend/model/mind/mind_reader.py pour le code de lecture du jeu de données original.
2. Mise en réseau du modèle
Le code suivant est un extrait de net.py. class Mind_Capsual_Layer définit la couche d’extraction multi-intérêts construite sur le mécanisme de routage des capsules d’intérêt. La fonction label_aware_attention() implémente la technique d’attention sensible aux étiquettes dans l’algorithme MIND. La fonction forward() dans la class MindLayer modélise les caractéristiques de l’utilisateur et génère les vecteurs de poids correspondants.
class Mind_Capsual_Layer(nn.Layer):
def __init__(self):
super(Mind_Capsual_Layer, self).__init__()
self.iters = iters
self.input_units = input_units
self.output_units = output_units
self.maxlen = maxlen
self.init_std = init_std
self.k_max = k_max
self.batch_size = batch_size
# B2I routing
self.routing_logits = self.create_parameter(
shape=[1, self.k_max, self.maxlen],
attr=paddle.ParamAttr(
name="routing_logits", trainable=False),
default_initializer=nn.initializer.Normal(
mean=0.0, std=self.init_std))
# bilinear mapping
self.bilinear_mapping_matrix = self.create_parameter(
shape=[self.input_units, self.output_units],
attr=paddle.ParamAttr(
name="bilinear_mapping_matrix", trainable=True),
default_initializer=nn.initializer.Normal(
mean=0.0, std=self.init_std))
class MindLayer(nn.Layer):
def label_aware_attention(self, keys, query):
weight = paddle.sum(keys * query, axis=-1, keepdim=True)
weight = paddle.pow(weight, self.pow_p) # [x,k_max,1]
weight = F.softmax(weight, axis=1)
output = paddle.sum(keys * weight, axis=1)
return output, weight
def forward(self, hist_item, seqlen, labels=None):
hit_item_emb = self.item_emb(hist_item) # [B, seqlen, embed_dim]
user_cap, cap_weights, cap_mask = self.capsual_layer(hit_item_emb, seqlen)
if not self.training:
return user_cap, cap_weights
target_emb = self.item_emb(labels)
user_emb, W = self.label_aware_attention(user_cap, target_emb)
return self.sampled_softmax(
user_emb, labels, self.item_emb.weight,
self.embedding_bias), W, user_cap, cap_weights, cap_mask
Consultez le script /home/aistudio/recommend/model/mind/net.py pour la structure réseau spécifique de MIND.
3. Optimisation du modèle
Ce projet utilise l’algorithme Adam comme optimiseur du modèle.
def create_optimizer(self, dy_model, config):
lr = config.get("hyper_parameters.optimizer.learning_rate", 0.001)
optimizer = paddle.optimizer.Adam(
learning_rate=lr, parameters=dy_model.parameters())
return optimizer
De plus, PaddleRec écrit les hyperparamètres dans config.yaml, il vous suffit donc de modifier ce fichier pour voir une comparaison claire entre l’efficacité des deux modèles afin d’améliorer l’efficacité du modèle. Lors de l’entraînement du modèle, un mauvais effet du modèle peut résulter d’un sous-ajustement ou d’un surajustement du modèle. Vous pouvez donc l’améliorer en modifiant le nombre de cycles d’entraînement. Dans ce projet, il vous suffit de modifier le paramètre epochs dans config.yaml pour trouver le nombre parfait de cycles d’entraînement. De plus, vous pouvez également modifier l’optimiseur du modèle, optimizer.class, ou learning_rate pour le débogage. Voici une partie des paramètres dans config.yaml.
runner:
use_gpu: True
use_auc: False
train_batch_size: 128
epochs: 20
print_interval: 10
model_save_path: "output_model_mind"
# hyper parameters of user-defined network
hyper_parameters:
# optimizer config
optimizer:
class: Adam
learning_rate: 0.005
Consultez le script /home/aistudio/recommend/model/mind/dygraph_model.py pour l’implémentation détaillée.
4. Entraînement du modèle
Exécutez la commande suivante pour démarrer l’entraînement du modèle.
python -u trainer.py -m mind/config.yaml
Consultez /home/aistudio/recommend/model/trainer.py pour le projet d’entraînement du modèle.
Étape 3. Test du modèle
Cette étape utilise le jeu de données de test pour vérifier les performances, telles que le taux de rappel du modèle entraîné.
Pendant le test du modèle, tous les vecteurs d’items sont chargés depuis le modèle, puis importés dans Milvus, la base de données vectorielle open source. Lisez le jeu de données de test via le script /home/aistudio/recommend/model/mind/mind_infer_reader.py. Chargez le modèle de l’étape précédente et injectez le jeu de données de test dans le modèle afin d’obtenir quatre vecteurs d’intérêt de l’utilisateur. Recherchez dans Milvus les 50 vecteurs d’items les plus similaires aux quatre vecteurs d’intérêt. Vous pouvez recommander les résultats retournés aux utilisateurs.
Exécutez la commande suivante pour tester le modèle.
python -u infer.py -m mind/config.yaml -top_n 50
Pendant le test du modèle, le système fournit plusieurs indicateurs pour évaluer l’efficacité du modèle, tels que Recall@50, NDCG@50 et HitRate@50. Cet article présente uniquement la modification d’un paramètre. Cependant, dans votre propre scénario d’application, vous devez entraîner davantage d’epochs pour obtenir un meilleur effet du modèle. Vous pouvez également améliorer l’efficacité du modèle en utilisant différents optimiseurs, en définissant différents taux d’apprentissage et en augmentant le nombre de cycles de test. Il est recommandé d’enregistrer plusieurs modèles avec différents effets, puis de choisir celui qui offre les meilleures performances et qui correspond le mieux à votre application.
Étape 4. Génération de candidats d’items produits
Pour créer le service de génération de candidats produits, ce projet utilise le modèle entraîné lors des étapes précédentes, associé à Milvus. Pendant la génération des candidats, FASTAPI est utilisé pour fournir l’interface. Lorsque le service démarre, vous pouvez exécuter directement des commandes dans le terminal via curl.
Exécutez la commande suivante pour générer des candidats préliminaires.
uvicorn main:app
Le service fournit quatre types d’interfaces :
- Insertion : Exécutez la commande suivante pour lire les vecteurs d’articles depuis votre modèle et les insérer dans une collection dans Milvus.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/insert_data' \
-H 'accept: application/json' \
-d ''
- Générer des candidats préliminaires : Saisissez la séquence dans laquelle les produits sont cliqués par l’utilisateur, et déterminez le prochain produit sur lequel l’utilisateur pourrait cliquer. Vous pouvez également générer des candidats d’articles produit par lots pour plusieurs utilisateurs en une seule fois.
hist_itemdans la commande suivante est un vecteur bidimensionnel, et chaque ligne représente une séquence des produits sur lesquels l’utilisateur a cliqué par le passé. Vous pouvez définir la longueur de la séquence. Les résultats renvoyés sont également des ensembles de vecteurs bidimensionnels, chaque ligne représentant lesitem idrenvoyés pour les utilisateurs.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/recall' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"top_k": 50,
"hist_item": [[43,23,65,675,3456,8654,123454,54367,234561],[675,3456,8654,123454,76543,1234,9769,5670,65443,123098,34219,234098]]
}'
- Interroger le nombre total de produits : Exécutez la commande suivante pour renvoyer le nombre total de vecteurs d’articles stockés dans la base de données Milvus.
curl -X 'POST' \
'http://127.0.0.1:8000/rec/count' \
-H 'accept: application/json' \
-d ''
- Supprimer : Exécutez la commande suivante pour supprimer toutes les données stockées dans la base de données Milvus .
curl -X 'POST' \
'http://127.0.0.1:8000/qa/drop' \
-H 'accept: application/json' \
-d ''
Si vous exécutez le service de génération de candidats sur votre serveur local, vous pouvez également accéder aux interfaces ci-dessus à l’adresse 127.0.0.1:8000/docs. Vous pouvez faire des essais en cliquant sur les quatre interfaces et en saisissant la valeur des paramètres. Cliquez ensuite sur "Try it out" pour obtenir le résultat de recommandation.
Figure 5.
Figure 6.
Récapitulatif
Cet article se concentre principalement sur la première étape de génération de candidats dans la création d’un système de recommandation. Il fournit également une solution pour accélérer ce processus en combinant Milvus avec l’algorithme MIND et PaddleRec, et a donc répondu au problème posé dans le paragraphe d’introduction.
Que se passe-t-il si le système est extrêmement lent lors du renvoi des résultats en raison de l’énorme quantité de jeux de données ? Milvus, la base de données vectorielle open source, est conçue pour une recherche de similarité ultra-rapide sur des jeux de données de vecteurs denses contenant des millions, des milliards, voire des billions de vecteurs.
Que se passe-t-il si les données nouvellement insérées ne peuvent pas être traitées en temps réel pour la recherche ou les requêtes ? Vous pouvez utiliser Milvus, car il prend en charge le traitement unifié par lots et en flux et vous permet de rechercher et d’interroger les données nouvellement insérées en temps réel. De plus, le modèle MIND est capable de convertir le nouveau comportement utilisateur en temps réel et d’insérer instantanément les vecteurs utilisateur dans Milvus.
Que se passe-t-il si le déploiement complexe est trop intimidant ? PaddleRec, une bibliothèque puissante qui appartient à l’écosystème PaddlePaddle, peut vous fournir une solution intégrée pour déployer votre système de recommandation ou d’autres applications de manière simple et rapide.
À propos de l’autrice
Yunmei Li, ingénieure données chez Zilliz, est diplômée de l’Université des sciences et technologies de Huazhong en informatique. Depuis son arrivée chez Zilliz, elle travaille à l’exploration de solutions pour le projet open source Milvus et aide les utilisateurs à appliquer Milvus dans des scénarios réels. Elle se concentre principalement sur le NLP et les systèmes de recommandation, et elle souhaite approfondir davantage son expertise dans ces deux domaines. Elle aime passer du temps seule et lire.
Vous cherchez plus de ressources ?
- Plus de cas d’utilisation de la création d’un système de recommandation :
- Créer un système de recommandation de produits personnalisé avec Vipshop et Milvus
- Créer une application de planification de garde-robe et de tenues avec Milvus
- Créer un système intelligent de recommandation d’actualités dans l’application Sohu News
- Filtrage collaboratif basé sur les éléments pour un système de recommandation musicale
- Making with Milvus : recommandation d’actualités alimentée par l’IA dans le navigateur mobile de Xiaomi
- Plus de projets Milvus en collaboration avec d’autres communautés :
- Engagez-vous avec notre communauté open source :
Continuer à lire

Introducing Business Critical Plan: Enterprise-Grade Security and Compliance for Mission-Critical AI Applications
Discover Zilliz Cloud’s Business Critical Plan—offering advanced security, compliance, and uptime for mission-critical AI and vector database workloads.

1 Table = 1000 Words? Foundation Models for Tabular Data
TableGPT2 automates tabular data insights, overcoming schema variability, while Milvus accelerates vector search for efficient, scalable decision-making.

Legal Document Analysis: Harnessing Zilliz Cloud's Semantic Search and RAG for Legal Insights
Enhance legal document analysis with Zilliz Cloud’s Semantic Search and RAG. Improve accuracy, efficiency, and scalability for contracts, case law, and compliance.



