L’ATS open source de HackerRank attribue 90, 74 ou 88 points au même CV
(danunparsed.com)- En relançant à plusieurs reprises l’agent de recrutement ATS open source de HackerRank avec le même CV et la même commande, les scores ont oscillé entre 66 et 99 points ; avec un seuil de 85 points, 65 % des passages aboutissaient à un rejet
- L’outil parse les CV PDF et appelle un LLM 6 fois pour structurer les informations de base, l’expérience, la formation, les compétences, les projets et les distinctions, puis ajoute les informations GitHub pour évaluer le profil sur 100 points + 20 points de bonus
- Les compétences techniques sont restées presque constantes, avec 8/10 dans 98 exécutions sur 100, mais l’évaluation des projets a montré une forte variabilité, oscillant entre « manque de complexité architecturale » et « démontre un déploiement réel »
- La non-détermination persistait non seulement avec le modèle par défaut gemma3:4b à une temperature de 0,1, mais aussi à une temperature de 0 ; même en passant à Gemini, un seuil de 60 points entraînait un taux de rejet de 28 %
- La rubrique expérience a attribué 25/25 points même à un ancien CV ne comportant qu’un seul stage, ce qui suggère que la notation par LLM peut devenir un filtrage dû au hasard plutôt qu’un moyen de distinguer la qualité des candidats
Le même CV obtient un score différent à chaque fois
- hiring-agent, l’ATS open source de HackerRank, a été testé après avoir suscité l’attention sur LinkedIn et Reddit
- Le premier score obtenu était de 90/100 points ; après suppression d’une instruction d’affichage de debug, une nouvelle exécution avec le même CV et la même commande a donné 74/100 points
- Après désactivation de
DEVELOPMENT_MODEet 100 exécutions répétées, les scores se sont étendus de 66 à 99 points - Si le seuil de passage d’une entreprise est fixé à 85 points, le même CV a 65 % de chances d’être rejeté
Pipeline d’évaluation et structure de notation
- L’outil parse le CV PDF en texte, puis appelle plusieurs fois un LLM pour structurer les informations du candidat
- Informations de base
- Expérience
- Formation
- Compétences
- Projets
- Distinctions
- Il scanne le profil GitHub et les principaux dépôts, puis ajoute ces informations comme contexte supplémentaire avant d’envoyer l’ensemble des données au LLM pour évaluation
- Le modèle par défaut est gemma3:4b, exécuté localement, avec une temperature réglée à 0,1
- Le score est sur 100 points, avec jusqu’à 20 points de bonus supplémentaires
- Contributions open source : 35 points
- Projets personnels : 30 points
- Expérience professionnelle : 25 points
- Compétences techniques : 10 points
- Expérience en startup, site portfolio, blog technique, etc. : jusqu’à 20 points de bonus
Rubriques stables et rubriques instables
- Les compétences techniques sont presque constantes, avec 8/10 points dans 98 exécutions sur 100
- La présence de technologies comme React relève davantage d’une checklist, ce qui laisse peu de place au jugement subjectif du LLM
- En revanche, la rubrique projets varie fortement d’une exécution à l’autre
- Dans certaines exécutions, les projets sont évalués comme présentant un « manque de complexité architecturale »
- Dans d’autres, ils sont jugés comme « démontrant un déploiement réel »
- Une temperature de 0,1 est un réglage faible, mais le problème ne disparaît pas même en la réduisant à 0
- Dans une issue GitHub ouverte en octobre 2025, six exécutions consécutives à temperature 0 ont également produit des scores différents : 27, 34, 32, 34, 34, 30
Une instabilité qui persiste même en changeant de modèle
- L’influence du modèle a aussi été vérifiée, gemma3:4b étant un modèle local
- Avec Gemini, la distribution des scores s’est resserrée entre 48 et 64 points
- Mais avec un seuil de 60 points, le candidat est rejeté avec une probabilité de 28 %, indépendamment du contenu de son CV
- Le score open source est devenu plus cohérent, mais le score des projets a continué à fortement fluctuer
Le problème inverse du score d’expérience : cohérent, mais inutile
- La rubrique expérience a donné 25/25 points dans toutes les exécutions
- Même un ancien CV ne comportant qu’un seul stage a obtenu 25/25 points
- Dans le prompt d’évaluation, la rubrique Production ne contient que deux lignes
- Analyser le travail réel, les stages et l’expérience en production dans les sections
worketvolunteer - Accorder une considération supplémentaire aux rôles de fondateur, cofondateur ou ingénieur early-stage en startup
- Analyser le travail réel, les stages et l’expérience en production dans les sections
- Il n’existe aucun critère, exemple ou repère permettant de distinguer 15 points de 25 points
- En conséquence, le stage d’un ingénieur junior, l’expérience de 10 ans d’un principal engineer en systèmes distribués et le CV utilisé pour le test peuvent tous recevoir 25/25 points
Risques pratiques pour le tri des CV
- Utiliser un LLM pour parser un CV en données structurées ou vérifier la présence de Python est un cas d’usage relativement adapté
- Lui demander de décider si l’expérience d’un candidat vaut 18 ou 24 points produit plutôt un résultat de type vibe-check
- La structure qui donne à l’open source et aux projets un poids cumulé de 65 % peut aussi biaiser les décisions de recrutement
- Un candidat ayant deux stages et un projet open source peut être mieux évalué qu’un ingénieur ayant créé S3 avec 30 ans d’expérience
- Un ingénieur ayant réalisé des travaux importants qui n’apparaissent pas sur GitHub peut perdre plus de la moitié des points
- Les ingénieurs habilités à introduire des outils d’IA dans le tri des CV doivent garder à l’esprit qu’un outil incapable de distinguer la qualité peut simplement devenir un dispositif d’élimination des candidats
Corrections
- La première ligne du modèle resume_evaluation_criteria.jinja contient « Software Intern »
- Cette formulation n’est pas documentée et n’est référencée nulle part ailleurs dans le dépôt
- Le même modèle attribue plus loin des bonus aux rôles de fondateur, cofondateur et ingénieur early-stage en startup
- Même en relançant explicitement avec un prompt Senior SWE, le résultat est resté identique, et les dimensions de scoring fonctionnent indépendamment du niveau du poste
1 commentaires
Avis sur Hacker News
Il est surprenant de voir combien de gens ignorent qu’un LLM fonctionne comme un processus purement probabiliste, donc ce genre d’article approfondi est bienvenu
Je suis en recherche d’emploi, et c’est peut-être pour ça qu’il est si difficile d’obtenir des rappels ces temps-ci. On dirait que les CV sont simplement jetés dans une sorte de trou noir à LLM, sans que personne ne sache vraiment comment il fonctionne
L’explication de l’article — « temperature 0.1 — une valeur basse, généralement considérée comme poussant le modèle vers des sorties déterministes » — n’est pas exacte. La température n’est pas un interrupteur de déterminisme : c’est une valeur qui influe sur la distribution d’échantillonnage ; elle rend simplement la distribution plus pointue, mais cela reste une distribution
Plus rigoureusement, une température de 0 n’existe pas en soi. Mathématiquement, à mesure que la température tend vers 0, la distribution devient de plus en plus pointue, l’échantillon le plus probable tend presque vers l’infini, et les autres vers presque 0
Dans les implémentations réelles,
temperature=0n’utilise pas la formule prévue pour les valeurs non nulles ; on passe plutôt par une branche séparée dans unif, afin d’éviter une division par zéro, qui choisit l’échantillon le plus fréquentCela dit, à cause du traitement par lots ou d’erreurs en virgule flottante propres aux implémentations, la distribution de probabilité elle-même varie souvent d’une exécution à l’autre, et l’échantillon change donc aussi
Deux personnes peuvent regarder le même CV et parvenir à la même conclusion, tout comme deux patients présentant les mêmes symptômes et le même tableau clinique peuvent avoir des maladies différentes
L’explication selon laquelle l’ancienne IA serait surtout morte à cause du coût de maintenance des bases de connaissances ne me convainc pas vraiment ; je pense plutôt que le problème central était l’absence d’un système d’inférence général capable de gérer l’incertitude
Le fait que Spock dise toujours des choses du genre « Capitaine, les chances de survie de cette mission sont de 21 % » m’a toujours semblé être une blague récurrente. D’un point de vue bayésien, comme il existe aussi des distributions de probabilité sur les distributions de probabilité, une formulation plus juste serait plutôt : « les chances de survie de cette mission sont β(5,1) »
En ce sens, passer un CV 100 fois dans cette machine et observer la distribution de probabilité des scores n’est pas si étrange
[1] Cela dit, je suis le genre de fou qui reste allongé dans son lit à trier des images sur une tablette jusqu’à ce que son système visuel parte en vrille
En revanche, s’il s’agit d’un MoE, les entrées dupliquées doivent aussi être identiques dans l’ensemble du batch. Les voisins du batch peuvent influencer le choix des experts
Les kernels doivent être déterministes, et il ne doit pas y avoir, dans les modèles de raisonnement, de commutateur de niveau d’effort à l’échelle du système qui réagisse à des choses comme la charge globale du cluster
En conclusion, dans une infrastructure cloud classique, même une température de 0 n’est probablement pas déterministe, mais en inférence en périphérie, elle peut l’être de façon assez fiable
Quant à dire que 0,1 est « plus déterministe », je trouve que c’est un résumé assez raisonnable. À température 0,1, n’échantillonne-t-on pas beaucoup plus souvent la « réponse de température 0 » qu’à température 0,9 ?
J’ai entendu un nombre incalculable de fois : « pour obtenir des résultats cohérents, il faut régler la température à 0 »
Il y a plusieurs raisons pour lesquelles ce ne serait pas forcément le cas, mais lorsque l’on exécute un modèle local, comme l’a fait l’auteur, je ne pense pas que ces raisons s’appliquent
Si l’on combine la tendance de l’IA à « préférer » le code produit par l’IA avec d’autres biais, cette méthode a de fortes chances d’être très illégale dans l’UE, en violant de plusieurs façons les lois antidiscrimination
Filtrer au hasard des CV au motif qu’il y en a trop me semble globalement acceptable. Mais il faut que ce soit réellement aléatoire, et indépendant du contenu des CV
Avec l’IA, le caractère aléatoire n’est pas indépendant de l’évaluation réelle du CV, donc cela ne s’applique pas
En général, on ne peut pas garantir qu’une IA n’applique pas de biais systémique, et il existe même de forts signaux indiquant que c’est probable
On peut former des humains et leur donner pour consigne d’ignorer les biais. Bien sûr, cela ne fonctionne pas non plus de manière fiable, mais au moins la responsabilité du biais illégal se trouve déléguée au recruteur qui a enfreint les consignes
En revanche, lorsqu’on utilise l’IA, l’utilisateur reste responsable, quelles que soient les consignes données. Il peut aussi être techniquement possible de « montrer ou prouver » qu’une IA donnée est fortement biaisée dans un contexte donné. C’est techniquement possible aussi pour un employé humain, mais en pratique ce n’est quasiment pas difficile
Au final, le risque juridique passe d’un niveau « individuel et généralement niable » à celui d’un biais systématiquement démontrable. Autrement dit, dès qu’on sait qu’une IA est utilisée dans le recrutement, les gens peuvent l’attaquer juridiquement de façon systématique
Autrement dit, même d’un strict point de vue mathématique, il est probable que cela soit corrélé d’une manière ou d’une autre avec la race, le genre et d’autres groupes protégés aux États-Unis
Donc, même aux États-Unis, un bon procès pourrait rendre cela illégal. Il n’est même pas nécessaire de gagner : il suffit de tenir suffisamment longtemps au tribunal pour faire peur aux autres entreprises et les dissuader de l’utiliser
Je n’aimerais pas me retrouver dans la position du défendeur qui doit prouver que mon système de tri par IA respecte pleinement toutes les règles du droit du travail. Ce serait un cauchemar
[1]: https://gwern.net/everything
Prendre le quatrième CV dans la pile et proposer le poste à cette personne est une méthode de recrutement stupide, mais parfaitement équitable
Mais l’IA est très douée pour capturer les biais ; si on lui demande de filtrer des CV, il ne serait donc pas surprenant qu’elle se mette à utiliser comme critères des éléments qui ne devraient absolument jamais en être, comme le nom du candidat
Il se pourrait par exemple que tous les CV mentionnant la correction d’une faute de frappe dans un grand projet open source passent, tandis que les CV ne listant que des projets personnels soient rejetés dans 60 % des cas. Dans ce cas, on perdrait davantage de bons candidats que de mauvais
Je suis d’accord pour dire que, puisqu’il fonctionne comme une machine à sous irrationnelle, il peut avoir des effets indésirables de discrimination indirecte. Mais il ne sera probablement pas facile de montrer qu’il discrimine en raison de « la religion ou des convictions, du handicap, de l’âge ou de l’orientation sexuelle ». C’est possible, mais il faudrait beaucoup de travail aux avocats pour le prouver devant un tribunal
Le point le plus intéressant est l’EU AI Act. Cette partie n’entrera en application que le 2 décembre 2027, mais les systèmes d’IA utilisés pour le recrutement ou la sélection de personnes physiques, en particulier pour le placement d’annonces d’emploi ciblées, l’analyse et le filtrage des candidatures, ainsi que l’évaluation des candidats, sont clairement des systèmes d’IA à haut risque
Cela ne signifie pas qu’ils sont interdits, mais les LLM pourraient plus tard être exclus des cas d’usage d’IA à haut risque. Sans exception, ils peuvent relever de l’article 6
Alors que les normes ne sont pas encore publiées, je ne vois absolument pas comment faire respecter, lors de l’utilisation d’un LLM pour ce type de tâche, les passages suivants de l’article 10
« (f) examiner les biais susceptibles d’affecter la santé et la sécurité des personnes, d’avoir une incidence négative sur les droits fondamentaux ou d’entraîner une discrimination interdite par le droit de l’UE, en particulier lorsque les sorties de données influencent les entrées de futures opérations
(g) prendre des mesures appropriées pour détecter, prévenir et atténuer les biais potentiels identifiés conformément au point (f) »
À ce stade, même avec la coopération complète du fournisseur du modèle, je pense que c’est techniquement impossible avec un LLM généraliste. De petits modèles pourraient peut-être faire l’objet d’un audit significatif
L’EU AI Act pourrait finir par exclure, pour les cas d’usage à haut risque de l’annexe III, toutes les approches façon vibe coding du type « on utilise bien un LLM, mais on ne sait pas vraiment pourquoi », et cela me paraît justifié
https://eur-lex.europa.eu/eli/reg/2024/1689/oj/eng
« La personne concernée a le droit de ne pas faire l’objet d’une décision fondée exclusivement sur un traitement automatisé, y compris le profilage, produisant des effets juridiques la concernant ou l’affectant de manière significative de façon similaire »
Les exceptions de l’article 22(2) ont peu de chances de s’appliquer. Il est difficile de soutenir que c’est réellement nécessaire, et dans un contexte d’emploi, le consentement est rarement valable. Ce serait possible si une loi spécifique de l’UE ou d’un État membre l’autorisait, mais il faudrait alors une base juridique distincte
À ce stade, on pourrait aussi bien adopter la blague consistant à dire : « je ne veux pas embaucher des gens malchanceux, donc je jette la moitié des CV les yeux fermés »
Cette méthode avantageait les étudiants qualifiés issus de milieux moins aisés, plutôt que ceux qui avaient les moyens de contourner des critères d’évaluation manuelle des dossiers de plus en plus complexes à l’époque
Une campagne organisée du type « va-t-on choisir les futurs médecins par tirage au sort ? » a été lancée, et le système de loterie a fini par être discrètement abandonné
Les candidats de la moitié restante ont déjà dépensé une partie de leur chance dans cette sélection ; en moyenne, ils auront donc moins de chance que la moitié rejetée
Au cours des dernières décennies, la formation et l’éducation se sont considérablement développées, ce qui a continuellement augmenté le nombre de chercheurs d’emploi, mais la création d’emplois n’a pas suivi le même rythme
Quand des dizaines de candidats se présentent pour un seul poste, l’employeur peut trier les CV n’importe comment, ou en jeter la moitié, et quand même finir par recruter quelqu’un de qualifié
« J’ai 65 % de chances d’être recalé. Exactement le même CV, mais une autre chance » : pour quelqu’un qui a exploité des pipelines de recrutement pour des postes techniques ces dernières années, c’est en fait un excellent chiffre
Je déteste objectivement le dire comme ça, mais c’est vrai
35 % de chances de faire passer des profils techniques à l’étape suivante sans effort ? Même en ajoutant des questions de présélection spécifiques au domaine, j’ai déjà vu plus de 100 candidats par heure. Cela fait donc 35 candidats « présélectionnés » par heure
Des candidats valables ont-ils été filtrés ? Oui. Se retrouve-t-on quand même avec un vivier de candidats 35 fois plus grand que nécessaire ? Malheureusement, oui aussi
Le nombre de candidatures est tellement élevé que, sans intervention de l’IA, la probabilité de passer à l’étape suivante est en réalité bien plus faible. Si vous n’avez pas postulé immédiatement, et surtout si vous ne l’avez pas fait avec un bot IA, il y a plus de 50 personnes devant vous, et un responsable technique épuisé devra bien finir par arriver un jour à votre CV
Ce n’est pas pour rien qu’il existe une prime de cooptation
Grâce aux technologies les plus récentes, il ne laisse passer que les meilleurs* 1 % de candidatures
*selon nos indicateurs propriétaires, non publics et non déterministes, qui peuvent ou non être
Math.randomUn filtre qui réduit le flux de CV n’est utile que si cette réduction est corrélée à la qualité. Sinon, il ne fait qu’allonger inutilement le processus de recrutement ou conduire, au final, à abaisser les critères sans raison
Par exemple « John Schmidt », « John J. Schmidt », « John J. J. Schmidt », « John Jacob J. Schmidt », « J. J. Jingleheimer Schmidt »
Si les 50 premiers candidats sont tous des bots, pourquoi lire les CV dans l’ordre de candidature ?
Ce qui m’inquiète davantage, c’est que si d’autres systèmes fonctionnent comme cet ATS, ils semblent juger les candidats sur des éléments qui écarteront massivement des profils tout à fait corrects, voire bons
Par exemple, la combinaison de projets personnels et de contributions open source reçoit 65 points. Cela peut être très bien si la tech est votre seul centre d’intérêt et que vous n’avez ni famille, ni personnes à charge, ni deuxième ou troisième emploi
Mais si l’un de ces éléments existe, les chances semblent devenir énormément défavorables
Je me demande combien de ces systèmes sont conçus pour avantager des personnes aisées qui n’ont rien d’autre à gérer que l’université ou un seul emploi dans le secteur qu’elles visent, et qui peuvent se passionner pour la tech à un niveau quasiment obsessionnel
Pour prendre mon propre exemple, je fais très peu de projets personnels en dehors du travail. Toute mon expérience réelle en programmation vient de ce que j’ai fait pour mes employeurs pendant mes heures de travail
Mes loisirs sont adjacents à la tech, comme l’impression 3D, le matériel/Arduino ou la photo, mais ce n’est pas le genre de choses où je publie quantité de projets sur GitHub
Je ne vais certainement pas créer de fausses applis CRUD ou SaaS pour les montrer à de potentiels employeurs. C’est une perte de temps
J’ai délibérément évité de construire ce type de présence en ligne. Mon GitHub n’a aucun dépôt public et je ne tiens pas de blog
Cette tendance s’est aussi propagée au domaine ops/administration systèmes dans lequel je travaille, et elle y est même pire. Bien sûr que je n’ai pas mis tout un tas de scripts spécifiques à mon environnement sur mon GitHub : pourquoi le ferais-je ? Ils n’auraient aucun sens pour quelqu’un qui ne travaille pas dans mon service, dans mon entreprise actuelle
Le mot déterminisme a un effet presque magique : il déforme les textes en ligne qu’il touche
Quand on entend ce mot, on peut presque garantir que la discussion va partir dans la mauvaise direction. Cela dit, cette fois-ci, il est bien question du vrai déterminisme — même entrée, même sortie — et non de choses hors sujet
Le déterminisme est important pour la reproductibilité, mais dans ce cas précis, veut-on vraiment que la sortie soit reproductible ? Rendre la sortie d’un LLM déterministe est relativement trivial. Si vous utilisez du batching, utilisez des kernels invariants au batch ; et plutôt que de régler la temperature à 0 — ou de ne pas le faire, car l’échantillonnage aléatoire existe pour une raison — mieux encore, fixez une seed. C’est déjà possible dans certains systèmes
Mais cela ne rendra pas le résultat plus utile. Cela ne fera que masquer le fait que l’agent n’est pas réellement sûr de lui. Regardez l’éventail des scores. Il ne prédira toujours rien, mais le score sera simplement le même à chaque fois. Est-ce vraiment ce que vous voulez ?
Ce qui se passe ici, c’est qu’on fournit trop peu d’informations : un seul CV, qui relève presque du bruit, et l’on attend une réponse aux implications beaucoup trop larges
C’est une erreur de conception fondamentale, que l’on utilise ou non un LLM. Tous les questionnaires, examens, lois et systèmes de vote fonctionnent avec trop peu d’informations, ce qui les rend extrêmement sensibles au cadrage. Simplement, contrairement à ce machin, ils n’existent pas dans le vide
Les algorithmes de Las Vegas sont non déterministes, mais corrects à 100 %. Le compromis est que le temps nécessaire pour atteindre la bonne réponse peut varier fortement
L’erreur ici n’est pas d’avoir utilisé un système non déterministe. Dans un certain sens, l’erreur pourrait même être de ne pas l’avoir assez utilisé. Réévaluer le même CV 5 fois et observer une forte variance des scores serait un signal plus utile que de ne l’évaluer qu’une seule fois
Tout le monde a déjà entendu dire que les peines sont plus sévères dans l’heure qui précède le déjeuner
Si l’on veut empêcher les gens d’optimiser leur candidature pour le processus de filtrage, il faut rendre celui-ci non déterministe dans une certaine mesure
Par exemple, au lieu de couper net après les 100 premiers, on pourrait augmenter de manière exponentielle la probabilité qu’un meilleur candidat passe le filtre
Cela réduit l’intérêt de chercher à exploiter le processus de filtrage à la Goodhart, car la probabilité n’augmente presque pas et il existe beaucoup de meilleures façons d’utiliser son temps
Si le modèle par défaut est
gemma3:4b, c’est un très petit modèleAucun LLM ne sera sans doute un juge parfait et reproductible, mais brancher un modèle 4B sur un tel système revient un peu à connecter un générateur de nombres aléatoires
Toute l’expérience donne l’impression que quelqu’un voulait créer un projet ATS open source, a codé un ATS en mode vibe coding, puis l’a ajusté juste assez pour que les tests passent
Il existe probablement une façon d’analyser des CV avec ce modèle qui fonctionnerait bien. Mais pas en mode « hé, tas de ferraille, quels projets cette personne a-t-elle faits ? »
Il faudrait de l’extraction, de la structuration, probablement de la comparaison via OCR et un nettoyage supplémentaire, plusieurs analyses LLM par signal, des classificateurs, etc.
Rien de tout cela n’a besoin d’être un grand modèle. Utiliser un grand modèle améliorerait un peu les choses, mais comme le contexte est très réduit, ce type de modèle peut bien fonctionner s’il est utilisé correctement
J’ai fait tourner l’ATS moi-même et j’ai eu une expérience tout aussi bizarre
Il n’a pas trouvé mon profil GitHub, donc j’ai obtenu une note dans les 70, puis il n’a pas aimé certaines bibliothèques Ruby connues que j’ai créées
Après quelques exécutions, il a commencé à les reconnaître correctement, mais il me pénalisait toujours sur la formation académique officielle
Ce genre de chose est écœurant
Il n’a pas non plus détecté les certifications ni les prix. J’ai appliqué quelques PR où des gens proposaient des améliorations (https://github.com/Zem-0/hiring-agent), et ça a aidé, mais globalement cet ATS est fortement biaisé en faveur des personnes ayant de grosses contributions open source sur GitHub
J’ai toujours trouvé étonnant que les entreprises tech paient plus de 300 000 dollars sous prétexte qu’il est difficile de trouver de bons ingénieurs, alors que les recruteurs travaillent sans support et ont des critères totalement différents pour définir un « bon candidat »
L’ATS envoie plus de 50 % des CV dans un trou noir à cause d’heuristiques de filtrage pourries, l’équipe recrutement a choisi l’ATS pour des raisons comme son intégration avec Google Gmail, et la technologie de filtrage de cet ATS n’a été revue par personne dans l’équipe d’ingénierie ou de data
J’ai essayé avec mon CV et, somehow, j’ai reçu des points bonus GSoC
BONUS POINTS: 5.0------------------------------Google Summer of Code (GSoC) participation: +5Pourtant, je n’ai jamais participé au GSoC et je ne l’ai pas écrit sur mon CV
C’est une hallucination connue https://github.com/interviewstreet/hiring-agent/issues/240