You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
자연어 기반 채용공고 검색을 위해 슬롯 추출, 정규화, 크롤링, 하이브리드 검색, 응답 생성을 결합한 AI 채용 검색 시스템입니다.
2. 해결하려는 문제
일반적인 채용 검색은 백엔드, 서울, 신입처럼 키워드를 직접 조합해야 하고, 여러 조건이 섞인 자연어 요청을 안정적으로 반영하기 어렵습니다. 실제 사용자는 서울 백엔드 신입 대졸 채용공고 찾아줘처럼 지역, 직무, 경력, 학력 조건을 한 문장으로 입력하기 때문에, 단순 키워드 검색만으로는 원하는 공고를 빠르게 찾기 어렵습니다.
이 프로젝트는 자연어 질의를 그대로 받되, 내부적으로는 지역 / 직무 / 경력 / 학력 슬롯으로 구조화하고, 이를 실제 검색 URL과 공고 수집 파이프라인에 연결해 조건에 맞는 공고를 추천합니다. 구현 자체보다도, 얼마나 동작하는지, 왜 이 구조를 선택했는지, 운영 시 어떤 문제가 있었고 어떻게 개선했는지까지 보이도록 설계와 평가를 함께 정리했습니다.
3. 핵심 기능
자연어 질의에서 지역 / 직무 / 경력 / 학력 슬롯 추출
동의어 사전 기반 슬롯 정규화와 누락 정보 안내
정규화된 슬롯을 사람인 검색 URL로 변환
view-ajax 기반 상세 공고 수집과 교육성 공고 필터링
공고 제목, 요약, 상세, 지원 방법, 기업 정보, 복리후생, 지원자 통계 파싱
BM25 + 임베딩 기반 하이브리드 검색으로 상위 공고 선별
상위 결과를 바탕으로 최종 추천 응답 생성
동기 POST /query API와 비동기 Job Polling API 제공
진행 상태를 queued -> running -> done / failed와 단계 라벨로 노출
사용자 흐름
사용자 입력 -> 슬롯 추출 -> 슬롯 정규화 -> 정보 부족 시 incomplete 종료 -> URL 매핑 -> 공고 수집 -> 공고 파싱 -> 하이브리드 검색 -> 최종 응답 생성
4. 시스템 아키텍처
LangGraph 파이프라인
현재 실제 LangGraph 흐름은 아래와 같습니다.
단계별 구조
노드
역할
핵심 출력
요청 접수
사용자 요청이 들어와 전체 워크플로우를 시작함
요청 접수 이벤트
LLM 인스턴스 준비
이후 단계들이 공통으로 사용할 LLM 인스턴스 또는 추론 컨텍스트를 준비함
초기화된 모델 객체 / 실행 컨텍스트
질문에서 조건 추출
사용자 질문에서 회사명, 직무, 지역, 경력, 기술스택 같은 조건을 추출함
추출된 조건 엔티티
조건 해석 및 정규화
추출된 조건을 표준 형식으로 정리하고, 모호한 표현을 해석하며, 정보 부족 여부를 판정함
정규화된 검색 조건 또는 추가 정보 필요 상태
대상 공고 URL 결정
정규화된 조건을 바탕으로 직접 조회할 대상 공고 URL 또는 소스 경로를 결정함
대상 공고 URL
공고 페이지 수집
결정된 URL의 채용 공고 페이지를 실제로 수집함
원본 HTML 문서
공고 핵심 정보 추출
HTML에서 직무명, 회사명, 위치, 요구사항, 우대사항, 마감일 등 핵심 정보를 구조화함
구조화된 공고 정보
관련 공고 통합 검색
추출된 공고 정보를 기준으로 유사 공고나 관련 공고를 통합 검색함
관련 공고 목록 / 랭킹 결과
사용자 답변 생성
원 공고 정보와 관련 공고 검색 결과를 종합해 사용자에게 보여줄 답변을 만듦
최종 사용자 응답 텍스트
처리 종료
정상 종료 또는 추가 정보 부족에 따른 조기 종료를 처리함
처리 종료 상태
설계 의사결정
설계 선택
이유
LangGraph 사용
검색 플로우가 단순 함수 호출이 아니라 정상 검색과 정보 부족 종료 분기를 갖기 때문에, 파이프라인과 상태 전이를 명시적으로 관리하기 위해 선택했습니다.
node / state / tools 분리
오케스트레이션, 상태 계약, 도메인 로직을 분리해 유지보수성과 확장성을 높였습니다.
OpenAI 경로 + 로컬 fallback 유지
운영 환경과 실험 환경을 모두 고려해 OpenAI structured output 경로와 로컬 모델 경로를 함께 유지했습니다.
비동기 Job Polling 구조 도입
장시간 동기 요청으로 인한 타임아웃과 사용자 대기 문제를 줄이기 위해 /query/jobs 기반 비동기 흐름을 추가했습니다.
view-ajax 기반 수집
raw HTML만으로는 상세 공고 핵심 정보가 누락되는 문제가 있어, 브라우저 전체 렌더링보다 가벼우면서도 정확도를 유지할 수 있는 view-ajax 수집 방식으로 전환했습니다.
추천 공고 1건 고정
최종 응답이 여러 공고를 애매하게 섞는 문제를 줄이기 위해, 리트리버 1위 공고를 기준으로 추천 대상을 고정했습니다.