Le problème de départ
Aucun jeu de données n'associe une demande en langage naturel à un haïku classique. Les anthologies existantes sont faites pour être lues, pas pour entraîner un modèle. Il fallait donc construire ce corpus, puis apprendre à un petit modèle à suivre ce genre de demande tout en restant assez léger pour tourner dans un onglet de navigateur.
Les étapes
Rassembler des haïkus classiques
Un scraper récupère les haïkus de sept poètes auprès de sources très différentes : PDF, archive XML universitaire (Shiki), blog (Chiyo-ni), page archivée par la Wayback Machine (Takahama). Chaque source a son propre parseur.
Le livre de Bashō est un scan dont la couche OCR est illisible par endroits (« a frog js-.si.ps into »). Les pages sont donc retranscrites à partir des images par Gemini Flash-Lite, pour 0,25 $ le livre, puis contrôlées : numéros mal lus corrigés par la continuité des pages, citations dans la prose écartées, cas douteux vérifiés à la main.
Nettoyer et équilibrer le corpus
Une étape commune normalise la ponctuation et l'Unicode, supprime les doublons et la prose, et signale les mots inconnus du dictionnaire pour repérer les erreurs d'OCR restantes. Kobayashi Issa représentant à lui seul 13 000 haïkus, il est limité à 2 000 pour ne pas imposer son style au modèle.
| poète | après nettoyage | retenu |
|---|---|---|
| Kobayashi Issa | 13 373 | 2 000 |
| Bashō | 1 011 | 1 011 |
| Yosa Buson | 865 | 865 |
| Natsume Sōseki | 165 | 165 |
| Kyoshi Takahama | 80 | 80 |
| Masaoka Shiki | 44 | 44 |
| Chiyo-ni | 35 | 35 |
Générer des demandes variées
Pour chaque haïku, Gemini Flash-Lite rédige trois demandes qu'un utilisateur aurait pu taper, dans trois styles tirés parmi six : quelques mots, message familier, phrase polie, mots-clés, ordre bref, scène vécue. Le haïku doit répondre entièrement à la demande, sans qu'elle en recopie le texte : les demandes qui reprennent quatre mots consécutifs du haïku sont régénérées.
"hey can u give me a haiku about fireflies flying above the river pls"
→ Now gathering, / Now scattering, / Fireflies over the river. (Sōseki)
Fine-tuner Gemma 3 270M en LoRA
Le modèle google/gemma-3-270m-it est entraîné en bfloat16 avec des
adaptateurs LoRA (rang 16, toutes les couches linéaires) via SFTTrainer.
La perte ne porte que sur le haïku, et la validation est séparée par haïku : un même
poème ne peut pas apparaître des deux côtés avec des demandes différentes. Le meilleur
checkpoint est à la fin de la première epoch, avant que le modèle ne commence à
réciter son corpus.
Alléger le modèle
Le vocabulaire de Gemma compte 262 000 tokens dans des dizaines de langues, soit 62 % des paramètres. Seuls les tokens utiles à l'anglais sont conservés, mesurés sur le corpus et sur des échantillons de vraies demandes à un chatbot, de texte web et de poésie. Le tokenizer est reconstruit en gardant les étapes intermédiaires de son algorithme de fusion, et la matrice d'embeddings est découpée en conséquence.
Exporter en ONNX et quantifier
Le graphe ONNX est construit avec un script de Xenova adapté à la dernière version de Transformers. Les calculs restent en float32, car les activations de Gemma 3 débordent en float16. Les poids passent en 8 bits, y compris la matrice d'embeddings, stockée une seule fois pour l'entrée et la sortie du modèle. Des versions 4 bits ont été testées puis écartées : moins fidèles, et dix fois plus lentes sur WebGPU.
Servir 100% dans le navigateur
Le modèle est hébergé sur Hugging Face et chargé par Transformers.js dans un Web Worker, pour ne pas bloquer l'interface. WebGPU est utilisé quand il est disponible, sinon un nouveau worker repart sur le CPU en WebAssembly. Le haïku s'affiche au fil de la génération, et ni la demande ni le résultat ne quittent l'appareil du visiteur.
Outils
Données
- BeautifulSoup / pdfminer.six
- Gemini API (OCR, génération en batch)
- wordfreq
Fine-tuning
- Hugging Face Transformers / TRL
- PEFT (LoRA)
Export & serving
- ONNX / ONNX Runtime
- Transformers.js (WebGPU / Wasm)