AI 기반 취업상담 완전 자동화: 채용정보 수집부터 SMS 발송까지 무인 시스템 구축

📝 지피터스 사례 게시글: 취업상담 AI 자동화 시스템



소개

🎯 시도하고자 했던 것

취업상담센터의 반복 업무를 AI로 완전 자동화하고 싶었습니다.

기존에는 취업상담사가 직접:

  1. 여러 채용 사이트를 매일 확인 (워크넷, 사람인, 잡코리아)

  2. 구직자별로 적합한 공고를 찾아서

  3. 일일이 문자로 안내

이 모든 과정이 하루 2-3시간씩 소요되었고, 상담사의 주관이 개입되어 공정성 문제도 있었습니다.

💡 왜 만들었나요?

Pain Points:

  • 📋 채용정보 탐색 비효율: 여러 플랫폼을 수동으로 검색

  • 😫 상담사 수작업 구조: 반복 업무로 핵심 상담에 집중 못함

  • 🎯 맞춤 연계 한계: 구직자별 적합 공고 발굴 어려움

  • 안내 지연 문제: 상담 후 정보 전달 시차 발생 (1-3일)

목표:

채용정보 수집 → AI 매칭 → SMS 발송
모든 과정을 30초 간격으로 자동 실행!

진행 방법

🛠️ 사용 도구

도구

용도

비용

Claude API

AI 매칭 분석

월 1-2만원

Google Sheets

구직자 정보 관리

무료

Python

자동화 스크립트

무료

워크넷 API

공공 채용정보 수집

무료

사람인/잡코리아 RSS

민간 채용정보 수집

무료

알리고 SMS

문자 발송

월 1만원


📊 전체 시스템 구조

┌─────────────────────────────────────────┐
│         1. 대면 상담 (구직자)            │
│  상담사가 1:1 상담 후 PC로 정보 입력     │
└─────────────────────────────────────────┘
                  ↓
┌─────────────────────────────────────────┐
│       2. 구글 시트 (데이터 허브)         │
│  이름, 희망직종, 지역, 조건, 전화번호    │
└─────────────────────────────────────────┘
                  ↓
┌─────────────────────────────────────────┐
│     3. 채용정보 자동 수집 (30초마다)     │
│  워크넷 API + 사람인 RSS + 잡코리아 RSS  │
└─────────────────────────────────────────┘
                  ↓
┌─────────────────────────────────────────┐
│        4. SQLite DB 자동 저장            │
│  jobs.db에 중복 제거하여 저장           │
└─────────────────────────────────────────┘
                  ↓
┌─────────────────────────────────────────┐
│      5. AI 스마트 매칭 (Claude API)      │
│  구직자 조건 ↔ 채용공고 적합도 분석      │
└─────────────────────────────────────────┘
                  ↓
┌─────────────────────────────────────────┐
│        6. SMS 자동 발송 (알리고)         │
│  매칭된 공고를 구직자에게 즉시 전송      │
└─────────────────────────────────────────┘

💻 핵심 코드

1. 채용정보 자동 수집 (워크넷 API)

import requests
from datetime import datetime

class WorkNetCollector:
    """워크넷 API로 채용정보 수집"""
    
    def __init__(self, api_key):
        self.api_key = api_key
        self.base_url = "http://openapi.work.go.kr/opi/opi/opia/jobSrch.do"
    
    def collect_jobs(self, keyword="", region=""):
        """채용공고 수집"""
        params = {
            'authKey': self.api_key,
            'returnType': 'XML',
            'keywords': keyword,
            'region': region,
            'startPage': 1,
            'display': 100
        }
        
        response = requests.get(self.base_url, params=params)
        
        if response.status_code == 200:
            # XML 파싱 후 저장
            jobs = self.parse_xml(response.content)
            return jobs
        
        return []

2. AI 매칭 프롬프트

MATCHING_PROMPT = """
당신은 취업상담 전문가입니다.
구직자와 채용공고의 적합도를 분석하세요.

## 구직자 정보
- 이름: {name}
- 희망 직종: {job_type}
- 희망 지역: {region}
- 희망 조건: {conditions}
- 자격증: {certificates}

## 채용 공고
- 회사명: {company}
- 직무: {position}
- 지역: {location}
- 급여: {salary}
- 자격요건: {requirements}

## 분석 항목
1. 적합도 점수 (0-100점)
2. 적합 이유 (3가지)
3. 부족한 부분 (있다면)
4. 추천 여부 (YES/NO)

JSON 형식으로 응답:
{{
  "score": 85,
  "match_reasons": ["직무 일치", "지역 근접", "급여 적정"],
  "concerns": ["경력 부족"],
  "recommend": "YES"
}}
"""

3. AI 매칭 엔진

from anthropic import Anthropic

class AIJobMatcher:
    """Claude AI로 구직자-공고 매칭"""
    
    def __init__(self, api_key):
        self.client = Anthropic(api_key=api_key)
        self.model = "claude-sonnet-4-20250514"
    
    def match(self, jobseeker, job_posting):
        """적합도 분석"""
        prompt = MATCHING_PROMPT.format(
            name=jobseeker['name'],
            job_type=jobseeker['job_type'],
            region=jobseeker['region'],
            conditions=jobseeker['conditions'],
            certificates=jobseeker['certificates'],
            company=job_posting['company'],
            position=job_posting['position'],
            location=job_posting['location'],
            salary=job_posting['salary'],
            requirements=job_posting['requirements']
        )
        
        response = self.client.messages.create(
            model=self.model,
            max_tokens=1500,
            temperature=0.3,
            messages=[{"role": "user", "content": prompt}]
        )
        
        result = response.content[0].text
        
        # JSON 파싱
        import json
        analysis = json.loads(result)
        
        return analysis

4. 자동 발송 메인 루프

import time

def main():
    """취업상담 자동화 메인 프로그램"""
    
    # 초기화
    google_sheet = GoogleSheetsCollector(SHEET_ID)
    worknet = WorkNetCollector(WORKNET_API_KEY)
    saramin = SaraminRSSCollector()
    jobkorea = JobKoreaRSSCollector()
    matcher = AIJobMatcher(CLAUDE_API_KEY)
    sms = SMSSender(ALIGO_API_KEY, ALIGO_USER_ID)
    
    print("✅ 취업상담 자동화 시작")
    print("30초마다 새 채용공고를 확인하고 매칭합니다.\n")
    
    while True:
        try:
            # 1. 구직자 목록 가져오기
            jobseekers = google_sheet.get_jobseekers()
            
            # 2. 채용정보 수집
            jobs = []
            jobs.extend(worknet.collect_jobs())
            jobs.extend(saramin.collect_jobs())
            jobs.extend(jobkorea.collect_jobs())
            
            print(f"📋 수집된 채용공고: {len(jobs)}건")
            
            # 3. 각 구직자별 매칭
            for jobseeker in jobseekers:
                matched_jobs = []
                
                for job in jobs:
                    # AI 매칭 분석
                    analysis = matcher.match(jobseeker, job)
                    
                    # 적합도 70점 이상이고 추천인 경우
                    if analysis['score'] >= 70 and analysis['recommend'] == 'YES':
                        matched_jobs.append({
                            'job': job,
                            'analysis': analysis
                        })
                
                # 4. SMS 발송 (최대 3개)
                if matched_jobs:
                    top_matches = sorted(
                        matched_jobs, 
                        key=lambda x: x['analysis']['score'], 
                        reverse=True
                    )[:3]
                    
                    # 메시지 생성
                    message = create_job_message(
                        jobseeker['name'],
                        top_matches
                    )
                    
                    # SMS 발송
                    sms.send(
                        jobseeker['phone'],
                        jobseeker['name'],
                        message
                    )
                    
                    print(f"✅ {jobseeker['name']}: {len(top_matches)}건 발송")
            
            # 30초 대기
            time.sleep(30)
            
        except KeyboardInterrupt:
            print("\n프로그램 종료")
            break
        except Exception as e:
            print(f"오류: {e}")
            time.sleep(30)


if __name__ == "__main__":
    main()

📱 발송 메시지 예시

[대한취업지원센터]

김철수님, 안녕하세요!

맞춤 채용공고 3건을 안내드립니다.

1. ⭐ 적합도 92점
   회사: (주)테크솔루션
   직무: 사무행정
   지역: 서울 강남구
   급여: 월 250만원
   
2. 적합도 85점
   회사: 한국전자
   직무: 생산관리
   ...

자세한 내용은 워크넷에서 확인하세요.

📞 문의: 02-1234-5678

🎨 시스템 화면 캡처

1. 구글 시트 (구직자 관리)

이름 | 희망직종 | 지역 | 연락처 | 마지막발송 | 발송횟수
김철수 | 사무행정 | 서울 | 010-1234-5678 | 2026-02-01 | 5
이영희 | 요양보호사 | 경기 수원 | 010-9876-5432 | 2026-02-01 | 3

2. 채용 DB (jobs.db)

CREATE TABLE jobs (
    id INTEGER PRIMARY KEY,
    source TEXT,           -- 워크넷/사람인/잡코리아
    company TEXT,          -- 회사명
    position TEXT,         -- 직무
    location TEXT,         -- 지역
    salary TEXT,           -- 급여
    requirements TEXT,     -- 자격요건
    url TEXT,              -- 공고 URL
    collected_at DATETIME  -- 수집 시각
);

3. 발송 로그

======================================================================
발송 시각: 2026-02-01 14:30:25
수신자: 김철수 (010-1234-5678)
상태: success
메시지 ID: 1260222884

메시지:
[대한취업지원센터]
김철수님, 안녕하세요!
맞춤 채용공고 3건을 안내드립니다...
======================================================================

결과와 배운 점

🎉 성과

정량적 결과:

업무 시간: 하루 3시간 → 10분 (95% 감소)
매칭 정확도: 주관적 → AI 기반 객관적 평가
응답 속도: 1-3일 → 실시간 (30초)
발송 비용: 월 3만원 (SMS 100건 기준)

정성적 효과:

  • ✅ 상담사가 핵심 업무(1:1 심층 상담)에 집중 가능

  • ✅ 모든 구직자에게 동일한 기회 제공 (공정성 확보)

  • ✅ 24시간 자동 운영으로 신규 공고 즉시 안내

  • ✅ 데이터 기반 취업 지원 가능


💡 나만의 꿀팁

1. 채용정보 수집 주기는 30초가 적절

너무 짧으면: API 호출 제한 & 비용 증가
너무 길면: 신규 공고 놓침

30초 = 실시간성 + 안정성 균형

2. AI 매칭 프롬프트에 예시 포함

# Bad: 막연한 요청
"구직자와 공고가 맞는지 알려줘"

# Good: 구체적 기준 + 예시
"적합도를 0-100점으로 평가하되,
직무 일치: 40점
지역 일치: 30점
급여 적정: 20점
자격요건 충족: 10점
기준으로 계산하세요."

3. RSS는 파싱 실패 대비 필수

try:
    jobs = saramin.collect_jobs()
except Exception as e:
    print(f"사람인 수집 실패: {e}")
    jobs = []  # 빈 리스트로 계속 진행

4. DB 중복 체크로 SMS 낭비 방지

# 이미 발송한 공고는 재발송 안 함
if db.is_already_sent(jobseeker_id, job_id):
    continue

🚧 시행착오

문제 1: 워크넷 API XML 파싱 복잡함

해결: BeautifulSoup으로 간단히 처리

문제 2: AI 매칭 속도 느림

문제: 구직자 10명 × 공고 100개 = 1000번 API 호출 (비용 폭증)
해결: 
1. 지역/직종으로 1차 필터링 (90% 제거)
2. 남은 것만 AI 매칭 (10개)
→ 100배 비용 절감!

문제 3: 같은 공고 중복 수집

해결: DB에 UNIQUE 제약조건 추가
CREATE UNIQUE INDEX idx_job_url ON jobs(url);

문제 4: SMS 발송 실패 시 재시도 없음

해결: 발송 상태 DB 기록 + 재시도 로직

❓ 도움 필요한 부분

1. 카카오 알림톡 전환

  • 현재는 SMS(20원/건)

  • 알림톡으로 전환하면 8원/건

  • 신청 방법 & 템플릿 작성법 조언 환영!

2. 대시보드 구축

  • 상담사가 발송 현황 실시간 확인

  • Streamlit vs Dash vs Gradio?

  • 추천 부탁드립니다!

3. 채용공고 품질 필터링

  • 가끔 spam성 공고 포함됨

  • AI로 사전 필터링하는 방법?


🚀 앞으로의 계획

Phase 1: 모니터링 강화 (2주)

  • Streamlit 대시보드 구축

  • 발송 통계 자동 집계

  • 구직자 만족도 설문

Phase 2: 기능 확장 (1개월)

  • 카카오 알림톡 전환

  • 이메일 발송 추가

  • 면접 일정 자동 안내

Phase 3: 타 센터 확산 (3개월)

  • 설정만으로 다른 센터 적용

  • SaaS화 검토

  • 사용 가이드 문서 작성


도움 받은 글

참고 자료:

영감 받은 사례:

  • 지피터스 커뮤니티의 다양한 자동화 사례들

  • Claude Code를 활용한 무인 시스템 구축 사례


🎓 마무리

핵심 메시지:

"AI는 취업상담사를 대체하는 게 아니라
반복 업무를 자동화해서
더 중요한 심층 상담에 집중하게 해줍니다."

이 시스템의 가치:

  1. ⏰ 시간 절감: 95% 업무 자동화

  2. 🎯 정확도 향상: AI 기반 객관적 매칭

  3. ⚖️ 공정성: 모든 구직자에게 동일한 기회

  4. 💰 저비용: 월 3만원으로 운영

  5. 📈 확장성: 다른 센터에도 즉시 적용 가능

프로젝트 파일:

E:\자동화\employment_automation\
├── auto_employment.py       # 메인 자동화
├── start.bat / stop.bat     # 시작/종료
├── job_matching/            # AI 매칭 모듈
├── messaging/               # SMS 발송 모듈
└── jobs.db                  # 채용 데이터베이스

1

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요