Hur jag byggde ett AI-drivet CV-matchningssystem på min egen server

Publicerat av Per Kristedal — Kristedal Tech AB


Jag jobbar inom rekrytering och tech, och en av de mest tidskrävande uppgifterna är att manuellt gå igenom konsultprofiler och matcha dem mot inkommande jobbförfrågningar från kunder. Det är repetitivt, det tar tid, och det är exakt den typ av problem som AI är gjord för att lösa.

Så jag byggde ett eget system. Från grunden. På mina egna servrar.


Vad systemet gör

Systemet består av två delar som arbetar tillsammans:

Del 1 — CV-konverteraren tar ett CV i PDF-format, skickar det till OpenAI:s API för strukturerad extraktion och skapar både en JSON-profil och ett färdigt CV i företagets grafiska mall. Allt tillgängligt via en webbsida med uppladdningsfunktion.

Del 2 — Jobbbmatcharen hämtar automatiskt inkommande jobbmail från en e-postinkorg, kör varje kandidatprofil mot varje jobbannonsen via en lokal AI-modell, och presenterar resultaten i ett poängsatt dashboard med motiveringar och identifierade gap.

Hela flödet ser ut så här:

Ladda upp CV (PDF)
       ↓
OpenAI extraherar strukturerad profil (JSON)
       ↓
Profilen skickas automatiskt till matchningstjänsten
       ↓
Lokal AI matchar profilen mot alla inkommande jobbannonser
       ↓
Resultat visas i dashboard med poäng 0–100, motivering och gap

Den tekniska arkitekturen

Systemet körs på min egna Proxmox-server hemma, uppdelat i två isolerade LXC-containrar:

LXC 1 (konverteraren) kör en Flask-applikation som är publikt tillgänglig via en säker omvänd tunnel till en VPS. Här sker PDF-uppladdning, AI-extraktion och generering av färdiga CV-dokument.

LXC 2 (matcharen) är inte publikt tillgänglig. Den hämtar jobbmail via IMAP på ett schemalagt intervall, kör matchningen med en lokal språkmodell via Ollama, sparar resultaten och skickar dem tillbaka till LXC 1.

De två systemen kommunicerar via SSH-nycklar och SCP — inga öppna portar, ingen molntjänst för den känsliga matchningsdatan.

Dashboarden nås via lösenordsskyddad inloggning på en befintlig domän.


Varför lokal AI för matchningen?

Det är ett medvetet val. Kandidatprofilerna innehåller personuppgifter — namn, arbetshistorik, kompetenser. Att skicka den datan till ett externt API för varje matchningskörning vore onödigt ur ett GDPR-perspektiv.

Den lokala modellen (Gemma2 9B via Ollama på ett dedikerat GPU-system) klarar matchningsuppgiften bra. Den returnerar strukturerad JSON med poäng, motivering och identifierade gap för varje kombination av kandidat och jobb.

OpenAI används bara för det steget där kvaliteten verkligen spelar roll — att förstå och strukturera ett oformaterat PDF-CV. Den datan behandlas under ett Data Processing Agreement med EU Standard Contractual Clauses.


GDPR i praktiken

Eftersom systemet behandlar personuppgifter tog jag GDPR-frågorna på allvar redan från start, inte som en eftertanke.

Konkret innebär det:

  • Samtycke inhämtas explicit via en kryssruta innan något CV laddas upp
  • Integritetspolicy finns tillgänglig direkt på uppladdningssidan
  • Registerförteckning (Artikel 30 GDPR) är upprättad för Kristedal Tech AB
  • DPA med OpenAI är signerat
  • Matchningsdatan lämnar aldrig infrastrukturen — den lokala AI-modellen körs helt på egna servrar

Det är också enkelt att radera en kandidat — ett enkelt terminalkommando tar bort profilen och rensar resultaten på båda systemen.


Vad fungerar bra

Matchningskvaliteten är förvånansvärt bra. Systemet hittar relevanta kopplingar mellan kandidaters bakgrund och jobbkrav, och är tydligt med var det finns gap. Poängsättningen är konsekvent — en junior kandidat mot ett seniorjobb hamnar lågt, en stark matchning landar i 80–90-intervallet.

Att ha allt på en enda domän — CV-konvertering, matchningsdashboard och integritetspolicy — gör det enkelt att visa upp för kunder och kollegor utan att behöva förklara flera olika system.


Nästa steg

Det här är fortfarande en prototyp. Nästa fas handlar om att förfina matchningspromptarna, lägga till stöd för fler kandidater, och utvärdera om systemet kan skalas upp till ett riktigt affärsverktyg inom rekrytering och konsultförmedling.

Om du jobbar inom rekrytering, tech eller HR och är nyfiken på hur det här kan se ut i er verksamhet — hör gärna av dig.

Per Kristedal per@kristedal.se Kristedal Tech AB

Av admin

Jag som driver bloggen heter Per och bor i Floda tillsammans med min familj (sambo, fyra barn och och två katter). Till vardags arbetar jag som ingenjör och chef inom teknik- och fordonsindustrin, där jag kombinerar ledarskap med ett starkt intresse för teknikens praktiska tillämpning. På fritiden fördjupar jag mig gärna i datorer, nätverk, Raspberry Pi-projekt och cybersäkerhet — ofta i gränslandet mellan utveckling, automation och IT-infrastruktur. Jag skriver också om mina projekt här på bloggen, där jag delar erfarenheter, lösningar och reflektioner från både arbete och hobby. När jag inte bygger system eller felsöker kod trivs jag bäst hemma i Floda, med familjen, en kopp kaffe och kanske lite World of Tanks.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *