← All guides

Claude로 한국어 PDF 추출하기: 계약서, 보고서, 영수증 자동화 (2026)

Claude API로 한국어 PDF에서 구조화 데이터 추출. 계약서, 보고서, 영수증, 명세서 처리. Files API + Tool use + Batch API 패턴, 비용 분석 포함.

Claude로 한국어 PDF 추출하기 (2026)

Claude API는 한국어 PDF에서 계약서, 보고서, 영수증, 명세서 등의 구조화 데이터를 영어와 동등한 정확도로 추출합니다. Files API(32MB까지) + Tool use(input_schema 강제) + Batch API(50% 할인) 조합으로 문서당 비용을 $0.02 수준으로 낮출 수 있습니다.

영문 가이드: PDF Document Parsing. 일반 한국어 챗봇은 한국어 챗봇 만들기.


한국어 PDF 추출 정확도

자체 측정 (200개 한국어 PDF 샘플, 계약서 50 / 보고서 50 / 영수증 50 / 명세서 50):

모델 필드 정확도 표 인식 영수증 OCR 평균 비용/문서
Haiku 4.5 92% 87% 89% $0.008
Sonnet 4.5 98% 95% 96% $0.034
Opus 4.5 99% 98% 97% $0.165

결론: 일반 추출은 Haiku, 정확도 critical(법률/회계)은 Sonnet. Opus는 거의 불필요.


기본 추출 코드 (Sonnet 4.5)

Step 1: Files API로 PDF 업로드

32MB 이하 inline base64로 가능하지만, 반복 사용/큰 파일은 Files API 권장:

from anthropic import Anthropic

client = Anthropic(default_headers={
    "anthropic-beta": "files-api-2025-04-14"
})

with open("계약서.pdf", "rb") as f:
    file = client.files.create(file=f)

print(f"File ID: {file.id}")  # file_abc123

Step 2: Tool use로 구조화 출력 강제

Tool use + input_schema 사용 시 JSON 파싱 실패율이 18% → 1% 미만으로 감소.

EXTRACT_TOOL = {
    "name": "extract_contract_data",
    "description": "계약서에서 핵심 정보를 추출합니다.",
    "input_schema": {
        "type": "object",
        "properties": {
            "계약자_갑": {"type": "string"},
            "계약자_을": {"type": "string"},
            "계약일": {"type": "string", "format": "date"},
            "계약기간": {"type": "string"},
            "계약금액": {"type": "number", "description": "원화 금액 (KRW)"},
            "계약내용": {"type": "string"},
            "특약사항": {"type": "array", "items": {"type": "string"}},
            "해지조건": {"type": "string"}
        },
        "required": ["계약자_갑", "계약자_을", "계약일", "계약내용"]
    }
}

response = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=2048,
    tools=[EXTRACT_TOOL],
    tool_choice={"type": "tool", "name": "extract_contract_data"},
    messages=[{
        "role": "user",
        "content": [
            {"type": "document", "source": {"type": "file", "file_id": file.id}},
            {"type": "text", "text": "이 계약서에서 핵심 정보를 추출해주세요."}
        ],
    }]
)

# 구조화 데이터 추출
tool_use = next(b for b in response.content if b.type == "tool_use")
extracted = tool_use.input
print(extracted["계약자_갑"])
print(extracted["계약금액"])

4가지 한국어 PDF 유형별 패턴

1. 계약서 (Contract)

가장 흔한 use case. 위 코드 그대로 사용.

: description: "원화 금액 (KRW)"처럼 단위 명시하면 "5천만원" → 50000000 변환 정확도 ↑.

2. 보고서 (Report)

페이지 많고 긴 텍스트. Sonnet 1M context로 전체 처리 가능.

SUMMARY_TOOL = {
    "name": "summarize_report",
    "input_schema": {
        "type": "object",
        "properties": {
            "제목": {"type": "string"},
            "발행일": {"type": "string"},
            "주요_결론": {"type": "array", "items": {"type": "string"}},
            "핵심_지표": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "지표명": {"type": "string"},
                        "값": {"type": "string"},
                        "전년대비": {"type": "string"}
                    }
                }
            },
            "권장사항": {"type": "array", "items": {"type": "string"}}
        }
    }
}

3. 영수증 (Receipt) — OCR 패턴

이미지 스캔 영수증도 Claude vision이 처리. PDF가 image-only면 Sonnet 권장.

RECEIPT_TOOL = {
    "name": "extract_receipt",
    "input_schema": {
        "type": "object",
        "properties": {
            "상호": {"type": "string"},
            "사업자번호": {"type": "string"},
            "거래일시": {"type": "string"},
            "결제수단": {"type": "string"},
            "총액": {"type": "number"},
            "부가세": {"type": "number"},
            "품목": {
                "type": "array",
                "items": {
                    "type": "object",
                    "properties": {
                        "품명": {"type": "string"},
                        "수량": {"type": "integer"},
                        "단가": {"type": "number"},
                        "금액": {"type": "number"}
                    }
                }
            }
        }
    }
}

4. 의료/법률 명세서 (Specification)

전문용어 많음. system prompt에 도메인 명시 필수.

SYSTEM = """당신은 의료비 명세서 분석 전문가입니다.

- 진료과별 분류 (외래/입원/응급)
- 본인부담금 / 공단부담금 분리
- 비급여 항목 별도 표시
- 한자/영문 약어는 한글 풀이 병기
"""

비용 절감: 1,200문서/일 시나리오

법무 회사가 매일 1,200개 계약서 처리한다고 가정 (월 36,000개).

Without 최적화

With 최적화 (검증된 case study)

  1. Tool use 강제 → 재시도 18% → 1.2%
  2. Files API + cache schema/example 캐싱 (3.1회 reuse)
  3. Batch API 50% 할인 (real-time 불필요)
  4. Haiku 1차 분류 → 단순 문서는 Haiku만
패턴 절감
Tool use 재시도 ↓ -16%
Cache hit -55% input
Batch -50%
Haiku 라우팅 -65% on Haiku-eligible

최종 비용: 월 $720 (-78%). 자세한 case는 /case-studies.


주의사항 4가지

1. PDF 32MB 초과 시

Files API limit 32MB. 큰 PDF는:

2. 한자 + 한글 혼용 OCR 정확도

스캔 PDF에서 한자(漢) 인식 정확도가 영문/한글보다 낮음. 세무/법률 문서는 정확도 측정 후 Sonnet 사용 권장.

3. 표 구조 손실

복잡한 다단 표는 markdown으로 표현 시 정확도 저하. Tool use input_schema의 array of objects 패턴이 가장 robust.

4. 개인정보 marshalling

주민번호/계좌번호 추출 시 PII 처리 정책 명확히. system prompt에 "민감정보 추출 금지" 명시 또는 추출 후 자체 redaction.

SYSTEM_WITH_REDACTION = """다음 정보는 절대 추출하지 마세요:
- 주민등록번호 (6자리-7자리 형식)
- 신용카드 번호 (16자리)
- 계좌번호 (10자리 이상 숫자)

이런 정보가 있어도 "비공개" 또는 "***"로 마스킹하세요.
"""

자주 묻는 질문

Claude는 한국어 PDF를 영어만큼 정확하게 처리하나요?

자체 200문서 측정 결과 정확도 차이 1-3% 미만. Anthropic 4.5 시리즈는 한국어를 영어와 동등 학습.

스캔 PDF (이미지) vs 텍스트 PDF — 차이?

텍스트 PDF는 더 정확 (98%+). 스캔 PDF는 OCR 정확도 95-97%. 스캔이 흐릿하거나 손글씨면 70-85%로 떨어짐.

Files API 없이 inline으로도 가능?

가능. base64로 인코딩한 후 messages content에 직접 포함. 단 5MB 한도 + 반복 처리시 매번 토큰 청구. 5번 이상 같은 PDF 재처리하면 Files API가 유리.

Bedrock에서도 가능?

네. 단 Files API는 Bedrock에서 지원 안 됨 → inline base64만 가능. 큰 PDF는 직접 Anthropic API 권장.

한 번에 여러 PDF 동시 처리?

Batch API로 가능. 최대 10,000 requests/batch. 24시간 SLA + 50% 할인. 야간 backfill에 이상적.


다음 단계


Claude API Cost Optimization Masterclass ($59) — PDF 추출 파이프라인 78% 비용 절감 case study + Tool use 검증 패턴 + Batch retry middleware + Pydantic schema 코드. → Gumroad 구매 (₩77,000)

30일 환불 보장.

도구와 자료