
지원하지 말라고 말해주는 AI 도구 만들기 — 그리고 그것이 왜 어려운 부분인지
요약
구직자가 자신에게 적합하지 않은 공고를 걸러낼 수 있도록 돕는 AI 도구 'Job Finder India' 개발 사례를 소개합니다. 단순 매칭을 넘어 이력서와 직무 기술서를 대조하여 지원 여부와 구체적인 근거를 제시하는 방식에 집중합니다.
핵심 포인트
- 단순 공고 나열이 아닌 '지원 금지' 결정을 내리는 차별화된 접근법
- 이력서 문구와 직무 요구사항을 대조하여 판단 근거를 명시하는 투명성
- 인도 시장의 특수성(CTC, LPA 등)을 반영한 로컬라이징 전략
- 표면적인 키워드 편향으로 인해 유능한 인재가 스스로를 탈락시키는 문제 해결
구직자들은 종종 두 가지 실수를 동시에 저지릅니다. 자신이 실제로 합격할 가능성이 없는 역할에 지원하는 것과, 자신에게 매우 적합한 역할임에도 조용히 건너뛰는 것입니다. 두 번째 실수는 비용이 많이 드는 실수입니다. 왜냐하면 그것은 눈에 보이지 않기 때문입니다. 사람들이 스스로 포기한 직업에 대해서는 아무도 알 수 없습니다.
저는 AI 도구를 만드는 사람이며, 이 문제는 정직하게 해결할 가치가 있는 문제라고 생각했습니다. 그래서 저는 무료 오픈 소스(open source)인 Job Finder India를 만들었습니다. 그리고 이 과정은 구직에 대해 배우기보다 AI를 안정적으로 출시(shipping)하는 법에 대해 훨씬 더 많은 것을 가르쳐 주었습니다.

아이디어: 더 긴 목록이 아닌, 결정
대부분의 "AI 직업 매칭 도구(AI job matchers)"는 사용자에게 더 많은 채용 공고를 제공합니다. 이미 압도된 상태에 있는 사람에게 그것은 도움이 되지 않는 것의 반대입니다. 저는 그 반대를 원했습니다. 가장 가치 있는 결과물이 **"이곳에는 지원하지 마세요, 그리고 그 이유는 정확히 이것입니다."**가 되는 도구 말입니다.
이 도구는 실제 인도의 채용 공고를 읽고, 각 공고를 이력서와 비교하여 증거에 기반한 판결 — 지원(APPLY), 도전(STRETCH), 또는 지원 금지(DON'T APPLY) — 을 반환합니다. 모든 판결은 이력서의 특정 문구와 직무 기술서(job description)의 특정 요구 사항을 대조하여 인용합니다. 블랙박스(black-box) 형태의 숫자는 없습니다. 만약 "지원하지 마세요"라고 말한다면, 잘못된 직무, 연차 불일치, 퇴사 통보 기간(notice-period) 충돌, 맞지 않는 위치 등 그 이유를 명시합니다.
이 도구는 의도적으로 인도 시장을 우선시했습니다. 숫지만 바꾼 서구식 템플릿이 아니라, CTC와 LPA, 퇴사 통보 기간, 그리고 인도 시장에 실제로 존재하는 역할들을 이해합니다.
포착할 가치가 있는 편향
여기 깊이 생각해 볼 만한 질문이 있습니다. 우리는 업무 자체가 아니라 단지 '단어' 하나 때문에 얼마나 자주 직업을 거절하고 있을까요?
낯선 도메인 전문 용어(jargon)가 가득한 채용 공고는, 그 역할의 핵심을 한 줄씩 읽어 내려갔을 때 누군가가 수년간 실제로 해온 일과 매우 일치하더라도 "나와는 맞지 않는 것"처럼 읽힙니다. 단 한 줄의 "8년 이상의 경력"이라는 문구는 "또는 그에 상응하는 경험"이라는 조항이 환영했을 수도 있는 지원 자격을 종료시켜 버립니다. 이것들은 표면적인 신호들이며, 유능한 후보자들이 다른 누군가에게 기회가 가기 전에 스스로를 탈락시키게 만듭니다.
이력서의 _실체(substance)_를 바탕으로 적합성을 점수화하고 그 근거를 보여주는 도구는 바로 그러한 격차를 드러냅니다. 이 도구의 조용한 가치는 '예'라고 답하는 직무에 있는 것이 아니라, 반사적인 '아니오'로부터 구해낸 적합도가 높은 역할들에 있습니다. 그것이 바로 이 도구가 존재하는 이유인 편향(bias)이며, 이를 구축하는 과정은 구직 활동의 상당 부분이 실제로 얼마나 단순한지, 즉 면밀히 읽는 대신 어휘에 대한 패턴 매칭(pattern-matching)에 불과한지를 상기시켜 주었습니다.
가장 중요했던 아키텍처 선택
겉으로 드러나지 않는 결정적인 선택은, 이 도구가 자체적인 AI를 탑재하지 않는다는 점이었습니다. 이 도구는 여러분이 이미 사용 중인 AI 코딩 어시스턴트 — Claude Code, GitHub Copilot, Codex — 내부에서 실행되며, 추론을 위해 해당 모델을 빌려옵니다. 결정론적인(Deterministic) Python이 배관 작업(데이터 가져오기, 필터링, 규칙 적용)을 수행하고, 모델이 판단을 내리며, 고정된 채점 루브릭(scoring rubric)이 양측이 따라야 할 법이 됩니다.
이 선택은 제가 가치 있게 여기게 된 세 가지 결과를 가져왔습니다. 첫째, 이력서가 사용자의 기기를 절대 떠나지 않습니다(서버 없음, 계정 없음, 데이터 수집 없음). 둘째, 특정 벤더에 종속되지 않고 다양한 AI 벤더 전반에서 작동합니다. 셋째, 사용자의 자체 모델 로그인을 사용하므로 도구가 사용자의 자격 증명(credentials)에 전혀 접근하지 않습니다.
실제로 시간을 잡아먹은 것: 명확하게 실패하게 만들기
점수 산정 방식은 초기에 잘 작동했습니다. 구축 과정에서 가장 많은 시간을 소비하게 만든 것은 더 미묘한 적이었던 **침묵하는 실패(silent failure)**였습니다. 정직함이 브랜드의 핵심인 도구에게 있어, 가장 큰 죄악은 틀리는 것이 아니라, 맞는 것처럼 보이면서 틀리는 것입니다. 저는 이 문제에 반복적으로 부딪혔고, 매번 같은 교훈을 얻었습니다:
- 성능이 낮은 모델(weak model)의 경우, 온보딩(onboarding) 과정에서 조용히 엉망인 프로필을 작성하고는 아무 문제가 없는 것처럼 계속 진행해 버립니다. 결과적으로 모든 후속 점수(downstream score)가 소리 없이 틀리게 됩니다. 저는 프로필 작성 기능을 모델의 손에서 분리하여, 잘못된 데이터로는 절대로 작업을 완료하지 않는 결정론적(deterministic) Python 코드로 옮겼습니다.
- 한 번은 모델이 점수 감점(scoring penalty)을 기록해 놓고는 이를 적용하지 않아, "적용하지 말 것" 목록에 있던 항목이 "적용할 가치가 있는" 목록으로 올라간 적이 있습니다. 저는 루브릭(rubric) 자체의 산술 연산을 강제하는 코드를 추가했습니다. 즉, 모델이 감점 요인을 _식별_하기만 하면, 모델이 직접 계산을 하든 안 하든 상관없이 감점이 반드시 적용되도록 했습니다.
- 네트워크가 없는 샌드박스(sandbox)에서의 실행 결과로 "찾은 작업 없음(0 jobs found)"이 반환되었습니다. 이는 정직하게 "일치하는 항목 없음"이라고 말하는 것과 구별할 수 없었습니다. 이제 시스템은 "탐색 실패: 채널에 도달할 수 없음"이라고 크게 알리고, 디스크의 파일이 오래되었다고 경고합니다.
관통하는 핵심 원칙은 이것입니다: 언어 모델(language model)에게 신뢰성 있게 수행하라고 요청하는 그 어떤 것이든, 성능이 낮은 모델은 때때로 이를 건너뛰고는 수행했다고 주장할 것입니다. 따라서 반드시 참이어야 하는 모든 것은 결정론적 코드(deterministic code)에 있어야 합니다. 모델은 판단을 위한 것이며, 보증(guarantees)은 Python에 존재합니다. 출시 전, 저는 조용히 성능을 저하시킬 수 있는 모든 남은 경로를 의도적으로 전수 조사하여 차단했습니다.
그리고 저는 코드가 해결할 수 없는 단 한 가지 사실에 대해 솔직하게 밝힙니다: 점수 품질(scoring quality)은 모델에 달려 있습니다. 유능한 모델은 실제 근거를 제시하고 정확하게 보정된(correctly-calibrated) 판결을 내리지만, 작은 무료 티어(free-tier) 모델은 평이하고 신뢰할 수 없는 판결을 내립니다. README에도 정확히 그 내용을 명시했습니다. 그렇지 않은 척하는 것은 문서상에서 발생하는, 앞서 말한 '조용히 틀리는 죄악'과 다를 바 없기 때문입니다.
이것이 하는 것과 하지 않는 것
이 도구는 자동으로 적용하지 않습니다. 봇을 차단하는 사이트를 스크래핑(scrape)하지 않습니다. 데이터를 수집하지 않습니다. 누군가의 기분을 좋게 만들기 위해 부적합한 결과를 부풀리지도 않습니다. 이것들은 누락된 기능이 아니라, 이 도구의 핵심 목적입니다.
이 도구는 실제 인프라와 함께 제공됩니다: 모든 변경 사항에 대해 게이트(gated)가 적용되는 테스트 스위트(test suite), 작업 소스 API의 변동이 생기면 저에게 이메일을 보내는 데일리 카나리(daily canary), 의존성 및 코드 스캐닝, 고정된 의존성(pinned dependencies) 등이 포함됩니다. 저는 주말용 데모가 아니라, 낯선 사람에게 맡겨도 신뢰할 수 있는 무언가를 만들고 싶었습니다.
만약 당신이 인도에서 구직 활동을 하고 있고 AI 코딩 어시스턴트 (AI coding assistant)를 사용한다면, 그것은 무료이며 오픈 소스 (open source)입니다. 직접 사용해 보시고 점수 산정이 어디서 틀리는지 저에게 알려주세요. 저는 바로 그 피드백을 향해 이 도구를 만들고 있습니다.
Repo: https://github.com/harshgarg95/job-finder-india
저는 복잡한 판단 문제 (judgment problems)부터 제품을 출시할 수 있게 만드는 지루한 신뢰성 작업 (reliability work)에 이르기까지, 이와 같은 AI 도구들을 엔드 투 엔드 (end to end)로 구축합니다. 만약 당신의 팀이 AI 아이디어를 실제로 출시 가능한 제품으로 만들고자 한다면, 언제든 대화의 문이 열려 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기