Product

매칭은 마법이 아닙니다. 5단계 파이프라인이죠.

RecruitMatch는 LLM, 임베딩, 그래프 정규화, 학습된 랭커를 조합한 결정론적 파이프라인입니다. 모든 점수는 추적 가능한 근거에서 비롯됩니다.

매칭 파이프라인 — JD 1건이 후보자 1,000명을 거치는 데 평균 1.2초

Live trace
Parse
LLM 추출
Normalize
Skill Graph
Embed
pgvector + HNSW
Score
4축 가중 + LightGBM
Explain
Evidence 링크
p50 latency 0.84s
p99 latency 2.30s
throughput 18k 매칭/분
uptime 99.98% (90d)
v2.14.0 · k8s · seoul-1, tokyo-1
STAGE 01

Parse — 어떤 포맷이든 구조화된 JSON으로

PDF · DOCX · URL · ATS API · 텍스트 붙여넣기 — 모든 입력을 동일한 스키마로 변환합니다.

LLM이 문서를 읽고 책임/요건/우대/스택/도메인을 추출. OCR 단계에서 표·헤더·푸터를 분리해 환각을 차단합니다.

추출된 필드는 사람이 검증할 수 있도록 원본 문서의 페이지·라인 좌표와 함께 저장됩니다.

PDF Layout-aware OCR (Tesseract + Donut)
120+ ATS 필드 매핑 (Greenhouse, Lever, Workday)
중요 필드 LLM self-consistency 3-pass 검증
PII 자동 마스킹 (개인정보보호법 준수)
resume_kim.pdf3 pages · 84 KB
RAW (텍스트)
Coupang (2021~) - 백엔드 개발자
- 카탈로그 서비스 개발
- 이벤트 처리
STRUCTURED JSON
{
  "company": "Coupang",
  "role": "Backend Eng.",
  "start": "2021-03",
  "page": 1
}
PDFDOCXURLGreenhouseLeverWorkday
Skill Graph · JVM neighborhood
JVMKotlinJavaScalaSpringKtorMicronaut
180k nodes420k edgescosine 0.84
STAGE 02

Normalize — 스킬과 직책의 의미를 동일화

Kotlin과 Java는 같은 JVM 패밀리. "Sr. Eng", "Senior", "L5"는 동일 레벨. 이러한 동치 관계를 RecruitMatch는 18만 노드의 스킬 그래프로 관리합니다.

도메인별 별칭, 약어, 버전 차이를 정규화하고, 신규 용어는 사용 빈도 임계를 넘으면 그래프에 자동 등재됩니다.

18만 노드 · 42만 엣지 스킬 그래프 (자체 큐레이션)
직책 레벨 정규화 (IC1~IC8, M1~M3)
버전 호환성 (React 16 ≈ React 17 ≈ React 18)
한국어/영어 양방향 매핑 ("쿠팡 ≈ Coupang")
STAGE 03

Embed — 의미 단위로 끊고 벡터화

JD의 모든 요건 문장과 이력서의 모든 경험 문장은 3,072차원 벡터로 변환되어 pgvector에 저장됩니다.

HNSW 인덱스로 1억 후보 풀에서 Top-1000을 8ms 안에 회수. 정확도와 속도의 trade-off는 테넌트별로 튜닝 가능합니다.

text-embedding-3-large · 3,072차원
pgvector + HNSW (m=16, ef_construction=64)
한국어 임베딩 도메인 적응 (in-house fine-tune)
문장 단위 청크 (sentence-bert 분리)
Embedding space · 3,072d → 2d UMAP
JD-2401 query
Backend Frontend DataHNSW · Top-1k in 8ms
Score breakdown · C-1207 × JD-2401
Skills35% · 94Experience25% · 92Domain20% · 88Culture10% · 78Logistics10% · 100
score = LightGBM(0.35·skills + 0.25·exp +
     0.20·domain + 0.10·culture + 0.10·log)
→ 96
STAGE 04

Score — 4축 가중 + LightGBM 랭커

하나의 점수가 아닙니다. Skills · Experience · Domain · Culture 4개 축을 각각 계산하고, 가중치는 JD 유형과 회사 피드백으로 학습됩니다.

최종 랭킹은 LightGBM 랭커가 4축 점수 + 메타 피처(연봉 fit, 위치, 비자)를 결합해 결정합니다. 모델은 매일 새 피드백으로 재학습됩니다.

Skills 35% · Experience 25% · Domain 20% · Culture 10% · Logistics 10%
LambdaMART 기반 LightGBM 랭커 (NDCG@10 최적화)
테넌트당 200+ 피드백 누적 시 전용 모델 활성
Hard filter: 위치·비자·연봉 범위
STAGE 05

Explain — 모든 점수는 근거를 갖습니다

JD의 어떤 문장이 이력서의 어떤 문장과 매칭되는지, span-level로 추적합니다. 클릭하면 양쪽 원본으로 점프.

Hallucination을 막기 위해 LLM 응답이 원본 텍스트에 anchor되어 있지 않으면 자동으로 폐기합니다. "추정" 표현은 회색으로 표시.

Span-pointer 기반 근거 링크 (양방향)
Anchor-required 정책 (근거 없는 주장 자동 차단)
강점 / 갭 / 면접질문 자동 제안
리크루터 피드백 → 다음 매칭에 반영
Evidence linking
JD-2401 · L23
Kafka 기반 이벤트 파이프라인을 설계하고 운영할 수 있어야 하며…
resume_kim.pdf · p2 · L8
Kafka 기반 이벤트 시스템을 3년간 운영. 14k QPS 트래픽을…
{
  "jd_span": [4, 24],
  "resume_span": [15, 31],
  "strength": 0.94,
  "anchored": true
}

Model Registry

RecruitMatch 내부에서 사용 중인 모델
All healthy
모델역할버전p50월 호출호스팅
gpt-4.1-nano문서 파싱 · AI Editor 다듬기v2025.040.42s8.2MOpenAI
text-embedding-3-large문장 임베딩 (3072d)v2025.0238ms92MOpenAI
ts-ranker-lgbm4축 점수 + 메타피처 랭커2.14.06ms420MSelf-hosted (k8s, seoul-1)
ts-bias-clfJD 편향 분류 (DistilBERT FT)1.8.212ms1.2MSelf-hosted (seoul-1)
ts-skill-graph스킬 정규화 그래프4.2.1< 1mspgvector + Postgres
ts-evidence-link근거 span 매핑 (SBERT FT)1.4.0180ms12MSelf-hosted
SOC 2 Type II
AICPA 표준 연 1회 감사. 보고서 요청 시 NDA 후 제공.
PII 마스킹
주민번호·전화·이메일은 추출 단계에서 hash 처리. 모델 학습에 미사용.
데이터 거주성
한국 테넌트 데이터는 ap-northeast-2(서울)에 격리 저장.
학습 옵트아웃
귀사 데이터로 공용 모델을 학습하지 않는 것이 기본값입니다.
삭제 권리
API 한 번으로 후보자/JD/매칭 로그 완전 삭제. 30일 grace 기간.
편향 모니터링
월 1회 인구통계학적 parity 리포트 자동 생성. 임계 초과 시 알림.