스마트 채용 검색 API 구축: FastAPI, LangChain, PostgreSQL, LLMs 활용

카테고리

프로그래밍/소프트웨어 개발

서브카테고리

웹 개발

대상자

- 개발자: 채용 플랫폼 또는 AI 기반 검색 API 개발에 관심 있는 웹 개발자

- 난이도: 중간 (FastAPI, LangChain, SQLAlchemy, LLMs 경험 필요)

핵심 요약

  • LLM 기반 자연어 검색: 사용자가 "remote senior developer jobs at a medium company in London with at least $100k salary"와 같은 자연어를 입력하면, LangChain + OpenAI를 사용해 구조화된 필터({"salary__gte":80000,"company_size":"medium","remote":true,"location":"Matthewshaven"})로 변환
  • 유연한 필터링 시스템: Django ORM 스타일의 salary__gte, title__ilike 신택스를 지원하며, company_size와 같은 비즈니스 용어를 자동으로 직무 필터 매핑
  • 모듈화된 아키텍처: SQLAlchemy + Alembic으로 ORM 모델 및 마이그레이션 관리, Pydantic을 통해 LLM 출력의 구조화된 JSON 검증

섹션별 세부 요약

1. 프로젝트 구성 요소

  • FastAPI: 웹 API 서버 역할, 빠른 개발 및 테스트 가능
  • PostgreSQL: Docker Compose를 통해 컨테이너화된 데이터베이스 활용
  • SQLAlchemy + Alembic: ORM 모델 정의 및 마이그레이션 자동화
  • LangChain + OpenAI: LLM 기반의 필터 생성 로직 구현
  • 모듈화 구조: 유지보수성을 위한 코드 분리

2. `/jobs-ai-search` 엔드포인트

  • 자연어 검색 지원: 사용자가 "medium size company remote in Matthewshaven"과 같은 문장을 입력하면, LLM이 이를 {"company_size":"medium","remote":true,"location":"Matthewshaven"}과 같은 JSON 필터로 변환
  • LLM 연동 로직: ChatGPT를 사용해 자연어 쿼리를 JSON 필터로 변환, Pydantic을 통해 구조화된 출력 검증
  • 예제 요청: GET /jobs-ai-search?filter=at least $80000 medium size company remote in Matthewshaven

3. 필터 매핑 및 처리

  • 회사 규모 매핑: "medium" → 51-250명 직원 범위 자동 매핑, 사용자에게 투명한 편의성 제공
  • SQLAlchemy 필터 변환: Django 스타일 salary__gte 신택스를 col >= value와 같은 SQLAlchemy 표현식으로 변환
  • 쿼리 실행: get_llm_job_filtersquery_dict_to_sqlalchemySQLAlchemy 쿼리 실행 및 결과 반환

4. 응답 형식 및 확장성

  • API 응답 예시:

```json

{"total":12,"next_page":"/jobs-ai-search?skip=10&limit=10&filter=...","prev_page":null,"results":[{"id":1,"title":"Software Engineer","company":"Acme Corp","salary":90000,"remote":true,"location":"Matthewshaven"}]}

```

  • 확장성: 새로운 필드, 연산자, 엔티티 유형 추가 시 핵심 로직 변경 없이 구현 가능

결론

  • 핵심 팁: LLM을 활용해 사용자 의도를 구조화된 필터로 변환함으로써 자연어 검색의 직관성과 정확성을 동시에 확보할 수 있음. Pydantic을 사용한 JSON 검증과 SQLAlchemy 필터 변환 로직은 확장성과 안정성을 보장함.
  • 실무 적용: FastAPI + LangChain + OpenAI + PostgreSQL 스택을 기반으로 한 채용 검색 API는 사용자 친화적인 검색 경험과 동시에 유지보수성을 높이는 데 효과적임.