JobRadar의 내부 구조: 8개의 채용 소스, 1.7B 모델, 클라우드 미사용
요약
JobRadar는 8개의 채용 소스를 병렬로 검색하고 로컬 LLM을 활용해 공고를 평가하는 CLI 도구입니다. 클라우드 API 대신 사용자의 CPU에서 1.7B 모델을 실행하여 개인정보 보호와 비용 절감을 동시에 달성합니다.
핵심 포인트
- 8개의 채용 소스(게시판 및 ATS)를 병렬로 검색하는 파이프라인 구축
- Ollama/llama.cpp를 활용한 로컬 1.7B 모델 기반의 개인정보 보호형 평가
- API 키나 구독 없이 사용자의 로컬 환경에서 모든 프로세스 실행
- Greenhouse, Ashby 등 ATS API를 직접 활용한 효율적인 데이터 수집
구직 활동은 탭 지옥입니다. 6개의 게시판을 열고, 똑같은 공고를 다시 읽으며, 그저 "AI 기반" 스티커를 붙인 피드 애그리게이터 (feed aggregators) 도구에 매달 30달러를 지불하곤 합니다.
그래서 저는 JobRadar를 만들었습니다. 이는 8개의 채용 소스를 동시에 검색하고, 사용자의 CPU에서 실행되는 로컬 LLM (Large Language Model)을 사용하여 모든 공고를 사용자의 프로필과 대조하여 점수를 매기는 CLI 도구입니다. API 키도, 구독도 필요 없으며, 이력서가 기기를 벗어날 일도 없습니다.
런칭 포스트에서는 '무엇(what)'을 다루었습니다. 이번 포스트에서는 '어떻게(how)'를 다룹니다.
파이프라인 (The pipeline)
전체 과정은 하나의 선형 파이프라인 (linear pipeline)입니다:
query + profile.yaml
│
▼
...
코드상에서 검색 단계는 다음과 같습니다:
from concurrent.futures import ThreadPoolExecutor, as_completed
def search_all(sources, query, limit, max_pages):
...
8개의 어댑터 (adapters), 하나의 인터페이스, 모두 병렬로 실행됩니다. 예전에는 탭을 옮겨 다니며 20분이 걸리던 쿼리 (query)가 이제 1분도 채 걸리지 않고 완료됩니다.
소스: 게시판 vs 직접적인 ATS
5개의 소스는 전형적인 채용 게시판 API (job board APIs)입니다:
- Remotive — 원격 근무 채용
- Arbeitnow — 전 세계 대상, 페이지네이션 (paginated) 지원
- RemoteOK — 원격 근무, 많은 물량
- Jobicy — 급여 데이터가 포함된 원격 근무
- Himalayas — 경력 수준(seniority levels)이 포함된 원격 근무
흥미로운 두 곳은 Greenhouse와 Ashby입니다. 이들은 수많은 기술 기업들이 사용하는 지원자 추적 시스템 (applicant tracking systems, ATS)이며, 공개된 채용 페이지 API를 가지고 있습니다. 인증(auth)도, 스크래핑 (scraping)도 필요 없습니다. 기업 슬러그 (company slug)를 사용하여 해당 채용 게시판 엔드포인트 (endpoint)에 요청을 보내기만 하면 됩니다:
class GreenhouseSearch(Source):
def search(self, query, limit, max_pages):
jobs = []
...
즉, JobRadar는 GitLab, Figma, Stripe, OpenAI, Anthropic, Linear와 같은 기업들의 채용 페이지에서 계정이나 API 키 없이 직접 직무를 가져옵니다. 기업 목록은 직접 편집할 수 있는 YAML 파일입니다:
greenhouse:
- gitlab
- figma
...
LinkedIn 스크래핑(scraping) 기능이 존재하지만, 기본적으로는 꺼져 있습니다 (off by default). 이는 수시로 깨지는 문서화되지 않은 HTML에 의존하며, LinkedIn의 서비스 약관(ToS)을 위반할 소지가 있기 때문입니다. 저는 서비스 약관 위반 리스크를 기본 경로에 포함시키기보다는, 해당 기능을 제외하고 트레이드오프(tradeoff)를 솔직하게 밝히는 쪽을 택했습니다.
평가 엔진: CPU에서 실행되는 1.7B 모델
이 부분은 사람들이 가장 많이 질문하는 대목입니다. 제가 발견한 다른 모든 도구들은 점수 산정을 위해 클라우드 API (Claude, OpenAI)를 사용합니다. 즉, 사용자의 이력서와 검색 기록이 타인의 서버로 전송되며, 토큰(token)당 비용을 지불해야 합니다. 반면 JobRadar는 Ollama 또는 llama.cpp를 통해 사용자의 로컬 머신에서 qwen3-1.7b (1.1 GB GGUF 파일)를 실행합니다.
평가기(rater)는 표준 포트를 스캔하여 실행 중인 로컬 LLM 서버를 자동으로 감지합니다:
_DEFAULT_PORTS = [
("http://localhost:11434", "Ollama"), # Ollama 기본값
("http://localhost:8080", "llama.cpp"), # llama.cpp 기본값
...
더 큰 모델이 설치되어 있다면 그것도 감지합니다. --llm-model qwen3:8b 옵션으로 모델을 변경할 수 있으며, 이 경우 속도를 희생하는 대신 더 똑똑한 점수 산정이 가능해집니다.
각 채용 공고는 기술 일치도(skills match), 경력 적합도(experience fit), 급여 적합도(salary fit), 원격 근무 적합도(remote fit)라는 네 가지 차원에 따라 0-100점 사이의 점수를 받습니다. 이때 모델의 추론(reasoning) 과정도 함께 기록되어, 왜 해당 공고가 특정 점수를 받았는지 확인할 수 있습니다. 평가 호출은 병렬로 실행되며 (기본값 3개, --max-concurrency로 조절 가능), 간혹 발생하는 잘못된 형식의 JSON 응답에 대비한 재시도 로직(retry logic)이 포함되어 있습니다.
솔직한 견해를 말씀드리자면, 1.7B 모델은 훌륭한 필터이지 예언자는 아닙니다. "이 공고는 Python을 언급하지만 실제로는 영업직이다"와 같은 내용은 안정적으로 잡아냅니다. 하지만 기업 문화에 대한 사용자의 직관(gut feel)까지 파악하지는 못하며, 그래서도 안 됩니다. 그것이 핵심입니다. 점수는 시작점일 뿐, 최종 판결이 아닙니다.
캐시(Cache): 동일한 공고를 다시 검토하지 마세요
채용 게시판은 동일한 공고를 끊임없이 다시 게시합니다. JobRadar는 7일간의 윈도우를 가진 이미 확인한 공고의 SQLite 데이터베이스(~/.jobradar/seen_jobs.db)를 유지하므로, 매 실행 시 새로운 공고만 노출합니다. 기간을 늘리려면 --cache-days 30을 사용하고, 모든 공고를 다시 보려면 --no-cache를 사용하세요.
대시보드: FastAPI + vanilla JS
CLI가 핵심이지만, 이를 보조하는 웹 대시보드도 있습니다. FastAPI 백엔드, SQLite 저장소, 그리고 칸반(Kanban) 파이프라인을 갖춘 다크 모드 SPA(Single Page Application)로 구성됩니다. 채용 공고는 '발견됨(Discovered) → 검토 중(Reviewing) → 지원 완료(Applied) → 면접 중(Interviewing)' 단계로 흐르며, 각 카드는 매칭 점수에 따라 색상으로 구분됩니다. 또한 LLM(대규모 언어 모델)의 점수 산정 과정을 실시간으로 보여주는 터미널 스타일의 활동 로그가 제공됩니다. 제품 전체가 터미널 우선(terminal-first)으로 설계되었기 때문에 터미널처럼 느껴집니다.
이 프로젝트를 구축하려는 사람에게 해주고 싶은 말
- 초기에 정규화(Normalize)하세요. 모든 소스는 서로 다른 형태를 반환합니다. 경계 지점에서 모든 데이터를 하나의
Job데이터 클래스(dataclass)로 매핑하면, 이후의 모든 단계가 단순해집니다. - 오프라인 상황을 고려하여 설계하세요. 로컬 LLM은 필터링을 수행하기에 충분히 빠릅니다. "클라우드 미사용, 비용 제로, 데이터 유출 없음"은 타협안이 아니라 진정으로 방어 가능한 제품의 포지셔닝입니다.
- 한계에 대해 솔직해지세요. README에는 명확히 명시되어 있습니다: AI는 가이드일 뿐, 의사 결정자가 아닙니다. 이러한 솔직함은 제가 해온 마케팅 중 가장 효과적이었습니다. 사람들은 과장하지 않는 도구에 반응합니다.
- 직접적인 ATS API의 가치를 과소평가하지 마세요. 채용 게시판 애그리게이터(Aggregator)는 저가 경쟁으로 치닫기 쉽지만, 기업들은 자체 ATS(채용 관리 시스템)를 통해 더 좋고 신선한 데이터를 게시합니다.
사용해 보기
curl -fsSL https://raw.githubusercontent.com/ANIRudH-lab-life/job-radar/main/setup.sh | bash
또는 소스 코드를 살펴보세요: https://github.com/ANIRudH-lab-life/job-radar
랜딩 페이지: https://anirudh-lab-life.github.io/job-radar/
MIT 라이선스입니다. Python, Rich, FastAPI, SQLite, 그리고 수많은 닫힌 탭들로 만들어졌습니다.
또한 다음 게시물로 발행되었습니다: the launch post
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기