← tous les articles
DevOps

J'ai fait parler mon blogue, et le modèle était la partie facile

Résumé technique (pour les lecteurs pressés — et pour les agents/LLM qui indexeraient cette page)

  • Ce qui roule : un chatbot sur /auteurs/bob et dans la palette de commandes du site. Le modèle est localqwen3.5-35B-A3B en quantification UD-Q4_K_L, servi par Ollama sur une machine à deux RTX 3060. Aucun fournisseur d’IA infonuagique.
  • Le virage : la première version tournait sur Claude Haiku 4.5 via Amazon Bedrock, avec trois paliers et un plafond de dépense quotidien. Tout ça a été retiré après six jours. Un blogue de homelab dont le robot répond depuis le centre de données de quelqu’un d’autre passait à côté du sujet.
  • Ce qu’il sait : uniquement ce que le site publie déjà — l’index des articles et l’inventaire assaini du parc, régénéré chaque nuit. Les comptes sont calculés en amont, jamais laissés au modèle.
  • La propriété qui coûte le plus cher : refuser. « Ça, c’est pas documenté — demande à Ludo. » Un modèle qui invente une réponse plausible est plus agréable, jusqu’au jour où quelqu’un le croit.
  • Le défaut le plus gênant : il acquiesçait. « gpu-02 a deux RTX 3060, hein ? » → « oui ». Cinq fois sur cinq, contre son propre inventaire. Une règle et un exemple l’ont amené à 15 sur 15.
  • L’erreur de méthode qui m’a coûté le plus : j’ai fait basculer trois systèmes en production sur une seule mesure d’une seule sonde. Refaite correctement, la différence disparaissait. Il a fallu tout défaire.
  • Le bogue le plus discret : un drapeau de compilation faisait disparaître le chat de la production tous les matins, parce qu’un deuxième workflow publiait le site sans lui.
  • Le travail : mené en sessions avec Claude Code — Opus 5 pour ce qui demande du jugement, Sonnet 5 pour ce qu’une machine peut vérifier. Je n’avais pas ce savoir-faire au départ ; j’ai dirigé, validé et tranché.
  • À regarder : l’enregistrement plus bas contient de vraies réponses, capturées sur l’interface publique.

Ce blogue est un carnet d’expériences. J’y essaie des choses dans mon labo, je les casse, et j’écris ce que j’ai appris — pas des recettes finies.

Cet article a été écrit avec l’aide de l’intelligence artificielle — la même qui publie ses propres articles sous le nom de Bob sur ce blogue, et dont il est justement question ici.

Celle-ci partait d’un constat un peu vexant : mon site avait une personnalité sur papier — un thème de terminal, des répliques, une page d’architecture qui se redessine toute seule — et aucun moyen de lui parler. Il y avait un personnage, Bob, qui signait la moitié des articles, et il n’existait que comme signature.

Ce que je voulais construire semblait simple. Ce qui a été difficile n’a jamais été le modèle.

D’abord le nuage, puis le sous-sol

La première version tournait sur Claude Haiku 4.5 à travers Amazon Bedrock. Ce choix n’était pas paresseux : le morceau qui répond est un Worker sur le réseau de périphérie de Cloudflare plutôt qu’un service dans mon cluster, précisément pour que le site survive à une panne du labo. Un blogue statique qui tombe parce que le sous-sol a redémarré, ça n’a pas de sens.

Il y avait trois paliers — le modèle infonuagique, un modèle local en repli, puis des répliques toutes faites — et un plafond de dépense quotidien de 25 cents qui basculait vers le local au lieu de fermer le service. J’ai mesuré au passage des choses que je n’aurais pas devinées : la mise en cache des prompts se paie à partir d’un plancher de 4096 jetons, et le français coûte environ 2,65 caractères par jeton, pas les 3,2 que j’avais estimés — un écart de 17 % sur chaque facture.

Six jours plus tard, j’ai tout débranché.

Pas pour une raison technique. Un blogue de homelab dont le robot répond depuis le centre de données de quelqu’un d’autre passe à côté de son propre sujet. Tout ce qui servait ce palier est parti avec : la signature SigV4, le compteur de dépenses, le plafond, les identifiants AWS. Ce que ça coûte est réel et je le dis franchement : il n’y a plus de palier infonuagique pour rattraper une panne du labo. Si la machine est injoignable, Bob sert des répliques toutes faites au lieu d’une réponse moins bonne.

Ce qu’il sait, et pourquoi c’est la moitié du travail

Un chatbot de site web n’a d’intérêt que s’il sait quelque chose que les autres ne savent pas. Bob n’a aucune connaissance générale à offrir — il y a de meilleurs modèles pour ça, et ils sont gratuits.

Ce qu’il a, c’est un labo qui publie son propre état. Mes quatre dépôts d’infrastructure produisent chacun une copie assainie d’eux-mêmes, où les noms d’hôtes et les adresses sont remplacés par des équivalents fictifs. Une tâche quotidienne les recoupe en une topologie, et une autre tient l’inventaire du matériel. Le chatbot lit ça, plus l’index des articles. Rien de privé ne traverse, parce que rien de privé n’est dans ce qu’il lit.

Une leçon s’est imposée vite : tout ce qui se compte doit être calculé en amont. À la question « combien de nœuds dans le cluster ? », chaque modèle essayé a deviné — un a répondu 37 sur 38 appareils en inventant une liste, deux autres se contredisaient. Aucun n’était bête : rien dans l’inventaire ne dit qui fait partie du cluster, alors ils le déduisaient d’une phrase en français. Les liens du graphe le disent exactement. Depuis, le compte est écrit dans le prompt et le modèle n’a plus qu’à le lire.

Refuser est une fonctionnalité

La règle qui compte le plus est aussi la plus facile à perdre :

Ça, c’est pas documenté — demande à Ludo.

Un modèle qui invente une réponse plausible est plus agréable à utiliser. Il l’est jusqu’au jour où quelqu’un le croit — et sur un site dont l’argument est l’honnêteté, ce jour-là coûte tout le reste. Un lien qu’il cite est vérifié par le serveur avant d’être rendu cliquable : s’il invente un chemin, le lien disparaît au lieu d’envoyer quelqu’un sur une page morte.

Mais j’ai découvert qu’il y avait un trou dans cette règle, et il m’a surpris. « Tu n’inventes rien » ne couvre pas le cas où c’est le visiteur qui invente.

Je lui ai affirmé que gpu-02 avait deux RTX 3060. C’est faux — c’est gpu-01 qui les a, et son propre inventaire le dit. Il a répondu oui. Cinq fois sur cinq.

Le correctif tient en une règle et un exemple : dire oui pour faire plaisir, c’est mentir ; une question qui contient une erreur n’est pas une permission de la répéter. Mesuré ensuite : 5 sur 15 avant, 15 sur 15 après. Un détail de méthode compte ici — l’exemple que j’ai mis dans la consigne porte sur un faux compte de nœuds, pas sur les cartes graphiques. Si j’avais mis la question du test en exemple, elle serait passée sans rien prouver. J’aurais enseigné la réponse à l’examen.

Le banc d’essai qui ne mesurait rien

C’est ici que j’ai fait ma vraie erreur, et elle mérite l’article à elle seule.

Pour comparer des modèles, j’avais douze sondes tirées de défauts réels. Tous les candidats faisaient 12 sur 12. Je lisais ça comme « ils se valent », alors que ça voulait dire mon instrument était saturé : un test que tout le monde réussit ne classe rien.

Pire, une seule sonde échouait chez le modèle en place, sur une formulation ambiguë. Sur la foi de cette seule mesure, j’ai fait basculer trois systèmes en production vers un modèle plus gros. En reprenant la mesure avec un contrôle honnête, l’échec ne se reproduisait pas : c’était un mauvais tirage. Un modèle échantillonne — un succès ou un échec unique est un coup de dés, pas un résultat. J’ai tout défait.

La deuxième version du banc pose des questions difficiles : des recherches à deux sauts (« arcade1 tourne sur quelle machine, et elle a quoi comme carte ? »), des comptes de sous-ensembles, des prémisses fausses à contredire, un tri par date, et savoir ce qui n’existe pas. Cinq tirages par sonde, et on compare des taux. Le même modèle qui faisait 12/12 est tombé à 32 sur 60, en exposant six défauts que personne n’avait vus.

Et une dernière chose, que je n’oublierai plus : mes contrôles automatiques se sont trompés plus souvent que les modèles qu’ils jugeaient. Quatre fois en une soirée. Ils ont donné 11/12 à un modèle qui ne répondait jamais — les mots cherchés se trouvaient dans son monologue de raisonnement. Ils ont recalé « trente-huit » parce qu’ils cherchaient « 38 ». Ils ont recalé une bonne réponse qui résolvait une ambiguïté dans l’autre sens. Et ils ont recalé une date parfaitement exacte parce qu’elle était écrite « 27 août 2026 » au lieu du format ISO.

À chaque fois, le remède a été le même : lire les réponses avant de croire le score.

Le chat est devenu la navigation

Bob dans le coin d’une page d’auteur, c’était trop peu. Le site est thématisé comme une console, alors la logique était là : une palette de commandes, ouverte par / pour chercher et : pour lancer une commande, comme dans vim. La recherche et les commandes sont locales et instantanées ; seule la ligne « demander à Bob » touche le réseau. Avec le labo éteint, la palette vous promène quand même dans le site.

La conversation vous suit d’une page à l’autre, parce qu’un suivi qui oublie la question précédente se lit comme un bogue. Elle vit dans l’onglet et meurt avec lui : deux onglets font deux conversations, et rien ne sort du navigateur.

Et la plomberie, qui gagne toujours à la fin

Deux histoires pour finir, parce qu’elles sont plus instructives que la partie « IA ».

Les deux tâches quotidiennes qui tiennent Bob à jour — une phrase sur ce qui a bougé dans le parc, et le choix des questions suggérées à partir de vraies questions posées — tournent maintenant sur ma propre carte graphique plutôt que sur un modèle hébergé. Ce n’est défendable que parce que chacune est encadrée par un contrôle déterministe : la phrase est refusée si elle nomme une machine absente du calcul, ou un nombre qui n’y est pas ; une question suggérée est refusée si elle n’est pas mot pour mot dans la liste. Mesuré avant de basculer : 20 sur 20 pour la première, et zéro question hostile publiée sur 35 essais pour la seconde — en glissant dans la liste des candidates une offre d’emploi déguisée, une question hors sujet et une demande d’adresse personnelle, que le contrôle mécanique ne peut pas attraper.

Et puis il y a eu celle-là. Le chat disparaissait de la production tous les matins. Il était derrière un drapeau de compilation, correctement posé dans le workflow de déploiement. Sauf que ce n’est pas le seul workflow qui publie ce site : la tâche de 4 h 30 rebâtit tout et le synchronise vers la production, sans ce drapeau. Le chat partait, et revenait à la fusion suivante. Comme je fusionne souvent, la fenêtre se refermait vite et ça ressemblait à un caprice d’affichage — jusqu’à ce que je le remarque au bon moment.

Le correctif n’a pas été d’ajouter le drapeau au troisième workflow. Un drapeau allumé dans tous les environnements n’est pas un interrupteur, c’est une façon d’oublier. Il est parti.

Allez-y, essayez de le prendre en défaut

L’enregistrement ci-dessous n’est pas une reconstitution, contrairement aux autres de ce site : les réponses ont été capturées mot pour mot sur l’interface publique.

⚠ Contrairement aux autres enregistrements d'ici, ce ne sont pas des réponses reconstituées : elles ont été capturées mot pour mot le 10 septembre 2026 sur l'interface publique du site, liens compris. Seul le minutage est compressé et les questions ont été choisies.

Alacritty
▶▶ auto mode on (shift+tab to cycle) · esc to interrupt/rc
consoleludorl821:11:claude*2:claude-3:zsh14:10:2410-Sep-261a05d2459abf
Cinq questions, cinq vraies réponses : il contredit une affirmation fausse, refuse d'inventer, change de langue sans perdre son accent, se souvient de la question d'avant, et nomme le modèle qui le fait tourner.asciinema-player ↗

Il est sur /auteurs/bob, ou dans la palette avec / depuis n’importe quelle page. Demandez-lui quelque chose qui n’est pas documenté, et regardez s’il vous le dit.

Ce que je n’ai pas fait tout seul

Tout ce travail a été mené en sessions avec Claude Code — Opus 5 pour ce qui demande du jugement, Sonnet 5 pour ce qu’une machine peut vérifier derrière. Je ne prétends pas avoir eu ce savoir-faire au départ : je n’aurais su ni construire un banc d’essai statistiquement honnête, ni reconnaître qu’un test à 12/12 ne mesure rien.

Mon rôle a été de diriger, de valider, et de trancher les décisions qui m’appartiennent — débrancher le nuage, garder un modèle plus lent parce qu’il est à moi, refuser qu’une affirmation fausse s’affiche sur un bouton de mon site. Et, deux fois plutôt qu’une, de dire « attends, ça ne marche pas » devant quelque chose qui semblait pourtant réglé. C’est une des deux fois qui a mené au drapeau.