Projet

Sujet

L’objectif de ce projet est de concevoir un site de partage de recettes qui va permettre de :

Le LLM ne servira pas à gérer les recettes, mais à sélectionner des recettes pertinentes parmi celles présentes sur le site à partir de requêtes en langage naturel. Par exemple : « Je cherche un dessert pour Noël, assez classique et faisable en moins de 2 h. » Le LLM devra être hébergé sur les serveurs de votre entreprise.

Recettes

Les recettes de base contiennent :

Une recette peut être une variante d’une recette existante. La variante fait référence à une recette de base ou à une autre variante. Elle peut enlever des ingrédients, changer des quantités et rajouter des ingrédients. Elle peut aussi modifier le temps et contient un texte complémentaire qui ajuste les instructions et qui explique.

L’affichage des variantes doit refléter la recette de base ainsi que les modifications apportées. Pour l’affichage d’une variante de variante, on se rapporte à la recette de base. On doit voir visuellement les changements. Une convention d’affichage devra être définie afin de signaler visuellement les différences entre la recette de base et ses variantes (codes couleur, texte barré, surlignage, etc.).

Types d’utilisateurs

Le site devra gérer 3 types d’utilisateurs : les utilisateurs non authentifiés, les utilisateurs authentifiés et l’administrateur. Tous les utilisateurs, qu’ils soient authentifiés ou non, peuvent consulter les recettes publiées sur le site.

Utilisateurs non authentifiés

Les utilisateurs non authentifiés peuvent simplement voir la page d’accueil du site, qui présente les dernières recettes publiées, et faire des recherches « simples » par mots-clés.

Tous les utilisateurs authentifiés

Les utilisateurs authentifiés peuvent :

Tous les utilisateurs authentifiés possèdent un porte-monnaie virtuel sur le site, qu’ils peuvent recharger en euros à l’aide de leur carte bancaire via Stripe. Les super-likes coûtent 1 € ; ce montant est prélevé sur le porte-monnaie virtuel, qui ne peut jamais être dans le négatif. L’argent des super-likes sera redistribué en fin de mois aux auteurs des recettes, selon un mécanisme décrit plus loin.

Contrairement aux autres utilisateurs, l’administrateur ne possède pas de porte-monnaie virtuel personnel. La plateforme dispose en revanche de deux porte-monnaie virtuels techniques, visibles uniquement par l’administrateur du site :

Répartition des bénéfices

Quand un utilisateur utilise un super-like, 40 % de la somme reviennent directement au site comme bénéfice et sont transférés sur le porte-monnaie des bénéfices du site. Les 60 % restants sont versés sur le porte-monnaie de redistribution.

À chaque fin de mois, la somme présente sur le porte-monnaie de redistribution est redistribuée vers les auteurs des recettes, en tenant compte des recettes ayant reçu des super-likes et des recettes dont elles sont des variantes, selon la règle suivante :

Pour chaque recette, la redistribution est calculée sur la somme totale des montants issus des super-likes reçus pendant le mois ; cette règle influe sur la manière dont sont gérés les arrondis. En cas de montants qui ne sont pas exactement divisibles en centimes lors de ces répartitions, les arrondis sont effectués au centime d’euro. Si un centime résiduel subsiste du fait des arrondis, ce centime bénéficie au propriétaire qui est le plus proche, dans la chaîne, de la recette ayant reçu le super-like.

Par exemple, imaginons une recette A qui est une variante de la recette B, elle-même variante de la recette C. Si un utilisateur super-like la recette A pour un coût de 1 €, il y a 60 centimes à redistribuer (les 40 centimes restants allant au porte-monnaie des bénéfices).

Entre les propriétaires de A, B et C :

Les utilisateurs et l’administrateur doivent avoir accès à un détail de l’origine des fonds, recette par recette.

Promotions et coûts des super-likes

L’administrateur du site doit pouvoir, depuis un espace dédié, modifier les coûts des super-likes et planifier des promotions des types suivants :

Les promotions doivent être planifiables à l’avance et modifiables tant qu’elles ne sont pas en cours. Il ne peut pas y avoir deux promotions actives simultanément. Les promotions s’appliquent à l’ensemble des utilisateurs. Ceux-ci doivent être informés des promotions en cours et à venir par un mécanisme de notification défini dans le cadre du projet.

Les super-likes gratuits sont payés depuis le porte-monnaie des bénéfices. Il faut empêcher que l’administrateur puisse définir une politique tarifaire qui ferait perdre de l’argent au site. Il vous incombe de proposer une solution garantissant que le site ne puisse pas perdre d’argent, en tenant compte notamment des promotions, des super-likes gratuits et de la répartition des montants.

Dans le reporting financier accessible à l’administrateur et aux utilisateurs, les promotions appliquées doivent être clairement identifiées, de manière à éviter toute contestation.

Recherche de recette intelligente

Les utilisateurs inscrits peuvent effectuer une recherche intelligente pour 10 centimes d’euro. L’utilisateur fournit un petit texte décrivant ses envies et ses contraintes, et le site propose des recettes adaptées. Vous utiliserez un LLM local pour sélectionner les recettes (et variantes pertinentes).

Page d’accueil du site

La page d’accueil du site change selon que l’utilisateur est authentifié ou non. Un utilisateur authentifié voit, en plus, les recettes publiées pendant le dernier mois par les personnes qu’il suit, puis par les personnes suivies par ces personnes, etc. Dans un même niveau de proximité, les recettes sont classées selon le nombre de likes et de super-likes reçus pendant le mois.

Technologies imposées et consignes techniques

Votre site devra utiliser les technologies suivantes:

Votre projet doit utiliser Maven comme outil de build.

Vous collaborerez sur votre projet en utilisant Git. Une fois votre groupe crée, vous créerez un projet sur GitLab. Votre activité sur GitLab sera prise en compte dans votre note finale.

Spring Boot quand il est utilisé avec Spring Data et Hibernate met en place un pattern assez douteux : il crée une Session hibernate lors de chaque appel à une méthode du controleur. Comme cela est très bien expliqué dans cet article, cette approche peut entrainer des problèmes de performances.

Dans votre projet, vous devez désactiver ce pattern en mettant dans votre fichier application.properties:

spring.jpa.open-in-view=false

Critères d'évaluation

Votre site devra:

Vous serez évalué en partie sur la capacité de votre site à être utilisé par un très grand nombre d'utilisateurs.

Vous serez aussi évalué sur la qualité de votre architecture logicelle.

Groupes

Vous devez créer un groupe de 5 personnes (sauf dérogation négociée avec les enseignants). Dans votre groupe, vous désignerez un chef de projet qui servira d'intermédiaire avec les enseignants.

La première tâche du chef de projet est de créer le gitlab. Dans le README du projet, vous mettrez les noms et prénoms et les emails des membres du groupe. Ensuite, il invitera les membres du projet et les deux enseignants comme Maintener du projet: @acarayol et @Youssefooooo.

Modalités du rendu

Le projet doit contenir un README qui commence par la liste des membres du projet avec leurs adresses email en commençant par le responsable du projet. Le fichier README doit donner les instructions à suivre pour lancer le projet après avoir cloné le projet depuis GitLab.

Le projet doit contenir des données et fonctionner avec un base de données tournant localement.

Pour le rendu, le projet doit être finalisé sur GitLab et déposé sur e-learning. Le chef de projet devra:

Après le dépot de votre projet, vous recevrez une liste de questions auxquelles vous devrez répondre dans un rapport. Vous ne pourrez plus modifier votre projet. Le rapport comptera dans l'évaluation.

Dates

Les dates limites sont fermes: ne rien avoir déposé à cette date ou ne pas être présent à la soutenance entraine automatiquement 0 au projet. Conformément aux modalités de contrôle des connaissances du master, la note de projet n'est pas compensable en deuxième session.