0Pricing
AI Engineering Academy · 강의

비정형 텍스트에서 데이터 추출하기

이메일, 영수증, 기사와 같은 원시 텍스트를 읽고 유형, 기본값, 유효성 검사가 포함된 구조화된 필드를 반환하는 정보 추출 파이프라인을 구축합니다.

비정형 텍스트에서 데이터 추출하기은(는) CoddyKit의 무료 AI Engineering Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 AI Engineering Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

정보 추출 문제

조직은 이메일, 지원 티켓, 계약서, 청구서, 뉴스 기사, 의료 기록, 소셜 미디어 게시물과 같은 비정형 텍스트에 파묻혀 있습니다. 이 텍스트 안에는 가치 있는 정형 데이터가 묻혀 있지만, 수작업으로 추출하면 느리고 비용이 많이 들며 오류가 발생하기 쉽습니다. 구조화된 출력을 지원하는 LLM은 이러한 상황을 바꿉니다. LLM은 어떤 텍스트든 읽고 관련 필드로 미리 정의된 스키마를 채울 수 있으며, 합리적인 정확도로 대규모 처리가 가능합니다.

정보 추출(IE)은 비정형 텍스트에서 정형화된 사실을 자동으로 식별하고 가져오는 과정입니다. LLM 기반 IE는 초기의 규칙 기반 또는 전통적인 NLP 접근 방식보다 훨씬 뛰어난 성능을 보입니다. LLM은 모든 변형에 대해 사람이 일일이 정규 표현식 패턴을 작성하지 않아도 문맥, 동의어 관계, 암시적 정보를 이해하기 때문입니다.

일반적인 추출 활용 사례

정보 추출은 다음과 같은 다양한 가치 있는 비즈니스 애플리케이션을 지원합니다.

  • 청구서 처리: 미지급금 자동화를 위해 PDF 청구서에서 공급업체, 항목, 금액, 지급 기한을 추출합니다
  • 계약서 분석: 법률 문서에서 당사자, 발효일, 지급 조건, 해지 조항을 추출합니다
  • 이력서 분석: ATS 시스템을 위해 이력서에서 기술, 경력, 학력, 연락처 정보를 추출합니다
  • 지원 티켓 분류: 티켓을 자동으로 분류하기 위해 범주, 심각도, 영향을 받는 제품, 고객 등급을 추출합니다
  • 뉴스 모니터링: 경쟁 정보 수집을 위해 뉴스 기사에서 개체, 사건, 감정을 추출합니다

이메일 추출 파이프라인 구축

고객 이메일을 읽고 실행 가능한 정형 데이터를 추출하는 실용적인 추출 파이프라인을 구축해 보겠습니다. 이 파이프라인은 Pydantic 스키마를 사용해 각 이메일에서 정확히 어떤 데이터를 가져올지 정의한 다음, 이메일을 일괄 처리합니다.

import openai
from pydantic import BaseModel
from typing import List, Optional
from enum import Enum

client = openai.OpenAI()

class Priority(str, Enum):
    urgent = 'urgent'
    high = 'high'
    normal = 'normal'
    low = 'low'

class EmailExtraction(BaseModel):
    subject_summary: str
    sender_intent: str
    product_mentioned: Optional[str]
    issue_category: str  # billing / technical / general / feedback
    priority: Priority
    action_required: bool
    action_description: Optional[str]
    customer_sentiment: str  # positive / negative / neutral / frustrated

def extract_from_email(email_body: str) -> EmailExtraction:
    result = client.beta.chat.completions.parse(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': 'You are an expert at analyzing customer emails and extracting structured information for a support team.'},
            {'role': 'user', 'content': f'Analyze this customer email:\n\n{email_body}'}
        ],
        response_format=EmailExtraction
    )
    return result.choices[0].message.parsed

LLM을 활용한 개체명 인식

개체명 인식(NER)은 전통적인 IE 작업으로, 텍스트에서 개체명(사람, 조직, 위치, 날짜, 금액)을 식별하고 분류하는 작업입니다. LLM을 사용하면 원하는 개체를 설명하기만 하면 별도로 학습된 NER 모델 없이도 개체를 추출할 수 있으므로 NER이 훨씬 간단해집니다.

import openai
from pydantic import BaseModel
from typing import List, Optional

client = openai.OpenAI()

class NamedEntity(BaseModel):
    text: str       # The exact text as it appears
    entity_type: str  # PERSON / ORG / LOCATION / DATE / MONEY / PRODUCT
    normalized: Optional[str]  # Standardized form where applicable

class NERResult(BaseModel):
    entities: List[NamedEntity]

text = '''
Apple Inc. CEO Tim Cook announced yesterday that the company will invest $1.2 billion
in a new manufacturing facility in Austin, Texas, expected to open in Q3 2026.
'''

result = client.beta.chat.completions.parse(
    model='gpt-4o-mini',
    messages=[
        {'role': 'system', 'content': 'Extract all named entities from the text. Classify each as PERSON, ORG, LOCATION, DATE, MONEY, or PRODUCT.'},
        {'role': 'user', 'content': text}
    ],
    response_format=NERResult
)
for entity in result.choices[0].message.parsed.entities:
    print(f'[{entity.entity_type}] {entity.text}')

대규모 문서 추출

수천 개의 문서를 처리하는 운영 환경의 추출 파이프라인에는 비동기 처리와 속도 제한 처리가 필요합니다. 일반적으로 세마포어와 함께 asyncio를 사용하여 API의 속도 제한을 준수하면서 문서를 병렬로 처리합니다.

import asyncio
import openai
from pydantic import BaseModel
from typing import List, Optional

async_client = openai.AsyncOpenAI()

class InvoiceExtraction(BaseModel):
    vendor: str
    total_amount: Optional[float]
    currency: str
    invoice_date: Optional[str]

async def extract_invoice(doc_text: str, semaphore: asyncio.Semaphore) -> InvoiceExtraction:
    async with semaphore:  # Limit concurrent requests
        result = await async_client.beta.chat.completions.parse(
            model='gpt-4o-mini',
            messages=[
                {'role': 'system', 'content': 'Extract invoice data.'},
                {'role': 'user', 'content': doc_text}
            ],
            response_format=InvoiceExtraction
        )
        return result.choices[0].message.parsed

async def process_invoices(documents: List[str]):
    sem = asyncio.Semaphore(5)  # Max 5 concurrent requests
    tasks = [extract_invoice(doc, sem) for doc in documents]
    return await asyncio.gather(*tasks, return_exceptions=True)

# results = asyncio.run(process_invoices(invoice_texts))
print('Async pipeline defined - handles rate limits via semaphore')

암시적·추론 정보 처리

LLM은 명시적으로 언급된 정보뿐 아니라 추론되거나 암시된 정보도 추출할 수 있습니다. 예를 들어 어떤 리뷰에 '한 달 동안 매일 사용했는데도 여전히 완벽하게 작동합니다'라고 적혀 있다면, '내구성'이라는 단어가 전혀 나오지 않아도 모델은 내구성을 긍정적인 특성으로 추론할 수 있습니다. 이는 명시적으로 존재하는 내용만 찾을 수 있는 정규 표현식 기반 추출에 비해 큰 장점입니다.

하지만 이러한 능력에는 위험도 따릅니다. 모델이 사실이 아닌 추측으로 필드를 채기며 과도하게 추론할 수 있기 때문입니다. 법률, 금융, 의료와 같이 중요한 추출 작업에서는 스키마에 confidence 필드를 추가하고 모델이 확신도를 평가하도록 지시하여, 확신도가 낮은 추출 결과를 사람이 검토하도록 표시하십시오.

추출 프롬프트 설계

추출 품질은 프롬프트 설계에 크게 좌우됩니다. 추출 프롬프트의 핵심 원칙은 다음과 같습니다.

  • 모호한 필드를 정의하십시오: '날짜'가 청구서 날짜, 지급 기한 또는 수신 날짜를 의미할 수 있다면 원하는 날짜를 정확히 지정하십시오
  • 특이한 형식의 예를 제공하십시오: '가격은 숫자만 반환하십시오. 예: $29.99가 아니라 29.99'
  • 정규화를 처리하십시오: '국가명을 ISO 3166-1 alpha-2 코드로 정규화하십시오'
  • 추출 원본을 지정하십시오: '이메일 본문이 아니라 제목에서만 추출하십시오'

추출 프롬프트를 사람 데이터 입력 담당자를 위한 정확한 명세라고 생각하십시오. 프롬프트에 남겨 둔 모든 모호함은 모델이 일관되지 않게 판단해야 하는 부분이 됩니다.

복잡한 문서를 위한 다중 단계 추출

일부 문서는 전체 스키마가 크거나, 섹션마다 서로 다른 전문 지식이 필요하거나, 문서 구조의 변동성이 매우 커서 한 번의 처리만으로 추출하기에 너무 복잡합니다. 다중 단계 추출은 작업을 순차적인 단계로 나눕니다. 먼저 문서 유형을 분류한 다음 해당 유형에 적합한 스키마를 추출합니다.

import openai
from pydantic import BaseModel
from typing import Optional

client = openai.OpenAI()

class DocumentType(BaseModel):
    doc_type: str  # invoice / contract / resume / report
    confidence: float

def classify_document(text: str) -> str:
    result = client.beta.chat.completions.parse(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': 'Classify the document type.'},
            {'role': 'user', 'content': text[:500]}  # Use only the beginning for classification
        ],
        response_format=DocumentType
    )
    return result.choices[0].message.parsed.doc_type

# Then route to the appropriate extraction schema
EXTRACTION_SCHEMAS = {
    'invoice': 'InvoiceSchema',  # Replace with actual Pydantic classes
    'contract': 'ContractSchema',
    'resume': 'ResumeSchema',
}

print('Multi-pass: classify first, then extract with the right schema')

추출 후 데이터 보강

추출된 데이터는 초기 추출 후 보강이 필요한 경우가 많습니다. 예를 들어 회사 데이터베이스를 조회하여 추출된 회사명을 표준 형식으로 변환하거나, 추출된 우편번호를 조회하여 도시와 주를 채우거나, 추출된 날짜를 표준 형식으로 변환할 수 있습니다. 이 보강 단계는 LLM 호출 중이 아니라 추출 후 애플리케이션 코드에서 수행해야 합니다.

추출과 보강을 분리하면 파이프라인을 테스트하고 유지 관리하기가 쉬워집니다. 보강 로직을 독립적으로 단위 테스트할 수 있고, 보강 코드를 변경하지 않고도 추출 모델을 교체할 수 있습니다.

추출 정확도 측정

운영 환경의 추출 파이프라인에서는 라벨이 지정된 테스트 세트를 기준으로 정확도를 체계적으로 측정하십시오. 핵심 측정 항목은 다음과 같습니다.

  • 필드 정확도: 문서별로 정확하게 추출된 필드의 비율
  • 완전 일치: 필드 값이 정답과 정확히 일치하는지 여부
  • 정규화 후 일치: 정규화 후 필드 값이 일치하는지 여부(예: '$1,234.00' == '1234.0')
  • 거짓 양성 비율: 비어 있어야 하는 필드를 모델이 추출하는 빈도
  • 거짓 음성 비율: 실제로 존재하는 필드에 대해 모델이 비어 있는 값으로 반환하는 빈도

모델을 변경하거나, 프롬프트를 업데이트하거나, 파이프라인에 새로운 문서 원본을 추가할 때마다 이 평가를 실행하십시오. 수천 개의 문서를 처리할 때는 정확도가 조금만 떨어져도 비즈니스에 상당한 영향이 연쇄적으로 발생할 수 있습니다.

지속적인 개선을 위한 추출 기록

운영 환경의 모든 추출 결과는 파이프라인을 개선할 수 있는 데이터입니다. 모든 입력 문서, 추출된 출력, 검증 오류를 데이터베이스에 기록하십시오. 운영 기록에서 주기적으로 표본을 추출하여 일반적인 실패 패턴을 파악하십시오. 예를 들어 모델이 특정 문서 형식에서 어려움을 겪는지, 비어 있으면 안 되는 필드가 자주 비어 있는지, 또는 프롬프트의 변화가 감지되는 특이한 값이 있는지를 확인할 수 있습니다.

이렇게 기록한 데이터는 추출 작업에 맞게 모델을 미세 조정하려는 경우 향후 학습 데이터 세트가 되기도 합니다. 이를 통해 정형 추출 작업에서 범용 LLM보다 정확도가 높고 비용이 낮은 대안을 마련할 수 있습니다.

빠른 확인

이 단원에서 배운 AI 엔지니어링 개념을 이해했는지 테스트해 보십시오.

단원 요약

이 단원에서는 다음을 배웠습니다. Pydantic 스키마를 사용하는 LLM은 모든 비정형 텍스트 원본에서 정형 데이터를 안정적으로 추출합니다. 또한 세마포어를 사용한 비동기 처리를 통해 속도 제한을 준수하면서 수천 개의 문서를 일괄 추출할 수 있습니다. 그리고 다중 단계 추출은 먼저 문서를 분류한 다음 각 유형에 적합한 스키마를 적용합니다. 다음으로는 추출된 데이터가 비즈니스 규칙을 위반하는 경우를 처리하기 위한 검증 및 자동 재시도 로직을 구축하겠습니다.

자주 묻는 질문

“비정형 텍스트에서 데이터 추출하기” 강의는 무료인가요?

네 — “비정형 텍스트에서 데이터 추출하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 AI Engineering Academy 강의 전체를 잠금 해제할 수 있습니다. AI Engineering Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“비정형 텍스트에서 데이터 추출하기”에서 뭘 배우나요?

이메일, 영수증, 기사와 같은 원시 텍스트를 읽고 유형, 기본값, 유효성 검사가 포함된 구조화된 필드를 반환하는 정보 추출 파이프라인을 구축합니다. 브라우저에서 직접 실행하는 실습 코드로 AI Engineering Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

AI Engineering Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 AI Engineering Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“비정형 텍스트에서 데이터 추출하기” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 AI Engineering Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 AI Engineering Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. JSON 모드와 response_format
  2. Pydantic으로 구조화된 출력 만들기
  3. 비정형 텍스트에서 데이터 추출하기
  4. 잘못된 출력 검증 및 재시도
← AI Engineering Academy(으)로 돌아가기