Journal
5 min de lecture

Le jour où mon apéro 2Pac s'est rempli de méditation bouddhiste

Que joue un DJ automatique quand personne ne propose rien ? J'ai d'abord demandé des titres à un LLM, puis à un moteur de recherche. Les deux m'ont trahi, chacun à sa façon.

Une aprem piscine avec des potes, une semaine avant mon anniversaire. Je teste Orfeo en conditions presque réelles. On démarre sur du 2Pac.

Quelques titres plus tard, les enceintes passent à de la méditation bouddhiste.

Pas un remix. Pas un sample. De la vraie méditation bouddhiste, très originale, au bord de la piscine. J'ai ri, j'ai coupé, et j'ai ouvert le code.

Ce bug-là est mon préféré de tout le projet, parce qu'il raconte en une scène un problème que j'ai mis trois versions à comprendre.

Le vrai problème : les creux

Dans Orfeo, les invités proposent des titres et votent. Tant qu'ils proposent, c'est facile : il y a de quoi jouer.

Mais une soirée, ce n'est pas un flux continu de propositions. Les gens discutent, mangent, se baignent. Personne ne sort son téléphone pendant vingt minutes. Et pendant ces vingt minutes, la musique ne doit pas s'arrêter.

Il faut donc que la machine trouve des titres toute seule. La question, c'est : où ?

Acte 1 : demander au LLM

Première idée, la plus évidente. J'ai un LLM qui tourne en local sur le Mac. Je lui décris l'ambiance du moment, il me donne des titres, je les cherche dans le catalogue.

Ça a marché. Trois jours.

Le problème, c'est qu'un LLM invente. Pas souvent, mais il invente. Selon les modèles que j'ai mesurés, entre 0,5 % et 23 % des titres proposés n'existaient pas. Un artiste réel avec un morceau qu'il n'a jamais sorti. Un titre plausible, bien dans le style, totalement fictif.

Et c'est là que j'ai compris mon erreur. Un artiste et un titre, c'est un fait. C'est déterministe : soit le morceau existe, soit il n'existe pas. Demander un fait à une machine qui fabrique du plausible, c'est se tromper d'outil.

J'en ai fait une règle, écrite noir sur blanc dans les décisions du projet : le LLM ne nomme jamais un titre. Plus jamais.

Acte 2 : naviguer un vrai catalogue

Si le LLM ne peut pas citer de titres, il faut partir de titres qui existent déjà. Ceux que la soirée vient de jouer.

Orfeo utilise l'API publique de Deezer pour ça — elle est ouverte, sans clé — et suit un chemin tout bête :

un titre joué → son artiste → la radio de cet artiste → des titres réels

Chaque morceau est identifié par son ISRC, le code international d'un enregistrement. C'est ce qui permet de naviguer chez Deezer et de jouer sur Apple Music : même code, même morceau.

Avec cette approche, un titre inventé devient structurellement impossible. Tout ce qui sort du système existe quelque part dans un catalogue.

Restait un souci : la radio d'un artiste te garde dans son univers, pas forcément dans l'énergie du moment. Alors j'ai rendu un petit rôle au LLM. Pas pour citer des titres — pour traduire une phase de soirée en genres. « Apéro tranquille, énergie 2 sur 5 » devient quelques mots-clés, et je cherche ces mots-clés dans le catalogue.

Un LLM qui décrit une ambiance, ça, il sait faire. J'étais content de moi.

Acte 3 : la piscine

Retour au bord de l'eau.

Au tout début d'une session, rien n'a encore fini de jouer. Donc pas d'historique, donc pas d'artiste d'où partir. Résultat : 100 % des titres de remplissage venaient de la recherche par genre.

Pour une phase calme, le LLM proposait des termes comme « ambient » ou « chill ». Raisonnable. Sauf que l'endpoint que j'utilisais n'est pas un filtre de genre. C'est une recherche plein texte. Tu cherches « ambient », il te renvoie tout ce qui contient ce mot — y compris les artistes dont c'est le nom.

Et il existe tout un catalogue de musique de bien-être dont les artistes s'appellent précisément comme ça. « Musique de Réflexion Academy ». « Buddhist méditation académie ».

Le pire, c'est la suite. Mon système note ensuite chaque candidat selon son adéquation à la phase. De la méditation bouddhiste pour une phase à 2 sur 5 d'énergie ? Note parfaite. La machine était ravie de son choix.

C'étaient de vraies réponses à la mauvaise question.

Le correctif : écouter la salle

Trois changements, une seule idée.

Partir de ce qui joue maintenant. Le titre en cours et les propositions des invités servent de point de départ, avant même qu'un morceau soit terminé. Si la salle écoute 2Pac, la navigation part de 2Pac.

Un vocabulaire fermé. Fini la recherche plein texte. Les genres passent par la liste officielle du catalogue et ses classements. Un classement « Rap » ne peut pas te renvoyer un artiste dont le nom contient juste le mot.

Dire au LLM que c'est une fête. Le prompt précise maintenant le contexte et les artistes en cours, et ne décrit plus une phase calme comme de la musique d'ascenseur.

Une semaine plus tard, pour mon anniversaire, les creux ont été remplis sans une seule fausse note. Personne n'a médité.

Ce que j'en retiens

Deux leçons, et aucune n'est dans un tutoriel.

La première : un LLM est bon pour décrire, mauvais pour citer. Une ambiance, un genre, une intention — oui. Un titre, un nom, un fait vérifiable — non. Ce n'est pas un défaut du modèle, c'est juste le mauvais outil pour ça.

La seconde, plus vexante : remplacer le LLM par une vraie API ne suffit pas à avoir raison. Mon moteur de recherche n'inventait rien. Il répondait juste à une autre question que la mienne, avec le même aplomb.

Et tous mes tests passaient. Il a fallu une piscine, des potes et du 2Pac pour le voir.

— Pato