Naar hoofdinhoud gaan

Overzicht

De vacaturematchingengine van Recruitier is een meerfasige AI-pipeline die het volledige profiel van een kandidaat — bevestigde vaardigheden, ervaring, functietitel, locatie en voorkeuren — neemt en de meest relevante vacatures vindt uit een database van duizenden kansen. Vervolgens worden alle matches gescoord en gerangschikt via AI-evaluatie over vier dimensies, waarbij gedetailleerde verklaringen worden geproduceerd die precies vertellen waarom elke vacature een goede match is. Het volledige proces verloopt op de achtergrond. U start het en werkt verder terwijl het systeem het zoeken, filteren en scoren afhandelt. Realtime voortgangsupdates worden via Server-Sent Events (SSE) naar uw browser gestuurd naarmate elke fase wordt voltooid. Een typische matchingronde verwerkt 50-200 vacatures in minder dan 2 minuten.

De 5-fase matchingpipeline

Wanneer matching wordt geactiveerd voor een kandidaat, voert het systeem vijf afzonderlijke fasen in volgorde uit. Elke fase bouwt voort op de uitvoer van de vorige.
1

Fase 1: Embedding (Analyseren)

Wat er gebeurt: Het systeem leest het volledige profiel van de kandidaat en genereert vectorembeddings — wiskundige representaties van de expertise van de kandidaat die semantisch zoeken mogelijk maken.De matchingengine laadt de gegevens van de kandidaat uit de database, waaronder:
  • CV-tekst (origineel van upload of synthetisch van LinkedIn-import)
  • Bevestigde vaardigheden (alleen bevestigde vaardigheden worden gebruikt)
  • Functietitel en ervaringsniveau
  • Locatiecoordinaten en zoekradius
  • Salarisverwachtingen en voorkeur voor functietype/flexibiliteit
Vervolgens worden drie afzonderlijke vectorembeddings gegenereerd voor het profiel van de kandidaat:
VectorBrongegevensWat het vastlegtGewicht bij zoeken
TitelvectorFunctietitel en koptekstFunctie-afstemming, senioriteitssniveau, functie35%
VaardigheidsvectorBevestigde vaardigheidslijstTechnische vaardigheden en toolbeheersing45%
ErvaringsvectorSamenvatting en cv-tekstBredere professionele context, domeinkennis, werkcomplexiteit20%
Deze drie vectoren worden opgeslagen in de Qdrant-vectordatabase voor snelle gelijkenisivergelijking. Als de kandidaat eerder is ingebed (is_embedded = true), worden bestaande vectoren gebruikt tenzij het profiel is gewijzigd. Als dit de eerste embedding is of het profiel is bijgewerkt, worden verse vectoren gegenereerd door de aanbevelingsservice aan te roepen.Waarom drie vectoren in plaats van één? Een enkele embedding zou het signaal vervagen. Door titel, vaardigheden en ervaring te scheiden, kan het systeem verschillende aspecten van fit onafhankelijk evalueren. Een kandidaat kan een perfecte vaardigheidsmatch hebben (Python, FastAPI, PostgreSQL) voor een vacature met een heel andere titel (“Platform Engineer” versus “Backend Developer”). De drie-vectoraanpak vangt deze genuanceerde matches op die een systeem met één vector zou missen.
Vectorembeddings zijn hoog-dimensionale wiskundige representaties (doorgaans 384-768 dimensies) waarbij vergelijkbare betekenissen dicht bij elkaar in de vectorruimte liggen. “Python Developer” en “Python Engineer” produceren vectoren die erg dicht bij elkaar liggen, ook al zijn de exacte woorden anders. “Python Developer” en “Marketing Manager” produceren vectoren die ver uit elkaar liggen.
2

Fase 2: Zoekopdrachten genereren

Wat er gebeurt: De AI genereert meerdere diverse zoekstrategieën op basis van het profiel van de kandidaat.In plaats van een enkele zoekopdracht uit te voeren, vraagt het systeem de AI (Gemini) om tot 15 verschillende zoekopdrachtensets aan te maken. Elke zoekopdrachtenset richt zich op een ander aspect van de mogelijkheden van de kandidaat:
  • Directe functietitelmatches — Vacatures met dezelfde of vergelijkbare functietitel
  • Op vaardigheden gebaseerde zoekopdrachten — Vacatures die de sleutelvaardigheden van de kandidaat in combinatie vereisen
  • Alternatieve functies — Gerelateerde posities die de kandidaat kan vervullen op basis van hun vaardigheidsset
  • Branchevariaties — Dezelfde functie in verschillende sectoren of bedrijfstypes
  • Senioriteitsvariaties — Vergelijkbare functies op iets andere niveaus
Voorbeeld: Een “Senior Python Developer” met vaardigheden in FastAPI, PostgreSQL en Docker kan de volgende zoekopdrachten genereren:
Zoekopdracht #ZoekstrategieVoorbeeldzoekopdracht
1Directe functietitel”senior python developer”
2Vaardigheidscombinatie”python backend engineer fastapi”
3Framework-focus”python developer django fastapi”
4Alternatieve titel”software engineer python”
5Infrastructuurinvalshoek”python developer docker kubernetes”
6Data-invalshoek”python developer postgresql data”
7Lead-variatie”lead python developer”
8Full-stack invalshoek”full-stack python developer”
Waarom meerdere zoekopdrachten belangrijk zijn: Een enkele zoekopdracht kan vacatures missen die andere terminologie gebruiken voor dezelfde functie. “Backend Engineer”, “Software Developer”, “Platform Engineer” en “Application Developer” kunnen allemaal posities beschrijven waarvoor een Senior Python Developer perfect geschikt is. Meerdere zoekstrategieën werpen een ruimer net en vangen kansen op die puur trefwoord- of enkelvoudige zoekopdrachten zouden missen.
3

Fase 3: Zoeken (vectorzoekopdracht)

Wat er gebeurt: Het systeem voert parallelle vector- (semantische) zoekopdrachten uit in de volledige vacaturedatabase, waarbij op voorkeur gebaseerde filters worden toegepast.Dit is waar de drie-vectormatchingarchitectuur in het spel komt. Voor het profiel van de kandidaat voert het systeem drie parallelle vectorzoekopdrachten uit in de vacaturedatabase:
  1. Titel-naar-titel zoekopdracht (35% gewicht) — De titelvector van de kandidaat wordt vergeleken met de titelvector van elke vacature via cosinus gelijkenis. Dit vindt vacatures met vergelijkbare functiebeschrijvingen, ongeacht de exacte bewoordingen. “Senior Python Developer” matcht “Python Backend Engineer” omdat ze semantisch vergelijkbaar zijn.
  2. Vaardigheden-naar-vaardigheden zoekopdracht (45% gewicht) — De vaardigheidsvector van de kandidaat wordt vergeleken met de vaardigheidsvector van elke vacature. Dit vindt vacatures die vergelijkbare technische vaardigheden vereisen. Een kandidaat met [Python, FastAPI, PostgreSQL] matcht een vacature die [Python, Django, MySQL] vereist omdat de vaardigheidssets aanzienlijk overlappen in de vectorruimte.
  3. Ervaring-naar-beschrijving zoekopdracht (20% gewicht) — De ervaringsvector van de kandidaat wordt vergeleken met de volledige beschrijvingsvector van elke vacature. Dit legt bredere context vast zoals domeinkennis, branche-ervaring, werkcomplexiteit en organisatorische verwachtingen.
Elke zoekopdracht past ook filters toe op basis van de voorkeuren van de kandidaat en vereisten voor gegevenskwaliteit:
FilterDoelToegepast wanneer
is_activeAlleen actieve, huidige vacatureplaatsingenAltijd
Actualiteit (6 maanden)Alleen vacatures geplaatst in de afgelopen 6 maandenAltijd
BedrijfsnaamVacatures zonder geldige bedrijfsnaam uitsluitenAltijd
Branche-uitsluitingUitzendbureaus en wervingsbureaus uitsluitenAltijd
ErvaringsniveauNiveau van kandidaat matchen (junior/medior/senior/lead)Wanneer ingesteld op kandidaat
Locatie + radiusVacatures voorbij 2x de gewenste radius uitsluitenWanneer kandidaat coordinaten heeft
FunctietypeAlleen overeenkomende types (fulltime, parttime, contract)Wanneer voorkeuren zijn ingesteld
FlexibiliteitAlleen overeenkomende regelingen (on-site, hybride, remote)Wanneer voorkeuren zijn ingesteld
De zoekopdracht gebruikt een ophaalmaximum van 400 — er worden tot 400 kandidaatvacatures opgehaald uit de vectordatabase. Dit is opzettelijk groter dan de weergavelimiet van 200 om een buffer te bieden voor nafiltering (deduplicatie, uitsluiting van bestaande matches, enz.).Waarom semantisch zoeken beter presteert dan trefwoordzoeken: Een vacature voor een “Python Backend Engineer” matcht een kandidaat met de titel “Senior Python Developer” ook al verschilt de exacte formulering. Een vacature die “cloud infrastructure experience” vereist, matcht een kandidaat wiens cv “deploying applications on AWS EC2 and ECS” beschrijft omdat het inbeddingsmodel begrijpt dat deze semantisch gerelateerd zijn. Dit is dramatisch beter dan trefwoordmatching, die deze verbindingen zou missen.
4

Fase 4: Verwerken (aanmaken van matches)

Wat er gebeurt: Het systeem verzamelt resultaten van alle zoekopdrachten, verwijdert duplicaten en maakt matchrecords aan in de database.Omdat meerdere zoekopdrachten en drie parallelle vectorzoekopdrachten dezelfde vacature kunnen vinden, voert het systeem verschillende verwerkingsstappen uit:
  1. Vectorscores samenvoegen: Voor elke gevonden vacature worden de drie vectorgelijkenisscores gecombineerd via de gewogen formule: gecombineerde_score = (titel_score * 0,35) + (vaardigheden_score * 0,45) + (ervaring_score * 0,20)
  2. Resultaten ontdubbelen: Dezelfde vacature kan in meerdere zoekresultaten verschijnen. Het systeem behoudt alleen de hoogst scorende instantie van elke unieke vacature.
  3. Bestaande matches uitsluiten: Vacatures die al een CandidateJobMatch-record hebben voor deze kandidaat worden uitgesloten. Dit voorkomt dubbele matchkaarten in de pipeline.
  4. Beschermde matches uitsluiten: Vacatures die zich in beschermde statussen bevinden (favoriet, gesolliciteerd, gecontacteerd, in gesprek, aanbod fase, geplaatst) worden geidentificeerd en hun ID’s worden doorgegeven aan de uitsluitingslijst. Deze matches worden NOOIT verwijderd of vervangen tijdens hermatching.
  5. Bedrijfsgegevens valideren: Elke gematchte vacature moet een geldige bedrijfsnaam en bedrijfsinformatie hebben. Vacatures met ontbrekende bedrijfsgegevens worden uitgefilterd.
  6. Matchrecords aanmaken: CandidateJobMatch-records worden aangemaakt in de database met de initiële vectorgelijkenisscores en een “in behandeling”-status. Deze records koppelen de kandidaat aan specifieke vacatures en worden bijgewerkt met AI-scores in de volgende fase.
Waarom deduplicatie belangrijk is: Zonder deduplicatie zou een vacature die door 3 verschillende zoekopdrachten wordt gevonden, 3 keer in uw pipeline verschijnen. De deduplicatie zorgt ervoor dat elke kans precies eenmaal verschijnt, met de best beschikbare vectorgelijkenisscore.
Beschermde matches zijn heilig. Als u een vacature heeft gefavoriet of er al aan het solliciteren bent, wordt die match nooit verwijderd tijdens hermatching. Dit is een kernontwerpprinciep — uw pipelinevoortgang wordt altijd bewaard.
5

Fase 5: Scoren (AI-evaluatie)

Wat er gebeurt: Elke gematchte vacature wordt individueel beoordeeld door Gemini, dat een gedetailleerde scoreanalyse en verklaring in natuurlijke taal produceert.Voor elke vacaturematch ontvangt de AI een zorgvuldig opgestelde prompt die bevat:
InvoerBronTekenlimiet
Kandidaat CV-tekstVeld cv_text (origineel of synthetisch)Tot 8.000 tekens
Bevestigde vaardigheden kandidaatskills_with_confidence (alleen bevestigde)Volledige lijst
Ervaringsniveau kandidaatVeld experience_levelEnkele waarde
FunctietitelVan de gematchte vacatureVolledige tekst
BedrijfsnaamVan het bedrijf van de gematchte vacatureVolledige tekst
VacaturelocatieVan de gematchte vacatureVolledige tekst
VacaturebeschrijvingVolledige beschrijving uit de vacatureplaatsingTot 6.000 tekens
De AI evalueert de match over vier scoringdimensies:
DimensieStandaardgewichtWat het evalueert
Functiefit30% (weight_role)Hoe goed de achtergrond van de kandidaat aansluit bij de functievereisten. Loopbaantrajectorie, senioriteitsafstemming, functietypealignment.
Vaardigheidsfit35% (weight_skills)Hoeveel vereiste vaardigheden de kandidaat bezit. Identificeert overeenkomende en ontbrekende vaardigheden.
Ervaringsfit20% (weight_experience)Of de jaren en het type ervaring van de kandidaat voldoen aan de verwachtingen. Brancherelevantie, projectcomplexiteit.
Secundaire fit15% (weight_secondary)Aanvullende factoren: afstemming van opleiding, certificeringen, branchekennis, taalvereisten, indicatoren voor cultuurfit.
Elke dimensie ontvangt een score van 0 tot 1. De AI produceert ook:
  • Belangrijkste matchpunten — De sterkste redenen waarom de kandidaat geschikt is voor deze functie (weergegeven als groene badges op matchkaarten)
  • Mogelijke aandachtspunten — Zaken om te overwegen, zoals ontbrekende vaardigheden of ervaringshiaten (weergegeven als oranje badges)
  • Toelichting in natuurlijke taal — Een samenvatting van waarom deze match goed is of niet, met specifiek bewijs uit zowel het cv als de vacaturebeschrijving
  • Aanbeveling — “solliciteren”, “overwegen” of “overslaan” op basis van de eindscore
Na AI-scoring wordt de locatiestraf toegepast als een multiplicatieve factor (zie Locatie en voorkeuren voor de formule). Vacatures worden vervolgens gerangschikt op hun eindscore en er worden rangposities toegewezen (1 = beste match).Gelijktijdige scoring voor snelheid: Om matching snel te houden, zelfs met honderden potentiële vacatures, wordt AI-scoring gelijktijdig uitgevoerd — tot 50 vacatures worden tegelijkertijd gescoord via parallelle API-aanroepen. Dit gelijktijdigheidsniveau is afgesteld om binnen de limiet van 500 RPM van Gemini te blijven. Elke individuele scoringaanroep heeft een time-out van 90 seconden om te voorkomen dat een enkele trage evaluatie de hele batch blokkeert.Een typische matchingronde scoort 50-200 vacatures in minder dan 2 minuten.
Kritieke mismatch-grenzen: Als een scoringdimensie extreem laag is, wordt de totale score begrensd om misleidend hoge scores te voorkomen:
  • Functiefit onder 0,30: Totale score begrensd op 35% — zelfs geweldige vaardigheden kunnen een volledig verkeerde functie niet compenseren
  • Vaardigheidsfit onder 0,30: Totale score begrensd op 45% — een sterke functiematch helpt niet als de kandidaat de kernvaardigheden mist
Deze grenzen zorgen ervoor dat fundamentele mismatches in functie of vaardigheden altijd resulteren in een lage totale score, ongeacht hoe goed andere dimensies scoren.

De technologie achter matching

Vectorembeddings uitgelegd

De kern van de matching van Recruitier is vectorinbeddingstechnologie. Tekst (functietitels, vaardigheidslijsten, beschrijvingen) wordt geconverteerd naar hoog-dimensionale wiskundige vectoren waarbij vergelijkbare betekenissen dicht bij elkaar in de vectorruimte liggen. Dit betekent dat “Python Developer” en “Python Engineer” vectoren produceren die erg dicht bij elkaar liggen, ook al zijn de woorden anders. “Python Developer” en “Java Developer” liggen verder uit elkaar maar zijn nog steeds dichter dan “Python Developer” en “Marketing Manager”. De afstand tussen vectoren vertegenwoordigt semantische gelijkenis.

Drie-vectorarchitectuur

In plaats van een enkele embedding voor het hele profiel te gebruiken, gebruikt Recruitier drie afzonderlijke vectoren met verschillende gewichten:
VectorGewichtMotivering
Titel35%De functietitel is het meest directe signaal voor functie-afstemming. Het legt senioriteit (Senior, Junior, Lead), domein (Backend, Frontend, Full-Stack) en primaire functie (Developer, Engineer, Architect) vast.
Vaardigheden45%Vaardigheden zijn de sterkste voorspeller van technische fit. Ze dragen het meeste gewicht omdat een geweldige functiematch zinloos is als de vaardigheden niet overeenkomen. Een “Senior Developer” zonder de juiste technologiestack is geen match.
Ervaring20%De volledige ervaringsbeschrijving levert “zachte signalen” — domeinkennis, bedrijfstypes, projectcomplexiteit, branchecontext. Het is ruwer dan vaardigheden of functietitel maar voegt nuttige context toe die de andere vectoren missen.
Deze gewogen aanpak presteert beter dan matching met een enkele vector omdat het systeem hierdoor verschillende aspecten van fit afzonderlijk kan evalueren en ze intelligent kan combineren. Onderzoek toont aan dat meervoudige-vector aanpakken de recall met 15-25% verbeteren in vergelijking met methoden met een enkele vector.

Gelijktijdige AI-scoringarchitectuur

De scoringfase gebruikt een gelijktijdig uitvoeringsmodel om de doorvoer te maximaliseren:
  • Batchgrootte: Tot 50 gelijktijdige AI-scoringaanroepen
  • Snelheidslimiet: Blijft binnen de limiet van 500 RPM (verzoeken per minuut) van Gemini
  • Time-out: Elke individuele scoringaanroep heeft een time-out van 90 seconden
  • Foutafhandeling: Mislukte scoringaanroepen worden geregistreerd maar blokkeren andere scores niet. Een vacature die niet kan worden gescoord, krijgt een standaardafhandeling in plaats van de hele batch te laten crashen
  • Typische doorvoer: 50-200 vacatures gescoord in minder dan 2 minuten
Dit betekent dat zelfs voor kandidaten met zeer brede vaardigheidssets of grote zoekradii die veel vectormatches produceren, de scoring snel wordt afgerond.

Realtime voortgangsupdates

Tijdens matching ontvangt u live voortgangsupdates rechtstreeks op de kandidaatdetailpagina. Een voortgangspaneel toont elke fase met realtime statusindicatoren:
FaseLabelBeschrijving
AnalyserenProfiel analyserenVaardigheden en ervaring van de kandidaat lezen
GenererenZoekopdrachten aanmakenZoekparameters voor de vacaturedatabase opbouwen
ZoekenVacatures zoekenDatabases scannen op overeenkomende kansen
VerwerkenVerwerkenMatchrecords ontdubbelen en voorbereiden
ScorenAI scoortElke match evalueren op kwaliteit en fit
Elke fase toont een van drie statussen: voltooid (vinkje), momenteel actief (wachtsymbool) of in de wachtrij (cirkel). Het paneel toont ook een beschrijving van wat de huidige fase doet en een notitie dat matching doorgaans minder dan een minuut duurt. De voortgangsupdates worden geleverd via Server-Sent Events (SSE) met Redis pub/sub. U hoeft de pagina niet te vernieuwen. U kunt de matchingvoortgang in realtime bekijken, wegnavigeren en later terugkomen, of aan andere kandidaten werken terwijl matching op de achtergrond verloopt.

Wanneer matching wordt uitgevoerd

Matching wordt automatisch geactiveerd in verschillende scenario’s:
TriggerTypeWat er gebeurt
Na cv-uploadAutomatischVolledige 5-fase pipeline verloopt nadat de kandidaat is aangemaakt en vaardigheden zijn bevestigd
Na LinkedIn-importAutomatischVolledige 5-fase pipeline verloopt nadat het profiel is geimporteerd
Na vaardigheidswijzigingAutomatischAls bevestigde vaardigheden zijn gewijzigd (toegevoegd/verwijderd), wordt hermatching geactiveerd
Na locatiewijzigingAutomatischWijzigingen in locatie, coordinaten of radius activeren hermatching
Bij inloggen (incrementeel)AutomatischTop 5 kandidaten gematcht met 50 nieuwe vacatures elk, met een afkoelperiode van 6 uur
Handmatige triggerOp aanvraagU kunt matching op elk moment handmatig starten vanuit het kandidaatprofiel

Hermatchinggedrag

Wanneer matching opnieuw verloopt voor een kandidaat die al matches heeft:
  • Beschermde matches worden ALTIJD bewaard: Vacatures met deze statussen worden nooit verwijderd:
    • Favoriet
    • Gesolliciteerd
    • Gecontacteerd
    • In gesprek
    • Aanbod fase
    • Geplaatst
  • In behandeling zijnde matches kunnen worden vervangen: Niet-gescoorde of onbewogen matches (met de status “Nieuwe matches”) kunnen worden vervangen door verse resultaten
  • Nieuwe matches worden toegevoegd: Vacatures die niet in de vorige resultaten stonden, worden toegevoegd als nieuwe matches
  • Uitsluitingslijst: Vacature-ID’s van beschermde matches worden doorgegeven aan de matchingpipeline zodat er geen bronnen worden verspild aan het opnieuw scoren van vacatures waarmee u al interactie heeft gehad
Hermatching is ontworpen als veilig. Het wist nooit uw pipelinevoortgang. Alleen “in behandeling” zijnde matches waarmee u geen interactie heeft gehad, worden beinvloed. Dit betekent dat u vol vertrouwen de vaardigheden of locatie van een kandidaat kunt bijwerken wetende dat uw gefavorite, gecontacteerde en “in gesprek” matches veilig zijn.

Incrementele matching bij inloggen

Om matchresultaten actueel te houden zonder handmatige tussenkomst voert Recruitier incrementele matching uit wanneer u inlogt:
ParameterWaarde
TriggerInloggen gebruiker
Afkoelperiode6 uur (wordt niet uitgevoerd als de laatste run minder dan 6 uur geleden was)
Verwerkte kandidatenTop 5 kandidaten (op activiteit of prioriteit)
Vacatures per kandidaatTot 50 nieuwe vacatures
SSE-gebeurtenissenlogin_matching_started, incremental_matching_success, login_matching_completed
Dit betekent dat elke ochtend wanneer u inlogt, uw meest actieve kandidaten automatisch worden gematcht met vacatures die ‘s nachts zijn geplaatst of recent aan de database zijn toegevoegd.

Matchingconfiguratie

Scoringgewichten

De standaard scoringgewichten kunnen per kandidaat worden aangepast via het kandidaatprofiel:
GewichtStandaardConfigureerbaarGebruik voor aanpassing
weight_role0,30JaVerhogen voor functies waarbij branche-/domeinafstemming het meest telt
weight_skills0,35JaVerhogen voor sterk technische functies (ML Engineer, DevOps)
weight_experience0,20JaVerhogen voor leiderschaps- of managementposities
weight_secondary0,15JaVerhogen voor functies waarbij opleiding/certificeringen cruciaal zijn
Alle vier gewichten moeten optellen tot 1,0. Wanneer u een gewicht verhoogt, verlaag de andere proportioneel.
Voor de meeste technische functies werken de standaardgewichten goed. Pas gewichten alleen aan wanneer u merkt dat de standaardscoring niet vastlegt wat het meest telt voor een specifiek type functie. Gangbare aanpassingen:
  • Carrierewisselaars: Verlaag functiegewicht (0,15), verhoog vaardigheidsgewicht (0,50)
  • Leiderschapsposities: Verhoog ervaringsgewicht (0,30), verlaag vaardigheidsgewicht (0,25)
  • Gereguleerde sectoren: Verhoog secundair gewicht (0,25) om certificeringen en compliance te benadrukken

Ophaal- en weergavelimieten

Het systeem heeft configureerbare limieten voor pipelineprestaties:
LimietStandaardDoel
Ophaalmaximum400Maximum aantal opgehaalde vacatures uit vectorzoekopdracht (buffer voor filtering)
Weergavelimiet200Maximum aantal matches weergegeven aan de gebruiker na alle verwerking
Minimumscore0,50Vacatures onder deze drempelwaarde ontvangen een “overslaan”-aanbeveling

Geavanceerd

De volledige pipelinegegevensstroom

Hier is de volledige gegevensstroom van trigger tot resultaten, die toont hoe gegevens door elke fase bewegen:
Trigger (cv-upload, vaardigheidswijziging, locatiewijziging, handmatig, inloggen)
    |
    v
Fase 1: Embedding
    Invoer: candidate.title, candidate.skills (bevestigde), candidate.cv_text
    Verwerking: Genereer 3 vectoren via aanbevelingsservice
    Uitvoer: Titelvector, vaardigheidsvector, ervaringsvector -> opgeslagen in Qdrant
    |
    v
Fase 2: Genereren van zoekopdrachten
    Invoer: Kandidaatprofiel (titel, vaardigheden, samenvatting, ervaringsniveau)
    Verwerking: Gemini genereert tot 15 diverse zoekopdrachtensets
    Uitvoer: Array van zoekopdrachtenstrings
    |
    v
Fase 3: Vectorzoekopdracht
    Invoer: 3 kandidaatvectoren + zoekopdrachtenstrings + filtercriteria
    Verwerking: Parallelle zoekopdrachten in Qdrant met filters
    Uitvoer: Tot 400 vacaturekandidaten met vectorgelijkenisscores
    Filters toegepast: is_active, actualiteit, bedrijfsnaam, branche-uitsluiting,
                     ervaringsniveau, locatie/radius, functietype, flexibiliteit
    |
    v
Fase 4: Aanmaken van matches
    Invoer: Ruwe zoekresultaten (mogelijk gedupliceert over zoekopdrachten)
    Verwerking: Scores samenvoegen (35%/45%/20%), ontdubbelen, bestaande matches uitsluiten,
             beschermde matches uitsluiten, bedrijfsgegevens valideren
    Uitvoer: CandidateJobMatch-records in database (in behandeling status)
    |
    v
Fase 5: AI-scoring
    Invoer: CV van elke match kandidaat (8K tekens) + bevestigde vaardigheden +
           vacaturebeschrijving (6K tekens) + vacaturemetadata
    Verwerking: 50 gelijktijdige Gemini-aanroepen, 90s time-out elk
    Uitvoer: Scores per match (role_fit, skills_fit, experience_fit, secondary_fit),
            belangrijkste matchpunten, mogelijke aandachtspunten, toelichting, aanbeveling
    Naverwerking: Locatiestraf toepassen, eindscore berekenen, rangposities toewijzen
    |
    v
Resultaat: Gerangschikte lijst van tot 200 gescoorde matches met volledige toelichtingen
    Geleverd via: SSE-notificatie naar browser

Hoe de scoringprompt werkt

De AI-scoring gebruikt een zorgvuldig ontworpen prompt (CANDIDATE_JOB_SCORING_PROMPT) die Gemini instrueert om:
  1. De cv-tekst en bevestigde vaardigheden van de kandidaat te lezen
  2. De vacaturebeschrijving en vereisten te lezen
  3. Vier dimensies onafhankelijk te evalueren (functiefit, vaardigheidsfit, ervaringsfit, secundaire fit)
  4. Belangrijkste matchpunten en mogelijke aandachtspunten te identificeren
  5. Een toelichting in natuurlijke taal met bewijs te produceren
  6. Een gestructureerde JSON-respons te retourneren
De prompt is ontworpen om consistente, gekalibreerde scores te produceren. De AI wordt geinstruseerd om:
  • Het volledige bereik van 0-1 te gebruiken (niet te clusteren rond 0,5)
  • Specifiek bewijs te leveren uit zowel het cv als de vacaturebeschrijving
  • Fundamentele mismatches expliciet te markeren
  • Zowel vereiste als gewenste kwalificaties afzonderlijk te overwegen

Kritiek strafmechanisme

De kritieke mismatch-grenzen dienen als vangnet tegen score-inflatie: Functiefit-grens: Wanneer role_fit < 0,30 wordt de totale score begrensd op 0,35 (35%). Dit voorkomt een situatie waarbij een Marketingmanager met Python-hobby-projecten een overeenkomst van 80% scoort voor een Senior Python Developer-functie alleen omdat hun vaardigheden overlappen. Vaardigheidsfit-grens: Wanneer skills_fit < 0,30 wordt de totale score begrensd op 0,45 (45%). Dit voorkomt een situatie waarbij een Senior Java Developer een hoge score krijgt voor een Python/FastAPI-functie alleen omdat hun senioriteit en ervaring overeenkomen. Deze grenzen zorgen ervoor dat fundamentele mismatches in functie of vaardigheden altijd resulteren in een lage totale score, ongeacht hoe goed andere dimensies scoren.

Uitsluiting van uitzendbureaus

De matchingpipeline sluit automatisch vacatures van uitzendbureaus en wervingsbureaus uit. Dit is een bewuste bedrijfsregel: recruiters die Recruitier gebruiken willen hun kandidaten niet matchen met vacatureplaatsingen van concurrerende bureaus. De uitsluiting is gebaseerd op de lijst EXCLUDED_CLIENT_INDUSTRIES, die momenteel “Staffing and Recruiting” omvat. Bedrijven met deze brancheclassificatie in de tabel global_company worden uitgesloten van zoekresultaten. Bedrijven zonder branchegegevens (NULL) worden nog steeds opgenomen — alleen expliciet uitgesloten branches worden uitgefilterd.

SSE-gebeurtenissenstroom tijdens matching

De matchingpipeline publiceert de volgende SSE-gebeurtenissen via Redis pub/sub:
GebeurtenisWanneerGegevens
matching_startedPipeline begintcandidate_id, candidate_name
matching_stage_updateElke faseovergangstage_name, stage_number, total_stages, status_message
matching_completedPipeline eindigtcandidate_id, total_matches, top_score
login_matching_startedIncrementele matching begint bij inloggenuser_id
incremental_matching_successIncrementele match van één kandidaat eindigtcandidate_id, new_matches_count
login_matching_completedAlle incrementele matching eindigttotal_candidates_processed
De frontend ontvangt deze via de SSEConnectionManager en werkt de UI realtime bij — voortgangsindicatoren, matchaantallen en notificaties worden allemaal aangedreven door deze gebeurtenissen.

Tips voor gevorderde gebruikers

Activeer handmatige hermatching na gewichtsaanpassingen. Als u de scoringgewichten van een kandidaat wijzigt (bijv. het vaardigheidsgewicht verhogen voor een technische functie), werden de bestaande matchscores berekend met de oude gewichten. Activeer een handmatige hermatching om alle scores te herberekenen met de nieuwe gewichtsconfiguratie.
Gebruik de fase-voor-fase voortgang om problemen te diagnosticeren. Als matching traag is in de fase “Zoeken”, heeft de kandidaat mogelijk een zeer breed profiel dat te veel vectormatches genereert. Als het traag is in de fase “Scoren”, zijn er veel vacatures te evalueren. Als het snel wordt voltooid maar weinig matches produceert, zijn de voorkeuren van de kandidaat mogelijk te restrictief.
Pas voor kandidaten met ongebruikelijke profielen gewichten aan voordat u de eerste match uitvoert. Een carrierewisselaar van de financiële sector naar tech met sterke Python-vaardigheden moet hun functiegewicht verlaagd en vaardigheidsgewicht verhoogd hebben VOOR de eerste matchingronde. Dit bespaart een hermatching en levert betere initiële resultaten op.

Gerelateerd