Meetup Tech.Rocks

IA Générative chez Teads : De l'idée à la réalité

Meetup Tech.Rocks · 12 décembre 2023 · 63 min · en français

Résumé

Replay du premier meetup Tech.Rocks organisé en région, consacré à l'IA générative chez Teads, de l'idée à la réalité.

Summary

Replay of the first Tech.Rocks meetup held outside Paris, on generative AI at Teads, from idea to reality.

Thèmes : IA

Transcript complet

Transcription automatique, à relire : les noms propres peuvent être mal orthographiés.

Bonjour à tous et à toutes. Pas mal de gens, je pense, m'ont la tête un peu familière. Je suis dans l'écosystème depuis un bon moment. Je suis le fondateur et PDG de la société Flint. Rapidement, Flint, c'est une SN. Ne jetez pas les cailloux tout de suite. Donc moi, je suis dev à la base, donc je voulais monter une ESN qui me ressemble un petit peu. Mon directeur général aussi, directeur des opérations, est à Paris, est un ancien dev aussi, et ancien directeur général de Xebia France. Et l'idée, c'est d'être actif et proactif au sein de la communauté et d'avoir une ESN qui est peut-être un peu plus cool que les gros noms et les gros mastodontes sur lesquels généralement vous jetez des cailloux. Donc voilà, on est très actif, Noémie le disait, on est membre de Tech.Rocks, on est actif dans Tech.Rocks, mais aussi dans l'écosystème. Vous avez dû voir les différents meetups qu'on essayait d'organiser. C'est toujours avec plaisir qu'on retrouve un peu toute la communauté des têtes de développeurs, développeuses qu'on connaît et puis les nouveaux qui arrivent.

Donc voilà, on a des podcasts qu'on anime. Tous les trois mois, on met en place aussi du sponsoring de certains projets open source. Voilà, on se pique dans des confs, etc. Donc, on est très content d'avoir participé avec Tech.Rocks et puis aussi, bien évidemment, avec Teads. Donc voilà, on vient de lancer simplement une petite info. On est à fond. Sur l'IA. D'ailleurs, si vous me suivez, vous pouvez aussi mettre unsubscribe pour éviter d'avoir du contenu IA en permanence et en spam sur LinkedIn ou les autres canaux. On vient de lancer une offre d'accompagnement IA pour transformer et exploiter et puis un petit peu démystifier, désacraliser, déhyper toute la hype IA qu'il y a aujourd'hui, parce qu'il y a quand même pas mal de gens qui sont perdus et il y a aussi pas mal de charlatans. Voilà, j'ai terminé. Et donc, ce soir, le contenu, c'est l'accueil d'abord des participants. Merci d'être venu et d'être au rendez-vous ce soir.

Deux talks. Le premier par Nicolas, qui est ici, Nicolas de Teads, une introduction de l'IA générative. Donc, je crois qu'ils vont nous présenter un cas réel jusqu'à la mise en prod d'IA, en fait, au sein de Teads. Donc, ça, c'est intéressant parce qu'on parle aussi beaucoup de... De DIA, mais en fait, derrière l'époque et les MVP, il n'y a pas grand-chose qui sort. Et ensuite, on a Adrien Maret qui va nous parler un petit peu d'agents et de LLM en Node.js. Et puis ensuite, un apéro avec du brocoli, beaucoup de légumes, des crudités. etc. Et des bières aussi, et peut-être des pizzas. Donc très... Content et un énorme merci à TILS, que je connais depuis des années et des années et qui sont finalement des activistes aussi de l'écosystème. Et c'est vraiment cool parce qu'il faut qu'il y ait des boîtes comme ça qui fassent vivre aussi les écosystèmes et ne fassent pas que consommer, mais finalement redonnent à l'écosystème. Merci, j'ai dit, et je vais donner la parole finalement à Nicolas.

Ce soir, je vais vous parler un petit peu de comment nous, chez Teads, on a introduit une certaine partie des capacités de la Generative AI et comment on est arrivé finalement, comment on a fait émerger des idées pour arriver jusqu'à un produit en production. Peut-être avant ça, je fais les présentations. Moi, je m'appelle Nicolas Crovatti. Je suis directeur technique chez Teads depuis 7 ans. J'aurai bientôt plus assez de doigts pour tout compter sur mes deux mains. Et j'en suis très content. Qu'est-ce qu'on fait chez Teads? On est en développement d'une plateforme publicitaire qui permet aux publisheurs de renom dans le monde de monétiser leur contenu. De ce côté-là, et évidemment de connecter les plus grandes marques également aux 2 milliards d'utilisateurs qui composent cette audience. On fait ça dans, évidemment, le respect de la planète et d'une manière respectueuse pour les utilisateurs. Si vous voulez en discuter avec moi tout à l'heure, on pourra toujours en discuter. Donc, l'intelligence générative artificielle, je pense que la dernière fois que je le dis comme ça, parce que j'ai toujours beaucoup de mal à prononcer tous ces mots-là d'un coup, eh bien, moi, je trouve qu'elle a,

d'une manière générale, largement modifié, en tout cas dans un certain cercle, la manière dont on travaille, dont on vit, pas encore, mais pourquoi pas, et finalement, de la manière dont on crée également. Est-ce qu'il y a des gens qui ont déjà écrit un prompt dans la salle? Levez la main. Ok, full house. Bravo. Est-ce qu'il y a des gens qui ont l'intention d'introduire l'indicateur génératif dans leur compagnie dans les mois qui arrivent ou les années qui arrivent? Un peu moins. Mais bravo, super. Vous êtes là au bon endroit, je pense. Donc moi aujourd'hui, je comprends que pas mal de boîtes aient envie de, il y en a beaucoup qui l'ont fait, j'en ai cité quelques-unes ici, ça vient sous forme de produits, je citerai quelques-uns, Copilot, Firefly, en tant que produit de Generative AI pur. On va trouver des services qu'on va pouvoir consommer évidemment par le biais d'API ou directement et toute une pléthore aussi

de gens qui sont sur le chemin critique et qui vont fournir, comme dans toute bonne ruée vers l'or, l'infrastructure pour arriver à ces fins. Donc pourquoi une entreprise voudrait introduire ces capacités de générative? Je pense que si vous êtes ici, c'est que vous avez peut-être décelé le potentiel. Et à ce moment-là, dans une entreprise, qu'est-ce qu'on cherche à faire? C'est souvent se différencier de la concurrence. Et si ce n'est pas par le prix, ça passe par l'objet de la différenciation ou de l'optimisation. Donc moi, je pense que c'est naturel de le faire et je vous comprends. Alors comment nous on s'y est pris? D'ailleurs, je vais prendre le cliqueur, ce sera plus simple. Je pense que tout démarre par une idée, une bonne idée. Donc comment on fait pour faire émerger les idées? Il y a plein de manières de le faire. On peut faire des brainstorms, on peut faire des brainstorms. du mind mapping, on peut éventuellement juste récolter des feedbacks d'utilisateurs ou de clients. Et en tout cas, le thème, c'est vraiment d'interroger le plus de cerveaux possible pour faire émerger les idées.

Nous, au-delà de cette étape-là, on a choisi un format un peu particulier qui est celui du hackathon. Pourquoi c'est intéressant, hackathon? C'est intéressant parce que ça permet de regrouper vos populations en interne d'une différente manière de d'habitude. On casse un petit peu les codes et puis on va mélanger des gens qui n'ont pas l'habitude de travailler ensemble initialement. Et puis, ça peut faire émerger plein d'initiatives qu'on n'aurait pas eues sinon. De la même manière, avoir une deadline forte, ça force forcément à arrondir les angles et puis aller droit au but. Nous, le delete était assez simple, l'objectif était assez simple à ce moment-là. C'était vraiment de dire, OK, on veut utiliser les outils de Generate AI. Vous êtes les gens qui connaissent mieux la plateforme. Allez-y, ayez une démo à montrer à la fin des 36 heures. 14 équipes ont présenté une démo, c'était formidable, on a élu quelques-unes et deux aujourd'hui, dont je vais vous parler, plus particulièrement d'une, ont atteint le stade de close d'alpha, on va dire, en tout cas en production aujourd'hui.

Et donc, une fois qu'on a tout un tas d'idées qui ont émergé, on commence à se poser des questions. Mais avec des questions, il y a des décisions à prendre. Et aujourd'hui, je voudrais retracer un petit peu le parcours, nous, des réponses qu'on a trouvées et des questionnements qui sont venus à nous. Tout au long de ce cheminement. Je vais parler de la sélection des use cases. Il y en a qui font du sens, il y en a qui font peut-être un peu moins du sens, qui sont un peu plus gimmicks. On va parler de la philosophie et de l'approche qu'on peut avoir par rapport à ces outils-là et de ce qu'ils apportent et de ce qu'ils peuvent apporter. On va parler d'organisation un petit peu. On va parler d'un dilemme qu'on rencontre très souvent dans nos métiers quand on est leader technologique, ou leader tout court d'ailleurs, est-ce qu'on achète ou est-ce qu'on construit nous-mêmes les choses? Et on verra que celle-là, elle est récurrente. On va parler des capacités aussi et de comment on peut les catégoriser, les capacités de Generative AI. Et évidemment, un petit mot sur le hosting et sur nous, les choix qu'on a faits à ce moment-là.

Pour choisir un use case, je vais commencer par là. Je pense que c'est assez simple. Il faut finalement suivre ou du moins établir dans un premier temps un certain nombre de critères. Nous, dans tous les aspects de Generative AI, les choses qui nous séduisaient par rapport à notre métier dans la pub, c'est véritablement... d'avoir une valeur ajoutée par l'efficacité. Donc, rendre les choses, des étapes qui sont soit manuelles et réverbatives, arriver à les automatiser, à enlever justement des étapes manuelles tout simplement. Et pourquoi pas inspirer encore plus les utilisateurs à utiliser nos outils qu'on leur met à disposition. On a choisi deux use cases particuliers qui sont aujourd'hui en production. Je parle en quelques mots du premier, qui est le brief to campaign dans notre métier, dans la publicité, et notamment la publicité en ligne. Quand on veut démarrer une campagne publicitaire, on va recevoir à un moment donné un ordre.

qui va être sous la forme de l'opérateur de la campagne, celui qui est chargé de créer la campagne sur une plateforme. Il va recevoir cette note sous forme de PDF, il va recevoir ça sous forme de doc, de Word, ou au fin fond d'un thread d'email, quelques informations qui sont utiles à créer cette campagne. Notre idée avec cette étape-là, c'était vraiment de simplifier au maximum, d'automatiser au maximum la création de campagne. En gros, il n'y a plus besoin de quelqu'un pour aller extirper les données au fin fond d'un email, etc. L'idée, c'était de dire, OK, vous uploadez votre fichier, vous faites votre copier-coller depuis l'email, et puis notre outil va aller se charger d'extirper les informations nécessaires, les différents targetings, je parle des budgets, je parle du titre de la campagne, etc. Et va setup notre interface automatiquement et puis mettre à disposition cette validation-là, ces informations récoltées auprès de l'utilisateur. Et je vais en parler de ce point-là, pourquoi on ne crée pas directement la campagne, j'en reparlerai tout à l'heure aussi.

Le cas que je vais développer un peu plus ce soir avec vous, c'est le landing page tout créatif. Vous savez que quand on fait une campagne publicitaire, elle est composée de créations publicitaires, donc les choses que les utilisateurs voient sur leurs écrans. celle-là elle était importante je peux en toucher deux mots parce que elle vient en synergie et c'est pour ça qu'on l'a choisi Il vient en synergie avec quelque chose qui existait déjà chez TIT depuis très longtemps. Ça fait longtemps qu'on fait de la predictive AI. Et cette partie prédictive, on l'appelle cette partie-là, en tout cas, il y en a d'autres, mais c'est la DCO, Dynamic Creative Optimization. Donc, qu'est-ce que ça veut dire? Ça veut dire que pour une campagne donnée, on va pouvoir avoir une pléthore, jusqu'à 125 variations de la même créative qu'on va ensuite venir nourrir des algorithmes prédictifs qui vont en choisir celle qui fonctionne le mieux. Au fur et à mesure du temps. Pour ceux qui sont familiers avec ça, en tout cas, nous, on fait ça et c'est très bien, mais ça vient quand même avec une étape hautement manuelle d'arriver à, non pas à créer 125 variations, mais en tout cas

de faire au moins quelques opérations manuelles pour uploader des images différentes, pour imaginer des textes différents ou des call to action, pour ceux qui savent ce que c'est. Un call to action, c'est en général le tout petit bout de texte qui vient sur le bouton de la publicité. Acheter, réserver, etc. Alors, on a maintenant notre use case, on a nos idées, on a notre use case, et bien on va commencer du prompt engineering. Alors ici, c'est un exemple qui n'a rien à voir avec ce qu'on a fait, mais qui est lourd de sens. Donc, je vous le confie. Alors imaginez qu'on veuille avoir des images, par exemple, d'un saumon qui descend une rivière en nageant. Quand on va soumettre ça à certains modèles, on peut constater ensemble les résultats. C'est bien une rivière, c'est bien du saumon, mais ce n'est pas tout à fait ce à quoi je m'attendais.

Ça, ça porte un nom dans le jargon, c'est une hallucination. En gros, une hallucination, en deux mots, pour ceux qui ne savent pas, c'est une génération de contenu qui ne va vraiment pas trouver de sens dans le monde qui nous entoure. Ici, on verra rarement ça pris en photo. Ou alors, il faudra faire un staging particulier. Et alors, comprendre ça, que ça, ça peut exister dans la génération et l'utilisation des modèles, des large language models, eh bien, ça nous a fait nous poser quelques questions. OK, donc ça, ça peut arriver. Donc, quelle est notre approche face à ça? Eh bien, nous, ce qu'on s'est dit, c'est que si ça peut halluciner et que les résultats, d'ailleurs, peuvent varier, à ce moment-là, il faut que l'utilisateur final soit au contrôle et à la validation. Et ça m'a aussi permis de connecter les points avec GitHub Copilot. Pourquoi c'est un Copilot et pas un Pilot? Là, j'avais compris. Donc, ça a été notre positionnement.

C'est une des premières questions qu'on a eu à répondre. Donc, une fois qu'on a fait toutes ces étapes-là, il en reste encore quelques-unes, on va les décrire. On veut faire un profond concept. Donc, on a fait notre propre engineering. Maintenant, on a une idée du... use case et comment le réaliser. On va aller regarder automatiquement qu'est-ce qui est disponible sur le marché pour arriver à faire ça. Et on va très vite se rendre compte qu'il y a beaucoup de choses qui sont déjà disponibles et déjà exposées en tant qu'API prêtes à consommer. On connaît tous, la plupart d'entre vous connaissent OpenAPI, of course. Il y en a une pléthore. Dans cette étape-là, on va commencer à utiliser des outils ou des API. Et on va se rendre compte qu'on l'a vu avec les saumons, qu'il y a beaucoup de choses inconnues qui nous attendent. Donc, on va être en mode exploratoire. Ce mode exploratoire, une des bonnes façons de le traiter, c'est de faire en sorte que l'équipe qui va travailler sur ce sujet-là, soit libéré un petit peu et puisse se itérer rapidement.

Parce qu'on sait qu'on va découvrir des choses, on sait qu'on va se prendre des murs, et donc il faut pouvoir aller vite. Pour faire ça, une bonne idée, en tout cas celle que nous avons adoptée, c'est celle de réunir autour de la table, pas seulement des devs et du produit, mais aussi de l'UX, du design. Des business stakeholders, donc des commerciaux qui vont être au contact des clients et même, on en parlera un tout petit peu après, des gens du service juridique. Donc ça, construire une équipe comme ça, une forme de startup dans la startup, ça permet justement d'avoir tout le monde autour de la table, qui puisse communiquer facilement et puis prendre des décisions rapidement. À cette étape-là, on peut aussi se préparer à se tromper, à avoir travaillé sur un use case qui finalement ne sera pas utilisé parce qu'on ne trouve pas de traction auprès du client ou parce que d'un point de vue juridique, c'est un peu compliqué de le faire. Donc, il faut se préparer à ce moment-là à aussi laisser des choses de côté.

Et ce n'est pas grave. Et le dernier point, la dernière recommandation que je peux vous donner, si vous en avez, je sais qu'il y en a certains, vous avez levé la main, qui veulent démarrer là-dedans, je dirais, à ce moment-là, choisissez une stack avec laquelle vous êtes déjà très confortable, puisqu'il y a beaucoup de choses que vous ne connaissez pas par ailleurs, auxquelles vous allez devoir vous confronter. Ce n'est pas tout à fait ce qu'on a fait, mais je vous expliquerai. Donc, arrondissez les angles, libérez vos gens du process, créez une île parfaite dans laquelle on peut itérer rapidement. Ce seraient mes recommandations. Ah, Builder Buy. Donc ça, c'est une question qui n'est pas née avec les projets de Generative AI. C'est quelque chose qui est un jour de la semaine comme les autres pour certains, qui peut être un choix cornelien pour d'autres. Dans tous les cas, c'est une question à laquelle vous allez être, en tant que leader, exposé. Je pense qu'il n'y a pas vraiment de réponse toute faite à cette question.

Il faut vraiment s'interroger sur son business, les choses qui peuvent rentrer en ligne de compte, même s'il y a beaucoup de choses qui sont déjà disponibles en tant qu'API. La vitesse pour arriver sur le marché est peut-être clé dans la réussite d'un projet. Réussir un projet, ce n'est pas simplement aller au bout. C'est aussi peut-être aller au bout assez rapidement pour capter des parts de marché ou pour construire une barrière à l'entrée pour la compétition. Donc ça, c'est important de faire les bons choix. Au fur et à mesure que vous allez avancer dans votre use case, ou dans le développement de ces fonctionnalités, vous allez peut-être devoir utiliser des choses un peu plus avancées que ce qui est disponible directement en tant qu'API à consommer. Et là, vous allez vous poser la question un petit peu, OK, j'ai ce modèle-là, il fait ça, ça marche sur ma machine, mais qu'est-ce que j'en fais maintenant? Où je le mets? Pour moi, en tout cas, dites-moi si vous en voyez d'autres. J'ai vu trois. trois façons de faire ça pour héberger des modèles. On peut aller vers du full managed pour les MLOps.

On va aller se tourner vers AWS Backdrock qui a une intégration profonde avec l'Astacad AWS par exemple et qui offre aussi par leur partenariat. Je ne fais pas plus de pubs pour AWS, je vous donne mon retour d'expérience. Qui vous donne aussi accès à un certain nombre de modèles via leur partenariat, qui permet de les tuner, etc. On a des passes, plateformes à service. J'ai identifié Hugging Face, Replicate, il y a Hyperstack, il y en a d'autres. qui, eux, vont vous permettre d'abstraire complètement votre partie infrastructure. Et du coup, vous allez juste envoyer votre modèle. Ils ont chacun leurs avantages et leurs inconvénients. Et évidemment, vous pouvez popper des machines dans votre infrastructure. Et puis, on l'a fait aussi, essayer d'aligner les astres sur les drivers NVIDIA, CUDA, PyTorch et compagnie pour arriver à tout aligner et faire en sorte que ça marche. Et ça, c'est peut-être dans mes recommandations, je dirais que nous, on a trouvé que les plateformes as a service permettent non seulement d'itérer rapidement, mais aussi d'avoir un moindre investissement en termes de ressources.

aussi bien humaines que finalement, de par leur modèle de pricing, ça permet de mieux contrôler les coûts. En gros, on ne va consommer et payer que ce qu'on consomme plutôt. Très intéressant. En début de projet, je dirais. Une fois que ça se devient un peu plus sérieux, peut-être qu'il faudra passer à d'autres plateformes. Je recommanderais peut-être d'investir dans l'infra si vous me dites que demain, je monte une startup dans l'intelligence gérative. Peut-être que là, c'est intéressant, si c'est votre core business, de faire un investissement. Est-ce que quelqu'un a déjà vu cette image quelque part ? J'ai pris ce screenshot il y a quelques jours. Celle-là, précisément, vous n'allez pas pouvoir l'avoir déjà vue. C'est un site qui s'appelle ArtStation. Est-ce que quelqu'un connaît ArtStation dans la salle? Oui, quelques-uns. ArtStation, c'est un site qui accueille les créateurs digitaux, donc les gens qui travaillent avec Photoshop, avec Illustrator, pour créer de l'art digital.

Et ce que vous voyez là, c'est des artistes digitaux qui ont juste rempli la homepage, et même plus, depuis novembre dernier, avec des symboles anti-AI. Alors, qu'est-ce qui s'est passé? En deux mots, en novembre, je pense, fin d'année dernière, je ne vous donnerai pas une date précise, en fin d'année dernière, on a été communiqué. Que des gros moteurs de génération de Generative AI, comme je citerai peut-être Midjourney et Stable Diffusion, ont entraîné ces modèles-là sur des données de ArtStation, de DeviantArt, de plusieurs grands sites comme ça, de publications, en tout cas de showcases pour les artistes digitaux. Évidemment, ça a donné lieu à une... Le vide-bouclier, non pas juste parce que ça avait été entraîné, mais parce qu'ensuite, on pouvait, avec des promptes, dire « Ok, je veux mes saumons qui descendent de la rivière dans le style 2 et puis insérer le nom de l'artiste.

» Et donc ça, ça pose des problèmes potentiellement de copyright. C'est pour ça que je vous dis, autour de la table, dans vos itérations, il y a toujours peut-être quelqu'un à cette étape-là. Qui soit du côté juridique. Je pense qu'on est au tout début de la... Pour moi, la poussière autour de la bataille juridique de l'intelligence artificielle ne retombera pas dans plusieurs années. C'est mon sentiment. Comme on a pu le voir précédemment dans le temps avec, si je prends des exemples, ce serait le MP3 ou l'utilisation des images dans Google Images. L'autre facteur, je sais que le titre est un peu trompeur, mais j'y viens juste après. L'autre facteur qui est important d'un point de vue juridique, c'est de prendre en compte, quand vous allez créer votre application, vous allez aussi accueillir des assets, que ce soit des images, des textes, etc., qui proviennent peut-être de vos clients, qui proviennent peut-être de vos utilisateurs. Et donc ça, il y a une dimension très importante et une position forte à avoir d'un point de vue juridique pour faire attention, parce que ce contenu ne vous appartient pas forcément, pour faire en sorte que ces contenus-là soient protégés.

Peut-être que votre client n'aura pas envie que son contenu qui vous confie soit utilisé pour entraîner un modèle. Donc ça, c'est très important de le... en tout cas de l'avoir en tête et peut-être de s'interroger quand on a une boîte. Donc, je reviens sur le titre que j'avais mis pour parler de ça. En gros, comment on choisit les capacités qu'on va utiliser? Moi, j'ai fait un exercice d'essayer de classifier des capacités de GRTVI qui sont safe d'un point de vue juridique, on va dire. Ce n'est pas forcément à 100% le cas, mais au moins, elles sont plus safe que le reste. Je vais les décrire ici rapidement. Donc, il y a des aspects transformatifs. En gros, on va pouvoir, sur une image par exemple, en enlever des morceaux ou la nettoyer grâce à l'inpainting. Ça, c'est relativement safe du moment que ça reste dans de petites zones. L'upscale, c'est une transformation purement... Certes, on réécrit tous les pixels, mais normalement, ça reste la même image, les mêmes images.

La traduction peut être un bon candidat, effectivement, dans ce cas-là aussi. C'est juste des exemples, évidemment, qui sont dans notre use case à nous. Dans la partie informative, on va pouvoir utiliser les capacités de la Generative AI pour aller classifier du contenu, que ce soit des images, aller faire de la détection d'objets, de la détection de langage, ce qui peut être intéressant quand on veut faire des traductions, ou extraire des estimations de... propriété purement technique, par exemple l'estimation de la profondeur de l'image ou de ses normales. Donc ça, c'est des cas importants. Les choses qu'on a laissées de côté, sur lesquelles, justement, je le disais tout à l'heure, on avait commencé à travailler, comment on remplace le background pour une image d'un produit, par exemple. On a fait tout ça et puis finalement, on l'a laissé de côté justement parce qu'il y avait ces aspects un peu... Un peu permissif de laisser l'utilisateur écrire ses promptes et donc potentiellement d'écrire des noms d'artistes peut-être dans le contenu, en tout cas dans le prompt.

Donc nous, on a laissé de côté les aspects un peu purement génératifs de générer une image from scratch et ou de remplacer des grandes parties de l'image. Voilà, c'est notre positionnement. Quelques mots sur le hosting. Le hosting, donc dans une application de type Generative AI, on a un nouveau type d'infra à gérer, ou un nouveau type de déploiement, ce sont les MLOps. Pour la partie applicative, je vous en touche deux mots parce que j'ai trouvé ça vraiment intéressant. Du coup, ça fitait bien avec l'organisation qu'on avait mis en place. C'est Amplify sur AWS. Amplify, c'est un outil qui va vous permettre de déployer automatiquement votre site une fois que vous le décidez. Il n'y a pas d'infra à faire du tout. Ça vous expose une URL, on va dire random ou pas random, mais qui permet justement cette itération rapide et vous abstrait de toute infra.

C'est-à-dire qu'il y a même une partie un peu back-end où vous pouvez mettre du cours d'un back-end pour planquer les tokens, etc. Donc, c'est super et tout. Ça nous a permis d'aller très, très vite. Vous pourrez en discuter avec Valentin qui est dans la salle ce soir. Et même pour les PR, c'est-à-dire qu'une PR, une branche qui est ouverte, ça vous ouvre un site spécial avec un sous-domaine spécial qui permet de voir ce code-là. Donc, imaginez-vous autour d'une table avec tous vos stakeholders. Ça, ça en est où? Tiens, on en est là, regarde, on fait ça, on fait ça. OK, on peut itérer, on itère et puis ça y est, ça déroule. Cela dit, ça vient avec la suite. Quelques limitations. Aujourd'hui, on est dans le process de… Donc, on a notre QS qui marche, on veut le solidifier, l'industrialiser un petit peu. La première chose qu'on a faite ou qu'on est en train de faire plutôt, je dirais, c'est de passer sur EC2 pour tout ce qui est notre pack-in. Ça, c'est important parce que vous avez plus de liberté pour tous les aspects de consommation de mémoire, de temps de processing, etc. Donc, ça, c'est un des… un des takeaways que je peux vous confier.

Pour les MLOps, nous, on a choisi, on a un petit modèle open source qu'on utilise pour passer de l'image à la vidéo. Et celui-là, on a décidé de l'hoster sur Replicate. Replicate, il est intéressant pour moi parce que justement dans cette idée d'itération rapide, On ne veut pas risquer d'écraser son modèle et de ne pas en retrouver le contenu qu'on avait précédemment. Pour ça, Repliquette offre le versionning, ce qui fait qu'une fois qu'on est satisfait du modèle, satisfait de son API, on peut uniquement switcher dans l'application et puis c'est fait. C'est un bon combo, j'ai trouvé. Maintenant, je passe au demo time. Je vous ai introduit tout à l'heure notre capacité de DCO qui est liée à notre capacité de prédiction. Maintenant, je vais vous montrer un petit peu ce qu'on a réalisé, ce qui est un prod aujourd'hui, pour venir remplacer en tout cas toutes les opérations humaines liées à la création de ces créatifs.

Donc, tout part du... Imaginez que vous vouliez promouvoir un produit. C'est très simple. Il y a des choses qui existent déjà. Toutes les marques vont créer des pages produits pour les produits qu'ils mettent en avant, que ce soit des voitures, des chaussures, des boissons. Vous imaginez le pléthore de choses disponibles. Et donc, avec cet outil qu'on a créé, on va aller chercher un certain nombre d'assets. Ce dont on a besoin, donc nous, pour créer une publicité. Ici, vous envoyez toute la preview, tous les formats, on va dire. On va avoir besoin d'images, on va avoir besoin d'un logo, on va avoir besoin d'une headline, peut-être d'une description également, d'un call to action. Eh bien, notre outil va aller chercher, extirper toutes les infos du site. Et puis donner ça à OpenAI pour répondre à cette question-là. Donc, en quelques secondes, on se retrouve avec une créa déjà préparée. On peut en sélectionner les images au fil de l'eau. On peut aussi s'amuser à retoucher les images.

Ici, un crop pour faire la créa. Focus sur le produit. On voit aussi ici que, je ne sais pas si vous avez remarqué, ça a été assez rapide, que le crop, ça supprime des pixels. Donc forcément, quand on supprime des pixels, peut-être que la qualité de l'image n'est plus suffisante pour atteindre vos standards de qualité. En l'occurrence, les capacités de upscaling permettent de vraiment pousser cette future de crop qu'on n'aurait pas pu mettre sinon, et vraiment de l'implémenter et d'aller au-delà de ce qu'on aurait pu faire. Donc vraiment... Excellent à tout point de vue. Ça, c'est vraiment l'aspect d'ICO. On ajoute des images, ce que je vous ai expliqué. Là, on a rajouté des variations en faisant ce geste-là. On peut les faire aussi sur les headlines, évidemment. Le call to action dont j'ai déjà parlé, là ici il n'y a aucune action humaine à part cliquer sur un bouton, générer une nouvelle.

Et donc tout fait du sens quand on regarde ce qui a été créé. Nous on aime bien aussi mélanger, je vous montre des vieilles recettes, aller changer la couleur du bouton ou ploder un asset particulier, c'est toujours pour garder à l'esprit cette philosophie de l'utilisateur et le contrôle total. Dans cette approche-là que je vous ai mentionnée tout à l'heure, il y a l'aspect de prendre en compte ça dans le design. Parce que si on doit régénérer des images ou les changer ou les cropper, ou si on doit les changer, On doit pouvoir éditer les textes à tout moment parce que l'utilisateur est dans le siège du pilote. À ce moment-là, il faut que ce soit pensé en UX. Donc ça, ça va dicter aussi la manière dont vous construisez votre produit. Une dernière capacité que je peux vous montrer, qui est justement l'inpainting, ici avec un cleanup d'une image. Je ne sais pas si dans la vraie vie, on supprimerait cette partie-là, mais disons que c'est possible. Je crois que ça conclut ma démo pour aujourd'hui.

Dans ces 125 variations, je vous l'ai déjà dit, je ne reviens pas dessus. Je passe juste à la slide suivante. En vous confiant peut-être quelques leçons apprises au cours du chemin, en plus de toutes celles que je vous ai déjà données, les larges modèles évoluent dans le temps, si bien que les résultats eux aussi évoluent dans le temps, pour le bien ou pour le moins bien, en fonction des évolutions évidemment. Et il y a eu finalement que la consistance dans le temps, parce que finalement si on fait la même requête plusieurs fois, tous les API ne fournissent pas forcément un CID pour aller fixer et avoir systématiquement la même génération, dans le temps on s'expose à avoir des résultats qui varient. Moi, j'ai trouvé que la Generative AI, je vous le disais juste à l'instant, permet de réutiliser des vieilles recettes et de les mettre sous stéroïde. Des choses qu'on ne pouvait pas faire avant, ou en tout cas pas aussi fort, on peut aujourd'hui se permettre de le faire, comme le crop et l'upscale, suivi d'un upscale.

Ce qu'on a remarqué aussi, c'est que vous savez, pour aller chercher ces images sur les sites, nous, on utilise un crawler. Donc, ce crawler-là, les crawlers, ça peut être catégorisé comme un data mining bot. Et puis ça, c'est quelque chose qui est de plus en plus. Les sites se protègent contre ça. Les sites n'ont pas envie forcément d'aller nourrir TGPT. On a vu ArtStation, on a vu un certain nombre d'exemples. Je le répète parce que certaines choses méritent d'être répétées. Itérer rapidement quand on est dans l'inconnu, c'est vraiment un de mes plus grands takeaways. Libérez vos équipes au maximum de tout process pour avancer rapidement et enfin trouver votre chemin. Tous les aspects légaux de sécurité, de gouvernance des données sont vraiment au balbutiement, en tout cas au tout début. Donc, restez alerte sur ces sujets-là. Mettez-vous, faites de la veille aussi sur ça pour voir comment ça évolue parce que c'est très important. Et parfois, on peut avoir aussi des problèmes de scalabilité. On peut être le throttle sur ChatGPT.

Il y a quand même des choses qui ne sont pas complètement… On est dans le neuf. Voilà. Donc, en conclusion, ce que je pourrais vous dire, c'est libérez-vous, facilitez, transformez, inspirez vos utilisateurs. du moment, en tout cas ce serait mon conseil aujourd'hui, que vous laissez l'utilisateur final dans le siège du pilote et la génére TVI en tant qu'assistant. Merci à tous de m'avoir écouté ce soir. On a le temps pour des questions? Bien. On ne saurait pas ce qu'aurait du succès.

S'il faut mes saumons et les avoir eu du succès, on ne saurait pas trop pourquoi. C'est une bonne question. Je n'ai pas la réponse. Pour l'instant, on reste sur une position un peu prudente. Mais je suis sûr que toutes les avancées qui arrivent, si on suit tous les news, on se rend compte qu'il y a des progrès tous les jours dans ce domaine-là, voire toutes les heures. Et donc, je suis sûr que très vite, on y sera. Je ne sais pas si on aurait pu résoudre notre use case particulier.

Donc, toi, tu dis qu'on devrait uploader des images à la source? Oui. Oui. Oui. J'ai une réponse pour toi. Les produits dont on fait la promotion, en général, ils viennent de sortir. Donc, ils ne sont pas forcément connus dans les larges langages modèles. Une dernière question? Oui. Avec plaisir. Ça a été relativement rapide. Il s'est passé un peu de temps entre le hackathon et l'enclenchement du projet en lui-même. Mais sur le projet en lui-même, je pense qu'on l'a commencé cet été et qu'il est en prod là.

Avec plaisir. Bonsoir à tous et merci encore Nicolas, c'était super intéressant comme talk sur un vrai usage en production. Donc le mien ne sera pas sur un vrai usage en production, moi je suis plutôt sur de l'expérimentation. Donc aujourd'hui on va parler d'agents LLM, on va voir ce que c'est un peu, vous en avez peut-être déjà entendu parler. Juste avant, petite présentation. Moi, je travaille chez Didask aujourd'hui. On fait une plateforme pédagogique. Le côté intéressant en rapport avec le sujet, c'est qu'on a une IA pédagogique qui va nous aider à rédiger les contenus. Donc concrètement, on a une chaîne de prompt et des agents LLM qui vont venir instrumenter l'interface pour créer les contenus pédagogiques selon nos méthodes. Voilà, là-bas, je suis staff ingénieur et j'aimerais aussi remercier toute l'équipe de Didask, qui n'est pas là vu qu'ils sont à Paris, qui m'ont aidé à faire un peu cette presse et à présenter devant eux, etc. Donc, petite dédicace. Ensuite, qu'est-ce que c'est un LLM? Donc, les LLM, un petit historique rapidement.

Donc, allez rapidement, 2018, on a BERT qui commence avec Google. OpenAI sort GPT-1, puis ensuite en 2019, on a GPT-2 chez OpenAI, Meta les troll un peu en sortant le BART, l'homonyme de BERT. En 2020, on n'a pas grand-chose chez Google, c'est un peu un flop. Par contre, on a GPT-3 qui sort, qui reste indétrônable pendant longtemps. En 2021, OpenAI nous sort Codex, que vous connaissez peut-être, c'est Copilot en gros, donc la plupart d'entre vous l'utilisent, j'espère. En 2022, c'est un peu la révolution qui fait que tout le monde est là aujourd'hui, tout le monde n'a pas de chat GPT. Concrètement, il y avait... pas une énorme avancée, à part le fait qu'on pouvait lui parler comme dans un chat, ce qui a beaucoup changé, alors que c'était juste de la génération de textes. Et en 2023, bon là, c'est carrément la folie, il y en a plein qui sont sortis. Juste Cocorico pour Mistral AI, qui est le premier LLM français et européen, du coup, open source, utilisable. Beaucoup de choses à faire, beaucoup de chemins à parcourir, mais c'est une très bonne nouvelle pour la souveraineté de l'Europe et de la France. Donc à quoi ça sert les LLM?

Donc en fait, les LLM, donc Large Language Model, ça sert à résumer du texte, par exemple, ça va servir à raconter des histoires, ça va nous servir aussi à traduire du texte, à corriger du texte, faire des suggestions de texte. Compléter du code qui est aussi du texte. Donc en fait, on a beaucoup de textes et c'est un peu limitant de s'arrêter à la génération de textes. On aimerait pouvoir faire plus de choses avec les potentiels des LLM et c'est là qu'interviennent les agents LLM. Donc concrètement, qu'est-ce que c'est un agent LLM? Au lieu de générer du texte, on va lui demander de faire quelque chose. On va lui demander de réserver un billet de train pour Montpellier le 17 octobre, pour que je vienne au meet-up. En fait, le LLM, lui, il ne sait pas faire ça. Lui, le seul truc qu'il sait faire, c'est générer du texte. Si vous demandez ça à GPT, il va vous dire« je ne sais pas faire». Ce qu'on va faire, c'est qu'on va lui demander de nous réserver un billet de train. Mais on va lui dire, pour faire cette tâche, tu as à ta disposition des actions. Et en fait, ces actions, c'est des actions qui vont avoir une incidence sur le monde réel.

Et donc, GPT va pouvoir se dire, je peux utiliser ces actions pour résoudre ma tâche dans son monde à lui virtuel. Donc, typiquement, si on lui demande ça, il va nous dire, Pour réserver le train pour Montpellier, tu vas utiliser l'action BookTrain. Et c'est là qu'entrent en jeu les développeurs pour parser la réponse texte et exécuter la véritable action qui va connecter notre LLM au monde réel. Ici, un appel à l'API SNCF, par exemple. Donc, ça nous amène aux quatre composants d'un agent à l'élème. Donc, première chose, une tâche à résoudre. Sinon, il n'y a pas de but. Deuxième chose, une liste d'actions. De quelle manière je vais permettre à mon LLM d'interagir avec le monde réel, Un prompt dynamique. Donc, bien sûr, la tâche à résoudre et les actions sont dans le prompt, mais cette partie dynamique du prompt sera très importante, on va y revenir. Et finalement, une boucle d'exécution qui est super basique, donc on ne va pas s'attarder dessus, mais en gros, c'est du code qui appelle l'LM et qui itère avec le compte. Donc, le prompt, comme vous l'aurez compris, en Generative AI, Gen AI, c'est le...

Le truc le plus important, c'est là que va se concentrer toute l'engineering, toute la compétence. Donc, bien sûr, pour un agent à l'ELM, c'est ce qui est aussi le plus important. Moi, je distingue plusieurs types de blocs à l'intérieur d'un prompt pour un agent à l'ELM. Donc, je le découpe en blocs d'instructions qui vont contenir l'explication de la tâche à résoudre et des directives pour y parvenir. Comment tu vas résoudre cette tâche? Comment j'aimerais que tu résoutes cette tâche? Un bloc d'action qui alise les actions disponibles pour résoudre la tâche. Et finalement, un bloc de feedback qui lui va être un bloc dynamique. C'est là qu'en fait réside le cœur du fonctionnement d'un agent LLM. Dans ce bloc de feedback, on va mettre le résultat des actions effectuées. L'agent LLM exécute des actions et on lui inclut le résultat de ces actions à l'intérieur de son prompt pour qu'il puisse comprendre en quelque sorte ce qu'il a fait. Un exemple d'un prompt, ici j'ai un prompt très basique avec un bloc d'instruction, récupérer trois fruits, un bloc de feedback, les fruits que j'ai déjà dans mon panier et des actions, une action get fruit et une action down pour dire que j'ai fini mon travail.

Comment ça va fonctionner? Donc, le premier prompt se compose ainsi. Dans le bloc de feedback, on a un seul fruit. On donne tout ça au LLM et en output, il va nous donner en réponse qu'est-ce qu'il faut pour avancer. Il faut que je récupère un fruit. Donc, je récupère mon deuxième fruit, une cerise. On va venir modifier notre... prompt et dans le bloc de feedback, on va ajouter le résultat de ces dernières actions. On vient d'ajouter un fruit. Donc maintenant, dans mon panier, j'ai deux fruits. On redonne tout ça au LLM. Il comprend qu'il n'a que deux fruits au lieu de trois. On repasse dans le tour de boucle. Il nous demande un troisième fruit. On ajoute le fruit dans le panier. On redonne l'ensemble du prompt au LLM. Il comprend qu'il a trois fruits. Et donc, il dit, c'est bon, j'ai fini de faire mon action. Donc ça, c'est vraiment le fonctionnement d'un agent LLM, c'est de pouvoir itérer sur une tâche en incluant le résultat de son action dans son prompt, et à la fin, il faut qu'il puisse comprendre que la tâche est finie. Donc, ça, c'était très théorique. Moi, j'ai envie de vous présenter un exemple un peu concret aujourd'hui.

Donc, j'ai fait quelques exemples du très sexy au ultra sexy. Donc, celui-là, c'est très sexy. C'est un agent LLM qui corrige vos bugs. Donc, il y a beaucoup de développeurs, j'ai l'impression, dans cette salle. Donc, ça va vous plaire. Les bugs, on fait tout ça, c'est la moitié de notre travail, disons. Comment ça se passe pour corriger un bug? Le processus qu'on fait tous, c'est d'abord, on va lire le message d'erreur, j'espère que vous faites ça. Ensuite, on va lire la stack trace, donc l'ensemble des fonctions qui sont incluses dans l'erreur. Et ensuite, on va souvent lire la call trace, qui est en fait toutes les fonctions qui ont été appelées. Depuis le début de la requête d'API, par exemple, jusqu'à l'exception. Une fois qu'on a toutes ces infos dans notre tête, on va essayer de comprendre le bug. Qu'est-ce qui a causé mon bug? Et une fois qu'on a compris, on va le corriger. Donc ici, en fait, on voit, pour moi, il y a deux étapes. Il y a une étape de recherche. Et ensuite, il y a une étape d'analyse. Quand on développe des agents LLM, c'est comme quand on développe des programmes, c'est bien de découper son code, et donc ici de découper ses agents LLM.

Et donc ici, on va en faire deux. Alors, petit bonus, ça fonctionne avec un seul agent LLM et un seul prompt, mais c'est moins performant, moins maintenable. Enfin bref, vous connaissez un peu la chanson, c'est comme des fonctions. Donc, on va un peu voir ce qu'on a dans nos deux agents. Le premier agent, je l'ai appelé, Walk, call, stack, agent. Donc cet agent, son but, ça va être de récupérer toutes les fonctions qui ont été impliquées dans le bug, le code de ces fonctions. Donc c'est l'étape de recherche en fait. Comment ça fonctionne? En entrée, je vais lui donner une stack trace. Et lui, en sortie, il va me donner le code de toutes les fonctions qui sont impliquées et uniquement le code de ces fonctions. Donc, première chose, le prompt, c'est surtout le plus important, on va parler du prompt. Dans mon prompt, je vais le lire parce que peut-être que tout le monde ne lit pas. Tu es un excellent développeur cherchant à lire le code de fonction. On a remarqué chez Didasque que quand tu flattes le LLM, il donne de meilleurs résultats. En lui disant que c'est un excellent développeur, Il fait des meilleurs résultats que si tu dis que tu es juste un développeur ou que tu es un mauvais développeur.

Ensuite, ton objectif est de récupérer le code de chaque fonction utilisateur appelé à partir de la première fonction référencée par cette stack trace. Ici, je mets la stack trace, c'est un template simple, comme n'importe quel moteur de template. Pour chaque fonction utilisateur, note le nom de chaque fonction appelée et lis le code de ces fonctions. Vérifie les appels à require dans les fonctions utilisateurs pour savoir quel fichier tu dois lire. On fait du JavaScript ici, enfin du TypeScript. Tu peux demander à lire plusieurs fonctions à la fois. Donc ici, j'ai mon bloc d'instructions. Je lui dis ce qu'il doit réaliser comme tâche et je lui dis comment j'aimerais qu'il la réalise. Ensuite, j'ai un bloc de feedback très simple. Tu as déjà le code des fonctions utilisateurs suivantes. Ici, j'insère le code de mes fonctions. Juste pour vous montrer à quoi ça ressemble, ce que j'insère, ça ressemble à un template simple, comme n'importe quel moteur de template. Pour chaque fonction utilisateur, note le nom de chaque fonction appelée et lis le code de ces fonctions. Vérifie les appels à require dans les fonctions utilisateurs pour savoir quel fichier tu dois lire. On fait du JavaScript ici, enfin du TypeScript. Tu peux demander à lire plusieurs fonctions à la fois. Donc ici, j'ai mon bloc d'instructions. Je lui dis ce qu'il doit réaliser comme tâche et je lui dis comment j'aimerais qu'il la réalise.

Ensuite, j'ai un bloc de feedback très simple. Tu as déjà le code des fonctions utilisateurs suivantes. Ici, j'insère le code de mes fonctions. Juste pour vous montrer à quoi ça ressemble, ce que j'insère, ça ressemble à un template simple, comme n'importe quel moteur de template. Pour chaque fonction utilisateur, note le nom de chaque fonction appelée et lis le code de ces fonctions. Vérifie les appels à require dans les fonctions utilisateurs pour savoir quel fichier tu dois lire. On fait du JavaScript ici, enfin du TypeScript. Tu peux demander à lire plusieurs fonctions à la fois. Donc ici, j'ai mon bloc d'instructions. Je lui dis ce qu'il doit réaliser comme tâche et je lui dis comment j'aimerais qu'il la réalise. Ensuite, j'ai un bloc de feedback très simple. Tu as déjà le code des fonctions utilisateurs suivantes. Ici, j'insère le code de mes fonctions. Juste pour vous montrer à quoi ça ressemble, ce que j'insère, ça ressemble à un template simple, comme n'importe quel moteur de template. Pour chaque fonction utilisateur, note le nom de chaque fonction appelée et lis le code de ces fonctions. Vérifie les appels à require dans les fonctions utilisateurs pour savoir quel fichier tu dois lire. On fait du JavaScript ici, enfin du TypeScript. Tu peux demander à lire plusieurs fonctions à la fois. Donc ici, j'ai mon bloc d'instructions. Je lui dis ce qu'il doit réaliser comme tâche et je lui dis comment j'aimerais qu'il la réalise. Ensuite, j'ai un bloc de feedback très simple.

Tu as déjà le code des fonctions utilisateurs suivantes. Ici, j'insère le code de mes fonctions. Juste pour vous montrer à quoi ça ressemble, ce que j'insère, ça ressemble à un template simple, comme n'importe quel moteur de template. Pour chaque fonction utilisateur, note le nom de chaque fonction appelée et lis le code de ces fonctions. Vérifie les appels à require dans les fonctions utilisateurs pour savoir quel fichier tu dois lire. On fait du JavaScript ici, enfin du TypeScript. Tu peux demander à lire plusieurs fonctions à la fois. Donc ici, j'ai mon bloc d'instructions. Je lui dis ce qu'il doit réaliser comme tâche et je lui dis comment j'aimerais qu'il la réalise. Ensuite, j'ai un bloc de feedback très simple. Tu as déjà le code des fonctions utilisateurs suivantes. Ici, j'insère le code de mes fonctions. Juste pour vous montrer à quoi ça ressemble, ce que j'insère, ça ressemble à un template simple, comme n'importe quel moteur de template. Pour chaque fonction utilisateur, note le nom de chaque fonction appelée et lis le code de ces fonctions. Vérifie les appels à require dans les fonctions utilisateurs pour savoir quel fichier tu dois lire. On fait du JavaScript ici, enfin du TypeScript. Tu peux demander à lire plusieurs fonctions à la fois. Donc ici, j'ai mon bloc d'instructions. Je lui dis ce qu'il doit réaliser comme tâche et je lui dis comment j'aimerais qu'il la réalise.

Ensuite, j'ai un bloc de feedback très simple. Tu as déjà le code des fonctions utilisateurs suivantes. Ici, j'insère le code de mes fonctions. Juste pour vous montrer à quoi ça ressemble, ce que j'insère, ça ressemble à un template simple, comme n'importe quel moteur de template. Pour chaque fonction utilisateur, note le nom de chaque fonction appelée et lis le code de ces fonctions. Vérifie les appels à require dans les fonctions utilisateurs pour savoir quel fichier tu dois lire. On fait du JavaScript ici, enfin du TypeScript. Tu peux demander à lire plusieurs fonctions à la fois. Donc ici, j'ai mon bloc d'instructions. Je lui dis ce qu'il doit réaliser comme tâche et je lui dis comment j'aimerais qu'il la réalise. Ensuite, j'ai un bloc de feedback très simple. Tu as déjà le code des fonctions utilisateurs suivantes. Ici, j'insère le code de mes fonctions. Juste pour vous montrer à quoi ça ressemble, ce que j'insère, ça ressemble à un template simple, comme n'importe quel moteur de template. Pour chaque fonction utilisateur, note le nom de chaque fonction appelée et lis le code de ces fonctions. Vérifie les appels à require dans les fonctions utilisateurs pour savoir quel fichier tu dois lire. On fait du JavaScript ici, enfin du TypeScript. Tu peux demander à lire plusieurs fonctions à la fois. Donc ici, j'ai mon bloc d'instructions. Je lui dis ce qu'il doit réaliser comme tâche et je lui dis comment j'aimerais qu'il la réalise.

Ensuite, j'ai un bloc de feedback très simple. Tu as déjà le code des fonctions utilisateurs suivantes. Là, ça. En gros, je donne le code de la fonction, je dis dans quel fichier elle est mise et le nom de la fonction. Je mets des backticks avec JS. Il comprend mieux le code quand on utilise ce format Markdown. Tout ça, c'est des astuces de prompt engineering. On pourrait y revenir plus tard si vous voulez. Et finalement, j'ai un bloc d'actions. Donc voilà, je lui donne les actions qu'il peut réaliser. Donc moi, j'ai deux actions. J'ai une action read function et une action done. Alors pour ceux pour qui le XML, ça pique les yeux, pareil, le LLM comprend mieux le XML que le JSON. Donc voilà, c'est pour ça que je fais du XML, même si ça fait longtemps. Donc, il peut faire une action read fonction, il va donner le chemin d'un fichier, le nom de la fonction, et moi, je vais devoir coder quelque chose qui lui renvoie le code de cette fonction de cette manière. Donc, maintenant, le code, ça va être très rapide, ne vous inquiétez pas. Le code est vraiment super simple, donc il n'y a pas besoin d'en passer des années. Donc là, c'est un peu petit, donc du coup, je vais l'expliquer. Première étape, on initialise le LLM. Moi, j'utilise Langchain pour initialiser les modèles et pour formater les promptes. Super pratique. Deuxième étape, on déclare le template de prompt. Donc, on a le template et les variables qu'on va venir injecter dedans. Donc ici, on va injecter la stack trace et la liste des fonctions utilisateurs déjà lues par le LLM. On va garder en mémoire deux variables, les stack traces et les fonctions. Et ensuite, on va rentrer dans la fonction run. Donc, c'est la boucle d'exécution du LLM. C'est la boucle principale. Pareil, franchement, c'est super simple. Ça me fait même honte de vous l'expliquer, mais je vais quand même le faire. Donc ici, j'ai le prompt, je le formate avec les variables. Donc à chaque tour de boucle, je vais avoir de plus en plus de fonctions dans le tableau User Function. Donc à chaque tour de boucle, le prompt va changer. C'est pour ça qu'on le reformate à chaque fois. On appelle le LLM avec du texte, ça nous renvoie du texte. Le LLM, c'est que du texte. On va parser ce texte. On va parser ce texte. La fonction de parsing, je vous l'épargne, c'est des regex pour du XML. Donc, c'est un peu sale, mais c'est ChatGPT qui l'a généré pour moi. Et finalement, pour chaque action, on va l'exécuter. Et on va renvoyer un booléen pour finir la boucle si on a fini d'exécuter notre agent. Là, c'est la méthode execute action. Pareil, je vous la montre, mais c'est un peu honte. C'est tellement simple. C'est juste un switch. Si c'est read function, je lis le code de la fonction. Donc, il y a une fonction un peu mystérieuse. Là, get function code with required. Je l'ai fait générer par TiaGPT, donc je ne vais pas vous la montrer. En gros, ça parcourt la ST de JavaScript et ça lit le code d'une fonction et ça le retourne. Et ensuite, le code qu'on vient de lire, on va le pousser dans le tableau des fonctions qu'on a déjà lues pour l'injecter dans le prompt à chaque fois. Et quand c'est fini, on dit que c'est fini. Super simple. Comment ça fonctionne l'exécution? On va y aller pas à pas. Vous allez voir, il n'y a pas 1000 tours de boucle. Là, il y en a 4. Premier tour, le tour 1 ou le tour 0 pour les intimes. Au premier tour, dans le prompt, on a juste la stack trace. Dans la stack trace, il y a deux informations importantes que le LLM va comprendre tout seul. Je ne lui dis même pas. Il va comprendre que j'ai une fonction createTask dans le fichier app.js. Et donc, lui, il va se dire, il faudrait que je lise cette fonction. Et donc, il va me demander de lire la fonction critas dans le fichier app.js avec l'action. Et moi, derrière, je vais exécuter le code qui va lire la fonction et je lui ajoute dans son tableau. Deuxième tour, j'ai le code de la fonction createTask. Et du coup, ce code a été intégré dans le prompt, dans le bloc de feedback du prompt. Donc le LLM, quand il passe, il voit qu'il a le code d'une fonction. Et du coup, il se dit, il faut que je lise le code de toutes les fonctions qui sont appelées depuis cette fonction, mais uniquement les fonctions de l'utilisateur. Il ne va pas aller lire les fonctions de Node.js, par exemple, parce qu'il est malin. Dans cette fonction, pareil, il la lit. Il voit que j'ai verifyTask et addTask. En plus, il arrive à voir que ces fonctions ont été importées depuis d'autres fichiers, depuis le fichier verify.js et le fichier database.js. Super, il se dit, donne-moi le code de ces fonctions, je veux les lire. Il me demande, j'exécute, je lis le code de ces fonctions, mon code s'exécute. Je rajoute ces deux fonctions dans mon tableau de fonctions. Là, dans mon prompt, on a la fonction createTask, la fonction verifyTask et la fonction addTask. Il se trouve que dans addTask, il y a d'autres fonctions utilisateurs. Pareil, il va me demander, s'il te plaît Adrien, tu peux me les lire. Le code d'Adrien peut me les lire. Et du coup, on va lire les fonctions. Et les ajouter dans la liste des fonctions qu'il a lues. Dernière étape, il a lu le code de toutes les fonctions. Et en fait, en repassant sur le prompt, il se dit qu'il n'y a aucune autre fonction utilisateur. Donc en fait, mon travail est fini. Et là, il s'arrête. Et c'est la fin de notre premier agent qui va nous donner en sortie la liste de toutes les fonctions qui ont été impliquées dans la call stack de notre bug depuis une simple stack trace.

Deuxième partie, beaucoup plus simple, vous allez voir, ce n'est même pas un vrai agent, on va corriger le bug. On avait la stack trace qui passe dans le premier agent qui nous donne la liste de toutes les fonctions utilisateurs. Notre deuxième agent, on va lui donner la stack trace et les fonctions utilisateurs. Et lui, qu'est-ce qu'il va faire? Il va nous expliquer le bug et en plus, il va le corriger. Le prompt. Encore une fois, on va le flatter un peu. Tu es un excellent développeur, blablabla. Voilà le message d'erreur ainsi que la stack trace. Puis là, on va lui donner des explications un peu précises sur comment j'aimerais qu'il corrige le bug. En fait, quand vous parlez, quand vous écrivez un prompt, il faut considérer l'agent LLM, le LLM en général, comme un stagiaire qui ne connaît rien, première année. Donc, il faut lui expliquer pour corriger un bug. Tu dois donner une brève explication du bug. Tu dois également fournir une solution pour corriger le bug. Essayer de corriger le bug au plus tôt dans la call stack. Tu n'as pas le code complet du fichier, donc tu dois faire des hypothèses. Tu dois peut-être modifier des fonctions dans différents fichiers pour corriger le bug. Ça paraît un peu débile comme ça, mais en fait, si je ne lui donne pas ces instructions, des fois, il n'y arrive pas. Donc, c'est vraiment le stagiaire de première année.

Et finalement, le code des fonctions, de toutes les fonctions qui ont été lues par le premier agent. Donc, tout ça, ça part dans le prompt du LLM. Et il va être capable... Ah, désolé. Le bloc d'action. En fait, le bloc d'action ici va être très simple. On n'aura pas de bloc de feedback, simplement un bloc d'action. Donc, une première action. Où on va lui dire pour expliquer le bug, et une action de correction, qui va pouvoir utiliser une ou plusieurs fois, où il va indiquer le chemin du fichier, le nom d'une fonction, et le code à remplacer pour cette fonction. Donc, c'était avec ça, bien sûr. Donc le code de l'agent, encore une fois, très simple, encore plus simple. Donc voilà, on formate notre prompt, on appelle le LLM, on extrait les actions et on les exécute. Et les exécuter, ça veut dire, si c'est l'explication, on la log, console log, super simple. Et si c'est la correction, on va remplacer le code d'une fonction. Pareil ici, c'est JGPT qui m'a généré cette fonction. Ça parcourt l'AST de JavaScript. Ça remplace tout le code d'une fonction par un nouveau code. Donc, super simple. Qu'est-ce que ça donne comme résultat ici?

Je ne l'ai pas lancé devant vous, parce que les live démo, c'est un peu compliqué, mais je vous mets le résultat. En fait, il m'a renvoyé deux actions. Première action, l'explication du bug. Je ne vais pas la lire maintenant, on va plutôt la lire ici pour comprendre où était ce fameux bug. En fait, le bug, il était ici. On essaye d'accéder à la propriété ID de metadata. Et en fait, il se trouve que metadata n'est pas défini. En fait, parce que la fonction addTask, elle va ajouter l'ID et elle va le pousser dans le tableau de tâches, mais elle ne va pas renvoyer l'objet sur lequel on a rajouté un ID. Elle va renvoyer l'objet passé en paramètre depuis le début. On va avoir une erreur, c'est pour ça qu'on a cette erreur à dire undefined. La deuxième action, c'est une action de correction. Donc là, mon agent me donne le code nécessaire pour corriger mon bug. En fait, il me dit quoi? Il me dit, tu déclares ta tâche avec les métadonnées à l'intérieur. Ensuite, tu pousses cette tâche et puis ensuite, surtout, tu la retournes à ta fonction à plante.

Comme ça, ta fonction à plante contient aussi l'ID de la tâche. Donc voilà, c'est comme ça qu'il a réussi à corriger mon bug. Pour ceux qui ne me croient pas sur parole, et vous ne devriez peut-être pas, le code est disponible sur GitHub. Vous pouvez le télécharger, le lancer. C'est la première version que j'ai faite avec un seul prompt. contient les deux agents. Ça marche aussi, c'est juste moins performant, mais ça fonctionne aussi très bien. Donc voilà, il faut juste une clé OpenAPI, OpenAI, et vous pouvez l'utiliser. Voilà, pas plus de choses pour ce premier aperçu de ce qu'on peut faire avec des agents LLM. J'espère que ça vous a donné plein d'idées. En tout cas, moi, j'en ai plein pour en discuter si vous voulez après. Quelques liens. Donc, Dida, si vous voulez voir un peu ce qu'on fait au niveau de l'IA générative, une publication que j'ai lancée avec un ami où j'écris sur justement les agents LLM. Et j'ai une veille technologique qui est aussi beaucoup alimentée d'ailleurs par Pierre de Flint sur tout ce qui se passe au niveau AI ces derniers mois. Et voilà, merci à tous. Si vous avez des questions, on peut les voir après.

Oui. Je répète la question de Jean qui dit que vu que le modèle, je lui dis de faire des suppositions parce que je ne lui donne pas tout le code. Est-ce qu'à des moments, il fait des hallucinations en, par exemple, me donnant des méthodes qui n'existent pas ou des choses fausses? En fait, je lui dis qu'il n'a pas tout le code parce qu'il n'a pas tout le code. Il n'a pas tous les fichiers de code comme moi, le développeur. Je pourrais lire un fichier en entier. Je vais juste lui donner une chaîne de fonctions. Toutes les fonctions appelées dans cette action d'API sont données au LLM. Si je ne lui donne pas tout le code, c'est parce qu'il y a quelque chose de très important qui s'appelle la fenêtre de contexte. C'est les limitations de combien de caractères on peut mettre dans un prompt.

Ça se compte en token, donc c'est un peu chiant, mais en gros, on peut dire qu'un token, c'est trois caractères. GPT-4, la limite, C'est 8000, donc ça fait 24 000 caractères. Donc, on ne peut pas mettre tout son code dedans. Donc, il faut faire des choix. Et donc, c'est pour ça qu'on est obligé d'aller chercher le code de chaque fonction. Cette limitation, en fait, elle vient de quelque chose de très physique. C'est que le prompt, en fait, il va être vectorisé. Donc, je ne vais pas entrer dans les détails. Il va être chargé dans la mémoire du GPU avec le modèle. Et du coup, il y a une limite à ce qu'on peut charger dans la mémoire d'une carte graphique pour générer le texte qui va suivre. Et donc, en fait, pour répondre à ta question, alors, il peut toujours halluciner, mais en fait, là, je lui demande de corriger un bug. Donc, je ne lui demande pas d'essayer d'écrire des fonctions, des choses comme ça. Sur les essais que j'ai faits, je n'ai pas vraiment eu ce genre de problème. Mais après, oui, sur des bases de code plus élevées, ça peut arriver. Sur les promptes qui sont plus longs, ça peut arriver. Plus le prompt est long, plus il y a des risques d'hallucinations. Il y a tout un ensemble de techniques qui sont aussi possibles d'appliquer pour réduire ces hallucinations quand tu les vois arriver dans ton programme.

D'autres questions ? Oui. Oui, alors j'ai testé déjà GPT 3.5. Uh, Alors, pour les tâches très simples, extraire du texte, ça va. Je l'utilise surtout parce que sa fenêtre de contexte est deux fois celle de GPT-4 et que son prix est dix fois moins cher. Donc, je l'utilise pour résumer du texte, extraire du texte, extraire des images d'une page web, des choses comme ça. Mais pour tout ce qui concerne la réflexion, GPT-4, c'est vraiment le meilleur. Il n'y a même pas de benchmark à faire. J'ai testé Lama2 aussi. C'était déplorable. Il n'était même pas capable de me retourner mes actions en format XML. Je n'ai pas testé Mistral AI. Mais honnêtement, je pense qu'OpenAI a une avance qui va être difficile de rattraper. Ça va se faire, mais pour l'instant, c'est pour plusieurs raisons. Déjà, la première raison, c'est qu'ils étaient les premiers. Ensuite, ils ont eu les données avec ChatGPT. Ils ont eu des millions et des millions de conversations qu'ils ont pu ensuite utiliser pour faire du fine-tuning avec des humains sur ces conversations.

Ils ont aussi fait du fine-tuning sur du code avec toute leur expérience qu'ils ont eue sur Codex aussi, Copilot. Tous ceux qui utilisent Copilot, sachez que ça permet à OpenAI de conserver son avance. Aujourd'hui, c'est difficile à estimer, mais ils ont dépensé une somme d'argent monstrueuse dans cette partie fine-tuning du modèle déjà entraîné. Et ce qui fait qu'il n'y a aucun des mots. modèle open source qui leur arrive à la cheville et c'est de loin en fait c'est vraiment gpt4 et de loin le meilleur donc je m'embête même pas je fais que du gpt4 D'autres questions? Oui. Oui, alors c'est vrai que les coûts de GPT-4 sont assez chers. En fait, je pense qu'il faut remettre toujours les choses dans leur contexte et quand on donne des chiffres, il faut les comparer à autre chose. Et du coup, vu qu'on est des développeurs et que là, par exemple, moi, ce que j'essaye de faire, c'est remplacer une partie de mon travail de développeur que je trouve rébarbative.

Le coût, il faut le comparer avec le coût de mon salaire. Et donc, en fait, aujourd'hui, le coût d'un développeur est largement supérieur au coût qu'on pourrait gagner en utilisant des IA comme ça pour nous aider dans notre travail. Enfin, copilote, ça coûte 20 euros, je crois. Même si nous faisons payer au vrai prix, qui est à peu près 10, le vrai prix de copilote, ce serait... plus entre 20 et 30 dollars le prix que ça leur coûte à github même si c'était 20 ou 30 dollars je paierai même si c'était 100 euros je paierai copilote parce qu'en fait copilote me fait gagner tellement de temps qu'à la fin c'est rentable si je suis si c'est mon entreprise et que j'ai mes salariés je leur dis écoutez tout le monde utilise copilote même si c'est 100 dollars vous l'utilisez parce que vous avez gagné en productivité ça va être monstre donc c'est cher mais appliqué au monde des développeurs plus on va réussir à développer des agents comme ça qui nous aider sur des tâches. Là, j'ai montré une résolution de bug. J'ai un autre poc sur GitHub pour aller voir. C'est un agent qui écrit la documentation d'une API, puis ensuite les tests fonctionnels en fonction de la documentation qu'il a générée. Donc voilà, c'est des tâches comme ça qui vont être capables de faire des tâches de refactoring.

Et clairement, c'est du temps. Et en fait, le coût du prompt, le coût de l'API d'OpenAI est moindre qu'en fait le coût d'un développeur. Oui, c'est vrai. Mais du coup, il faut entraîner son modèle d'IA. Et ça coûte cher, il faut collecter des données, il faut les nettoyer. Après, il faut payer des centaines de milliers d'heures de cartes graphiques pour entraîner le modèle. Il faut payer les salaires de tous les PhD en machine learning, toute la partie ML Ops. Ce sont des coûts qui sont faramineux. Et en fait, GPT-4 est quand même bon dans tout. C'est un modèle généraliste, entre guillemets, mais il est généralement bon. Merci.

D'autres questions peut-être? Oui? En gros, je vais être assez rapide. En gros, la façon de créer des contenus pédagogiques dans Didas, c'est qu'on va prendre un concept et on va le décliner en sous-concept qu'on appelle des granules. Chaque granule, c'est une unité de savoir à connaître. Il y a beaucoup de types de granules différentes. Ça peut être des choses avec des choix multiples, ça peut être des vidéos, ça peut être du texte, des dialogues, etc. Et en gros, les gens qui créent des formations, nos clients, ils vont pouvoir déposer par exemple un PDF. Par exemple, ils ont tout un PDF qui parle des risques de corruption dans le milieu de la finance ou de lobbying, je ne sais pas quoi. Ils vont mettre leur PDF et nous, on va découper ce PDF en modules et chaque module, on va pouvoir créer ces granules, donc les éléments pédagogiques les plus petits. Et du coup, ça va leur permettre de gagner énormément de temps. En gros, depuis que l'IA a été mise en place, nous, chez Didas, on crée aussi des formations pour nos clients. Depuis qu'il a été mis en place, on a multiplié par deux le nombre de formations qu'on arrive à créer pour nos clients sans que la taille de l'équipe bouge.

Donc, c'est quand même un gain de temps qui est vraiment énorme. Ça répond à ta question? Ok. D'autres questions? Sinon, je vois qu'on fait des signes en mode le buffet et l'apéro. Merci.