Votre moteur trouve-t-il vraiment ? Mesurer la pertinence sans corpus de référence
En partie seulement. Sans corpus de référence, quatre mesures disent où un moteur est fragile, pas s'il classe bien ; pour le savoir, il faut juger ensuite, et un jugement se discute. Notre propre banc le montre : pour « chemise de coton », il note une précision de 3 sur 3. Les quatorze chemises suivantes portent le même nom au numéro près, et le même score, 38,0. Départagés dans l'autre sens, ces scores donneraient 0 sur 3.
Un chiffre de pertinence résulte de trois choix
Précision, rappel, MAP, nDCG : les définitions sont partout. Ce qu'un chiffre publié donne rarement, ce sont les trois choix qui le produisent : le catalogue, les requêtes, et qui a décidé des bonnes réponses. Voici les nôtres.
| Corpus visserie | Corpus mode | |
|---|---|---|
| fiches | 12 | 134 |
| pack de règles | outillage | mode |
| requêtes | 10, dont 9 avec des bonnes réponses | 10, dont 9 avec des bonnes réponses |
| résultats lus par requête | les 10 premiers | les 60 premiers |
| d'où viennent les fiches | 8 vis, écrous et rondelles à fiche courte, face à 4 coffrets et forets dont la description, reprise de vrais produits, répète « x », « mm », « embouts » | 5 fiches et 4 requêtes relevées telles quelles en production, 129 fiches écrites pour placer certains mots à une fréquence voulue |
Les bonnes réponses sont une liste écrite à la main, dans le code du banc, une fois, en regardant le catalogue. Le critère écrit à côté est « ce qu'un acheteur considérerait comme une réponse correcte ». Il n'y a pas de note graduée : un produit est pertinent ou il ne l'est pas.
La référence, elle, n'est pas un jugement. C'est une photographie du moteur, l'ordre et les scores, refigée le 15 septembre 2026 après les deux corrections décrites plus bas. Elle dit si le classement a bougé. Seules les listes de bonnes réponses disent s'il a bougé dans le bon sens.
Première limite : ces bonnes réponses ont été écrites par ceux qui écrivent le moteur. Elles ont été proposées au fil de sessions de travail avec Claude, un assistant de programmation, et relues par moi, Alexis Flahaut, qui règle aussi le moteur. Le juge et la partie sont les mêmes. Les deux corpus ont en outre été construits pour reproduire des défauts que nous voulions corriger. Ce banc sert à ne pas régresser ; il ne sert pas à nous comparer à un autre moteur.
Deuxième limite, trouvée en écrivant cet article : le banc annonçait un garde qu'il n'avait pas. Son corpus mode affirmait que le banc refuse toute requête dont les bonnes réponses portent toutes le mot cherché dans leur nom, et qu'il réimprime à chaque lancement la fréquence des mots du corpus. Aucune version du banc n'a jamais fait l'un ou l'autre. Les fréquences écrites avaient d'ailleurs divergé : « coton » était annoncé à 64 ou 65 %, il est à 61 %. C'est la famille décrite dans les tests qui ne peuvent pas échouer, logée dans l'instrument qui sert à mesurer.
Ce qu'il rend le 15 septembre 2026
Moteur du 14 septembre, 18 requêtes jugées. Le banc calcule lui-même le rang de la première bonne réponse et la précision sur les trois premiers ; le rappel, la MAP et le nDCG ont été recalculés pour cet article, sur les mêmes listes.
| Mesure | Corpus visserie | Corpus mode |
|---|---|---|
| première bonne réponse au rang 1 | 8 requêtes sur 9 | 9 sur 9 |
| précision sur les 3 premiers, moyenne | 0,74 | 0,85 |
| rappel dans les résultats lus | 1,00 (10 premiers) | 0,91 (60 premiers) |
| MAP | 0,90 | 0,76 |
| nDCG sur les 10 premiers, jugement binaire | 0,94 | 0,80 |
Le chiffre ne varie pas. Nous avons lancé la mesure 27 fois : trois fois à la suite, avec un hachage Python différent à chaque processus, puis 24 fois par paquets de huit exécutions simultanées, pendant que six autres processus occupaient les processeurs. Les 27 photographies sont identiques entre elles, au score près, et identiques à la référence refigée le 15 septembre. La durée, elle, a varié : de 150 à 258 ms pour le corpus visserie, de 149 à 234 ms pour le corpus mode, sur les 24 lancements simultanés.
Cette stabilité porte sur un catalogue qui ne change pas pendant la mesure. Elle ne dit rien d'un catalogue réindexé entre deux recherches.
Ce que chaque mesure a caché, sur nos propres requêtes
La précision mesure l'ordre des identifiants quand les scores sont égaux. À score égal, le moteur départage par le stock, puis par l'identifiant. Sur « chemise de coton », dix-sept fiches sont à 38,0 ; les trois jugées pertinentes ont les trois plus petits identifiants. Précision 3/3. Les mêmes scores, départagés dans l'autre sens, donneraient 0/3. Sur « vsi inox », cinq produits sont à 12,0, et un écrou et une rondelle passent devant trois vis parce que E et R précèdent V : 1/3, qui deviendrait 3/3. Sur tout le corpus mode, la précision moyenne vaut 0,85 ; sans changer un score, elle irait de 0,52 à 0,85 selon le départage. Le moteur tombe ici sur la valeur la plus haute, parce que les bonnes réponses ont les plus petits identifiants.
Ce n'est pas un cas rare. Dans les 10 premiers résultats, 64 % des positions du corpus visserie et 88 % de celles du corpus mode partagent leur score avec un autre résultat.
La précision ignore ce qui manque. « chemise de coton » a cinq bonnes réponses. Deux d'entre elles, une blouse et un chemisier en coton, ne sont pas dans les 60 premiers résultats. La précision vaut toujours 3/3. Et elle ne peut pas atteindre 3/3 quand il n'existe que deux bonnes réponses : « embouts 25mm » plafonne à 2/3, quel que soit le moteur.
Le rappel ignore l'ordre, et le rang de la première bonne réponse ignore les suivantes. « pull de laine » : la première bonne réponse est au rang 1, et les quatre sont trouvées, rappel 1,00. Les trois autres, un gilet, un cardigan et un snood en laine dont le nom ne dit pas « laine », sont aux rangs 37, 38 et 39, derrière six écharpes et des pulls de maille. Deux mesures parfaites, et un nDCG sur les 10 premiers à 0,39.
Le nDCG suppose qu'on sait noter, et un jugement se conteste. Notre banc note en binaire, et même ainsi deux paires de requêtes voisines étaient jugées sur deux règles jusqu'au 15 septembre. Pour « vis inox M8 », un boulon zingué n'était pas une bonne réponse, faute d'inox. Pour « vis inox 20 », le même boulon zingué en était une : le même produit, deux verdicts. Le moteur le classe 8e, et le banc retenait ce rang 8 comme le pire de la requête. Nous avons corrigé la liste : le pire rang est tombé à 2 et le nDCG de la requête est passé de 0,91 à 1,00, sans qu'une ligne du moteur change. C'était une faute de la référence, et c'est ce que valait ce chiffre.
La seconde paire est dans le corpus mode. « apois écru » ignorait le mot « apois », qui n'existe pas au catalogue, et comptait les trois produits écrus. « apois laine » le lisait comme « à pois » et ne retenait que deux des quatorze fiches qui déclarent de la laine. Jugée sur la règle de ses voisines, elle en retient quatorze ; le moteur en rend quatorze, et sa précision passe de 1/3 à 3/3.
Le banc a affiché la première correction comme une amélioration, et la seconde comme une régression, parce que quatorze bonnes réponses additionnent plus de rangs que deux. Dans les deux cas, le moteur n'avait pas changé. Un banc qui stocke ses résultats sans ses jugements ne distingue pas un juge qui corrige d'un moteur qui bouge : sans une référence refigée aussitôt, le lot suivant aurait hérité du gain, ou de la perte. Reste, pour « pull de laine », un snood en laine jugé bonne réponse et une écharpe en laine qui ne l'est pas. Une note graduée multiplie ces décisions par le nombre de niveaux.
Ce qu'un marchand peut regarder sans corpus de référence
Presque aucun marchand n'a de liste de bonnes réponses pour son catalogue. Quatre mesures s'en passent ; nous les avons faites sur le même banc.
- Les recherches sans résultat. Elles se comptent dans le journal de recherche, sans rien juger. Voir le tableau de bord des recherches sans résultat.
- La cohérence des écritures. Le même besoin écrit de plusieurs façons doit ramener les mêmes produits. « M8x20 », « M8 x 20 » et « M8-20 » ramènent les trois mêmes vis en tête, jamais dans le même ordre, et 6, 9 et 6 résultats au total. Il suffit d'une liste de variantes, pas d'un jugement.
- La part des égalités de score en tête. Si le moteur renvoie ses scores, compter les positions des 10 premiers qui partagent le leur : 64 % et 88 % sur nos deux corpus. Plus elle est haute, plus l'ordre que voit l'acheteur est décidé par le départage, et non par la pertinence.
- La stabilité. La même requête, lancée deux fois sur un catalogue inchangé, doit rendre le même ordre. Sinon, aucune mesure faite une seule fois ne vaut.
Aucune de ces quatre ne dit si un classement est bon. Elles disent où il est fragile. Pour savoir dans quel sens un classement bouge, il faut juger. Nos 18 requêtes jugées ont suffi à trancher entre deux réglages le 27 août : sur « vis 20 mm », un correctif a fait passer la première vis du rang 3 au rang 1, sans dégrader les autres requêtes. Le jugement se fait de préférence sur des requêtes tirées du journal, par quelqu'un qui vend ces produits, et avant de regarder ce que le moteur rend.
Avant de comparer deux moteurs
Notre nDCG moyen sur les 18 requêtes vaut 0,87. Il valait 0,85 avant qu'on corrige deux jugements, sur un moteur identique. Sans le catalogue, les requêtes et le juge, ce nombre ne dit rien, et sur un autre catalogue il ne vaudrait rien. Comparer deux moteurs demande le même catalogue, les mêmes requêtes, un jugement écrit avant d'avoir vu les résultats de l'un ou de l'autre, et la publication de ce que la mesure dit contre soi.
Notre page La mesure le fait face à BM25, sur 2 821 fiches. Le jugement y est une règle, pas une opinion : chaque requête réécrit la dimension d'une fiche dans une autre graphie, et cette fiche est la bonne réponse. Résultat, +28 points de rappel sur 300 requêtes, et un classement un peu moins bon que BM25 quand les deux trouvent. Pour le comparatif des moteurs eux-mêmes, voir Heurix vs Algolia, Typesense, Sensefuel, Doofinder.