🔧 Code & reproduction complète (scripts, RUNBOOK, reproduce.sh, conversations) : https://github.com/AlexandreFenyo/MonEspaceSante-H100-reproduction

Qwen3-14B — Mon espace santé (CPT + SFT)

Modèle de question-réponse closed-book (sans RAG) sur la FAQ du service public français « Mon espace santé ». Les connaissances de la FAQ ont été injectées dans les poids par continued pre-training (CPT) sur un corpus synthétique massif, puis un SFT léger restaure le format question/réponse. Objectif : démontrer qu'un CPT préalable permet d'aller bien plus loin qu'un simple SFT pour ancrer durablement des faits dans un LLM.

TL;DR (chiffres clés)

Modèle Méthode Held-out 704 (strict) Held-out 704 (indulgent) Hallucination OOD
Ce modèle (CPT+SFT) CPT synthétique + SFT 63,8% 80,3% 12%
gpt-oss-20b-FAQ-MES SFT direct (20B) 42,5% 67,8% 60%
SFT direct (notre ablation, Qwen3-14B) SFT direct, sans CPT 37,2% 61,1% 56%

Le CPT préalable fait passer la précision closed-book de 37,2 % → 63,8% (strict) sur 704 questions held-out jamais vues, là où le SFT seul plafonne (le modèle « bluffe » les détails).

Données (toutes publiées)

Rôle Dataset Contenu
Vérité de base fenyo/MonEspaceSante-FAQ-QA 88 faits real (source unique, ~15 400 tokens) + 496 reformulations
Corpus CPT fenyo/H100-MonEspaceSante-CPT-corpus ~3,87 M tokens synthétiques distincts (EntiGraph + Nemotron-CC FR), décontaminés
Données SFT fenyo/H100-MonEspaceSante-SFT 428 Q/R domaine + 120 refus hors-périmètre
Éval / jugement fenyo/H100-MonEspaceSante-eval 704 held-out gelées + validation 30 + OOD 25 + oubli 30

Pipeline complet (reproductible)

Matériel : 1× NVIDIA H100 PCIe 80 Go.

1) Génération synthétique (1-hop, anti model-collapse)

  • Générateur : Qwen3-32B-FP8 servi par vLLM (VLLM_USE_DEEP_GEMM=0 ; thinking désactivé via chat_template_kwargs.enable_thinking=False), piloté par NVIDIA NeMo Curator.
  • Prompts Nemotron-CC adaptés FR (rephrase Wikipédia, distill, extract-knowledge, knowledge-list, diverse-QA) + opérateur EntiGraph custom (passages reliant paires/triplets de faits réels).
  • Tag de domaine [Mon espace santé] ; filtre qualité + déduplication (shingles n-grammes).
  • Décontamination vs held-out : embeddings bge-m3 (cos ≥ 0,90) + n-grammes (containment ≥ 0,6).
  • Volume retenu : ~3,87 M tokens distincts (plafond extractible de 88 faits ; ~×260).

2) CPT — continued pre-training (full fine-tuning) → modèle de base enrichi

  • Modèle : Qwen/Qwen3-14B-Base, tous les poids entraînés.
  • Corpus : corpus CPT + 18 % de replay FR généraliste (anti-oubli, Ibrahim 2403.08763).
  • Hyperparamètres : 3 epochs, lr 1e-5, cosine + warmup 3 %, weight_decay 0,01, grad clip 1,0, bf16, seq_len 2048, micro-batch 1 × accumulation 16, gradient checkpointing, attention SDPA.
  • Optimiseur : bitsandbytes paged_adamw_8bit (sans DeepSpeed — ZeRO-3 CPU-offload provoquait un OOM CPU ; le paged 8-bit tient en ~81 Go GPU paginé + ~25 Go RAM).
  • Résultat → fenyo/H100-Qwen3-14B-MonEspaceSante-CPT.

3) SFT — restauration du format Q/R (pas d'injection de faits, cf. Gekhman 2405.05904)

  • Données : MonEspaceSante-SFT (428 Q/R domaine + 120 refus).
  • Format fixe : Question : {q}\nRéponse : {a} ; loss sur la réponse uniquement (prompt masqué).
  • Hyperparamètres : 12 epochs, lr 2e-5, cosine + warmup 3 %, bf16, seq_len 2048, micro-batch 4 × accumulation 4, gradient checkpointing, paged_adamw_8bit.

Inférence (closed-book)

prompt = f"Question : {question}\nRéponse :"   # aucune donnée de contexte fournie
# greedy (temperature=0), stop sur "\nQuestion :"

Résultats détaillés

Courbe accuracy vs tokens synthétiques (CPT+SFT, juge Qwen3-32B)

Tokens synth. distincts Held-out strict Held-out indulgent Validation strict Validation indulgent
0 (baseline SFT direct) 37,2% 61,1% 43,3% 53,3%
478 k 44,0% 67,3% 46,7% 70,0%
1,95 M 52,6% 72,7% 63,3% 80,0%
3,87 M 60,7% 79,3% 56,7% 76,7%
3,87 M × 2 exposition (probe plateau) 65,1% 81,5% 56,7% 70,0%

La précision closed-book croît ~log-linéairement avec le nombre de tokens synthétiques, puis sature (rendements décroissants au-delà de ~4 M tokens distincts).

Comparaison directe vs gpt-oss-20b-FAQ-MES (même jeu de test, même juge)

Métrique (closed-book) Ce modèle (CPT+SFT, 14B) gpt-oss-20b-FAQ-MES (SFT, 20B)
Held-out 704 — strict 63,8% 42,5%
Held-out 704 — indulgent 80,3% 67,8%
Validation 30 — strict 56,7% 46,7%
Validation 30 — indulgent 70,0% 70,0%
Hallucination hors-domaine 12% 60%
Oubli (culture générale FR) 100% correct 96,7% correct

Note d'équité : gpt-oss-20b-FAQ-MES a été évalué via transformers (implémentation de référence) et non vLLM 0.22, dont le kernel MoE produisait des sorties incohérentes pour cette architecture (gpt_oss). Mêmes 704 questions held-out, même juge Qwen3-32B, même barème.

Protocole de jugement : LLM-juge Qwen3-32B, closed-book, deux barèmes — strict (faits-clés présents ET aucune contradiction) et indulgent (idée générale correcte, tolère détails imprécis).

Conclusions & enseignements (chiffres simples)

  1. Le CPT préalable change la donne. À jeu de test et juge identiques, le SFT direct sur la base plafonne à 37,2 % (strict, held-out) : le modèle apprend le format mais invente les détails (mauvais portail, mauvais bouton, mauvais horaire). Avec un CPT préalable, on atteint 63,8% — soit ×1,7 la précision du SFT seul.
  2. Plus de tokens synthétiques = plus de précision, de façon log-linéaire : 37 → 44 → 53 → 61 % (strict) pour 0 → 0,5 → 2 → 3,9 M tokens. Le levier dominant est le volume de connaissances distinctes ré-exprimées, pas la taille du modèle.
  3. Plafond de données : à partir de 88 faits (~15 k tokens), on extrait ~3,9 M tokens distincts (×260) ; au-delà, la génération se répète et la précision sature (+4 pts seulement en doublant l'exposition).
  4. Anti-hallucination : ajouter 120 exemples de refus au SFT fait chuter l'hallucination hors-domaine de 48 % → 12%, sans coût sur la précision factuelle.
  5. Pas d'oubli : grâce à 18 % de replay FR, la culture générale reste à 100% (aucun oubli catastrophique).
  6. Plus petit mais meilleur : ce modèle 14B dépasse gpt-oss-20b-FAQ-MES (20B) sur le held-out (63,8% vs 42,5% strict), illustrant qu'injecter la connaissance dans les poids (CPT) > la montrer en SFT.

Limites

  • Domaine étroit (FAQ « Mon espace santé »). Hors de ce domaine, comportement de base de Qwen3-14B.
  • Précision closed-book non parfaite : pour un usage production, un RAG complémentaire reste pertinent.
  • Le juge est un LLM (Qwen3-32B) ; les valeurs absolues dépendent du barème (strict/indulgent fournis).

Références

EntiGraph (arXiv:2409.07431) · WRAP (2401.16380) · Physics of LM 3.1 (2309.14316) · Gekhman et al. (2405.05904) · Continual pretraining (2403.08763) · Nemotron-CC (NVIDIA NeMo Curator).

Downloads last month
31
Safetensors
Model size
15B params
Tensor type
BF16
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for fenyo/H100-Qwen3-14B-MonEspaceSante-CPT-SFT

Finetuned
(1)
this model
Quantizations
1 model

Datasets used to train fenyo/H100-Qwen3-14B-MonEspaceSante-CPT-SFT

Paper for fenyo/H100-Qwen3-14B-MonEspaceSante-CPT-SFT