공공기관 채용공고를 ALIO API로 자동 수집하고, 원문 태그를 바탕으로 Facet Wiki로 구조화하며, 사용자 프로필과 단계형 분류 선택을 거쳐 최종 매칭하는 파이프라인입니다.
job_career 매칭 엔진은 단일 LLM으로 핵심 의도 키워드를 추출한 뒤, 나머지 후보 수집·가중치 계산·정렬·최종 추천은 전부 Python 코드로 처리합니다. 현재 구조에서는 crewai가 필요하지 않습니다.
job_wiki/
├── job_raw/ # Step 1: 수집 + 원문 저장
│ ├── scripts/
│ │ ├── main.py # 배치 실행기
│ │ └── harvester.py # 수집 → 저장
│ ├── fetcher.py # ALIO API 호출
│ ├── formatter.py # 마크다운 렌더링
│ ├── writer.py # 파일 저장 + 인덱싱
│ ├── utils.py # 유틸리티 (파일명 생성, ID 추출)
│ ├── 00_Raw/ # 단일 진실 공급원
│ │ ├── index.json # ALIO ID → 파일명 매핑
│ │ ├── json_archive/ # 원본 JSON 아카이브
│ │ └── *.md # 마크다운 채용공고
│ └── docs/README.md # 상세 기술 문서
│
├── job_wiki/ # Obsidian 지식 그래프 (최종 Wiki 출력물)
│ ├── 00_Raw → ../job_raw/00_Raw/ # 심볼릭 링크
│ ├── 10_Wiki/
│ │ └── Facets/ # 2차 분류 허브
│ ├── 20_Meta/
│ │ └── Facet_Index.json # facet 색인
│ └── .obsidian/ # Obsidian 설정
│
├── job_career/ # UI / 매칭 엔진
│ ├── server.py # 웹 서버
│ ├── frontend/ # HTML/JS/CSS 대시보드
│ └── src/career_agent/
│ ├── pipeline.py # 단계형 매칭 파이프라인
│ ├── llm_client.py # LLM 키워드 추출 클라이언트
│ ├── main_batch.py # 배치 실행
│ └── tools/
│ └── custom_tool.py # Wiki/raw 조회 도구
│
└── .github/workflows/
└── harvest.yml # CI/CD: 주간 자동 수집 + 정리 + Wiki 변환
| 항목 | 상태 |
|---|---|
| 수집된 공고 | ✅ |
| JSON 아카이브 | ✅ |
| 00_Raw 마크다운 | ✅ |
| Facet Wiki | ✅ |
| Facet_Index | ✅ |
| CI/CD workflow | ✅ 매주 월 09:00 KST |
fetcher.py가 ALIO 공공데이터 API에서 채용공고 목록 수집- 원문 필드(
ncsCdNmLst,hireTypeNmLst,recrutSeNm,acbgCondNmLst,workRgnNmLst,aplyQlfcCn,prefCondCn,prefCn,scrnprcdrMthdExpln)를 그대로 보존 - 결과:
00_Raw/{날짜}_{ID}_{회사}_{제목}.md+json_archive/에 원본 저장
00_Raw/index.json과json_archive/를 읽어10_Wiki/Facets/에 2차 분류 허브 생성Facet_Index.json업데이트
- 1단계: LLM이
core_keywords,support_keywords,follow_up_keywords를 분리해 추출 - 2단계: core 6배, support 3배, follow-up 1배로 가중치를 반영해 후보 기관을 좁힘
- 3단계: 1~5개 후보면 follow-up 없이 바로 추천하고, 6개 이상일 때만 추가 분류를 적용
- 1차 분석에서는 추천을 숨기고 follow-up 질문만 표시
- 최종 판단과 정렬은 Python이 담당하며, raw weighted score 기준으로 상위 5개만 보여줌
- 핵심 분류는 원문 필드를 그대로 사용합니다.
ncsCdNmLst,hireTypeNmLst,recrutSeNm,acbgCondNmLst,workRgnNmLst,aplyQlfcCn,prefCondCn,prefCn,scrnprcdrMthdExpln을 2차 분류 축으로 사용합니다.job_career는 LLM으로 핵심 의도 키워드를 추출하고, 최종 추천은 Python 규칙/점수화로만 산출합니다.
# 1. Python venv
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pip install -r job_raw/requirements.txt
pip install -e ./job_career
# 2. 환경변수 설정 (선택)
export ALIO_API_KEY="..." # 실제 ALIO API 수집용
# 3. 수집 실행 (모의 데이터)
python job_raw/scripts/main.py --days 7
# 4. Wiki 변환
python job_core/scripts/wiki_generator.py
# 5. 웹 UI
python job_career/server.py
- 루트
requirements.txt는 공용 수집용 패키지(requests)를 담고 있습니다. job_raw/requirements.txt는 수집기 실행용 패키지를 담고 있습니다.job_career/pyproject.toml은 웹 UI와 매칭 엔진의 런타임 의존성을 담고 있습니다.- 현재
job_career런타임 의존성에는crewai가 포함되지 않습니다. 도구 클래스는 로컬 최소 구현으로 동작합니다.
매주 월요일 09:00 KST 자동 실행:
- 만료 공고 정리 (
job_core/scripts/cleanup_expired.py) - 채용공고 수집 (
job_raw/scripts/main.py) - Wiki 변환 (
job_core/scripts/wiki_generator.py) - 변경사항 커밋 및 푸시
| Secret | 용도 | 필수 |
|---|---|---|
ALIO_API_KEY |
실제 ALIO API 호출 | 수집 시 필수 |
GROQ_API_KEY |
LLM 실험용 | 선택 |
OPENAI_API_KEY |
LLM 실험용 | 선택 |
NVIDIA_API_KEY |
LLM 실험용 | 선택 |
-
save_markdown() 무한 스킵 버그 —
save_markdown()이 실제 파일 존재 여부를 기준으로 건너뛰도록 수정. -
raw.list 데이터 구조 불일치 — ALIO API의 raw 데이터가
{"list": {...}, ...}형태여도 저장·렌더가 동작하도록 fallback 로직 추가. -
Facet Wiki 추가 — 원문 태그를 기반으로 2차 분류 허브를 생성하도록 변경.
-
단계형 추천 흐름 — 초기 분석에서는 추천을 숨기고, 확정되지 않은 분류를 선택한 뒤 최종 추천을 반환하도록 변경.
-
워크플로우 정리 — GitHub Actions가 현재
job_raw/job_core수집 구조를 직접 호출하도록 조정.
Private — khmo31