DEV Community

Ali
Ali

Posted on

I built a semantic job matcher for freelancers using Qdrant + BGE embeddings — here's what the rankings look like

Been freelancing for several years. Tired of manually scanning job listings trying to guess which ones fit my stack.

So I built a tool: embed your profile once, rank job listings by semantic similarity. No keyword rules — pure vector search.

How It Works

  1. Parse your profile (title, stack, portfolio) into a rich text chunk
  2. Embed it with BAAI/bge-base-en-v1.5 (768-dim) → store in Qdrant
  3. Embed each job listing the same way
  4. Rank by cosine similarity

Real Results on 6 Sample Jobs

Rank  Score  Job
  1   0.87   Senior AI/ML Engineer – Multi-Agent Systems     ← correct
  2   0.83   Full-Stack – Next.js + Python AI Backend        ← correct
  3   0.79   Backend Engineer – FastAPI + PostgreSQL         ← correct
  4   0.68   AI Chatbot Developer – GPT-4 Integration        ← fair
  5   0.71   AWS Solutions Architect – DynamoDB/Cognito      ← correct
  6   0.41   React Native Developer – iOS/Android            ← correctly last
Enter fullscreen mode Exit fullscreen mode

Most interesting: the React Native role scored 0.41 despite "React" appearing multiple times in my profile. Semantic context beats keyword matching.

What Surprised Me

Portfolio items matter a lot for match quality. When I added my AI platform (LaunchMentor.ai) and AWS compliance project to the profile text, match scores on AI/cloud jobs improved noticeably.

Usage

python3 matcher.py index-profile       # embed your profile
python3 matcher.py add-csv jobs.csv    # add job listings
python3 matcher.py match --top 10      # ranked output
Enter fullscreen mode Exit fullscreen mode

Stack: Python · Qdrant (local) · sentence-transformers (BGE-base-en-v1.5) · Click · Rich

Repo: github.com/prog585/freelance-tools

Anyone else doing semantic filtering on job listings? Curious if there are better approaches.


Building LaunchMentor.ai — AI market intelligence for founders validating startup ideas.

Top comments (0)