03_문서_분석_전략.md - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki

문서 분석 전략

작성 상태: ✅ 완료 최종 업데이트: 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)