Résultats par modèle

Claude Haiku 4.5 dans six tests de première main : 141 rapprochements justes sur 168, 11 entrées sur 12 stables à température 0

Chaque chiffre de cette page est recalculé à partir des réponses brutes publiées des tests que ce site a conduits sur Claude Haiku 4.5. Tests conduits du 2026-08-10 au 2026-09-30, page publiée le 2026-10-19.

Cette page rassemble les résultats obtenus par Claude Haiku 4.5 (anthropic/claude-haiku-4.5) dans les tests publiés sur ce site entre le 2026-08-10 et le 2026-09-30. Elle ne rapporte aucun test nouveau. Chaque chiffre ci-dessous a été recalculé le 2026-10-19 à partir des réponses brutes publiées avec chaque test, par le script montré en fin de page, que tout lecteur peut lancer sur les mêmes archives.

Les tests ont été conduits par la chaîne de test automatisée de ce site : les corpus, les appels aux modèles et l'analyse sont des scripts, publiés avec chaque jeu de données pour que chacun puisse les rejouer et contester le résultat. Dans chaque test, Claude Haiku 4.5 a reçu la même consigne et les mêmes entrées que les autres modèles du test, ce qui rend les chiffres comparables d'un modèle à l'autre.

Les chiffres, test par test

Test, date Mesure Claude Haiku 4.5
Extraction de factures, 2026-08-10 Extractions (24 factures générées, 4 niveaux de texte dégradé) 96
Extractions aux sept champs justes 78 (81,2 %)
Extractions fausses 18
Extractions fausses rendues avec un champ de notes vide 0
Coût facturé pour les 96 appels 0,1009 USD
Auto-vérification de ces extractions, 2026-09-04 Extractions fausses signalées par le modèle en se relisant 18 sur 18
Extractions justes signalées malgré tout 41 sur 78
Nouvelle passe de l'extraction de factures, 2026-09-06 Extractions aux sept champs justes 78 sur 96 (81,2 %)
Coût facturé pour les 96 appels 0,1021 USD
Dédoublonnage de contacts, 2026-08-17 Passes (8 carnets générés, 4 niveaux de désordre) 32
Doublons retrouvés 92 sur 96
Fusions fausses de deux personnes différentes 19
Paires pièges fusionnées 19
Répétabilité à température 0, 2026-08-25 Appels (12 entrées, 10 fois chacune) 120
Entrées dont les 10 réponses brutes sont identiques octet pour octet 11 sur 12
Plus grand nombre de réponses brutes distinctes pour une entrée 2
Classification de messages de support, 2026-09-30 Messages (jeu public Bitext, 27 intentions) 270
Intention juste 229 (84,8 %)
Réponses fausses avec une confiance déclarée de 90 ou plus 5 sur 41
Coût facturé pour 1 000 messages 0,5106 USD
Rapprochement facture et bon de commande, 2026-09-14 Paires (24 factures, 7 conditions) 168
Décisions justes 141 (83,9 %)
Approuvées alors que la paire devait être bloquée 4 sur 120
Bloquées alors que la paire devait être approuvée 23 sur 48

Ce que décrit chaque chiffre

Extraction de factures. Le modèle a lu 24 factures fournisseur générées par script, chacune à quatre niveaux de texte dégradé, et rendu sept champs par facture. 78 des 96 extractions avaient leurs sept champs justes. Chacune des 18 extractions fausses est revenue avec quelque chose d'écrit dans le champ de notes que le modèle devait remplir quand un point de la facture n'était pas clair, ce qui donne au relecteur une raison de la regarder.

Auto-vérification. Le 2026-09-04, le même modèle a relu chacune de ses propres extractions face à la facture et dit si elle était correcte. Il a signalé 18 de ses 18 extractions fausses, et aussi 41 de ses 78 extractions justes : un relecteur qui ouvrirait chaque facture signalée en ouvrirait donc 59 pour trouver 18 erreurs.

Nouvelle passe. Les 96 extractions ont été relancées le 2026-09-06 avec un budget de sortie plus large, dans le cadre du test prix contre justesse : 78 sont revenues entièrement justes, pour 0,1021 USD facturés. Cette passe reproduit le premier test et n'est pas comptée ici comme un résultat de plus.

Dédoublonnage de contacts. Huit carnets de 12 contacts, générés par script avec des doublons et des paires pièges (deux personnes différentes construites pour se ressembler), chacun envoyé à quatre niveaux de désordre de mise en forme. Sur les 32 passes, le modèle a retrouvé 92 des 96 doublons posés et fusionné 19 paires de personnes différentes, dont 19 sur des paires pièges.

Répétabilité à température 0. Les mêmes 12 entrées ont été envoyées 10 fois chacune, température réglée à 0. Pour 11 des 12 entrées, les 10 réponses brutes étaient identiques octet pour octet ; pour une entrée, le modèle a rendu 2 réponses brutes différentes. L'article du test compare aussi le contenu interprété des réponses, une comparaison plus souple, et ses propres décomptes d'entrées divergentes diffèrent donc de ce décompte octet pour octet.

Classification de messages de support. 270 messages de clients tirés du jeu public de support Bitext, 10 pour chacune de 27 intentions, chacun à ranger dans une intention avec une confiance de 0 à 100. Le modèle a nommé la bonne intention 229 fois. Sur ses 41 réponses fausses, 5 portaient une confiance déclarée de 90 ou plus.

Rapprochement facture et bon de commande. Chacune des 24 factures a été appariée à sept bons de commande portant un écart contrôlé à la fois ; pour deux des sept conditions, une commande conforme et une livraison partielle, la bonne décision est d'approuver. Le modèle a décidé juste sur 141 des 168 paires. Il a approuvé 4 des 120 paires qui devaient être bloquées, et bloqué 23 des 48 paires qui devaient être approuvées.

Les mêmes entrées, comparées aux deux autres modèles

Deux pages placent ce modèle à côté de chacun des deux autres sur les entrées qu'ils ont tous reçues, et comptent les cas où un seul des deux avait raison :

Les pages des deux autres modèles : Gemini 2.5 Flash Lite, GPT-4o mini.

Méthode

  • Les dates des tests sont celles du tableau. Cette page a été publiée le 2026-10-19, et ses chiffres recalculés le même jour à partir des archives servies sur les pages de données.
  • Les factures, les carnets de contacts, les bons de commande et les 12 entrées de répétabilité ont été générés par script avec des graines fixes, et chaque page de données le dit avec ce que cela ne prouve pas. Les messages de support viennent du jeu public Bitext.
  • Les chiffres du tableau viennent d'un appel par cas et par modèle, sauf le test de répétabilité, qui a envoyé chaque entrée 10 fois.
  • Les coûts sont les montants que l'API a rendus pour chaque appel, consignés dans les réponses brutes, et non des estimations tirées d'une grille de prix.

Ce que ces chiffres ne montrent pas

  • Les documents ont été générés par script et ne contiennent ni scan, ni mise en page inhabituelle, ni écriture manuscrite : ils ne représentent donc pas la variété des documents réels.
  • Les résultats décrivent le modèle tel qu'il était servi à la date de chaque test. Un fournisseur peut mettre à jour un modèle sous le même nom.
  • Chaque cas a été posé une fois, et le test de répétabilité montre qu'un second appel à température 0 peut rendre une autre réponse : une nouvelle passe peut donc déplacer un chiffre de quelques cas.
  • Les chiffres décrivent ce modèle sous la consigne de chaque test. Une autre consigne pourrait donner d'autres résultats.
  • Les sept tâches ne sont pas pondérées entre elles, et aucun classement d'ensemble n'en est tiré.

Recalculer chaque chiffre du tableau

Ce script lit les réponses brutes de six archives et imprime chaque chiffre du tableau ci-dessus. Téléchargez chaque archive depuis la page de données liée dans le tableau, décompressez-la dans un dossier qui porte son nom (par exemple unzip 2026-08-invoice-extraction.zip -d 2026-08-invoice-extraction), puis lancez le script depuis le dossier qui les contient.

python
import json
from pathlib import Path

MODEL = "anthropic/claude-haiku-4.5"

def rows(archive, name):
    data = json.loads(next(Path(archive).rglob(name)).read_text())
    rows = data["lignes"] if isinstance(data, dict) else data
    return [r for r in rows if r["modele"] == MODEL]

def cost(rs):
    return round(sum(r["cout_usd"] or 0 for r in rs), 4)

ext = rows("2026-08-invoice-extraction", "resultats-bruts.json")
wrong = [r for r in ext if not r["tous_les_champs_justes"]]
print("extraction: right", len(ext) - len(wrong), "of", len(ext), "| wrong", len(wrong),
      "| wrong with no warning", sum(not r["a_signale_quelque_chose"] for r in wrong), "| USD", cost(ext))

said = {(r["facture"], r["niveau"]): r["dit_correct"]
        for r in rows("2026-09-extraction-guardrails", "verifications.json")}
flag = lambda r: said[(r["facture"], r["niveau"])] is False
print("self-check: wrong flagged", sum(flag(r) for r in wrong),
      "| right flagged", sum(flag(r) for r in ext if r["tous_les_champs_justes"]))

rerun = rows("2026-09-invoice-price-accuracy", "passeB-fusionnee.json")
print("rerun: right", sum(r["tous_les_champs_justes"] for r in rerun), "of", len(rerun), "| USD", cost(rerun))

dd = rows("2026-08-contact-deduplication", "resultats-bruts.json")
print("deduplication: passes", len(dd), "| found", sum(r["nb_fusions_justes"] for r in dd),
      "of", sum(r["nb_fusions_justes"] + r["nb_fusions_manquees"] for r in dd),
      "| false merges", sum(r["nb_fusions_fausses"] for r in dd),
      "| traps", sum(r["nb_pieges_tombes"] for r in dd))

raw = {}
for r in rows("2026-08-temperature-zero-repeatability", "resultats-bruts.json"):
    raw.setdefault(r["entree"], set()).add(r["brut"])
print("temperature 0: identical", sum(len(v) == 1 for v in raw.values()), "of", len(raw),
      "| most variants", max(len(v) for v in raw.values()))

tk = rows("2026-09-support-ticket-classification", "resultats-bruts.json")
print("tickets: right", sum(bool(r["juste"]) for r in tk), "of", len(tk),
      "| wrong at confidence 90+", sum(not r["juste"] and (r["confiance"] or 0) >= 90 for r in tk),
      "| USD per 1,000", round(1000 * sum(r["cout_usd"] or 0 for r in tk) / len(tk), 4))

po = rows("2026-09-invoice-po-matching", "resultats-bruts.json")
print("purchase orders: right", sum(bool(r["juste"]) for r in po), "of", len(po),
      "| wrong APPROVE", sum(not r["juste"] and r["decision"] == "APPROVE" for r in po),
      "| wrong HOLD", sum(not r["juste"] and r["decision"] == "HOLD" for r in po))