이력서로 맞춤 채용공고를 추려주는 8B 소형 모델 '잡 서처' 해커톤서 공개
한 개발자가 허깅페이스 'Build Small' 해커톤 출품작으로 이력서 기반 채용공고 추천 도구 '잡 서처(Job Searcher)'를 공개했다. 이력서를 넣으면 검색 쿼리가 생성되는 과정과 공고별 평가 근거를 실시간으로 볼 수 있다.
동작은 세 단계로 이뤄진다. 먼저 모델이 이력서와 사용자가 설정한 선호(직종, 근무 형태, 위치, 자유 메모)를 읽고 링크드인에 맞는 검색 쿼리 몇 개를 추론 과정을 드러내며 작성한다.
이어 이 쿼리를 JobSpy를 통해 링크드인에서 하나씩 검색한다. 마지막으로 각 공고에 대해 이력서와 공고 쌍을 읽고 다섯 가지 차원으로 적합도 점수를 매긴다. 스킬 매칭, 경력 관련성, 학력·자격증, 산업·도메인 적합도, 시니어리티 정렬이다.
결과로 받는 것은 50개짜리 목록이 아니라 근거를 댈 수 있는 소수의 후보 명단이다. 모델이 왜 2위 공고가 3위보다 낫다고 보는지 그 이유를 읽을 수 있다.
기술적으로는 교사-학생 증류 구조를 썼다. 교사 모델은 DeepSeek V4 Pro로, 구조화된 추론에 강하고 정해진 출력 형식을 잘 따르며 대규모 말뭉치에 한 번 돌리기에 충분히 저렴해 라벨 생성기로만 쓰였다. 학생 모델은 Qwen3-8B로, Q4_K_M으로 양자화하면 단일 ZeroGPU 슬라이스에 들어갈 만큼 작으면서도 교사의 판단을 흡수할 만큼 크다.
말뭉치는 이력서를 중심으로 한 폐쇄 루프로 만들었다. Kaggle 이력서 데이터를 기반으로 이력서 2,500건을 준비하고, 교사가 각 이력서에서 링크드인용 쿼리를 먼저 작성했다. 그 쿼리로 JobSpy가 링크드인을 긁어 약 1만 건의 공고를 모았고, 교사가 모든 이력서-공고 쌍을 같은 다섯 차원으로 채점하며 차원마다 한 문장씩 이유를 달았다.
학습은 Modal에서 단일 A100으로 진행했다. 태스크별로 하나씩 두 번의 LoRA SFT를 돌렸으며, 어댑터는 랭크 16·알파 16에 드롭아웃을 끄고 어텐션과 MLP 프로젝션을 대상으로 했다. 각 태스크당 1에폭을 학습하고 200스텝마다 중간 체크포인트를 저장했다.
추론은 허깅페이스 ZeroGPU 스페이스에서 사전 빌드된 CUDA 휠과 함께 llama-cpp-python으로 돌린다. ZeroGPU가 호출마다 CUDA 컨텍스트를 재활용하기 때문에 모델 인스턴스를 GPU 호출 범위 안에서 만들고, 공고 단위가 아니라 제출 단위로 GPU를 한 번만 호출해 콜드 스타트를 줄였다. 응답은 토큰 단위로 화면에 흘러나오도록 스트리밍한다.
개발자는 두 가지 교훈을 남겼다. 쿼리 생성과 적합도 평가를 하나의 LoRA로 합쳤더니 쿼리 쪽엔 JSON이, 평가 쪽엔 산문이 새어 나와, 같은 베이스 위에 어댑터 두 개를 두고 호출마다 교체하자 이 문제가 사라졌다. 또 학생 모델의 크기보다 교사의 프롬프트가 더 중요했는데, '러스트 4년 경력인데 공고는 5년을 요구한다'처럼 이력서의 구체적 사실에 맞춰 채점하도록 교사 프롬프트를 고치자 그 습관이 증류를 통해 학생에게 전해졌다.