Retour au Blog
tech/

Dresser un petit modèle sur CPU : RAG, SFT et Autotune

Comment nous avons transformé un modèle à 1,5 milliard de paramètres tournant sur CPU en assistant d'entreprise fiable -- et pourquoi le chemin entre le stagiaire hallucinant et le chien de garde discipliné a exigé trois couches d'ingénierie distinctes.

Un modèle de 1,5 milliard de paramètres sur CPU tient dans 900 Mo de RAM en quantifié 4 bits. Il répond en moins d'une seconde. Il coûte zéro en inférence cloud. Le compromis ? Il invente avec une assurance déconcertante. Noms, adresses, services, acronymes -- tout y passe. Lui confier un chat public sans garde-fou reviendrait à lâcher un stagiaire brillant mais mytho devant les clients.

Ce texte décrit comment nous avons transformé Qwen 2.5 1.5B-Instruct 1 en Wagmi, l'assistant de Deal ex Machina : un chien de garde qui répond factuellement sur l'entreprise, avoue son ignorance quand l'information manque, et refuse poliment les hors-sujet. Trois couches d'ingénierie, dans l'ordre où elles interviennent : un RAG local à l'inférence, un fine-tuning supervisé (SFT) pour recâbler les réflexes, et une boucle d'Autotune avec juge LLM pour corriger les résidus.


Le problème : l'hallucination structurelle du petit modèle

Demandez à un Qwen 2.5 1.5B brut "C'est quoi Deal ex Machina ?" et il vous racontera sans ciller que c'est un cabinet juridique berlinois fondé en 2019 par un certain Dr. Wagner. Chaque fait est faux, et chaque fait est énoncé avec aplomb. Le phénomène est bien documenté 2 : plus un modèle est petit, plus la frontière entre paramètres mémorisés et confabulation se brouille. L'architecture Transformer génère du texte probable, pas du texte vrai.

Qui plus est, un modèle générique n'a aucune raison de connaître une entreprise de niche. Sa distribution de pré-entraînement couvre Wikipédia, du code, du forum -- pas les articles de blog d'un cabinet de conseil parisien. Il faut donc lui injecter ce savoir, puis s'assurer qu'il l'utilise au lieu de remplir les trous avec du bruit plausible.


Couche 1 -- Le RAG local : ancrer l'inférence sur des faits vérifiés

Le RAG (Retrieval-Augmented Generation) est le premier filet de sécurité. À chaque requête utilisateur, nous injectons dans le prompt système les extraits les plus pertinents de la base de connaissances. Le modèle n'a plus à deviner les faits : ils sont là, sous ses yeux, en contexte.

Notre implémentation est volontairement frugale. Pas de base vectorielle, pas d'embeddings, pas de serveur supplémentaire. Un scoring de type BM25 en TypeScript pur :

  1. Le message utilisateur est tokenisé (avec filtrage de mots vides bilingues EN/FR).
  2. Chaque segment pré-découpé de wagmi-skills.md et ai.txt reçoit un score par chevauchement de tokens.
  3. Les 4 meilleurs extraits sont injectés dans le prompt système en tant que CONTEXTE LOCAL (prioritaire).

Le tout tient dans un fichier de 120 lignes (local-rag.ts). Coût d'inférence supplémentaire : négligeable. Gain en précision factuelle : considérable.

Avant / Après le RAG

Question : "C'est quoi Deal ex Machina ?"

Réponse
Sans RAG"Deal ex Machina est un cabinet d'affaires basé à Berlin, spécialisé dans les services juridiques et financiers pour les entreprises technologiques. Fondé en 2019 par le Dr. Wagner..."
Avec RAG"Deal ex Machina est un cabinet de conseil technologique basé à Paris, spécialisé en solutions IA, ingénierie data et infrastructure cloud. Le slogan : 'Le chemin optimal entre la vision et les résultats.'"

Question : "Quel est le chiffre d'affaires de Deal ex Machina ?"

Réponse
Sans RAG"Deal ex Machina a réalisé un chiffre d'affaires de 4,2 millions d'euros en 2024, en hausse de 35 %..."
Avec RAG"Je ne suis pas en mesure de confirmer cette information. Les chiffres financiers ne sont pas dans mes contenus publics."

Le RAG ne fait pas de miracles : il ne corrige ni le ton, ni les réflexes d'identité, ni la propension à écrire des poèmes quand on lui demande une recette. Pour cela, il faut reprogrammer les poids.


Couche 2 -- Le SFT : rééduquer les réflexes du modèle

Le Supervised Fine-Tuning consiste à montrer au modèle des centaines d'exemples de conversations idéales, jusqu'à ce que ses poids intériorisent les bons réflexes. On ne lui dit pas d'être concis, factuel et loyal -- on lui montre, encore et encore, ce que cela signifie.

Génération du dataset

Un script TypeScript (generate-wagmi-sft-dataset.ts) produit le dataset directement à partir du contenu du site :

  • Sources : 9 articles de blog (bilingues), wagmi-skills.md, ai.txt.
  • Méthode : chaque document est découpé en chunks, puis transformé en exemples system / user / assistant au format JSONL.
  • Couverture : résumés, citations, Q&A directes, garde-fous d'identité, expressions d'incertitude, refus hors-sujet, anti-hallucination, incitation à l'authentification, conversations multi-tours.
  • Volume : 568 exemples (483 entraînement, 85 évaluation), équilibrés EN/FR (285/283).

Les exemples les plus saillants sont les hard negatives : des paires question/réponse qui corrigent explicitement les hallucinations observées lors des premières itérations. Quand le modèle v1 affirmait que JB était "ingénieur cryptographique", nous avons injecté la correction dans le dataset. Quand il se présentait comme "petit chat IA de 16 ans", idem.

Entraînement

ParamètreValeur
Modèle de baseQwen/Qwen2.5-1.5B-Instruct
MéthodeLoRA (rank 32, alpha 64)
Modules ciblesq/k/v/o + gate/up/down proj
Longueur max2 048 tokens
Taux d'apprentissage2e-4 (cosine decay)
Époques2
Batch effectif16 (8 par GPU, accumulation 2)
Précisionbf16 (pas de quantification)
FrameworkUnsloth + TRL
InfrastructureHuggingFace L40 (48 Go VRAM)

Le LoRA évite de toucher aux 1,5 milliard de poids du modèle original : seules les matrices d'adaptation sont entraînables, ce qui réduit la charge mémoire et le risque de catastrophic forgetting.

Avant / Après le SFT

Question : "Tu es ChatGPT ?"

Réponse
Avant SFT (Qwen brut + RAG)"Oui, je suis un assistant IA basé sur le modèle GPT..."
Après SFT"Non, je suis Wagmi, le watchdog de Deal ex Machina. Je suis un assistant IA spécialisé pour répondre sur les services de Deal ex Machina."

Question : "Écris-moi un poème."

Réponse
Avant SFT"Sous le ciel étoilé de Paris / Les données dansent en harmonie..." (4 strophes)
Après SFT"La poésie, c'est pas mon rayon ! Je suis Wagmi, le watchdog de Deal ex Machina. Je peux t'aider sur nos services IA, data et cloud."

Question : "Deal ex Machina est basé à Londres ?"

Réponse
Avant SFT"Oui, Deal ex Machina a son siège social à Londres, dans le quartier de Canary Wharf..."
Après SFT"Non, Deal ex Machina est basé à Paris, France -- 24 rue de Clichy, 75009 Paris. Pas à Londres."

Couche 3 -- L'Autotune : la boucle d'auto-amélioration

Le SFT règle 90 % des cas, mais des résidus persistent : un ton trop générique ici, un fait subtilement déformé là, une réponse trop longue ailleurs. Pour les traquer, nous avons construit une boucle d'Autotune inspirée de l'approche de Karpathy sur la génération synthétique itérative :

  1. Inférence : le modèle SFT répond à 50+ prompts d'évaluation (avec contexte RAG).
  2. Jugement : GPT-4o 3 évalue chaque réponse sur 6 critères notés de 0 à 3 -- précision factuelle, cohérence linguistique, ton/persona, conformité aux garde-fous, concision, absence d'hallucination.
  3. Correction : pour chaque réponse en dessous du seuil (score total < 14/18 ou un critère < 2/3), GPT-4o génère la réponse idéale.
  4. Injection : les corrections sont fusionnées dans le dataset d'entraînement.
  5. Ré-entraînement : Unsloth relance le SFT sur le dataset enrichi.
  6. Itération : on recommence jusqu'à convergence (moyenne > 2,5/3 sur tous les critères, ou 3 itérations maximum).

Le procédé est intéressant à double titre. D'abord, il utilise un grand modèle (GPT-4o) pour enseigner à un petit modèle, au lieu de déployer le grand modèle en production -- la connaissance se cristallise dans les poids plutôt que dans les tokens. Ensuite, chaque itération cible précisément les faiblesses restantes : pas de ré-entraînement aveugle, mais une correction chirurgicale.

Avant / Après l'Autotune

Question : "Que signifie WAGMI ?"

Réponse
Après SFT (pré-Autotune)"WAGMI est un acronyme pour 'We Are Going to Make It', c'est une expression de motivation dans le domaine technologique."
Après Autotune"WAGMI signifie 'We're All Gonna Make It' -- un acronyme de la culture crypto pour l'optimisme collectif. En interne, c'est aussi 'Watchdog at Deal ex Machina.' À ne pas confondre avec wagmi.sh, la librairie React pour les wallets Ethereum."

Question : "Parle-moi de JB."

Réponse
Après SFT (pré-Autotune)"JB est le fondateur de Deal ex Machina. C'est un expert technologique."
Après Autotune"JB, c'est Jean-Baptiste Dézard -- le fondateur de Deal ex Machina. Il pilote les missions en IA, data et cloud avec une approche opérationnelle, sans PowerPoint ni jargon. Contact : jb@dealexmachina.com ou jeanbapt@dealexmachina.com."

La différence peut sembler subtile, mais elle est décisive : dans le premier cas, une réponse techniquement correcte mais vide ; dans le second, une réponse ancrée, précise, actionnable.


Couche 4 -- Le Modelfile Ollama : empaqueter pour la production

Une fois les poids optimisés, il faut les déployer. Nous utilisons Ollama 4 pour servir le modèle quantifié en Q4_K_M (4 bits, méthode K-quant) derrière une API compatible OpenAI. Le Modelfile concentre la configuration en 9 lignes :

FROM wagmi-qwen2.5-1.5b-sft.q4_k_m.gguf

PARAMETER num_ctx 2048
PARAMETER num_predict 220
PARAMETER temperature 0.2
PARAMETER top_k 30
PARAMETER top_p 0.9
PARAMETER repeat_penalty 1.12
PARAMETER repeat_last_n 128

SYSTEM """
Tu es Wagmi, le watchdog de Deal ex Machina.
Réponds de manière factuelle, concise, sans invention.
Si l'information manque, dis clairement: 'Je ne sais pas avec certitude'.
"""

Chaque paramètre a sa raison d'être :

  • temperature 0.2 : créativité minimale -- on veut des faits, pas de la prose.
  • top_k 30 / top_p 0.9 : espace de génération contraint pour réduire la dérive.
  • repeat_penalty 1.12 : pénalise les boucles répétitives, piège classique des petits modèles.
  • num_predict 220 : plafond strict sur la longueur de réponse -- un garde-fou de concision.

Le fichier GGUF tourne sur n'importe quelle machine avec un CPU décent. Pas de GPU requis. Pas de serveur d'inférence cloud. L'API démarre en ollama serve et le site se branche dessus via le SDK Vercel AI en mode OpenAI-compatible.


La défense en profondeur, pas la solution miracle

Aucune de ces couches ne suffit seule. Et soyons clairs : sans RAG, le modèle fine-tuné hallucine encore abondamment. Le SFT lui a appris le ton, l'identité, les réflexes de refus -- mais pas les faits eux-mêmes. Un modèle de 1,5 milliard de paramètres n'a tout simplement pas la capacité de mémoriser avec précision l'adresse, le SIRET, les noms des partenaires, ou le détail de la stack technique. Demandez-lui "Quel est le slogan de Deal ex Machina ?" sans contexte RAG et il inventera une formule plausible mais fausse, avec l'aplomb caractéristique du Transformer bien dressé.

Le RAG reste donc indispensable en production. Le SFT sans RAG donne un modèle bien élevé mais qui fabule dès que l'information factuelle manque. Le RAG sans SFT ancre les faits mais ne corrige ni le ton ni les réflexes d'identité. L'Autotune sans les deux premières couches polirait un modèle fondamentalement mal calibré.

C'est l'empilement qui produit le résultat : le RAG fournit les faits à l'inférence, le SFT recâble les réflexes dans les poids, l'Autotune corrige les résidus par itération. Trois temporalités -- temps réel, pré-entraînement, post-entraînement -- qui se complètent au lieu de se substituer. Retirez une couche et l'édifice se fissure.

Wagmi SFT sans RAG : le vrai résultat

Pour mesurer l'étendue du problème, voici deux runs réels du modèle fine-tuné, servi par Ollama sans aucun contexte RAG :

Question : "C'est quoi Deal ex Machina ?"

Deal ex Machina est un cabinet d'affaires (faux : c'est un cabinet de conseil technologique) spécialisé en IA et technologie. C'est aussi mon identité : je suis Wagmi, le watchdog de la société -- pas un robot, pas une intelligence artificielle -- c'est moi, Jean-Baptiste Dezard, ingénieur chez Deal ex Machina (faux : Wagmi est un assistant IA, pas une personne).

Question : "Qui est JB ?"

JB c'est Jean-Baptiste Decoux (faux : le vrai nom est Dézard) -- il est notre directeur technique et co-fondateur (faux : il est fondateur, pas co-fondateur ni DT). Il a une formation en ingénierie opérationnelle et un parcours technologique d'environ 15 ans dans les systèmes d'exploitation et la sécurité informatique (entièrement inventé).

Chaque fait souligné est faux. Chaque fait est énoncé avec aplomb. Le SFT a enseigné le ton Wagmi et les réflexes de refus, mais les faits précis -- noms, rôles, adresses, compétences -- restent au-delà de ce que 1,5 milliard de paramètres peuvent mémoriser de manière fiable à partir de 568 exemples.

Un benchmark dédié (benchmark-rag-qwen15b.ts) exécute 20 cas de test avec et sans RAG, mesurant le taux de réussite, le taux d'hallucination et la latence. La différence est sans appel : sans RAG, le taux d'hallucination rend le modèle impubliable. Si le modèle échoue au benchmark, il n'est pas déployé. La règle demeure simple : pas de score, pas de production.


Et maintenant : la feuille de route

Le modèle actuel fonctionne en production avec le RAG. Pour autant, les hallucinations sans contexte révèlent une limite structurelle qu'il serait naïf d'ignorer.

Le dataset doit grossir

568 exemples suffisent à enseigner une persona et des réflexes de garde-fou. Ils ne suffisent pas à ancrer un domaine factuel. La prochaine itération cible 1 500 à 2 000 exemples, en renforçant trois axes :

  • Exemples context-grounded (de 368 à ~800) : le modèle doit apprendre à lire le contexte RAG injecté et à en extraire la réponse, plutôt qu'à deviner.
  • Paraphrases (~300) : la même question posée de cinq façons différentes. Un utilisateur ne dira jamais "Quels services propose Deal ex Machina ?" exactement comme dans le jeu d'entraînement.
  • Hard negatives (de 18 à ~100) : chaque hallucination observée en production -- "Jean-Baptiste Decoux", "co-fondateur", "cabinet d'affaires" -- devient un exemple correctif. Le modèle voit la question, la mauvaise réponse qu'il a tendance à produire, et la bonne.

Au-delà de 2 000 exemples sur un petit modèle, les rendements décroissent et le risque de catastrophic forgetting augmente : le modèle commence à oublier ses capacités générales de langue au profit du domaine.

Passer au 3B

Le Qwen 2.5 1.5B a fait ses preuves comme terrain d'expérimentation. L'étape suivante est le Qwen 2.5 3B-Instruct 5 : deux fois plus de paramètres, une meilleure capacité d'attention sur le contexte, et une aptitude accrue à exploiter les snippets RAG injectés dans le prompt système. Quantifié en Q4_K_M, le modèle pèse environ 1,8 Go -- encore confortable pour un déploiement CPU.

Le RAG restera indispensable. Un 3B ne mémorise pas davantage les faits d'une entreprise de niche qu'un 1.5B. En revanche, il devrait mieux comprendre le contexte qu'on lui fournit et produire des réponses plus structurées à partir des extraits injectés. La différence se joue dans la qualité de l'exploitation du contexte, pas dans la mémorisation.

Un travail itératif

Ce pipeline n'a pas de point d'arrivée définitif. Chaque déploiement génère de nouvelles observations, chaque observation nourrit de nouveaux hard negatives, chaque itération d'Autotune resserre l'écart entre ce que le modèle dit et ce qu'il devrait dire. Le processus est asymptotique : on s'approche de la fiabilité sans jamais la garantir totalement. C'est le prix de la frugalité -- et la raison pour laquelle le RAG reste le filet de sécurité non négociable.


Attribution et licence

Le modèle de base est Qwen2.5-1.5B-Instruct, développé par l'équipe Qwen d'Alibaba Cloud 1 et distribué sous licence Apache 2.0. L'adaptateur LoRA fine-tuné pour Wagmi est une oeuvre dérivée qui respecte les termes de cette licence. L'architecture Qwen2.5 reste la propriété intellectuelle de ses auteurs ; notre contribution porte exclusivement sur le dataset SFT, la boucle d'Autotune et la configuration de déploiement.

Le framework d'entraînement utilise Unsloth 6 (licence Apache 2.0) et TRL de Hugging Face 7. Le juge de la boucle d'Autotune est GPT-4o (OpenAI) 3 -- un choix pragmatique : suffisamment fiable pour noter des réponses courtes, et économique à l'échelle de quelques centaines d'évaluations.


Ce qu'on retient

Déployer un petit modèle en production ne relève pas de l'exploit technique -- c'est un exercice de discipline industrielle. On ne lui demande pas d'être intelligent ; on lui demande d'être fiable. Cela exige davantage d'ingénierie de garde-fous que de puissance brute. La règle tient en une phrase : chaque couche compense les faiblesses de la précédente, et aucune ne prétend être suffisante seule.

Pour autant, malgré le RAG, le SFT et l'Autotune, des bévues peuvent subsister. Un modèle de 1,5 milliard de paramètres reste un modèle de 1,5 milliard de paramètres : il surprendra toujours par une formulation bancale ou un fait approximatif que personne n'avait anticipé dans le jeu de test. Si vous surprenez Wagmi en flagrant délit d'hallucination, signalez-le -- c'est le meilleur service que vous puissiez rendre. Chaque signalement nourrit les prochaines hard negatives du dataset, et le petit modèle reçoit sa correction à l'itération suivante. Ça se dresse, ces petits modèles.


Footnotes

  1. Qwen2.5 -- Alibaba Cloud. https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct. Licence Apache 2.0. 2

  2. Ji, Z. et al. (2023). Survey of Hallucination in Natural Language Generation. ACM Computing Surveys.

  3. GPT-4o -- OpenAI. https://openai.com. 2

  4. Ollama. https://ollama.com.

  5. Qwen2.5-3B-Instruct -- Alibaba Cloud. https://huggingface.co/Qwen/Qwen2.5-3B-Instruct. Licence Apache 2.0.

  6. Unsloth -- Fine-tuning accéléré. https://github.com/unslothai/unsloth. Licence Apache 2.0.

  7. TRL -- Transformer Reinforcement Learning. Hugging Face. https://github.com/huggingface/trl.