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.

Bashō : 1 012 haïkus propres au lieu de 781 partiellement abîmés

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èteaprès nettoyageretenu
Kobayashi Issa13 3732 000
Bashō1 0111 011
Yosa Buson865865
Natsume Sōseki165165
Kyoshi Takahama8080
Masaoka Shiki4444
Chiyo-ni3535
4 200 haïkus retenus pour l'entraînement

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.

"Write a river firefly haiku."
"hey can u give me a haiku about fireflies flying above the river pls"
→ Now gathering, / Now scattering, / Fireflies over the river. (Sōseki)
12 600 paires demande → haïku, via l'API batch de Gemini

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.

99,5 % de haïkus en 3 lignes (80 % avant) · 0 % recopié du corpus · vocabulaire 50 % plus varié

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.

262k → 89k tokens · 268M → 157M paramètres · haïkus identiques sur 100 tests

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.

633 Mo → 182 Mo · environ 22 tokens/s sur GPU, 4 tokens/s sur CPU

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)

Essayer

Voir la démo interactive →

Modèle disponible sur Hugging Face : version navigateur (ONNX)