Une image pour chaque fiche, et pourquoi elle se trompait
Jusqu'au 12 mai, une fiche de recette s'ouvrait sur un dessin générique choisi selon son genre. Cet après-midi-là, elle a reçu une vraie photo, générée quelques secondes après sa création et poussée dans la fiche ouverte sans avoir à la rouvrir. Il a fallu pour cela apprendre au générateur à montrer le plat entier, retirer au modèle de langage le droit de déclencher l'image lui-même, et lui interdire de peindre des gens partout.
Un dessin qui disait « recette », pas « choucroute »
Depuis la veille, chaque fiche déclare son genre d'illustration dans ses cases : plat chaud, plat froid, boisson, pâtisserie, voyage, idée, livre, lieu. En haut de la fiche, une composition vectorielle était dessinée à partir de ce genre : des formes, un dégradé, une suggestion. Elle disait « ceci est une recette ». Elle ne disait pas laquelle.
Le matin avait été consacré à rendre la fiche corrigeable au doigt. L'après-midi, on a voulu que la fiche ressemble à ce qu'elle contient. Une recette de choucroute avec une photo de choucroute. Une idée de cadeau avec l'objet. Une note de voyage avec la ville.
Ce qui suit est le récit de cet après-midi, et des quatre façons dont l'image s'est trompée avant de tomber juste.
Une photo, deux chemins pour l'obtenir
La première version reposait sur deux déclencheurs.
Le premier était confié au modèle de langage. Après avoir créé une fiche mémo visuelle, il disposait d'un outil supplémentaire : demander une image, en passant l'identifiant de la fiche et un sujet, une phrase courte décrivant ce que la photo devait montrer. Le guide lui disait quand s'en servir, recettes, voyages, cadeaux, notes de lecture, événements dans un lieu nommé, et quand s'abstenir : rappels, tâches, contacts, faits, comptes rendus de réunion. Un compte rendu n'a pas de photo.
Le second était donné à l'utilisateur. Dans le petit menu en haut à droite de la fiche, à côté de « Modifier » et « Supprimer », une nouvelle entrée : « Générer une image ». Si la première photo ratait, on pouvait en demander une autre sans repasser par la conversation. Pendant les quelques secondes de fabrication, une ligne discrète s'affichait, « Photo en cours de génération… », en bleu et non en rouge, parce que ce n'est pas une erreur.
Derrière les deux chemins, la même chaîne côté serveur. Le sujet est enveloppé dans une consigne de style photographique, envoyé à un générateur d'images, et l'image revient sous forme d'octets. Ces octets sont déposés dans un espace de stockage sous le nom de la fiche, en écrasant l'éventuelle image précédente, avec un numéro de version dans l'adresse pour que le téléphone ne ressorte pas l'ancienne de son cache. Enfin, l'adresse est écrite dans les métadonnées de la fiche, à côté du gabarit et de la liste, sans toucher au reste. Le serveur vérifie au passage que la fiche appartient bien à celui qui demande, que le compte soit connecté ou anonyme.
Si la clé du service manque, le serveur le dit au démarrage et refuse proprement l'outil au lieu de planter au milieu d'une conversation. Si le générateur échoue, la fiche garde son dessin. L'image est un supplément, jamais une condition.
La choucroute sans choucroute
Premier essai réel : une choucroute pour six personnes. La photo montrait des saucisses, des carottes et des pommes de terre, joliment éclairées. Pas un brin de chou.
La cause était dans le sujet transmis. Le modèle de langage avait envoyé quelque chose comme « Choucroute, 6 personnes, 2 h ». Le générateur d'images ne connaît pas la choucroute comme un lecteur alsacien la connaît : pour lui, c'est un mot parmi d'autres dans une phrase courte, et il s'accroche à ce qu'il sait dessiner. Deux corrections ont suivi.
La consigne de style, côté serveur, a reçu une phrase qui pèse : l'image doit représenter exactement ce sujet, avec chaque élément nommé visible. Sans elle, le générateur prend le sujet pour une ambiance. Avec elle, pour une commande.
Et la description de l'outil, côté modèle de langage, a été réécrite avec des exemples de sujets ratés et de sujets réussis. « Choucroute » donne un chou. « Choucroute garnie sur un grand plat en grès, chou blanc fermenté en monticule au centre, saucisses fumées, jarret de porc et lard tranchés, pommes de terre vapeur, table en bois clair, lumière chaude » donne une choucroute. La règle tient en une question : si on retire le nom du plat de la phrase, décrit-elle encore la même image ? Si oui, elle est trop vague. Il faut le plat, trois à cinq éléments visibles qui le distinguent, et le contexte de service, plat, assiette ou planche. Vingt à quarante mots, sans verbe, sans citation.
La ligne en italique qui répétait la question
Le même essai a révélé un défaut sans rapport avec l'image, corrigé dans la foulée parce qu'il tenait au même endroit.
Sous le titre de la fiche, une ligne en italique reprenait la phrase d'origine : « J'aimerais faire une choucroute ce week-end, tu peux me… ». Lue sur la fiche une semaine plus tard, cette phrase est du bruit. On sait qu'on l'a demandée, on ne veut pas relire comment.
Cette ligne a changé de nature. Elle est devenue un chapeau éditorial, une ou deux phrases qui présentent la fiche comme l'introduction d'un article de magazine : « Un plat alsacien généreux pour un dimanche d'hiver : chou fermenté, viandes fumées et pommes de terre vapeur. » Le champ porte le même nom, il s'affiche au même endroit, seul son contenu a changé de sens. Dans l'éditeur de fiche, le texte d'invite est passé de « phrase d'origine » à « résumé éditorial ».
Ce chapeau a eu un effet secondaire heureux. Le bouton « Générer une image » de la fiche n'a pas de modèle de langage sous la main pour rédiger un sujet. Il assemble ce que la fiche contient déjà, le titre et les badges. Avec le chapeau en plus, il dispose enfin d'éléments visuels, du chou, des viandes fumées, des pommes de terre, là où la phrase d'origine n'en portait aucun.
L'identifiant qui n'existait pas encore
Le deuxième défaut n'était pas visible sur la photo. Il était dans le journal.
Le modèle de langage, à qui l'on demandait d'appeler la génération « immédiatement après » la création de la fiche, prenait la consigne au pied de la lettre : il appelait les deux outils en même temps, dans le même tour. Or l'identifiant de la fiche n'existe qu'une fois la création terminée. Plutôt que d'attendre, le modèle en inventait un, plausible, du genre « fiche-tartiflette-recette ». La génération partait vers une fiche fantôme, échouait, et la vraie fiche gardait son dessin.
On peut reformuler la consigne dix fois. On peut aussi retirer au modèle une responsabilité qu'il n'est pas fait pour tenir : l'ordre des opérations. C'est ce qu'on a fait.
Désormais, c'est le serveur qui décide. Quand une création aboutit à une fiche mémo dont le genre d'illustration est visuel, plat chaud, plat froid, boisson, pâtisserie, voyage, idée, livre, lieu, il lance lui-même la génération, avec le vrai identifiant, puisqu'il vient de l'écrire. Il n'attend pas le résultat : la réponse repart vers le modèle tout de suite, et l'image se fabrique en arrière-plan. Le sujet est construit à partir du titre, du chapeau éditorial et des badges de la fiche, les mêmes signaux que le bouton manuel, pour que les deux chemins donnent des photos de même nature. Les fiches renforcées, celles où une demande a retrouvé un souvenir existant au lieu d'en créer un, ne déclenchent rien : elles ont déjà leur image, ou n'en ont jamais voulu.
Restait à faire arriver l'image dans la fiche que l'utilisateur regarde, sans lui demander de la fermer et de la rouvrir. Quand la génération réussit, le serveur envoie un message temps réel à tous les appareils du propriétaire : tel identifiant, telle adresse d'image. Côté téléphone, ce message aboutit dans un tout petit tableau d'affichage, indexé par identifiant de fiche. Une fiche ouverte s'y abonne à son propre identifiant, et remplace son dessin par la photo dès que l'annonce passe, environ trois secondes après la création. Le tableau retient aussi la dernière adresse annoncée, pour la fiche qui s'ouvrirait après le message plutôt qu'avant : elle la trouve en arrivant.
L'outil de génération est resté au modèle de langage pour un seul usage : une demande explicite de l'utilisateur, « refais la photo de la tartiflette », « remplace l'image par le plat servi ». Jamais enchaîné avec une création.
Deux photos pour une seule fiche
Le troisième défaut est venu par deux plaintes qui n'avaient rien en commun.
La première : dans la liste des fiches, la vignette montrait toujours le dessin, même quand la fiche avait sa photo. La liste construisait la vignette sans lui transmettre l'adresse de l'image. Une ligne pour la faire suivre, et la fiche montre la même image dehors et dedans.
La seconde était plus intéressante : certaines fiches recevaient deux photos coup sur coup, une médiocre puis une meilleure. Malgré la consigne réécrite, le modèle continuait parfois à appeler la génération après la création, en concurrence avec le déclenchement automatique du serveur qui faisait déjà le même travail. Deux générations pour une fiche, et la dernière arrivée l'emportait.
On a cessé de négocier. L'outil a été retiré de la liste que voit le modèle. La fonction existe toujours côté serveur, pour la route que le bouton de la fiche appelle, mais le modèle ne peut plus la déclencher. Et pour le cas où la route serait appelée deux fois de suite, depuis deux téléphones par exemple, le serveur tient une table des générations en cours, par fiche : une deuxième demande pour la même fiche se raccroche à la promesse déjà partie au lieu de repartir de zéro. Ceinture et bretelles, mais la ceinture était la vraie correction.
Le soir : deux fiches qui flashent, et des gens partout
En fin de journée, un dernier essai a fait remonter deux défauts d'un coup, encore sans lien entre eux.
« Rappelle-moi demain à 8 h d'aller au magasin de bricolage acheter du ciment et des sangles. » À l'écran, une fiche est apparue, vide, un rendez-vous nu, puis a été remplacée par une seconde, avec la liste. Un flash désagréable, et un doublon dans la liste des fiches.
Le journal montrait la séquence : une création de type événement, puis un appel pour programmer le rappel, puis une seconde création de type tâche portant la liste. Le modèle avait découpé une demande en deux souvenirs. Chaque création ouvre automatiquement sa fiche, et l'anti-rebond qui devait absorber ce genre de rafale était réglé sur trois cents millisecondes : assez pour deux créations collées, pas pour deux créations séparées par un autre appel.
Deux corrections. Dans le guide du modèle, un bloc en tête de la partie mémo : une demande, un neurone principal. Un rendez-vous avec une liste est une tâche datée qui porte sa liste, pas un événement plus une tâche. Si on hésite entre les deux, c'est une tâche dès qu'il y a des choses à cocher, un événement seulement quand il n'y a rien à cocher. Et l'anti-rebond est passé à deux secondes : la fiche s'ouvre deux secondes après la dernière création, si bien que si le modèle découpe encore, seule la dernière fiche atteint l'écran. Sur une demande simple, ces deux secondes passent inaperçues, parce que la réponse parlée se prépare au même moment.
Le second défaut concernait les images de ces listes de courses : elles montraient des femmes. Une femme dans un rayon de quincaillerie, une femme devant des sacs de ciment. Personne n'avait demandé de personnage.
La cause était dans les premiers mots de la consigne de style : « photographie éditoriale, qualité magazine ». Pour un générateur nourri de magazines, ces mots veulent dire mode, et la mode veut dire mannequins. Le sujet arrivait après, trop tard pour changer la scène.
La consigne a été réancrée : photographie de nature morte et de scène d'objets, avec des clauses explicites, pas de personnes, pas de visages, pas de silhouettes, pas de portraits. Le générateur prend ces interdictions au pied de la lettre, exactement comme il prenait « magazine » au pied de la lettre. Les rayons de quincaillerie sont redevenus des rayons.
Ce que l'après-midi aura appris
Quatre fois, l'image s'est trompée, et quatre fois pour une raison différente. Un sujet trop maigre. Un identifiant inventé. Une course entre deux déclencheurs. Deux mots de style qui pesaient plus que le sujet.
Deux leçons en sont restées. La première : un générateur d'images n'interprète pas, il exécute. Il ne sait pas ce qu'une choucroute doit contenir, il ne sait pas qu'une liste de courses n'a pas besoin de figurant. Tout ce qu'on ne lui dit pas, il l'invente, et tout ce qu'on lui dit en premier pèse plus que le reste.
La seconde vaut au-delà des images. Quand une opération dépend de l'ordre des choses, l'identifiant après la création, une seule génération par fiche, ce n'est pas au modèle de langage de tenir cet ordre. On lui laisse ce qu'il fait bien, comprendre ce que l'utilisateur veut, et le serveur garde ce qui doit être exact. La mémoire reste la source, la conversation le moyen, et la photo, désormais, ressemble au plat.
