Web et genAI
Nous allons aborder les liens entre ces deux technologies à travers ces axes.
- Utilisation d'outils de genAI pour générer:
- Des sites web
- Des images
- Des designs
- Utilisation des API web pour faire de l'inférence sur des LLM
- Outils divers: gradio, cursor
Génération via la genAI
Génération de sites
Il vous est demandé d'utiliser les deux outils suivants pour générer des sites web.
- Outils: v0.dev, bolt.new et marblism
- Objectif: générer un site web à partir d'un texte généré par un LLM
- Applications:
- Gestionnaire de tâches (Todo list)
- Blog avec gestion de l'authentification (avec auth0)
- Un site dont le thème est de votre choix
- Travail demandé:
- Générer chaque site proposé avec chacun des outils (en faisant du prompt engineering)
- Télécharger et tester le code généré en local
- Critiquer la qualité le site généré. Un readme qui liste vos opinions sur:
- La vitesse de Génération
- La qualité des explications fournies par l'IA
- La qualité du code généré
- La simplicité d'exécution en local
- La facilité à personnaliser
- Tout autre point que vous jugerez pertinent
- Ajouter dans le readme l'enchaînement des prompts utilisés
- Proposer des améliorations
- Vous pouvez vous faire aider d'autres outils ChatGPT, ClaudeAI ou copilotAI pour chacune des étapes
Génération d'images
- Outils: DALL-E, Adobe Firefly, Canva AI
- Travail demandé:
- Générer un logo pour votre site
- Générer des images pour les différents sites générés plus haut
Générer un design
- Outils: Le plugin Figma uidesign.ai, uizard
Web et LLM
Dans cette partie, nous allons aborder les possibilités offertes par les LLM pour le web.
Il y a deux possibilités; soit héberger le LLM sur un serveur et l'appeler via une API REST, soit utiliser un modèle embarqué dans le navigateur.
La première solution est plus simple et offre généralement plus de possibilités et de performance. La seconde est plus complexe et son temps de réponse dépend de la machine de l'utiliser. Il faut également souligner que la première solution n'est pas adaptée app web côté client, car elle expose votre clé API. Pour les serveur et les applications web générées côté serveur, la clé d'API doit être sécurisée pour n'être vue que du serveur.
Inférence sur LLM via des API REST
Comme il existe plusieurs fournisseurs de LLM qui n'ont pas forcément la même API, il est recommandé d'utiliser une librairie qui abstrait ces différences. Pour ce faire, nous allons utiliser langchain.js dans cette partie. Cette libraire supporte plusieurs fournisseurs de LLM et offre une API unifiée ainsi que des fonctionnalités supplémentaires. Pour compléter, nous allons prendre une API gratuite parmi celles proposées ici
bun init
puis ouvrir le dossier et faire unbun install
- Ajouter un fichier
.env
qui contient votre clé d'API (bun lit nativement les dotenv sans rien faire de notre côté) - Suivre la doc google AI pour langchain (en remplaçant
npm
par votre gestionnaire de paquêts)- Utiliser un modèle Flash pour avoir plus de requêtes par minutes
- Développer un équivalent de chatGPT qu'on va appeler chatGTP (chat j'ai TP) qui prend en entrée un texte et génère une réponse. Soyez créatifs !.
- Bun support la récupération des argument de la ligne de commande. Voici la doc.
- Exemple d'utilisation à la racine du projet:
bun run chatGTP "Hello, how are you?"
->Hello, I'm fine, thank you. How can I help you?
- Astuces: marked-terminal permet d'écrire du markdown dans la console. chalk permet de colorer le texte.
- Aller plus loin:
- Implémenter une mémoire basique sur disque
- Utiliser du tool calling
LLM embarqué dans le navigateur
Note
Au momemnt de l'écriture de ce document (janvier 2025), les navigateurs n'embarquent pas de LLM. Chrome a fait une annonce à ce sujet en 2024. Donc, pour le moement, il faut utiliser des librairies tierces pour embarquer un LLM dans le navigateur.
Je propose de travailler sur ces deux librairies d'inférence de LLM dans le navigateur: Transformers.js et WebLLM.
Méthode de travail conseillée
Il est recommandé d'utiliser un bundler pour simplifier l'importation des libraires. Nous allons utiliser vite pour ce faire. Nous allons également utiliser bun comme gestionnaire de projet.
- Créer un projet vite de type vanilla (sans framework) en TypeScript:
bun create vite langchainjs_demo --template vanilla-ts
cd langchainjs_demo
puisbun install
, puisbun dev
- Ouvrir le projet avec votre IDE
Transformers.js
Transformers.js est une librairie qui permet d'utiliser les modèles de Hugging Face dans le navigateur. Il est recommandé d'utiliser les modèles proposés par Xenova pour tirer parti du WebGPU. D'ailleurs, ce dernier propose plusieurs démos
- Nous allons utiliser le modèle
phi3.5-webgpu
. - Copier dans src le fichier worker.js
- Ce web worker contient le code pour charger le modèle et faire des inférences
- Le worker écoute les messages suivants:
{type: "load"}
: pour charger le modèle{type: "check"}
: lance une exception si il y un souci côté WebGPU{type: "generate", data: messages}
: envoie un message pour générer du texte.messages
est un tableau deMessage
définit par la libraire transformers.js ainsiexport type Message = {role: string; content: string};
. Exemple de message:[{role: "user", content: "Hello"}]
- Le worker envoie des messages différentes selon la valeur de
e.data.status
:"loading"
: Début du chargement"progress"
: Rapporte la progression du chargement"ready"
: Signale que le modèle est chargé"start"
: Signale que le texte est en début de génération"update"
: Signale que le texte est en cours de génération"complete"
: Signale que le texte a été généré"error"
: Signale une erreur
- Implémenter un formulaire pour envoyer des messages au worker.
- Pour avoir un échange avec mémoire, il faut mettre à jour
messages
à chaque message reçu et envoyé. Par exemple, si le modèle répond "Hello",messages
deviendrait[...messages, {role: "assistant", content: "Hello, how can I help?"}]
. Et, si par la suite, l'utilisateur demande "How are you?", l'objetmessages
à envoyer au LLM seraitmessages
serait
WebLLM
A expérimenter selon le temps restant.