, , ,
• •

10 min de lecture

Moteur de recommandation de films avec Symfony : Kejja

kejja 3 recommandations par jour sans prise de tête

Introduction

On est tous passés par là. Netflix, Prime Video, Disney+… et toujours la même question : on regarde quoi ? S’engage alors un débat sans fin entre le scroll, des recommandations qui n’en sont pas vraiment, et un catalogue que chaque plateforme met en avant selon ses propres intérêts.

Les recherches « IA » n’arrangent pas grand-chose. La plupart reposent sur de la simple similarité, des plus proches voisins (un KNN) : vous avez aimé tel film, voici tout ce qui lui ressemble. On tourne en rond dans ce qu’on a déjà vu.

Et il y a plus sournois : un catalogue, ça bouge. Les contrats de diffusion expirent, et le film que vous aviez mis de côté dans votre liste peut disparaître du jour au lendemain. Sur une plateforme de streaming, on ne possède rien. On loue un droit de visionnage.

C’est là qu’est né Kejja, il y a maintenant deux ans. Le déclic n’a rien de spectaculaire : je voulais arrêter de perdre du temps à choisir. Et cette discussion revenait sans cesse, en famille, entre amis, et même entre collègues. Visiblement, je n’étais pas le seul.

Vous me connaissez : le projet est construit sur Symfony. Cet article fait d’ailleurs suite à celui sur l’API Symfony pour une application mobile, que je vous invite à lire si ce n’est pas déjà fait. Dans un premier temps, Kejja arrivera uniquement sur iOS, avec une app pensée pour fonctionner de pair avec le web : fluide, performante, et fidèle aux standards de design d’Apple.

Le principe : rester simple

Kejja doit rester simple, et ça commence dès l’inscription. Vous créez votre compte avec Google, via le fameux « Sign in with Google » : quelques secondes, et c’est fait.

Ensuite, on passe aux informations qui vont aider Kejja à mieux vous comprendre :

  • votre nom et votre âge (à 20 ans, on ne regarde pas la même chose qu’à 40 : l’âge change le corpus dans lequel Kejja va piocher) ;
  • vos plateformes ;
  • vos genres favoris ;
  • la note minimale qu’un contenu doit avoir pour vous être proposé ;
  • la durée maximale d’un film ;
  • et quelques autres réglages.

Oui, c’est un gros funnel, et je l’assume. Chaque information compte, et c’est même elle qui fait l’essentiel du travail : dès le premier jour, Kejja s’appuie sur ce que vous avez déclaré bien plus que sur votre historique.

Accueil de l'app web Kejja : trois recommandations du jour pour l'humeur « Rire », avec plateforme, note et raison du choix

Pourquoi Kejja vise juste dès le premier soir

On s’attendrait à ce qu’une app de recommandation démarre à l’aveugle et s’améliore à force de vous observer. Avec Kejja, c’est l’inverse : l’essentiel se joue à l’inscription. C’est là que ce gros funnel prend tout son sens.

Le moteur part des genres que vous avez déclarés, et un juge LLM, chargé d’évaluer la pertinence des recos, leur donne environ 79/100 dès les premières propositions. Pas besoin de trente soirées pour que ça tienne la route.

Vos retours viennent ensuite affiner le tir. Après une dizaine ou une vingtaine de gestes (j’aime, pas pour moi, titres vus, favoris), votre historique pèse sur les genres, les titres déjà vus sont écartés et les notes s’étalent mieux. Au rythme de trois recos par jour en gratuit, comptez une à deux semaines pour un utilisateur assidu. Le gain est réel, mais modeste face à ce que fait déjà le premier jour.

Reste la brique qui apprend vraiment des retours : le filtrage collaboratif, le fameux « ceux qui ont aimé X ont aimé Y ». Celle-là ne dépend pas de vous seul, mais de tout le monde. Elle a besoin que plusieurs personnes notent les mêmes titres. Or, avec 13 comptes aujourd’hui, 91 % des titres notés ne l’ont été qu’une seule fois. En test hors ligne, elle fait donc nettement moins bien que la stratégie de secours. Pour qu’elle décolle, il faudra des centaines d’utilisateurs actifs et quelques milliers de notes qui se recoupent. Autrement dit : plus on sera nombreux, plus Kejja deviendra bon pour chacun.

Un dernier mot d’honnêteté : tout ça reste des ordres de grandeur, pas des mesures. Personne n’a encore suivi la qualité des recos jour après jour sur un même compte. C’est le prochain chantier : simuler des parcours avec des profils aux goûts cachés, pour enfin tracer cette courbe.


La recommandation vit avec vous

Commençons par ce que Kejja ne fera jamais : vous profiler pour de la pub. Pas de régie, pas de publicité, et ça vaut aussi pour les utilisateurs gratuits, aujourd’hui comme demain. C’est un des fondements du projet. Je suis moi-même attaché à la vie privée, et j’ai voulu que Kejja le soit aussi.

Ce que vous confiez à Kejja ne sert donc qu’à une chose : trouver le contenu qui fera mouche.

Et ce profil n’est pas figé. Vous pouvez mettre à jour vos envies et vos plateformes à tout moment. Depuis la dernière mise à jour, vous pouvez même indiquer à Kejja les genres à ne jamais vous proposer.

C’est utile, parce qu’en recommandation, l’IA a vite fait de vous pousser un style sous prétexte qu’un film « pourrait vous plaire ». Pas fan de westerns ? Dites-le une fois, et Kejja ne vous en proposera plus jamais, même si toute sa logique de recommandation le pousse à tenter le coup.

Scaleway pour héberger Kejja

Sur le fond, Kejja pourrait tourner à peu près n’importe où. Mais pour un projet auquel je confie les données de mes utilisateurs, je voulais un fournisseur cloud fiable et pertinent, et Scaleway s’est imposé assez naturellement d’autant plus que c’est français, cocorico !

Chacun choisit son hébergeur, évidemment. Mais si la partie Ops de vos projets vous intéresse, je vous invite à y jeter un œil : c’est performant, et les configurations s’adaptent à à peu près tous les usages.


La vue contenu, riche et nécessaire à la fois

Une fois votre choix fait, vous arrivez sur la fiche du contenu, film ou série. Tout y est : la bande-annonce, le synopsis, la distribution et l’équipe. Vous pouvez même aimer un acteur ou un réalisateur d’un simple clic, et ce n’est pas qu’un favori pour la forme : ce geste pèse dans vos prochaines recos.

La fiche indique aussi où regarder. Un contenu n’est pas forcément exclusif à une plateforme : il peut être disponible à la fois sur Apple TV et via une chaîne Amazon, par exemple.

C’est aussi là que vous ajoutez un titre à votre liste ou que vous le marquez comme vu. Ces gestes comptent : ils écartent ce que vous avez déjà vu, pèsent sur vos prochaines recos, et vous laissent un historique clair de ce que vous avez vu comme de ce que vous avez envie de voir.

Les bandes-annonces, quand elles existent, viennent directement de YouTube. On n’y coupe pas, et ce n’est pas plus mal : la lecture s’adapte à votre connexion, pour une image et un son de qualité. Et pour rester cohérent avec ce que je disais plus haut sur la vie privée, le lecteur passe par youtube-nocookie.com, le mode de YouTube qui ne dépose pas de cookies de suivi tant que la vidéo n’est pas lancée.

Fiche d'un film dans Kejja : bande-annonce, synopsis, distribution, boutons Ma liste et Vu, plateformes où le regarde

Le fond sert la forme

Comme je le disais, Kejja est un projet Symfony, et il s’appuie sur tout ce que le framework met à disposition, à commencer par la sécurité. Côté runtime, FrankenPHP tourne en worker mode : l’application reste chargée en mémoire entre les requêtes, et ça se sent.

Pour la partie critique, le moteur de recommandation, le choix était clair : une architecture hexagonale. Le domaine définit des contrats, et des adaptateurs viennent les implémenter. Je peux ainsi écrire des stratégies précises, les combiner et les pondérer, au lieu de tout enfermer dans un gros service comme on le ferait pour un POC. Sauf que Kejja n’est pas un POC, c’est un produit. Le reste de l’application reste du Symfony classique : l’hexagonal, je le réserve là où il apporte vraiment quelque chose.

Côté données, la base est PostgreSQL, donc pgvector s’est imposé naturellement pour les embeddings des films et des séries. Une base vectorielle dédiée comme Qdrant ? Pas avec le nombre d’utilisateurs actuel : ce serait une brique de plus à opérer, pour un gain que Kejja ne peut pas encore mesurer.

Le KNN, lui, ne travaille pas sur votre seul historique, comme le font la plupart des plateformes, mais à l’échelle d’un groupe. Conséquence directe : plus il y aura d’utilisateurs à interagir avec un même contenu, meilleur sera le moteur.

Reste la question des LLM. Un LLM sans contexte n’est qu’un outil probabiliste : sa valeur vient des données qu’on lui fournit. Aujourd’hui, je passe encore par des API externes, mais c’est le produit qui garde la main : l’architecture trie et distribue ce que le modèle renvoie.

Et le ML ? Pour le moment, il est fait en PHP. Oui, en PHP. À terme, il passera dans un service Python externe qui dialoguera avec Kejja, et c’est aussi ce qui ouvrira la voie à une souveraineté totale. Je n’ai rien contre les services américains ou chinois, bien sûr. Mais un moteur qui m’appartient de bout en bout reste la suite logique du projet.

Conclusion

Kejja, c’est l’aboutissement de beaucoup d’heures de travail, de choix, de retours de proches et surtout de prises de tête. Comme toujours, rien n’est parfait : même un géant comme Netflix a ses plantages et ses bugs, alors un développeur seul… vous voyez l’idée.

Côté produit, c’est fascinant de voir à quel point tout ça n’a rien à voir avec un simple site : trouver un nom, poser le pourquoi, tout assembler, héberger, gérer l’infra, tester, valider les besoins. Oui, Kejja est un SaaS, en quelque sorte.

Pour la suite, je sais que vous attendez sûrement l’app mobile. C’est l’étape 2 du projet, elle est en cours, et vous pouvez déjà en avoir un aperçu sur la page de présentation de Kejja. Elle arrive, patience.

Quant au Premium, les modalités et les conditions d’usage restent à définir. Mais je le teste en ce moment même : vous l’avez sans doute remarqué sur les captures de cet article.

Enfin, merci à Grafikart, à l’AFUP et à l’API Platform Conference : leurs vidéos et leurs conférences m’ont prouvé qu’à l’ère de l’IA, un développeur peut toujours faire naître un projet à force de travail et de réflexion.

Et vous, Kejja, ça vous tente ? Créez votre compte et dites-moi ce que valent vos trois premières recos.