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.
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.
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.
Construire une chaîne qui marche est la partie facile. Construire une chaîne dont les pannes se voient est le vrai travail, car un modèle au milieu d'un flux ne s'arrête pas quand il est perdu.