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
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
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:
- 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.
- 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.
- 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.
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:
-
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) - Resultaten ontdubbelen: Dezelfde vacature kan in meerdere zoekresultaten verschijnen. Het systeem behoudt alleen de hoogst scorende instantie van elke unieke vacature.
-
Bestaande matches uitsluiten: Vacatures die al een
CandidateJobMatch-record hebben voor deze kandidaat worden uitgesloten. Dit voorkomt dubbele matchkaarten in de pipeline. - 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.
- Bedrijfsgegevens valideren: Elke gematchte vacature moet een geldige bedrijfsnaam en bedrijfsinformatie hebben. Vacatures met ontbrekende bedrijfsgegevens worden uitgefilterd.
-
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.
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:
De AI evalueert de match over vier scoringdimensies:
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
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:
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
Realtime voortgangsupdates
Tijdens matching ontvangt u live voortgangsupdates rechtstreeks op de kandidaatdetailpagina. Een voortgangspaneel toont elke fase met realtime statusindicatoren:
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: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:
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:
Alle vier gewichten moeten optellen tot 1,0. Wanneer u een gewicht verhoogt, verlaag de andere proportioneel.
Ophaal- en weergavelimieten
Het systeem heeft configureerbare limieten voor pipelineprestaties:Geavanceerd
De volledige pipelinegegevensstroom
Hier is de volledige gegevensstroom van trigger tot resultaten, die toont hoe gegevens door elke fase bewegen:Hoe de scoringprompt werkt
De AI-scoring gebruikt een zorgvuldig ontworpen prompt (CANDIDATE_JOB_SCORING_PROMPT) die Gemini instrueert om:- De cv-tekst en bevestigde vaardigheden van de kandidaat te lezen
- De vacaturebeschrijving en vereisten te lezen
- Vier dimensies onafhankelijk te evalueren (functiefit, vaardigheidsfit, ervaringsfit, secundaire fit)
- Belangrijkste matchpunten en mogelijke aandachtspunten te identificeren
- Een toelichting in natuurlijke taal met bewijs te produceren
- Een gestructureerde JSON-respons te retourneren
- 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: Wanneerrole_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 lijstEXCLUDED_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:
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
Gerelateerd
- Matchscores begrijpen — Leer hoe u matchscores en dimensie-analyses kunt interpreteren
- Kandidaatpipeline — Matches volgen door uw workflow
- Vaardigheden en expertise — Matchkwaliteit verbeteren via nauwkeurige vaardigheden
- Locatie en voorkeuren — Geografische filters en voorkeursfilters configureren

