La situation
Un produit de bien-être mental avec trois activités à l'intérieur : un abonnement grand public, un portail employeur vendu aux entreprises pour leurs salariés, et une place de marché où les utilisateurs réservent des séances vidéo avec des praticiens. Par-dessus tout cela, un moteur de recommandation qui suggère ce qu'une personne devrait faire ensuite, à partir de ce qu'elle dit ressentir.
Le troisième est la raison pour laquelle ce projet mérite d'être raconté. Un moteur de recommandation qui suggère un exercice de respiration à quelqu'un de légèrement stressé est une fonctionnalité agréable. Le même moteur suggérant un exercice de respiration à quelqu'un en situation de crise est une défaillance grave. La question d'ingénierie n'est pas comment le construire - c'est comment savoir qu'il ne fera pas cela.
Ce que j'ai construit
Un backend Django et DRF avec une application React 18 devant, livrés comme un seul système : abonnements et facturation, le portail employeur avec sa propre gestion des postes, la place de marché de téléconsultation sur le Zoom Video SDK, les fonctions de communauté, la gamification et un back-office administratif complet pour l'équipe éditoriale.
Le moteur de recommandation
Un hybride, pas un modèle pur. Un check-in structuré produit une évaluation graduée de l'état du système nerveux, et ce niveau pilote un échantillonnage pondéré dans un catalogue, au lieu d'une liste figée et ordonnée - donc le contexte bat la popularité, et deux personnes dans des états différents ne reçoivent jamais la même réponse simplement parce qu'un élément est globalement bien noté. Des créneaux de découverte, avec un cooldown, empêchent le catalogue de s'effondrer sur les mêmes vingt éléments, et le hot path contourne complètement l'ORM parce qu'il tourne sur chaque écran.
Deux fournisseurs d'IA sont derrière une seule abstraction, interchangeables depuis l'admin, avec un cache sur les réponses pour garder le coût par utilisateur prévisible. Le choix du fournisseur est une décision de configuration, pas une décision d'architecture - ce qui a compté dès la première année, quand les prix ont changé.
Une recherche qui reste ancrée
Environ trente mille solutions distinctes ont été extraites de quelque quatre-vingt-quinze livres et indexées pour la recherche. L'ancrage est tout l'intérêt : le système répond à partir de ce corpus, pas à partir de l'impression générale d'un modèle sur les conseils de bien-être. Une pondération selon l'adéquation aux situations de crise écarte les suggestions inappropriées des états sévères, des plafonds de diversité empêchent une seule source de dominer, et un index nutritionnel sur liste blanche empêche le modèle de dériver vers des conseils médicaux qu'il n'a aucune raison de donner.
Le coach conversationnel au-dessus a une mémoire persistante entre les sessions, un contrôleur de cadence qui pousse la conversation vers une action concrète au lieu de la laisser vagabonder agréablement, et une machine à états de modération à trois avertissements pour les contenus qui doivent mettre fin à l'échange et passer la main.
La partie dont je suis la plus fière
Rien de ce qui précède ne vaut quoi que ce soit comme simple affirmation. J'ai donc construit un harnais Monte Carlo qui génère des utilisateurs synthétiques avec des états variés, y compris hostiles, et les fait passer par le moteur réel.
Cent vingt mille sessions sur deux exécutions, vérifiant deux propriétés : qu'aucune session en état de crise ne reçoit jamais une recommandation inappropriée, et qu'aucun élément du catalogue n'est inaccessible - une carte morte, c'est du contenu que quelqu'un a écrit et que personne ne verra jamais. Les deux ont tenu.
Le harnais est exposé comme une action en un clic dans l'admin, si bien que l'équipe éditoriale le relance après chaque modification de contenu au lieu d'attendre un ingénieur. C'est ce qui en fait une propriété de sûreté et non une capture d'écran du jour du lancement : il est vérifié par les gens qui peuvent le casser, au moment même où ils pourraient le casser.
Une fonctionnalité d'IA que personne n'a mesurée n'est pas une fonctionnalité. C'est un risque non chiffré qui, par hasard, passe très bien en démo.
Commerce et conformité
Des abonnements Stripe avec un moteur bilingue de plans et de remises éditable depuis l'admin, la facturation électronique avec émission automatique et suspension en cas d'impayé, un moteur de commissions d'ambassadeurs à plusieurs niveaux, dix intégrations d'objets connectés via OAuth et un scoring de leads combinant des règles, un modèle et un passage par l'IA.
Ce que je ferais autrement
J'écrirais le harnais d'évaluation avant le moteur, et pas peu de temps après. J'ai construit le moteur de recommandation, puis ce qui le prouve - et j'ai passé une semaine à le modifier pour le rendre testable. Si j'étais partie de « qu'est-ce que je devrai démontrer à propos de cela ? », la conception serait arrivée en meilleur état, et une semaine plus tôt.