Recommandation en temps réel basés sur les graphes

Comment construire un moteur de recommandation qui exploite les connexions entre les données en temps réel. Exemple pratique en utilisant ArangoDB et AQL.

En règle générale, en Intelligence Artificielle (IA), les modèles sont entraînés avant d'être utilisés. L'inconvénient est que pour rester efficaces, ces modèles doivent être régulièrement revus et réentraînés pour éviter de ne plus atteindre les objectifs attendus. Pour parer à cela, il existe l'apprentissage par renforcement, qui permet de mettre à jour le modèle de manière automatique. Une autre possibilité consiste à utiliser les bases de données orientées graphe (DBOG).Pour parer à cela il existe l'apprentissage par renforcement, qui permet de mettre à jour le modèle de manière automatique, mais une autre possibilité consiste à utiliser les bases de données orientées graphe.

Avantages des bases de données orientées graphe

Les DBOG offrent plusieurs avantages par rapport aux bases de données relationnelles (DBR) :

  • Modélisation de données : Les DBOG permettent une modélisation plus intuitive des données qui représentent des relations entre des objets, contrairement aux tables relationnelles qui représentent des données sous forme de lignes et de colonnes.
  • Traitement de données liées : Les DBOG sont particulièrement efficaces pour gérer les données liées car elles peuvent stocker et parcourir les relations entre les données de manière efficace.
  • Scalabilité : Les DBOG sont plus faciles à scaler horizontalement car elles permettent de distribuer les données sur plusieurs nœuds.
  • Temps de réponse : Les DBOG sont plus rapides pour les requêtes qui impliquent des parcours de graphe, notamment pour les requêtes de type "chemin le plus court" ou "voisinage proche".
  • Flexibilité : Les DBOG permettent d'ajouter des données et des relations de manière plus flexible que les DBR qui ont besoin de modifications structurelles pour ajouter de nouvelles colonnes ou de nouvelles tables.

Une expérience d'achat personnalisée

Le principe de base de tous les algorithmes de recommandation est le même : ils commencent par trouver des entités ayant des propriétés similaires et calculent une mesure de leur "similarité". Par exemple, les clients qui vivent dans la même région, qui ont un âge similaire ou qui partagent des centres d'intérêts sont "groupés ensemble". Ensuite, en analysant les actions effectuées par chaque client, il est possible de trouver les bonnes recommandations.Imaginons qu'Alice ait acheté l'Objet-1 et l'Objet-2. Si Bob achète également l'Objet-1, et que notre modèle de notation le considère comme étant similaire à Alice, nous lui recommanderons également d'ajouter l'Objet-2 à son panier.

Pourquoi utiliser une base de données orientée graphe ?

Les bases de données relationnelles peuvent modéliser des relations, mais pour parcourir ces relations, vous devez écrire des requêtes SQL qui JOIN des tables ensemble. Le processus de JOIN est coûteux en calcul, et devient plus lent à mesure que le nombre de JOIN augmente, ce qui rend l'analyse en temps réel impratique en production.

Les bases de données orientées graphes peuvent aider à résoudre ce problème. Une base de données orientée graphe est un système de gestion travaillant sur un modèle de données graphique. Contrairement à d'autres bases de données, les relations ont la priorité dans les bases de données graphiques. Cela signifie que votre système n'a pas besoin d'inférer des connexions de données en utilisant des choses comme des clés étrangères.

Les données graphiques sont la représentation, l'utilisation et la persistance des relations entre les éléments de données. Le point clé ici est de maintenir la connaissance de la relation et non de l'instancier simplement comme cela pourrait être fait en utilisant une table JOIN dans un système de gestion de base de données relationnelle (SGBDR).

Depuis les relations sont explicitées par les éléments d'arête, parcourir le graphe d'un sommet à un autre est à la fois simple à comprendre et peu coûteux en calcul. En conséquence, vous pouvez effectuer des requêtes basées sur les relations en temps réel, et interroger rapidement les achats passés des clients, ainsi que capturer instantanément tout intérêt nouveau montré lors de leur visite en ligne actuelle, ce qui est essentiel pour faire des recommandations en temps réel.

Exemple concret : Tutoriel avec AQL et Foxx Services

Étape 1 : Préparation de l'environnement

Assurez-vous d'avoir ArangoDB installé et en cours d'exécution sur votre machine.

Étape 2 : Modélisation des données

Modélisez vos données en utilisant des concepts de graphe tels que les sommets et les arêtes. Par exemple, les sommets peuvent représenter les clients et les produits, et les arêtes peuvent représenter les relations d'achat.

Création des Collections

// Créer les collections
db._create("users");
db._create("products");
db._createEdgeCollection("purchases");

Insertion des Données

Utilisateurs

// Insérer des utilisateurs
db.users.insert([
  { _key: "user1", name: "Alice", region: "North" },
  { _key: "user2", name: "Bob", region: "North" },
  { _key: "user3", name: "Charlie", region: "South" }
]);

Produits

// Insérer des produits
db.products.insert([
  { _key: "product1", name: "Laptop", category: "Electronics" },
  { _key: "product2", name: "Smartphone", category: "Electronics" },
  { _key: "product3", name: "Tablet", category: "Electronics" }
]);

Achats

// Insérer des achats
db.purchases.insert([
  { _from: "users/user1", _to: "products/product1" },
  { _from: "users/user1", _to: "products/product2" },
  { _from: "users/user2", _to: "products/product1" }
]);

Étape 3 : Création d'un Service Foxx

  • Créer un dossier pour le service :
mkdir recommendation-service
cd recommendation-service
  • Créer un fichier manifest.json :
{
  "name": "recommendation-service",
  "version": "1.0.0",
  "engines": {
    "arangodb": "^3.0.0"
  },
  "main": "index.js",
  "description": "A recommendation service using ArangoDB",
  "keywords": ["foxx", "recommendation"]
}
  • Créer un fichier index.js :
'use strict';
const createRouter = require('@arangodb/foxx/router');
const router = createRouter();
const db = require('@arangodb').db;
const aql = require('@arangodb').aql;

router.get('/recommend/:userId', function (req, res) {
  const userId = req.pathParams.userId;
  const recommendations = db._query(aql`
    LET userPurchases = (
      FOR purchase IN purchases
        FILTER purchase._from == ${'users/' + userId}
        RETURN purchase._to
    )
    LET similarUsers = (
      FOR purchase IN purchases
        FILTER purchase._to IN userPurchases
        RETURN DISTINCT purchase._from
    )
    LET recommendedProducts = (
      FOR purchase IN purchases
        FILTER purchase._from IN similarUsers
        FILTER purchase._to NOT IN userPurchases
        COLLECT product = purchase._to INTO group
        SORT LENGTH(group) DESC
        RETURN product
    )
    RETURN recommendedProducts
  `).toArray();
  res.send(recommendations);
})
.response(['application/json'], 'List of recommended products.')
.summary('Fetch recommendations')
.description('Fetches product recommendations for a given user.');

module.context.use(router);

Étape 4 : Déploiement du Service Foxx

  • Zipper le dossier du service :
  zip -r recommendation-service.zip .
  • Déployer le service via l'interface web d'ArangoDB :
    • Accédez à l'interface web d'ArangoDB (par défaut à http://localhost:8529).
    • Allez dans l'onglet Services.
    • Cliquez sur Add Service, puis sur l'onglet Upload.
    • Téléchargez le fichier recommendation-service.zip et définissez un point de montage, par exemple /recommendation-service.

Étape 5 : Interagir avec le Service

Une fois le service déployé, vous pouvez interagir avec lui en utilisant des requêtes HTTP. Par exemple, pour obtenir des recommandations pour l'utilisateur user1, vous pouvez envoyer une requête GET à l'URL suivante :http://localhost:8529/_db/_system/recommendation-service/recommend/user1

Conclusion

En utilisant une base de données orientée graphe comme ArangoDB, vous pouvez créer un système de recommandation efficace qui utilise les relations entre les données pour fournir des recommandations en temps réel plus précises et personnalisées. Cependant, il est important de considérer les performances, les données et la confidentialité lors de la mise en place de ce système.