Matching Scoring CV vs AO
Guide utilisateur — Fiabiliser le scoring des candidats avec décision humaine traçable
Bienvenue
Cette plateforme permet de scorer un candidat (CV) par rapport à un appel d'offres (AO) de manière reproductible et auditable. Elle vise à réduire les contestations évitables tout en garantissant qu'une décision humaine finale est prise pour chaque scoring (conformité RGPD article 22 + AI Act Annexe III).
Ce que la plateforme fait
- Crée des scorings à partir d'un CV et d'un AO via le Custom GPT v3.5 (10 Actions Airtable branchées directement, aucune saisie manuelle).
- Stocke chaque scoring dans Airtable avec notes par critère (C1-C5), score final, citations exactes du CV, opérateur, session_uuid (audit trail).
- Permet à un arbitre humain de valider/rejeter chaque scoring et d'ajouter un commentaire dans la table Scorings_POC.
- Permet de valider une grille AO : le Custom GPT bascule le statut de "draft" à "validated" uniquement sur accord explicite de l'utilisateur.
- Donne une vision direction via un tableau de bord (score moyen, max, distribution, volume).
Ce que la plateforme ne fait pas
- Elle ne décide jamais seule. Toute décision finale doit être saisie par un arbitre humain.
- Elle n'envoie pas automatiquement les résultats aux cabinets membres du GIE.
- Elle ne remplace pas le jugement métier — elle l'outille.
Démarrage rapide (5 min)
Pour faire un premier scoring sans tout lire, suivez ces 5 étapes. Le reste du guide donne le détail si vous avez un doute.
- Ouvrir le Custom GPT v3.5 :
chatgpt.com/g/g-69fa0c30b2c48191bf9d2b579c0f6360. Vérifier que le modèle GPT-5.5 Thinking est bien sélectionné. - S'identifier au démarrage : cliquer sur « Démarrer une session (qui parle ?) », donner votre prénom et votre rôle (opérateur, arbitre, admin, etc.). Le GPT crée une session_uuid de traçage.
- Lancer le scoring : cliquer sur « Scorer un CV vs grille validée », donner le nom de l'AO (ex : AG2R ou KLESIA) et coller le texte du CV pseudonymisé.
- Valider la création du record : à la fin du scoring, le GPT propose « Je vais créer le record dans Airtable » — répondre oui, enregistre. Le scoring est immédiatement visible dans Airtable.
- Arbitrer : ouvrir l'interface Airtable, aller dans la page Détail évaluation, sélectionner votre scoring, choisir une decision_finale, mettre votre nom dans decideur, et ajouter un commentaire si besoin.
Approche & fondements
Cette section explique pourquoi la plateforme fonctionne comme elle fonctionne, et sur quoi on s'appuie pour affirmer que c'est solide. Vous n'êtes pas obligé de la lire pour utiliser l'outil — mais elle est là si on vous demande comment ça marche ou si vous voulez comprendre la logique sous le capot.
1. Pourquoi cette solution existe
Le problème de départ n'est pas un problème de score, c'est un problème de reproductibilité et de défendabilité. Deux opérateurs qui scorent le même CV avec le même prompt obtiennent des résultats différents. Un critère ajouté après coup déclenche une contestation membre. Une grille extraite à la volée à chaque scoring n'a pas le même sens d'un CV à l'autre. Et le tout doit pouvoir tenir face à une contestation, à un audit RGPD, et bientôt à l'EU AI Act Annexe III (système haut risque pour les décisions d'emploi).
La solution n'est donc pas "un meilleur prompt". C'est une architecture qui sépare ce qui doit être fait par l'IA (analyse linguistique du CV face à un critère) de ce qui doit être fait par du code (calcul du score, vérification des citations) et de ce qui doit rester humain (décision finale, arbitrage, validation de grille).
2. Le principe rubric-based
Au lieu de demander à l'IA "donne une note de 0 à 5 sur l'expertise MOA SI de ce CV" (note libre, instable), on décompose chaque critère en 5 questions Y/N atomiques. Exemple sur le critère Expertise MOA SI :
- F1 — Le CV mentionne-t-il MOA comme stack ?
- F2 — Le CV mentionne-t-il de l'analyse de données ?
- F3 — Le CV mentionne-t-il des outils CRM / éditique / GED ?
- F4 — Le candidat a-t-il occupé un rôle direct (lead / senior) sur MOA ?
- F5 — La durée cumulée MOA est-elle ≥ 3 ans ?
L'IA répond Y ou N à chaque question, en citant le passage exact du CV qui le justifie. Le score est ensuite calculé par du code Python (et non par l'IA) selon la formule : score critère = (nombre de Y / 5) × poids du critère. La somme des 5 critères pondérés donne le score sur 100.
C'est un changement de paradigme : on passe d'une opinion d'IA à un calcul vérifiable point par point. Si quelqu'un conteste, on peut pointer la feature exacte qui pose problème, montrer la citation associée, et discuter ce point précis — pas "le score global".
3. Sur quoi on s'appuie scientifiquement
Cette architecture n'est pas une idée maison. Elle s'appuie sur 3 publications académiques récentes qui ont validé chacun des piliers :
| Publication | Apport pour notre architecture |
|---|---|
| LLM-RUBRIC Microsoft Research, ACL 2024 |
Démontre que la décomposition d'une évaluation en questions atomiques Y/N réduit drastiquement la variance d'un LLM, comparé à demander une note globale. C'est la justification du choix Y/N par feature plutôt que note 0-5. |
| CodeJudge EMNLP 2024 |
Démontre que le calcul "code-side" est strictement supérieur au calcul "LLM-side" dès qu'on peut formaliser la règle. Justifie le fait que notre score final est calculé par scoring_engine.py (Code Interpreter), pas par l'IA qui ne fait que produire les Y/N. |
| Rulers arXiv 2026 |
Démontre que le scoring ancré sur citations littérales (chaque Y exige une preuve textuelle extraite du CV) réduit fortement les hallucinations du LLM. Justifie l'obligation de citation par feature dans notre rubric. |
4. Les garde-fous (ce qui rend la solution défendable)
| Garde-fou | Mécanisme | Pourquoi c'est important |
|---|---|---|
| Grille figée en amont | La grille AO (critères, features, poids) est extraite une fois, relue, et basculée en statut validated dans Airtable. Plus aucune modification après ce point. | Évite le cas "TJM ajouté après coup" qui avait déclenché les contestations Confirmit et Tilencia. |
| Citations obligatoires | Chaque Y du LLM doit s'accompagner d'un extrait littéral du CV. Vérifié par scoring_engine.py avant calcul. |
Si la citation n'existe pas dans le CV → la feature est invalidée. Bloque les hallucinations LLM. |
| Calcul déterministe | Le score final est produit par du code Python, pas par l'IA. Même grille + mêmes notes Y/N → même score, toujours. | Reproductibilité défendable face à un auditeur. La variance LLM est isolée au niveau Y/N par feature, mesurable et contrôlable. |
| Validation humaine finale | Aucun scoring n'est communiqué à un membre du GIE tant qu'un arbitre humain n'a pas rempli decision_finale + decideur + commentaire. | Conformité RGPD article 22 (interdiction de décision auto avec effet significatif) et EU AI Act Annexe III (oversight humain obligatoire). |
| Audit trail systématique | Chaque scoring porte un session_uuid, l'identité de l'opérateur, la version du prompt, la version de la rubric, le record_id de la grille AO, le timestamp. |
Traçabilité complète exigée par l'article 12 EU AI Act. Permet de rejouer ou auditer n'importe quel scoring à postériori. |
| Pseudonymisation amont | Aucun CV nominatif réel n'entre dans le système tant que la mise en conformité Production V1 n'est pas validée. POC uniquement sur initiales (HDA, RLO, etc.). | Limite l'exposition légale en phase POC. Aucun traitement de donnée personnelle au sens RGPD. |
| Protocole divergence 3 runs | Pour le TOP 4 d'un AO ou un cas contesté, l'opérateur exécute 3 runs du même scoring. La médiane est utilisée. Si l'écart entre runs > 5 points → flag divergence et escalade arbitre. | Mesure et expose la variance résiduelle du LLM, plutôt que de la cacher. Force l'arbitrage humain sur les cas où la machine n'est pas stable. |
5. La complexité cachée
Ce qui est visible côté utilisateur ressemble à "je colle un CV, j'ai un score". Ce qui se passe réellement sous le capot, pour produire ce score, est plus dense :
- Extraction de la grille AO (Prompt A v3) — le LLM lit l'appel d'offres, identifie 4 à 6 critères structurants, propose 5 features Y/N par critère + une pondération. La grille est ensuite relue par un arbitre humain, ajustée si besoin, puis verrouillée.
- Évaluation feature-by-feature (Prompt B v3) — pour chaque CV, le LLM répond aux 5×N features Y/N, en exigeant une citation littérale du CV pour chaque Y.
- Vérification des citations — un script Python (
scoring_engine.py) exécuté par Code Interpreter recherche chaque citation dans le CV source. Si la citation n'existe pas littéralement → la feature est invalidée. - Application des règles de glissement — le moteur vérifie aussi des contraintes métier (ex : "coordination" n'est pas équivalent à "pilotage", "business operationnel" n'est pas équivalent à "MOA SI"). Ces règles sont versionnées dans la rubric.
- Calcul du score final — formule rubric-based pondérée, totalement déterministe, hors LLM.
- Écriture Airtable — création d'un record dans Scorings_POC via une des 10 Actions Airtable du Custom GPT (
createScoring), incluant l'audit trail (session_uuid, opérateur, prompt_version, rubric_version, hash canonique du résultat). - Arbitrage humain — un arbitre relit, valide ou rejette via l'interface Airtable. Décision finale tracée.
- Vérification contestation (Prompt C v3) — si un membre conteste, un troisième prompt rejoue le scoring, isole le point de divergence, et propose une analyse à l'arbitre humain qui tranche.
Côté infrastructure POC : 1 Custom GPT v3.5 (ChatGPT GPT-5.5 Thinking), 10 Actions Airtable branchées en direct, 1 base Airtable avec 3 tables (Grilles_AO, CV_POC, Scorings_POC), 1 scoring engine Python exécuté en sandbox via Code Interpreter, 1 interface Airtable de pilotage (5 pages).
Qui fait quoi
La plateforme est conçue autour de 5 rôles fonctionnels. Une même personne peut occuper plusieurs rôles à la fois (par exemple un arbitre qui est aussi opérateur). C'est la fonction qui structure le workflow, pas l'identité.
| Rôle | Mission | Actions principales |
|---|---|---|
| Opérateur de scoring | Exécute les scorings au quotidien | Lance le Custom GPT, fournit l'AO + le CV, valide la création du scoring dans Airtable |
| Arbitre principal | Valide les scorings produits | Vérifie les notes et citations, marque Validé / Rejeté / Revue manuelle, commente |
| Co-arbitre | Backup et 2e regard | Mêmes droits que l'arbitre principal, intervient en cas de contestation ou de divergence |
| Directeur final | Décision business et escalade | Consulte le tableau de bord direction, arbitre les cas escaladés, valide les politiques |
| Admin | Supervision opérationnelle | Suit le volume traité, gère les utilisateurs, ouvre / archive les AO |
operateur + arbitres_assignes).
Accéder à l'interface
Lien direct vers l'interface Airtable du POC (donner quelques secondes au chargement la première fois) :
https://airtable.com/appqhLzZkXq5MZNJS/pagc8PDijuXMS5eIH
- Ouvrir le lien ci-dessus dans votre navigateur.
- Se connecter avec votre compte Airtable (créé pour vous par l'admin, ou via l'invitation reçue par email).
- L'interface Matching Scoring — Pilotage s'ouvre sur la première page disponible. Patientez quelques secondes lors de la première ouverture, Airtable charge les données.
- Le menu de gauche affiche les 4 pages : Revue par AO, Tableau de bord direction, Détail évaluation, Nouvelle évaluation.
Workflow complet (de A à Z)
Voici le parcours typique pour traiter un nouveau scoring, de la création à la décision finale.
1. Page Nouvelle évaluation
Créer un nouveau scoring (parcours de secours)
Utilisateur cible : opérateur de scoring (uniquement si on souhaite créer un record sans passer par le Custom GPT — le cas standard v3.5 est de laisser le GPT créer le record).
Étapes
- Aller sur la page Nouvelle évaluation via le menu de gauche.
- Remplir le formulaire avec les 5 champs visibles :
- scoring_label
- Identifiant unique de ce scoring. Convention :
AO-XXX-CV-INITIALES-runN(ex :AO-001-CV-RLO-run1). - ao_link
- Cliquer + Ajouter dossier et choisir l'AO concerné (AG2R, KLESIA…).
- cv_link
- Idem pour le CV à scorer (RLO, TMA, HDA, JGR, ABE, MAR…).
- operateur
- Choisir qui exécute le scoring : Custom_GPT_auto (cas standard), A&C_test, ou le nom de l'opérateur si saisie manuelle.
- notes_internes
- Champ libre pour vos remarques (ex : « test 2 - run 1/3 RLO »). Facultatif.
- Cliquer sur Lancer le scoring en bas à droite.
- Le record est créé dans Airtable. Message « Merci d'avoir envoyé le formulaire ! ».
Champs auto-générés (vous n'avez pas à les remplir ici)
Les champs suivants sont remplis automatiquement par le Custom GPT ou par défaut : notes_par_critere, citations_par_critere, score_final, prompt_version, rubric_version.
2. Custom GPT v3.5
Scorer le CV via ChatGPT
Utilisateur cible : opérateur de scoring.
Accès
Lien Custom GPT : https://chatgpt.com/g/g-69fa0c30b2c48191bf9d2b579c0f6360 (« Matching scoring CV - A&C Consulting »).
Étapes
- Cliquer sur le lien — vous arrivez sur le Custom GPT.
- Vérifier le bandeau « ✓ Utilisation du modèle recommandé par le créateur : GPT-5.5 Thinking ».
- Choisir un des 4 raccourcis :
- Démarrer une session (qui parle ?) — pour s'identifier en début de séance.
- Scorer un CV vs grille validée — le cas standard, à utiliser ici.
- Récupérer une grille AO existante — pour réutiliser une grille déjà validée.
- Vérifier un score contesté — pour rejouer un cas contesté.
- Coller le texte de l'AO et du CV (ou indiquer leurs noms en KB).
- Le GPT exécute son scoring_engine.py via Code Interpreter et produit :
- 5 notes Y/N par critère (C1 Expérience, C2 Compétences, C3 Gestion projet, C4 Management, C5 Adéquation).
- Le calcul détaillé.
- Le score final sur 100.
- Les citations exactes du CV qui justifient chaque note.
- Un hash canonique du résultat (reproductibilité).
- Copier ces informations dans le record Airtable créé à l'étape 1 (champs
notes_par_critere,citations_par_critere,score_final).
3. Page Revue par AO
Filtrer et trier les scorings
Utilisateur cible : Tous les rôles (vue d'ensemble).
Layout
La page affiche trois zones :
- En haut : la grille des AO validés (AG2R, KLESIA).
- Au-dessus de la grille Scorings : un widget Filtre avec la condition
ao_link est exactement [picker]. - En bas : la grille Scorings_POC (25 records par défaut, triés
score_finaldu plus haut au plus bas).
Filtrer par AO
- Dans le widget Filtre, cliquer sur le bouton + à droite de « est exactement ».
- Choisir l'AO à filtrer : Coordonnateur projet AG2R POMOA ou Coordonnateur de projet — Pôle Action Sociale & Solidarité (KLESIA).
- La grille Scorings_POC en dessous se filtre automatiquement (AG2R → 24 records, KLESIA → 1 record).
- Pour revenir à la vue complète, cliquer Réinitialiser.
Trier et explorer
- Les scorings sont triés par
score_finaldécroissant (meilleurs en premier). - Cliquer sur un en-tête de colonne pour trier autrement (ex : par date, par opérateur).
- Cliquer sur la flèche d'expansion à gauche d'une ligne pour ouvrir le détail.
scoring_label.
4. Page Détail évaluation
Examiner et arbitrer un scoring
Utilisateur cible : arbitre principal et co-arbitre.
Layout
Deux colonnes :
- Gauche : la liste de tous les scorings (cliquable, avec recherche en haut).
- Droite : le détail du scoring sélectionné, avec tous ses champs.
Champs visibles dans le détail
- scoring_label
- Identifiant (titre)
- ao_link
- L'AO de référence (avec son client et statut)
- cv_link
- Le CV scoré (initiales + source)
- operateur
- Qui a exécuté le scoring
- notes_par_critere
- Détail C1-C5 avec calcul ligne par ligne
- decision_finale
- Dropdown : En attente / Validé / Rejeté / Revue manuelle
- decideur
- Dropdown : nom de la personne ayant arbitré (selon la configuration de votre équipe — opérateur, arbitre principal, co-arbitre, directeur final, admin)
- date_decision
- Date + heure de l'arbitrage
- commentaire_decideur
- Justification libre (recommandé pour les cas non-évidents)
Comment arbitrer
- Sélectionner le scoring à arbitrer dans la liste à gauche.
- Lire les notes_par_critere et vérifier le calcul.
- Choisir la decision_finale dans le dropdown.
- Renseigner votre nom dans decideur (obligatoire pour traçabilité).
- Saisir la date_decision (mettre la date du jour + heure).
- Ajouter un commentaire_decideur pour expliquer la décision (recommandé surtout pour Rejeté et Revue manuelle).
- Les modifications sont sauvegardées automatiquement — le bandeau « modifications ont été enregistrées » apparaît en haut.
5. Page Tableau de bord direction
Vision globale et KPIs
Utilisateur cible : directeur final, sponsor, admin.
Contenu
- Titre : « Pilotage scoring — Vision direction ».
- Quantité : nombre total de scorings dans la base.
- Tableau croisé dynamique : decision_finale × decideur — qui a décidé quoi, et combien.
- Indicateurs clés :
- Score moyen : moyenne de tous les
score_final(84.8/100 actuellement). - Score max : meilleur score enregistré (100.0).
- Score moyen : moyenne de tous les
- Analyses & distribution : histogramme de la distribution des scores (bars). Permet de voir si la rubric produit des scores cohérents.
Usage
- Consultation hebdomadaire pour suivre le volume traité.
- Détecter rapidement les biais : si un même decideur a beaucoup de Validé mais peu de Rejeté, c'est un signal.
- Identifier les scorings extrêmes (max très haut, min très bas) qui méritent attention.
Les 4 décisions possibles
| Décision | Quand l'utiliser | Conséquence |
|---|---|---|
| En attente | Scoring fraîchement créé, pas encore examiné | Statut par défaut. Pas de communication au membre. |
| Validé | Le score reflète fidèlement le profil — accord avec le calcul GPT | Le scoring peut être communiqué au membre. Référence pour les contestations. |
| Rejeté | Erreur manifeste dans le scoring (mauvais critères, mauvais CV, hallucination) | Scoring annulé. Refaire un run propre. Toujours commenter la cause. |
| Revue manuelle | Cas particulier — la rubric standard ne s'applique pas bien, ou contestation membre | Le scoring sort du flux automatique. Les arbitres statuent à la main. |
Bonnes pratiques
Pour l'opérateur de scoring
- Utiliser une
scoring_labelclaire et versionnée (run1, run2, run3) pour pouvoir comparer. - Toujours pseudonymiser le CV avant de le passer au Custom GPT (initiales uniquement, pas de nom/email/téléphone).
- Si le GPT produit un résultat manifestement faux (score 0, citations inventées), ne pas reporter — recommencer un run.
- Conserver le hash canonique dans
notes_internespour pouvoir rejouer un scoring identique en cas de contestation.
Pour l'arbitre principal et le co-arbitre
- Toujours lire notes_par_critere avant de décider — vérifier que le calcul tient.
- Spot-check une citation : ouvrir le CV pseudo et confirmer que la citation y figure bien.
- Si vous validez un score, ajouter au moins « OK conforme à mon évaluation manuelle » en commentaire.
- Si vous rejetez, indiquer précisément pourquoi (ex : « C2 incorrect : le CV ne mentionne pas X »).
- Pour les cas contestés (Confirmit, Tilencia, etc.), utiliser Revue manuelle.
Pour le directeur final / admin
- Surveiller le ratio Validé / Rejeté. Si trop de rejets, la rubric a un problème (à revoir avec A&C Consulting).
- Suivre l'activité hebdomadaire pour valider que le POC apporte un gain de temps réel aux opérateurs.
FAQ & dépannage
Glossaire
- AO (Appel d'Offres)
- Le besoin client (mission, poste à pourvoir). Stocké dans la table Grilles_AO avec sa grille de critères validée.
- Custom GPT v3.5
- Le modèle ChatGPT spécialisé créé par A&C Consulting pour scorer les CV vs les grilles AO de Fastor.
- Decision_finale
- Champ Airtable qui matérialise l'arbitrage humain : En attente / Validé / Rejeté / Revue manuelle.
- GIE
- Groupement d'Intérêt Économique. Ici : Fastor, qui regroupe plusieurs cabinets de placement IT.
- Hash canonique
- Empreinte SHA-256 du résultat du scoring (input + output). Permet de rejouer un scoring à l'identique et de prouver qu'il est inchangé.
- Notes_par_critere
- Détail des notes C1 à C5 avec citations et calcul. C'est l'audit trail du scoring.
- Pseudonymisation
- Remplacement des informations identifiantes du CV (nom, email, etc.) par des initiales (RLO, TMA, etc.). Obligatoire RGPD pour le POC.
- Rubric-based scoring
- Méthode de scoring où chaque critère est évalué Y/N selon une grille fixe, plutôt que par un score libre. Plus reproductible.
- Score_final
- Score sur 100, calculé déterministiquement à partir des notes Y/N par critère pondérées.