📝 지피터스 사례 게시글: 취업상담 AI 자동화 시스템
소개
🎯 시도하고자 했던 것
취업상담센터의 반복 업무를 AI로 완전 자동화하고 싶었습니다.
기존에는 취업상담사가 직접:
여러 채용 사이트를 매일 확인 (워크넷, 사람인, 잡코리아)
구직자별로 적합한 공고를 찾아서
일일이 문자로 안내
이 모든 과정이 하루 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 API 공식 문서: https://docs.anthropic.com
워크넷 Open API: https://openapi.work.go.kr
알리고 SMS API: https://smartsms.aligo.in
지피터스 "입학상담 자동화" 사례 (유사 구조)
영감 받은 사례:
지피터스 커뮤니티의 다양한 자동화 사례들
Claude Code를 활용한 무인 시스템 구축 사례
🎓 마무리
핵심 메시지:
"AI는 취업상담사를 대체하는 게 아니라
반복 업무를 자동화해서
더 중요한 심층 상담에 집중하게 해줍니다."
이 시스템의 가치:
⏰ 시간 절감: 95% 업무 자동화
🎯 정확도 향상: AI 기반 객관적 매칭
⚖️ 공정성: 모든 구직자에게 동일한 기회
💰 저비용: 월 3만원으로 운영
📈 확장성: 다른 센터에도 즉시 적용 가능
프로젝트 파일:
E:\자동화\employment_automation\
├── auto_employment.py # 메인 자동화
├── start.bat / stop.bat # 시작/종료
├── job_matching/ # AI 매칭 모듈
├── messaging/ # SMS 발송 모듈
└── jobs.db # 채용 데이터베이스