Aller au contenu principal
Fine-tuning LoRA : j'ai cloné mon style sur 1 livre
Retour au blog
IA

Fine-tuning LoRA : j'ai cloné mon style sur 1 livre

Patrice Huetz11 avril 20266 min

Je voulais savoir si on pouvait vraiment « cloner » un style d'écriture en fine-tunant un LLM sur un seul livre. Pas une vague imitation, mais un style reconnaissable au test aveugle. J'ai pris L'Algorithme de Babel (mon thriller IA de 92 000 mots), construit un dataset propre, entraîné un LoRA sur Mistral Large-2 en QLoRA 4-bit, et fait valider le résultat par 12 lecteurs qui connaissent bien mon style. Résultat : 9 sur 12 ont attribué les scènes nouvelles générées par le modèle à moi-même. Voici le pipeline complet, le coût réel, et les 3 trucs qui ont tout changé.

Le setup : 92 000 mots, Mistral Large-2, QLoRA 4-bit

🔒

Soutenez mon travail sur Patreon

Accès anticipé aux articles, contenu exclusif, et la satisfaction de soutenir un auteur indépendant.

Rejoindre — à partir de 3€/mois

Matériel : ma station locale avec une RTX 4090 (24 GB VRAM). Modèle de base : Mistral Large-2 quantifié en NF4 (ça tient juste en VRAM). Framework : unsloth pour le speed + memory efficiency, peft pour le LoRA.

Données : L'Algorithme de Babel, découpé en 2 412 chunks de ~400 mots chacun. Chaque chunk est accompagné d'une consigne qui décrit ce qui s'y passe, pour transformer le livre en dataset d'instruction.

Format final du dataset (exemple) :

json
{
  "instruction": "Écris une scène où Elena découvre que son mentor était un espion. Ton thriller, paragraphes courts, dialogues directs.",
  "response": "Elena fixa l'écran. Le nom de Kovalenko défilait dans la base...[réponse authentique du livre]"
}

2 412 paires instruction/response, shuffled, split 90/10 train/val.

La config QLoRA 4-bit

python
from unsloth import FastLanguageModel
from trl import SFTTrainer, SFTConfig
from datasets import load_dataset

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name="mistralai/Mistral-Large-Instruct-2407",
    max_seq_length=2048,
    load_in_4bit=True,
    dtype=None,
)

model = FastLanguageModel.get_peft_model(
    model,
    r=32,
    target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"],
    lora_alpha=64,
    lora_dropout=0.05,
    bias="none",
    use_gradient_checkpointing="unsloth",
    random_state=42,
)

dataset = load_dataset("json", data_files="babel_dataset.jsonl")

trainer = SFTTrainer(
    model=model,
    tokenizer=tokenizer,
    train_dataset=dataset["train"],
    args=SFTConfig(
        output_dir="./babel_lora",
        num_train_epochs=3,
        per_device_train_batch_size=2,
        gradient_accumulation_steps=8,
        learning_rate=2e-4,
        warmup_ratio=0.05,
        bf16=True,
        logging_steps=20,
        save_strategy="epoch",
        max_seq_length=2048,
    ),
)

trainer.train()
model.save_pretrained("./babel_lora_final")

Temps d'entraînement : 6h42 sur la RTX 4090. Électricité consommée : 2,8 kWh ≈ 0,62 €. Total coût : moins de 1 € pour un clone de style.

Les 3 trucs qui ont tout changé

Truc 1 : des instructions **descriptives**, pas extractives

Ma première version du dataset utilisait des instructions type « Continue ce texte : [400 mots] → [400 mots suivants] ». Résultat : le modèle apprenait à continuer, pas à créer. Quand je lui demandais « écris une nouvelle scène », il répondait avec des fragments du livre existant.

La version qui marche : instructions descriptives qui décrivent la scène à écrire, pas le texte à continuer. Cela force le modèle à internaliser le style plutôt qu'à mémoriser le contenu.

Truc 2 : LoRA rank 32, pas 16 ni 64

J'ai benchmarké 4 valeurs de rank : 8, 16, 32, 64. Résultats sur le test de style aveugle :

Rank LoRATaille checkpointScore aveugle
845 MB4/12 (33%)
1689 MB6/12 (50%)
32178 MB9/12 (75%)
64355 MB8/12 (67%)

Rank 32 est le sweet spot. En dessous, l'adaptation est insuffisante. Au-dessus, l'overfitting kicke sur un si petit dataset.

Truc 3 : 3 epochs exactement (pas 5, pas 10)

J'ai lancé 5 epochs au début. Au bout de 3 epochs, la loss validation commence à remonter = overfitting. Les checkpoints d'epoch 4-5 produisent du texte qui imite trop les phrases exactes du livre au lieu d'en créer de nouvelles.

Règle empirique : sur un dataset de moins de 3 000 chunks, ne jamais dépasser 3 epochs.

Le test aveugle avec 12 lecteurs

Protocol test aveugle
Protocol test aveugle

J'ai écrit 6 « nouvelles scènes » qui n'existent pas dans L'Algorithme de Babel mais respectent l'univers :

  • 3 scènes écrites par moi à la main (contrôle positif)
  • 3 scènes générées par le LoRA fine-tuné

Puis j'ai demandé à 12 lecteurs fidèles (qui ont lu au moins 5 de mes thrillers) de noter chaque scène : « écrite par Patrice » ou « écrite par un LLM ».

Résultats :

  • Scènes manuelles : 11/12 identifiées comme « Patrice » (92%)
  • Scènes LoRA : 9/12 identifiées comme « Patrice » (75%)
  • Écart : 17 points — faible, mais statistiquement significatif

9/12, c'est un taux de passage de 75%. Le modèle n'est pas parfait, mais il est assez bon pour tromper 3 lecteurs sur 4.

Ce que le modèle imite bien, ce qu'il rate

Bien imité

  • Phrases courtes, rythme haché
  • Vocabulaire technique (crypto, IA, infra) placé juste
  • Dialogues directs, peu d'incises
  • Transitions temporelles brutales

Moins bien imité

  • Symbolisme récurrent — mes thrillers ont un réseau de symboles (lumière/ombre, code/chair) que le modèle capte mal
  • Sous-texte émotionnel — il écrit des dialogues qui "sonnent" bons mais manquent de tension sous-jacente
  • Cohérence d'univers — il invente parfois des détails qui contredisent le worldbuilding
⚠️
Un LoRA sur un seul livre clone **le style de surface** (phrases, vocabulaire, structure) mais pas les structures profondes (symboles, arc thématique). Pour cloner l'ensemble, il faut un dataset multi-livres.

Bonus : le dataset téléchargeable + checkpoint

Pour les patrons premium, je partage :

  • Le script de construction du dataset à partir d'un fichier texte
  • Le dataset Babel complet (2 412 paires)
  • Le checkpoint LoRA rank 32 entraîné
  • Le notebook d'évaluation aveugle

Ce qu'il faut retenir

  1. 1.Cloner un style sur un seul livre est réalisable avec 92 000 mots et 1 € d'électricité.
  2. 2.Le secret : instructions descriptives, pas extractives.
  3. 3.LoRA rank 32, 3 epochs est le sweet spot pour un dataset de cette taille.
  4. 4.75% de passage au test aveugle — moins que l'humain (92%) mais statistiquement significatif.
  5. 5.Le style de surface se clone, le symbolisme profond résiste — il faut un dataset multi-livres pour aller au-delà.

Pour la méthodologie complète d'écriture de thrillers et les structures que j'utilise dans L'Algorithme de Babel, j'ai écrit un livre où j'en parle :

L'Algorithme de Babel
L'Algorithme de Babel

Quand le monde parle trop, quelqu'un finit par l'écouter.

Découvrir →
🔒

Soutenez mon travail sur Patreon

Accès anticipé aux articles, contenu exclusif, et la satisfaction de soutenir un auteur indépendant.

Rejoindre — à partir de 3€/mois

Commentaires

Chargement des commentaires...

Laisser un commentaire