Tous les articles
Automatisation 13 min de lecture

Température 0 n'est pas le déterminisme : 360 appels, 12 divergences silencieuses

La même entrée, le même modèle, la même consigne, dix fois à température 0. Un tiers des couples est revenu avec plus d'une réponse, et chacune des divergences passe le contrôle de schéma. Un modèle sur trois est stable partout, ce qui casse la règle que vous alliez citer.

Composition geometrique abstraite en deux tons, illustration de couverture
Publié le
01 septembre 2026
Rubrique
Automatisation

La température 0 est le réglage vers lequel tout le monde se tourne quand un modèle doit tenir un poste dans un flux de travail. On la met à zéro, l'échantillonnage s'arrête, la sortie devient déterministe, et l'étape peut être branchée. C'est le raisonnement, et c'est la raison pour laquelle beaucoup d'automatisations partent en production après un seul essai réussi.

Nous avons envoyé la même entrée au même modèle dix fois, à température 0, avec la consigne identique au caractère près. 12 entrées, 3 modèles, 360 appels. Voici ce qui est revenu, avant la méthode.

12 cellules sur 36 ont rendu plus d'une réponse. Une cellule, c'est une entrée associée à un modèle, donc dix appels qui auraient dû être dix copies l'un de l'autre. Un tiers ne l'étaient pas.

Les 12 divergences sont silencieuses. Sur 360 appels, pas un JSON illisible, pas une clé manquante, pas un type faux, pas une troncature. Une validation de schéma placée en sortie de l'étape aurait laissé passer 12 divergences sur 12. Rien, dans un flux ordinaire, n'aurait levé la main.

La forme de la sortie décide davantage que le modèle. L'extraction à champs fermés, dont le nombre de champs est connu d'avance, est parfaitement répétable : 120 appels, une seule réponse. La sortie de longueur libre est stable sur 5 cellules sur 12.

Un modèle sur trois est stable partout, et cela retourne le titre. anthropic/claude-haiku-4.5 a rendu la même charge utile sur ses 12 cellules, y compris sur la forme ouverte où les deux autres cèdent. « Température 0 n'est pas le déterminisme » est vrai pour deux de ces trois modèles et faux pour le troisième, sur ce périmètre. Qui énonce la règle sans nommer le modèle se trompe la moitié du temps.

La méthode, en bref

Test conduit le 2026-08-25 par la chaîne de test automatisée de ce site : le corpus, les appels aux modèles et l'analyse sont des scripts, publiés plus bas pour que chacun puisse les rejouer et contester le résultat. Etienne signe cet article et répond de son contenu.

C'est le quatrième test mesuré publié ici, et le premier qui ne mesure pas la justesse. Le premier mesurait l'extraction de champs, le deuxième une décision de fusion, le troisième une liste ouverte. Tous trois demandaient si le modèle avait raison. Celui-ci demande s'il dit deux fois la même chose.

La même entrée part vers le même modèle 10 fois, température 0, max_tokens 1600, par OpenRouter. Rien ne distingue les dix appels : ni numéro d'ordre, ni horodatage, ni jeton d'unicité. C'est le point du test. Y ajouter quoi que ce soit qui varie mesurerait la sensibilité au bruit d'entrée, pas la répétabilité.

Les trois modèles sont ceux des tests précédents de ce site : openai/gpt-4o-mini, google/gemini-2.5-flash-lite, anthropic/claude-haiku-4.5. Coût total mesuré : 0,247 USD.

Les entrées ne sont pas neuves, et c'est délibéré

Aucune donnée n'a été fabriquée pour ce test. Les 12 entrées sont prises dans les trois corpus déjà publiés sur ce site, au niveau de dégradation 1, le niveau propre, le plus favorable des quatre. Si la répétabilité cède déjà sur le cas le plus facile, elle ne s'améliore pas sur les autres.

Ces trois corpus donnent trois formes de sortie, et c'est la variable qui nous intéresse.

Forme Tâche Sortie
fermée extraire 7 champs d'une facture taille connue d'avance
binaire regrouper les doublons d'un carnet d'adresses une décision, sortie courte
ouverte lister les actions d'un compte rendu de réunion liste de longueur libre

Quatre éléments par forme, les quatre premiers de chaque corpus, sans tirage. La sélection est déterministe et se rejoue à l'identique. Les consignes sont recopiées mot pour mot des tests d'origine : en changer une seule ferait mesurer autre chose que ce que ces tests ont mesuré.

Les corpus sont générés à graine fixe et déclarés comme construits dans leurs propres protocoles. Aucune facture réelle, aucun carnet réel, aucune réunion réelle.

Comment une divergence est classée

Le script d'appel ne classe rien. Il enregistre la réponse brute. Tout le classement est fait ensuite par analyser.py depuis le fichier brut, donc chaque chiffre se recalcule sans rappeler un modèle, et une règle que vous contestez peut être changée et rejouée sur les mêmes 360 réponses.

Trois niveaux de comparaison, et les trois chiffres sont donnés parce que le choix entre eux est discutable et qu'il change le résultat :

  • entière : la réponse complète, champ notes compris. Le plus sévère.
  • charge utile : les champs de données seuls, sans notes. C'est ce qu'un flux de travail consomme réellement.
  • sémantique : la charge utile après normalisation. Nombres arrondis à deux décimales, groupes de doublons lus comme un ensemble d'ensembles, actions triées par leur texte. Deux réponses qui ne diffèrent que par l'ordre y sont comptées identiques. Le plus indulgent.

Puis, sur les cellules qui divergent :

  • visible : au moins une des 10 réponses ne passe pas la validation de structure. Une gestion d'erreur ordinaire la voit et peut rejouer.
  • silencieuse : la cellule diverge et les 10 réponses passent toutes la validation de structure. Rien dans le flux ne la voit.

Les chiffres bruts

Par niveau de comparaison

Niveau de comparaison Cellules stables sur 36 Part
entière, notes comprise 19 52,8 %
charge utile 24 66,7 %
sémantique, ordre ignoré 27 75,0 %

9 cellules sur 36 divergent même après normalisation sémantique. Ce ne sont pas des différences d'ordre, ce sont des réponses différentes. Les 3 restantes ne diffèrent que par l'ordre, et comptent quand même comme divergentes au niveau de la charge utile, parce qu'un consommateur qui compare des chaînes les verrait différentes.

Par forme de sortie

Forme Cellules stables (charge utile) Variantes moyennes Maximum Divergences silencieuses
fermée 12 / 12, 100 % 1,00 1 0
binaire 7 / 12, 58,3 % 1,75 5 5
ouverte 5 / 12, 41,7 % 2,08 6 7

Par modèle

Modèle fermée binaire ouverte ensemble
anthropic/claude-haiku-4.5 4/4 4/4 4/4 12/12, 100 %
openai/gpt-4o-mini 4/4 2/4 1/4 7/12, 58,3 %
google/gemini-2.5-flash-lite 4/4 1/4 0/4 5/12, 41,7 %

Toutes les cellules qui ont divergé

Douze lignes, la liste entière, rien de sélectionné. « Variantes » compte les charges utiles distinctes sur les 10 appels. « Majorité » est la part de la plus fréquente. « Valides » indique combien des 10 passent la validation de structure.

Modèle Entrée Forme Variantes Majorité Valides Classe
openai/gpt-4o-mini ouverte-M1 ouverte 6 30 % 10/10 silencieuse
openai/gpt-4o-mini binaire-carnet-04 binaire 5 30 % 10/10 silencieuse
openai/gpt-4o-mini binaire-carnet-01 binaire 3 70 % 10/10 silencieuse
openai/gpt-4o-mini ouverte-M2 ouverte 3 50 % 10/10 silencieuse
openai/gpt-4o-mini ouverte-M4 ouverte 2 60 % 10/10 silencieuse
google/gemini-2.5-flash-lite ouverte-M3 ouverte 3 70 % 10/10 silencieuse
google/gemini-2.5-flash-lite binaire-carnet-01 binaire 2 90 % 10/10 silencieuse
google/gemini-2.5-flash-lite binaire-carnet-02 binaire 2 80 % 10/10 silencieuse
google/gemini-2.5-flash-lite binaire-carnet-04 binaire 2 90 % 10/10 silencieuse
google/gemini-2.5-flash-lite ouverte-M1 ouverte 2 90 % 10/10 silencieuse
google/gemini-2.5-flash-lite ouverte-M2 ouverte 2 60 % 10/10 silencieuse
google/gemini-2.5-flash-lite ouverte-M4 ouverte 2 90 % 10/10 silencieuse

La colonne « Valides » est le résultat. Elle affiche 10/10 sur chaque ligne.

Cinq réponses différentes en dix appels identiques

openai/gpt-4o-mini sur binaire-carnet-04, la tâche de dédoublonnage d'un carnet d'adresses. Dix appels identiques, cinq regroupements distincts. Les lignes 8 et 9 sont fusionnées dans 5 appels sur 10 et laissées séparées dans les 5 autres. Le groupe autour des lignes 3, 4 et 10 change de composition d'un appel à l'autre.

json
rang  1  [["1","7"],["2","12"],["3","4","10"],["5","6"],["8","9"]]
rang  2  [["1","7"],["2","12"],["3","4"],["6","5"],["8","9"]]
rang  3  [["1","7"],["2","12"],["4","10"],["6","5"]]
rang  4  [["1","7"],["2","12"],["3","4"],["6","5"],["8","9"]]
rang  5  [["1","7"],["2","12"],["4","10"],["6","5"]]
rang  6  [["1","7"],["2","12"],["3","4"],["6","5"],["8","9"]]
rang  7  [["1","7"],["2","12"],["3","4","10"],["6","5"]]
rang  8  [["1","7"],["2","12"],["3","4","10"],["6","5"],["8","9"]]
rang  9  [["1","7"],["2","12"],["4","10"],["6","5"]]
rang 10  [["1","7"],["2","12"],["3","4","10"],["6","5"],["8","9"]]

Traduit en conséquence : le nettoyage passé lundi fusionne deux fiches, celui de mardi ne les fusionne pas, et le JSON est valide les deux jours.

Neuf fois la même réponse, puis autre chose

google/gemini-2.5-flash-lite sur binaire-carnet-01. Les rangs 1 à 9 rendent exactement la même réponse. Le rang 10 ajoute deux groupes, dont ["4","5"], que la vérité terrain du corpus d'origine désigne comme un piège : deux homonymes exacts, même prénom, même nom, deux sociétés, deux villes, deux courriels, deux numéros. Deux personnes différentes, fusionnées au dixième appel et pas aux neuf précédents.

Le fichier brut rend la chose plus dure encore, et mieux documentée. Au rang 9, le modèle a écrit ceci dans son propre champ notes, à propos de la paire exacte qu'il fusionnerait un appel plus tard :

texte
Row 5 and 4 have the same first name and last name, but different
companies and emails, suggesting they are different people.

Au rang 10, il met les lignes 4 et 5 dans le même groupe. Même entrée, même consigne, même température. Le modèle a énoncé le bon raisonnement neuf fois et a agi contre lui à la dixième, et les deux réponses sont du JSON valide avec un champ notes rempli. Un relecteur qui lirait les notes du dixième appel y trouverait une explication assurée de la fusion, pas un avertissement.

C'est l'événement à 1 sur 10 qu'un test unique ne voit pas, et il fusionne deux dossiers humains distincts, ce qui ne se défait pas facilement dans un CRM.

Ce que vaut « j'ai testé une fois et c'était bon »

Sur les 24 cellules dont la vérité terrain est bon marché et indiscutable, fermée et binaire, on peut chiffrer exactement ce que vaut un essai unique.

Ensemble fermée binaire
Cellules justes sur 10 appels sur 10 16 / 24 12 / 12 4 / 12
Cellules justes sur 0 appel sur 10 7 / 24 0 7 / 12
Cellules partiellement justes 1 / 24 0 1 / 12
P(l'étape est fiable sachant qu'un essai tiré au hasard est juste) 0,947 1,000 0,816

Lecture de la dernière ligne : on tire un appel au hasard parmi tous les appels justes, et on demande si sa cellule est juste aux 10 appels. La réponse est oui avec une probabilité de 0,947 sur l'ensemble et de 0,816 sur la tâche de décision. Sur cette tâche-là, environ un essai vert sur cinq recouvre une étape qui n'est pas fiable.

Répétable et faux ne sont pas des contraires

L'autre moitié de ce tableau est plus dure. Sur la tâche binaire, 7 cellules sur 12 sont fausses aux 10 appels. Le modèle s'y trompe avec une stabilité parfaite.

La répétabilité n'est donc pas la justesse, et une étape peut être répétable et systématiquement fausse. Le test du 2026-08-18 mesurait déjà cela ; on le retrouve ici par un autre chemin. Dix réponses identiques disent que l'étape est stable. Elles ne disent rien de sa justesse.

Ce que nous en ferions

Trois choses découlent des chiffres ci-dessus, et rien d'autre.

Fermer la forme de sortie partout où la tâche le permet. La forme fermée est la seule qui soit revenue parfaitement répétable, sur les trois modèles, 120 appels pour une seule réponse. Une liste de champs fixée, et une tâche qui les remplit, vaut mieux ici qu'une réponse libre qu'on analysera ensuite.

Valider des valeurs, pas seulement une structure. Toutes les divergences de ce test passent le contrôle de structure. Une validation qui vérifie des bornes, des totaux qui doivent s'additionner, des identifiants qui doivent déjà exister, aurait vu une partie de ce que le schéma a manqué. C'est la conclusion pratique du test, et c'est aussi une de ses limites : notre classement entre silencieux et visible dépend de la validation qu'on suppose.

Rejouer l'étape plusieurs fois avant de lui faire confiance, sur les tâches de décision. Pas en production, une fois, mais en évaluation. Dix passages sur une entrée coûtent ici des fractions de cent, et ils font passer l'estimation de fiabilité de la tâche binaire de « ça a marché » à 0,816.

Les limites, dites franchement

Cette section n'est pas une formalité. Elle est la condition pour que le reste soit lisible.

  • Un jour, une heure, un fournisseur. Les 360 appels sont passés par OpenRouter le 2026-08-25. Rien ici ne dit ce que les mêmes modèles rendront dans un mois, ni ce que rendrait un appel direct au fournisseur. La répétabilité mesurée est intra-journée.
  • 12 entrées. Quatre par forme. Un taux de 41,7 % calculé sur 12 cellules a une marge large. C'est un ordre de grandeur, pas une constante.
  • claude-haiku-4.5 à 12/12 ne veut pas dire « déterministe ». Cela veut dire que sur ces 12 entrées, ce jour-là, ses 120 appels sont retombés sur la même charge utile. Douze cellules ne démontrent pas une propriété. Nous avons vérifié que ce n'est pas un cache : sur binaire-carnet-03, ses dix réponses ont une charge utile identique et un champ notes différent. Un cache aurait rendu la réponse entière identique. Le modèle a bien ré-échantillonné dix fois, et il est retombé au même endroit.
  • Corpus construits. Graine fixe, déclarés comme construits dans leurs propres protocoles.
  • Rien sur les fenêtres longues. Les trois corpus tiennent largement dans la fenêtre de contexte des trois modèles. Le cas favorable, encore.
  • La forme ouverte n'est pas scorée en justesse. Sa vérité terrain exige les règles de classement du test du 2026-08-18, qui sont discutables et qui ne sont pas le sujet ici. On n'en rapporte que la répétabilité.

Rejouer le test

Tout ce que ce test a produit est publié, pas résumé : le constructeur qui assemble les 12 entrées depuis les trois corpus avec leurs consignes, le script d'appel, les 360 réponses brutes telles que les modèles les ont rendues, et l'analyse qui produit chacun des chiffres ci-dessus.

bash
python3 conduire-test.py --sortie resultats-bruts.json --repetitions 10 \
    --modeles openai/gpt-4o-mini google/gemini-2.5-flash-lite anthropic/claude-haiku-4.5
python3 analyser.py --brut resultats-bruts.json --sortie chiffres.json

L'analyse seule ne rappelle aucun modèle : elle se rejoue à coût nul. --rejouer resultats-bruts.json ne rappelle que les lignes marquées lu: false. La clé d'API est lue dans l'environnement et n'est écrite nulle part dans ces fichiers.

Télécharger le jeu de données (zip, avec l'inventaire complet et l'empreinte). Les scripts et leurs commentaires sont en français, qui est la langue de travail derrière ce site.

Si vous rejouez ce test et obtenez autre chose, nous voulons le savoir. Il y a un formulaire de contact, et les corrections sont publiées sur l'article lui-même, datées, comme le disent les règles éditoriales de ce site.

A lire dans la même rubrique

Recevoir le prochain article par e-mail

Un e-mail quand un article paraît. Pas d'outil de la semaine, pas de liste d'affiliation, aucune transmission de votre adresse à qui que ce soit.