DEV Community

Cover image for #HackAVP CV-Matching : le bon profil, preuves à l'appui
Jo Biden
Jo Biden

Posted on Edited on

#HackAVP CV-Matching : le bon profil, preuves à l'appui

Logo CV-Matching

Track : onPrem
Ma contribution au #HackAVP, le hackathon de l'OPT-NC, de Station N et de la commission Data & IA d'OPEN NC, réalisée dans le cours Interopérabilité des SI du M2 MIAGE de l'IAE de Nouvelle-Calédonie. Dans JobMatch NC, le projet de notre promo, je m'occupe de la brique matching.

Au départ, une question toute bête

"Est-ce que mon CV coche vraiment les cases ?".

Ici, en Nouvelle-Calédonie, l'OPT-NC publie ses offres d'emploi en open data, décrites compétence par compétence et ouvertes à tous. De quoi construire un outil vraiment utile au territoire, pour les candidats comme pour les recruteurs.

D'où ma question de départ : "Et si un CV pouvait être comparé à toutes les offres en quelques secondes… à condition que la machine explique pourquoi ?"

La règle : pas de chiffre sans preuve

Beaucoup d'outils de "matching" donnent une note, point. 72 %. Pourquoi 72 ??? Mystère...🤔
Je voulais l'inverse : chaque point du score doit pouvoir être vérifié.

CV-Matching affiche donc, pour chaque compétence de l'offre, la phrase du CV qui la prouve.
Exemple réel, avec le CV fictif d'une auditrice interne face à l'offre Auditeur – Service de l'audit interne :

56 % · "Très bonne adéquation" · 8 compétences sur 15
Méthodologie d'audit ← "Réalisation de missions d'audit selon les normes professionnelles"

Une compétence, une preuve

Si une preuve est mauvaise, ça se voit tout de suite.

Deux enquêteurs pour chaque compétence

Pour trouver ces preuves, deux modèles d'IA open source travaillent en duo :

  • le chercheur (BAAI/bge-m3, licence MIT) passe le CV au peigne fin et ressort, pour chaque compétence, les 3 phrases qui lui ressemblent le plus ;
  • le vérificateur (BAAI/bge-reranker-v2-m3, licence Apache-2.0) relit ces phrases une par une et tranche : vraie preuve, ou simple ressemblance ?

Le chercheur et le vérificateur

Ensuite, on fait la moyenne, en donnant plus de poids aux compétences rares : savoir mener un audit compte plus que "rigueur". Les savoir-être sont mis à part, parce que ça, ça se vérifie en entretien. Le référentiel ROME 4.0 de France Travail fait aussi le lien entre les outils cités dans un CV (Excel, Word…) et les compétences de l'offre.

La moyenne pondérée

Pour lancer une analyse, il faut trois choses : un CV au format JSON Resume (un CV "rangé dans des cases", lisible par une machine), les offres de l'OPT-NC et un clic.
Le nom, l'e-mail et le téléphone ne sont jamais lus : seul le parcours compte.

Trois choses pour lancer une analyse

👉 À tester : huggingface.co/spaces/Myz0/CV-Matching.

Côté candidat, on dépose un CV et toutes les offres sont classées.

Côté candidat : les offres classées

Côté candidat : les preuves

Côté recruteur, on choisit une offre et les CV sont classés.

Côté recruteur : les candidats classés

Uniquement des CV fictifs.

Le jour où j'ai arrêté de croire mes intuitions

Au début, je réglais "au feeling". Mais mauvaise idée, car une modification qui "semblait" meilleure rendait parfois le classement pire...😭

Alors j'ai écrit mes propres examens : 23 CV fictifs dont je connaissais la bonne réponse et un script qui note le classement tout seul.
À partir de là, une seule règle : mesurer, corriger, re-mesurer. Une idée qui ne fait pas mieux est abandonnée, même si je l'aimais bien.

Résultat : le bon CV arrive premier dans 84 % des cas, contre 68 % au départ.

Sauf que quelqu'un qui révise avec le sujet de l'examen a forcément une bonne note 🤓.
J'ai donc écrit 18 autres CV, jamais utilisés pour régler quoi que ce soit. Là, le poste visé arrive premier dans 71 % des cas. Moins flatteur, mais plus honnête. Et sur les deux jeux, aucun profil hors sujet (cuisinier, infirmier, graphiste…) ne passe devant un bon candidat.

Le test qui m'a le plus convaincu : réécrire les meilleurs CV avec d'autres mots, pour le même parcours. Une recherche par mots-clés s'effondre (1 bon poste sur 7). CV-Matching garde le bon poste en tête 7 fois sur 7. Toute la différence entre comparer des mots et comparer du sens.

Les mesures

Il reste du travail (beaucoup même)... le vérificateur est parfois trop sévère avec les preuves partielles et le jeu de test qui est encore trop petit. Il faudra confirmer avec de vrais CV.

Une brique dans JobMatch NC

Je ne travaillais pas seul dans mon coin : notre promo a construit une chaîne de 7 briques, reliées par un hub commun, HACKAVPI.
Ma brique est le maillon matching, la fonction "score explicable" demandée par le hackathon.

Ce qui entre :

  • les offres, lues directement dans le dataset open data de l'OPT-NC (opt-nc/odata-avps), au format schema.org JobPosting ;
  • les CV, lus sur le hub, à la demande, avec le jeton du recruteur : c'est le hub qui gère les droits et je ne stocke rien.

Ce qui sort : les scores, envoyés aux deux sites de la promo, AVPRO-NC pour les recruteurs et Adopte un Job pour les candidats, qui appellent mon API.

L'interopérabilité

Échange Avec qui Format
Offres → CV-Matching dataset open data de l'OPT-NC JSON-LD schema.org JobPosting
CV → CV-Matching hub HACKAVPI API REST, jeton du recruteur
Scores → sites AVPRO-NC, Adopte un Job API REST JSON, OpenAPI, avec clé
Scores → IA agents conversationnels MCP (matcher_cv, classer_candidats)

Les routes principales : POST /v1/match (un CV → les offres classées), POST /v1/avps/{id_avp}/candidats (une offre → les candidats classés), POST /v1/score (une candidature) et POST /v1/hub/avps/{id_avp}/candidatures (les candidats qui ont postulé sur le hub). Tout est documenté sur /docs. Et la clé commune entre toutes les briques reste la référence de l'offre, par exemple 3134-26-1419/SR.

Petite leçon d'humilité au passage : les premiers CV de test du hub étaient presque vides… et les scores, très bas. Logique : le service ne note que ce qui est écrit. Un CV vide ne prouve rien.

Petit PC, grandes ambitions stonks📈

Pas besoin d'une machine de guerre.
J'ai tout développé sur mon PC portable, avec une RTX 3050 et ses 4 Go de mémoire : il a fallu faire tenir les deux modèles dedans (bge-m3 en demi-précision). Résultat : environ 4,5 s pour comparer un CV à toutes les offres et 1,5 s en mode simplifié, sans carte graphique.

La démo de la vidéo a d'ailleurs été filmée sur cette machine.

Et c'est tout l'intérêt : les CV ne partent nulle part.

  • Aucune IA externe : pas de ChatGPT, pas d'API payante. Les deux modèles sont open source, téléchargés une fois et tous les calculs se font sur la machine qui fait tourner le service.
  • Rien n'est stocké : les CV sont lus à la demande, notés, puis oubliés.
  • Des versions figées : les modèles sont fixés sur une version précise, les scores ne changent pas sans qu'on le décide.
  • Installable chez l'OPT-NC : tout tient dans une image Docker, modèles compris. Le même code tourne sur mon PC, sur Hugging Face ou sur un serveur de l'OPT-NC.

Hugging Face, c'est la vitrine, pas une dépendance : l'OPT-NC peut tout rapatrier chez elle.

Le tout reste souverain

Le coût : environ 950 XPF par mois (9 $), l'abonnement Hugging Face PRO. Modèles, données, IA : 0 XPF.

Cet abonnement n'est pas obligatoire : sans lui, CV-Matching tourne sur mon PC, sur n'importe quel serveur avec Docker, ou en mode simplifié sans carte graphique.

Il sert à deux choses :

  • des scores plus rapides : le Space utilise ZeroGPU, une carte graphique puissante que Hugging Face prête le temps de chaque calcul. Le compte PRO permet de créer ce type de Space et donne 8 fois plus de temps GPU par jour ;
  • lancer le projet n'importe où : une adresse publique, toujours en ligne, que le jury, la promo et les deux sites peuvent appeler, sans attendre que mon PC soit allumé.

PRO propose aussi d'autres options (Dev Mode pour se connecter en SSH à son Space, plus de stockage, des crédits d'inférence…), mais pour CV-Matching, c'est surtout ZeroGPU qui compte.

Le coût

Et ensuite ?

  1. Un vérificateur moins sévère : il rejette encore des preuves partielles. Je veux l'ajuster avec des exemples jugés à la main.
  2. Moins sensible aux mots : un même parcours écrit autrement peut perdre des points. Étendre le ROME à toutes les compétences rendrait le score plus stable.
  3. Rapide sans carte graphique : une version allégée du vérificateur pour tourner vite sur n'importe quel serveur de l'OPT-NC.
  4. Tester avec de vrais CV : confirmer en conditions réelles les 71 % obtenus sur des CV fictifs.

Remerciements !!!

Un grand merci à Adrien Sales pour cette opportunité et qui, en tant que professeur, nous a accompagnés et guidés tout au long du projet.
Merci aussi à l'OPT-NC d'avoir ouvert ses données, à la Station N, à la commission Data & IA d'OPEN NC et à l'IAE de la Nouvelle-Calédonie.

Et merci à toute la promo de JobMatch NC : CVForge, HACKAVPI, Adopte un Job, CV Generator, AVPRO-NC, Insight Squad et à Maud pour la coordination.

Chaque brique a fait avancer les autres et c'est ça l'interopérabilité !!!

Liens

CV-Matching : le bon profil, preuves à l'appui.

Top comments (6)

Collapse
 
adriens profile image
adriens •

Bonjour, et merci pour ta contribution !
Le processus d'évaluation par le jury démarre ce jour !

N'hésite pas à follower cet article, réagir et partager les réalisations des autres challengers 🫶

Collapse
 
adriens profile image
adriens •

Hello Jo, précise que c'est la track onPrem (au vu de la stack que tu as utilisée, tu aurais pu)

Collapse
 
adriens profile image
adriens •
Collapse
 
adriens profile image
adriens • • Edited

Très sympa et agrable à lire ton article Jo ! J'adore les petites touches d'humour qui rendent ta réalisation humaine et fun mais tujours intéressante à lire.

Le coût : environ 950 XPF par mois (9 $), l'abonnement Hugging Face PRO. Modèles, données, IA : 0 XPF.

Ca c'est trèèèèèès intéressant !

Collapse
 
adriens profile image
adriens •

Collapse
 
adriens profile image
adriens •