문서 분석 전략
작성 상태: ✅ 완료
최종 업데이트: 2026-01-26
📋 목차
1. 개요
목적
이력서, 포트폴리오, 채용공고에서 텍스트를 추출하고 LLM으로 종합 분석
사용 사례
- 채용공고에서 필수/우대 스킬 추출
- 이력서 내 기술 스택 및 경력 파악
- 이력서 ↔ 채용공고 매칭 분석
- 강점/약점 분석 및 개선 제안
핵심 플로우
┌─────────────────────────────────────────────────────────────┐
│ 문서 분석 파이프라인 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 📄 이력서/포트폴리오 (PDF/이미지) 📄 채용 공고 (PDF/이미지) │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ EasyOCR │ 텍스트 추출 │ EasyOCR │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 이력서 텍스트│ │ 채용공고 텍스트 │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ └───────┬──────────────────────────┘ │
│ ▼ │
│ ┌─────────────┐ │
│ │ Gemini LLM │ ◀── 종합 분석 │
│ └──────┬──────┘ │
│ │ │
│ ┌────────────┼────────────┐ │
│ ▼ ▼ ▼ │
│ [채용공고] [이력서 분석] [매칭 분석] │
│ 구조화 강점/약점 스킬 매칭률 │
│ 개선 제안 종합 등급 │
│ │
└─────────────────────────────────────────────────────────────┘
2. 요구사항
| 요구사항 |
목표 |
우선순위 |
| 정보 추출 정확도 |
90% 이상 |
🔴 높음 |
| 구조화된 출력 |
JSON 형식 |
🔴 높음 |
| 매칭 분석 |
스킬 매칭률, 등급 산출 |
🔴 높음 |
| 처리 속도 |
10초 이내 |
🟡 중간 |
| 비용 |
최소화 |
🟡 중간 |
3. OCR → LLM 분석 파이프라인
3.1 텍스트 추출
| 입력 형식 |
처리 방법 |
| PDF |
pdf2image → EasyOCR |
| 이미지 (PNG/JPG) |
EasyOCR 직접 처리 |
| 텍스트 직접 입력 |
그대로 사용 |
3.2 OCR 모델
📌 선정 모델: EasyOCR (무료, 한국어 86.9% 정확도)
상세 내용은 02_OCR_모델_선정.md 참조
3.3 LLM 분석
# 분석 플로우
async def analyze_documents(resume_text: str, job_posting_text: str):
"""이력서 + 채용공고 종합 분석"""
# 1. 채용공고 구조화
job_analysis = await analyze_job_posting(job_posting_text)
# 2. 이력서 분석
resume_analysis = await analyze_resume(resume_text)
# 3. 매칭 분석
matching_result = await match_resume_to_job(
resume_analysis,
job_analysis
)
return {
"job_posting": job_analysis,
"resume": resume_analysis,
"matching": matching_result
}
4. 채용공고 분석
4.1 추출 정보
| 항목 |
설명 |
예시 |
| 회사명 |
채용 기업명 |
"카카오", "네이버" |
| 포지션 |
채용 직무명 |
"백엔드 개발자" |
| 고용 형태 |
정규직/계약직/인턴 |
"정규직" |
| 경력 요구 |
신입/경력 및 연차 |
"경력 3~5년" |
| 필수 스킬 |
반드시 보유해야 할 기술 |
["Python", "FastAPI"] |
| 우대 스킬 |
보유 시 우대하는 기술 |
["Kubernetes", "AWS"] |
| 주요 업무 |
담당할 업무 내용 |
["API 개발", "DB 설계"] |
| 복리후생 |
제공되는 혜택 |
["재택근무", "교육비"] |
| 근무지 |
근무 위치 |
"서울 강남구" |
4.2 JSON 출력 형식
{
"company": "카카오",
"position": "백엔드 개발자",
"employment_type": "정규직",
"experience": {
"type": "경력",
"years_min": 3,
"years_max": 5
},
"skills": {
"required": ["Python", "FastAPI", "PostgreSQL"],
"preferred": ["Kubernetes", "AWS", "Kafka"]
},
"responsibilities": [
"API 서버 개발 및 운영",
"데이터베이스 설계 및 최적화"
],
"benefits": ["재택근무", "교육비 지원", "스톡옵션"],
"location": "서울 강남구"
}
4.3 분석 프롬프트
JOB_POSTING_PROMPT = """
다음 채용공고를 분석하여 JSON 형식으로 응답해주세요.
## 채용공고
{job_posting_text}
## 출력 형식
{{
"company": "회사명",
"position": "포지션명",
"employment_type": "고용형태",
"experience": {{
"type": "신입/경력",
"years_min": 최소연차,
"years_max": 최대연차
}},
"skills": {{
"required": ["필수 스킬"],
"preferred": ["우대 스킬"]
}},
"responsibilities": ["주요 업무"],
"benefits": ["복리후생"],
"location": "근무지"
}}
JSON만 출력하세요.
"""
5. 이력서/포트폴리오 분석
5.1 추출 정보
| 항목 |
설명 |
예시 |
| 총 경력 |
전체 경력 연차 |
"3년 6개월" |
| 학력 |
최종 학력 |
"OO대학교 컴퓨터공학과" |
| 현재 직장 |
가장 최근 근무처 |
"카카오 백엔드 개발자" |
| 기술 스택 |
사용 가능한 기술 |
Python, FastAPI, AWS |
5.2 기술 스택 분류
| 분류 |
항목 |
예시 |
| 프로그래밍 언어 |
사용 가능한 언어 |
Python, Java, TypeScript |
| 프레임워크 |
사용 경험 프레임워크 |
FastAPI, Spring Boot, React |
| 데이터베이스 |
사용 경험 DB |
PostgreSQL, MongoDB, Redis |
| 인프라/도구 |
DevOps, 클라우드 등 |
AWS, Docker, Kubernetes |
5.3 강점/약점 분석
강점 분석 기준:
- 주요 기술 숙련도 (프로젝트 경험 기반)
- 경력 연차 대비 성과
- 리더십/협업 경험
- 기술 블로그/오픈소스 기여
약점 분석 기준:
- 채용공고 대비 부족한 스킬
- 경력 공백 기간
- 프로젝트 규모/복잡도 부족
- 최신 기술 스택 부재
5.4 개선 제안
{
"improvements": [
{
"area": "기술 스택",
"suggestion": "Kubernetes 학습 권장",
"reason": "대부분의 시니어 포지션에서 필수 요구",
"priority": "높음"
},
{
"area": "프로젝트 경험",
"suggestion": "대규모 트래픽 처리 경험 필요",
"reason": "채용공고에서 일 1000만 DAU 언급",
"priority": "중간"
}
]
}
5.5 분석 프롬프트
RESUME_ANALYSIS_PROMPT = """
다음 이력서를 분석해주세요.
## 이력서
{resume_text}
## 채용공고 (매칭 분석용)
{job_posting_text}
## 분석 요청
1. 기본 정보 추출 (경력, 학력, 기술 스택)
2. 강점 분석 (3가지)
3. 약점 분석 (채용공고 기준, 3가지)
4. 개선 제안 (구체적이고 실행 가능한 조언)
## 출력 형식
JSON으로 응답해주세요.
"""
6. 매칭 분석
6.1 스킬 매칭
채용공고 필수 스킬: [Python, FastAPI, PostgreSQL, Docker]
이력서 보유 스킬: [Python, FastAPI, PostgreSQL, AWS]
매칭률: 3/4 = 75%
부족 스킬: Docker
추가 보유: AWS
6.2 경력 요구사항 충족도
| 항목 |
채용공고 요구 |
이력서 |
충족 여부 |
| 경력 연차 |
3~5년 |
4년 |
✅ 충족 |
| 학력 |
학사 이상 |
석사 |
✅ 충족 |
| 자격증 |
정보처리기사 |
없음 |
❌ 미충족 |
6.3 종합 등급
| 등급 |
매칭률 |
설명 |
| A |
90% 이상 |
매우 적합, 즉시 지원 권장 |
| B |
75~89% |
적합, 약간의 보완 후 지원 |
| C |
60~74% |
보통, 부족 스킬 학습 필요 |
| D |
40~59% |
부족, 상당한 준비 필요 |
| F |
40% 미만 |
부적합, 다른 포지션 고려 |
6.4 매칭 결과 JSON
{
"matching": {
"overall_grade": "B",
"overall_score": 78,
"skill_matching": {
"required_match_rate": 75,
"matched": ["Python", "FastAPI", "PostgreSQL"],
"missing": ["Docker"],
"extra": ["AWS", "React"]
},
"experience_matching": {
"years_required": "3-5년",
"years_actual": "4년",
"status": "충족"
},
"recommendations": [
"Docker 학습 권장 (필수 스킬 누락)",
"AWS 경험을 어필하면 좋음 (우대 스킬)"
]
}
}
7. 사용 모델
7.1 OCR 모델
| 용도 |
모델 |
비용 |
정확도 |
| 기본 OCR |
EasyOCR |
무료 |
86.9% |
| 고정확도 |
CLOVA OCR |
유료 |
94.2% |
상세 내용은 02_OCR_모델_선정.md 참조
7.2 LLM 모델
| 용도 |
모델 |
선정 근거 |
| 기본 분석 |
Gemini 3.0 Flash Preview |
빠른 응답, 저렴 ($2/M), JSON 출력 지원 |
| 심층 분석 |
Gemini Pro |
높은 정확도, 복잡한 분석 |
8. 구현 참조
코드 파일
3.model/app/services/ocr_service.py - EasyOCR 텍스트 추출
3.model/app/services/llm_service.py - LLM 분석
3.model/app/services/rag_service.py - 매칭 분석 파이프라인
API 엔드포인트
| 엔드포인트 |
메서드 |
설명 |
/ai/text/extract |
POST |
문서 텍스트 추출 및 분석 |
/ai/chat |
POST |
매칭 분석 (mode: analysis) |