HireFlow Agent 구축하기: Qwen Cloud 기반의 자율 채용 에이전트
요약
Qwen Cloud를 활용하여 ML 모델의 점수와 LLM의 추론을 결합한 자율 채용 에이전트 'HireFlow Agent' 구축 과정을 다룹니다. 단순 키워드 매칭의 한계를 극복하기 위해 Random Forest와 Qwen의 추론 레이어를 결합하여 신뢰도 높은 채용 필터링 시스템을 구현했습니다.
핵심 포인트
- ML의 빠른 점수 산출과 LLM의 추론 레이어를 결합한 하이브리드 구조
- 모델의 판단이 모호할 경우 사람에게 검토를 요청하는 폴백(Fallback) 설계
- OpenAI 호환 엔드포인트를 활용한 Qwen 모델의 손쉬운 통합 방법
- 안정적인 출력을 위한 시스템 프롬프트 작성 및 JSON 파싱 최적화
- 에이전트 엔지니어링의 핵심은 프롬프트보다 가드레일과 주변 로직에 있음
지난 며칠 동안 저는 Qwen Cloud와 함께하는 Global AI Hackathon Series를 위해 HireFlow Agent를 구축하며 이력서, 버그, 그리고 API 문서 속에 파묻혀 지냈습니다.
채용 도구를 고민하면서 계속 마주쳤던 문제는 다음과 같습니다. 대부분의 시스템은 키워드 매칭 알고리즘을 맹목적으로 신뢰하거나, 채용 담당자가 모든 이력서를 일일이 수동으로 읽게 만듭니다. 둘 다 좋지 않습니다. 높은 점수를 받았더라도 실제 잠재력이 있는 커리어 전환자를 놓칠 수 있고, 낮은 점수를 받았더라도 ATS(채용 관리 시스템)를 속이는 법만 아는 사람이 통과될 수 있기 때문입니다. 그래서 저는 두 가지 역할을 동시에 수행하는 무언가를 만들고 싶었습니다. 즉, 빠른 ML(머신러닝) 필터 기능과, 무언가 앞뒤가 맞지 않을 때 필터에 의문을 제기하는 추론 레이어(reasoning layer)를 결합하는 것이었습니다.
그것이 바로 HireFlow Agent가 되었습니다. 이 에이전트는 이력서와 직무 기술서(job description)를 가져와 Random Forest 모델을 통해 빠른 적합도 점수(fit score)를 산출한 다음, 점수와 이력서 모두를 Qwen에게 전달합니다. Qwen은 단순히 점수를 승인하는 것에 그치지 않습니다. 이력서 자체를 읽고 ML 점수와 일치하는지 확인한 후, 최종적으로 'Shortlist(서류 통과)', 'Reject(탈락)', 또는 'Send to a human(사람에게 전달)' 중 하나를 결정합니다. 저에게 가장 중요한 것은 마지막 옵션입니다. 만약 모델과 점수가 일치하지 않거나, 탄탄한 오픈 소스 작업이나 비전통적인 배경처럼 숫자가 포착할 수 없는 무언가가 이력서에 있다면, 모델은 추측하지 않습니다. 대신 사람이 검토할 수 있도록 플래그(flag)를 표시합니다.
Qwen을 연결하는 것은 사실 쉬운 부분이었습니다. Alibaba Cloud Model Studio가 OpenAI 호환 엔드포인트를 제공하기 때문에, 기존 OpenAI 클라이언트를 다른 베이스 URL(base URL)로 지정하고 모델 이름을 qwen-plus로 바꾸는 것만으로 통합이 거의 완료되었습니다. 더 어려웠던 부분은 출력을 신뢰할 수 있을 만큼 안정적으로 만드는 것이었습니다. 답변하기 전에 단계별로 추론 과정을 거치도록 시스템 프롬프트(system prompt)를 작성해야 했고, Qwen이 때때로 JSON을 마크다운 코드 펜스(markdown code fences)로 감싸는 경우가 있다는 것을 빠르게 학습하여 파싱(parsing) 전에 작은 정리 단계를 추가했습니다.
제가 가장 짜증 났으면서도 (내심 뿌듯했던) 해결한 버그는 이것입니다. 어느 시점에는 제가 업로드하는 모든 이력서의 지원자 이름이 "%pdf-1.5"로 반환되었습니다. 이를 본 적이 없으시다면 말씀드리자면, 이는 말 그대로 모든 PDF 파일의 로우 바이너리 데이터 (raw binary data)의 첫 번째 줄입니다. 제 파서 (parser)가 파일에서 실제로 콘텐츠를 추출하는 대신 파일을 일반 텍스트 (plain text)로 읽고 있었던 것입니다. 버퍼 (buffer)가 실제 PDF 파서 (parser)를 전혀 거치지 않고 있었다는 사실을 깨닫기까지 약간의 조사가 필요했습니다. 적절한 텍스트 추출 (text extraction) 기능을 연결하고, 쓰레기 값을 조용히 반환하는 대신 명확하게 오류를 발생시키는 체크 로직을 추가하자, 제 이력서로 테스트했을 때 제 이름이 포함된 실제 이름들이 나타나기 시작했습니다.
이 프로젝트를 통해 제가 다시 한번 확인한 것이 있다면, "AI 에이전트 (AI agent)"에서 흥미로운 엔지니어링 (engineering)은 대개 프롬프트 (prompt)가 아니라 그 주변의 모든 것이라는 점입니다. 가드레일 (guardrails), 폴백 경로 (fallback paths), 그리고 모델이 최종 결정을 내려서는 안 된다고 판단하는 순간들 말입니다. 그것이 바로 무언가를 단순한 추가 단계가 있는 API 호출 (API call)이 아닌, 진정한 에이전트 (agent)처럼 느껴지게 만드는 요소입니다.
다음 단계: 백엔드 (backend)를 Alibaba Cloud 인프라스트럭처 (infrastructure) 상에서 엔드 투 엔드 (end to end)로 완전히 구동하고, 단순히 시간대를 제안하는 대신 실제 캘린더 스케줄링 (calendar scheduling)을 연결하며, 궁극적으로 "사람의 검토 (human review)" 케이스에 대한 채용 담당자의 재량권 (overrides)이 ML 모델 (ML model)의 재학습 (retraining)으로 피드백되도록 만들고 싶습니다.
라이브 체험하기: https://hireflow-agent.onrender.com
코드: https://github.com/PitendraKumarsahoo/candidateforge
Qwen Cloud와 함께하는 Global AI Hackathon Series를 위해 제작되었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기