Construire un système de recommandation en temps réel

Jun 18 2022
Vous êtes-vous déjà demandé chaque fois que vous cliquez sur une nouvelle vidéo YouTube comment les suggestions changent-elles instantanément ou comment Amazon change-t-il rapidement vos recommandations en fonction de votre activité des derniers clics/recherches ? Tout cela est rendu possible grâce à des recommandations en temps réel où les entreprises personnalisent leurs suggestions pour votre profil en fonction de vos interactions à la volée. Cet article vise à démystifier à la fois la science des données et les aspects techniques de ces systèmes afin que vous puissiez commencer votre parcours de recommandation en temps réel.

Vous êtes-vous déjà demandé chaque fois que vous cliquez sur une nouvelle vidéo YouTube comment les suggestions changent-elles instantanément ou comment Amazon change-t-il rapidement vos recommandations en fonction de votre activité des derniers clics/recherches ? Tout cela est rendu possible grâce à des recommandations en temps réel où les entreprises personnalisent leurs suggestions pour votre profil en fonction de vos interactions à la volée. Cet article vise à démystifier à la fois la science des données et les aspects techniques de ces systèmes afin que vous puissiez commencer votre parcours de recommandation en temps réel. Nous aborderons les sous-sujets suivants au fur et à mesure de notre progression :

  • Génération de vecteurs
  • Recherche de vecteur/récupération d'ensemble de candidats
  • Classement
  • Conception du système

Par rapport aux recommandations en temps réel, les recommandations par lots sont beaucoup plus faciles à mettre en œuvre et elles sont également moins coûteuses en termes de calcul. Et la plupart des cas d'utilisation des recommandations peuvent être résolus à l'aide d'un système par lots. Vous vous demandez peut-être alors pourquoi les recommandations en temps réel sont-elles si à la mode ces jours-ci ? La véritable puissance des recommandations en temps réel se révèle lorsque votre système dépend du contexte .

Disons par exemple que vous regardez les meilleurs moments de matchs de football sur YouTube mais que tout à coup votre intérêt se déplace vers les vidéos de chats, aimeriez-vous que le système ne reconnaisse pas votre changement de contexte et continue à vous recommander des matchs de football ? Il en va de même pour le commerce électronique. Vous avez peut-être recherché des chaussures la semaine dernière et les recommandations ont été très précisément adaptées à vos goûts, mais aujourd'hui, vous êtes peut-être à la recherche d'un nouvel ordinateur portable. Vous voudriez certainement que le site Web / l'application capte vos intérêts en temps réel et envoie des suggestions significatives à votre façon.

Dans les sections suivantes, nous prendrons l'exemple de la construction d'un système de recommandation en temps réel pour une plate-forme de streaming vidéo, mais la même architecture peut être suivie pour le commerce électronique ainsi que pour les cas d'utilisation de recherche avec des ajustements minimes. Les termes vecteurs et plongements seront utilisés de manière interchangeable tout au long de cet article.

Partie 1 : Génération de vecteurs

Dans un premier temps, nous aurions besoin de décomposer les vidéos de notre catalogue en embeddings condensés. Pour les cas d'utilisation multimodaux, l'utilisation de CLIP par OpenAI est toujours un bon point de départ (le modèle code à la fois le texte et les images dans le même espace vectoriel). CLIP (Contrastive Language-Image Pre-Training) est un réseau de neurones formé sur une variété de paires (image, texte) .

L'une des principales raisons de choisir CLIP est qu'il possède d' excellentes capacités de prise de vue zéro et s'il ne correspond pas exactement au cas d'utilisation, nous pouvons toujours l'ajuster. La vidéo peut être décomposée en images en extrayant les images les plus importantes et celles-ci peuvent ensuite être converties en images incorporées à l' aide de CLIP. De même, nous pouvons également convertir les balises/description associées à la vidéo en incorporations de texte . Une fois que nous avons nos incorporations d'image et de texte, nous pouvons soit les combiner, soit les stocker séparément (expérimentez pour savoir lequel fonctionne le mieux pour votre cas d'utilisation). Vous pouvez également essayer des modèles plus récents comme MURAL et Sim-VLR .

Fig : Synthèse du modèle CLIP (source)

Partie 2 : Recherche de vecteurs/récupération d'ensembles de candidats

Maintenant que nous avons réussi à décomposer nos vidéos en vecteurs, nous allons voir comment stocker et récupérer efficacement ces vecteurs. Pour cette tâche, nous pouvons nous aider de plusieurs moteurs de recherche vectoriels facilement disponibles sur le marché, tels que Milvus, Vespa, Pinecone, Qdrant , etc. (Même Elasticsearch a décidé de participer à cette course aux moteurs de recherche vectoriels new-age). J'ai personnellement utilisé Milvus et je peux vous le recommander sans réserve.

Qu'est-ce que Milvus ?

Milvus est une base de données vectorielle open source conçue pour alimenter l'intégration d'applications de recherche de similarité et d'IA. Milvus rend la recherche de données non structurées plus accessible et offre une expérience utilisateur cohérente quel que soit l'environnement de déploiement.

Une fois les données insérées dans Milvus, nous pouvons récupérer efficacement des vidéos similaires à l'aide d'algorithmes de recherche Approximate Nearest Neighbor (ANN) . Certains des algorithmes pris en charge par Milvus sont IVF_FLAT , IVF_SQ8 , ANNOY , HNSW .

Types d'index

  • FLAT : FLAT est le mieux adapté aux scénarios qui recherchent des résultats de recherche parfaitement précis et exacts sur un petit ensemble de données à l'échelle d'un million.
  • IVF_FLAT : IVF_FLAT est un index basé sur la quantification et convient mieux aux scénarios qui recherchent un équilibre idéal entre précision et vitesse de requête.
  • IVF_SQ8 : IVF_SQ8 est un index basé sur la quantification et convient mieux aux scénarios qui recherchent une réduction significative de la consommation de mémoire du disque, du CPU et du GPU car ces ressources sont très limitées.
  • IVF_PQ : IVF_PQ est un index basé sur la quantification et convient mieux aux scénarios qui recherchent une vitesse de requête élevée même au détriment de la précision.
  • HNSW : HNSW est un index basé sur des graphiques et convient mieux aux scénarios qui ont une forte demande d'efficacité de recherche.
  • ANNOY : ANNOY est un index basé sur un arbre et convient mieux aux scénarios qui recherchent un taux de rappel élevé.

Désormais, pour un utilisateur donné sur la base de ses 5 ou 10 dernières interactions (expérience pour le nombre idéal pour votre cas d'utilisation), nous pouvons obtenir une moyenne des intégrations des vidéos qu'il a visionnées ou une moyenne pondérée basée sur la récence. Avec ce vecteur, nous pouvons interroger la base de données pour récupérer les vidéos les plus similaires.

En utilisant la recherche du voisin le plus proche , nous pouvons désormais récupérer un ensemble de centaines de vidéos pertinentes de notre catalogue contenant des millions en quelques millisecondes. À ce stade, une logique commerciale telle que le filtrage des vidéos récupérées en fonction de la langue et le filtrage du contenu obscène peut être appliquée et les résultats peuvent être directement présentés aux utilisateurs finaux. Mais si vous souhaitez mieux classer les vidéos récupérées, passez à la partie suivante.

Partie 3 : Classement

Fig : Architecture de recommandation en temps réel pour YouTube (source)

La génération d'ensembles de candidats est un processus rapide où nous avons échangé la précision contre l'efficacité et réduit l'espace de recherche. Le classement est un processus plus méticuleux pour sélectionner et trier les meilleures suggestions. Ici, nous pouvons utiliser les caractéristiques de l'utilisateur (âge, sexe, affinité de catégorie, statistiques d'engagement, etc.) et les caractéristiques vidéo (durée, type, langue, nombre d'impressions, etc.) pour le formuler dans un problème de classification (si l'utilisateur cliquera sur la vidéo ou si l'utilisateur va la regarder pendant au moins 30 secondes, etc. selon le cas d'utilisation). Les probabilités de ce problème de classification servent maintenant de métrique de classement pour notre ensemble de candidats. XGBoost ou LightGBMpourrait être un algorithme assez bon pour commencer lors de la construction d'un modèle de classification.

Nous avons maintenant utilisé avec succès l'utilisateur et les métadonnées de la vidéo pour trier et sélectionner les meilleures recommandations pour notre utilisateur. Après cela, si nécessaire, une logique métier supplémentaire peut être ajoutée. Pour évaluer la qualité des recommandations, nous pouvons utiliser des métriques telles que rappel@k , précision@k , NDCG et MRR et une fois que nous sommes satisfaits des résultats, nous pouvons effectuer un test A/B en ligne pour valider notre système. La discussion détaillée sur les pratiques d'évaluation sera réservée pour un autre jour. Dans la partie suivante, nous discuterons de l'aspect technique de la conception de notre système de recommandation en temps réel.

Partie 4 : Conception du système

Fig : Conception du système pour les recommandations et la recherche (source)

Avant d'aller de l'avant, découvrons quelques technologies qui aident à alimenter un tel système.

Kafka

Apache Kafka est un magasin de données distribué optimisé pour l'ingestion et le traitement de données en continu en temps réel. Les données en continu sont des données générées en continu par des milliers de sources de données, qui envoient généralement les enregistrements de données simultanément. Une plate-forme de streaming doit gérer cet afflux constant de données et traiter les données de manière séquentielle et incrémentielle.

Kafka fournit trois fonctions principales à ses utilisateurs :

● Publier et s'abonner à des flux d'enregistrements

● Stocker efficacement les flux d'enregistrements dans l'ordre dans lequel les enregistrements ont été générés

● Traiter les flux d'enregistrements en temps réel

Kafka est principalement utilisé pour créer des pipelines de données de streaming en temps réel et des applications qui s'adaptent aux flux de données. Il combine la messagerie, le stockage et le traitement de flux pour permettre le stockage et l'analyse des données historiques et en temps réel.

Redis

Redis , qui signifie Remote Dictionary Server, est un magasin de données rapide, open source, en mémoire et clé-valeur. Redis offre des temps de réponse inférieurs à la milliseconde, permettant des millions de requêtes par seconde pour des applications en temps réel dans des secteurs tels que les jeux, la technologie publicitaire, les services financiers, la santé et l'IoT. En raison de ses performances rapides, Redis est un choix populaire pour la mise en cache, la gestion de session, les jeux, les classements, l'analyse en temps réel, la géospatiale, le covoiturage, le chat/messagerie, le streaming multimédia et les applications pub/sub.

Kubernetes

Kubernetes , également connu sous le nom de K8s , est un système open source permettant de gérer des applications conteneurisées sur plusieurs hôtes. Il fournit des mécanismes de base pour le déploiement, la maintenance et la mise à l'échelle des applications. Kubernetes nous aide à mettre pleinement en œuvre et à s'appuyer sur une infrastructure basée sur des conteneurs dans des environnements de production. Les applications de production s'étendent sur plusieurs conteneurs, et ces conteneurs doivent être déployés sur plusieurs hôtes de serveur. Kubernetes nous offre les capacités d'orchestration et de gestion nécessaires pour déployer des conteneurs, à grande échelle, pour ces charges de travail.

Voyons maintenant comment ces technologies se combinent pour alimenter un système de recommandation en temps réel.

Flux de travail

À partir du côté utilisateur, les informations sur les interactions effectuées par l'utilisateur sont transférées à l'aide de Kafka et les 5/10 derniers identifiants vidéo interagis sont stockés dans Redis pour tous les utilisateurs respectifs. Chaque fois qu'il y a un appel d'API pour récupérer des recommandations pour un utilisateur, ces identifiants vidéo mis en cache sont ensuite utilisés pour créer l'intégration moyenne, comme indiqué précédemment. Une fois que nous avons intégré la requête, nous pouvons effectuer une recherche vectorielle sur notre base de données vectorielle pour obtenir notre ensemble de candidats.

Désormais, les métadonnées de l'utilisateur et de la vidéo doivent être stockées dans un magasin de fonctionnalités pour une disponibilité rapide. Nous pouvons utiliser Redis comme magasin de fonctionnalités, mais vous pouvez expérimenter d'autres alternatives. Les métadonnées de l'utilisateur et de la vidéo sont maintenant utilisées par notre modèle de classification pour générer des probabilités pour notre tâche définie. L'ensemble de recommandations final est trié en conséquence, puis renvoyé à l'utilisateur. Nous pouvons utiliser FastAPI pour créer toutes les API sous-jacentes à chaque étape du processus (vous pouvez également utiliser Go pour créer les API car la latence est une préoccupation majeure ici). Ces API peuvent ensuite être déployées sur Kubernetes afin que notre système soit évolutif.

Conclusion

J'espère que cet article vous a permis de mieux comprendre comment commencer à créer un système de recommandation en temps réel . Passer d'un système de recommandation par lots à un système de recommandation en temps réel peut sembler une tâche herculéenne, mais je dirais que les avantages l'emportent sur les efforts.

Eh bien, c'est un enveloppement! J'espère que vous l'avez aimé, et si vous avez des suggestions ou des questions, commentez ci-dessous ou contactez-moi directement sur LinkedIn .

Références