Skip to main content

전처리 전략 (Document Preprocessing)

PDF, DOCX, PPTX 등 비정형 문서는 텍스트 추출 → 구조 변환 → 청킹의 전처리 파이프라인이 필요합니다. 특히 이미지, 표, 수식 등 비텍스트 요소를 포함하는 문서는 전처리 품질이 RAG 성능에 직접적인 영향을 미칩니다.

Docling — 멀티포맷 문서 변환

Docling은 IBM Research에서 개발한 문서 변환 라이브러리로, PDF, DOCX, PPTX, HTML, 이미지 등 다양한 형식을 구조화된 문서 모델(DoclingDocument)로 변환합니다. OCR, 레이아웃 분석, 표 인식, 이미지 추출을 포함하는 종합 파이프라인을 제공합니다.
pip install docling
from docling.document_converter import DocumentConverter

converter = DocumentConverter()
result = converter.convert("document.pdf")

# Markdown으로 내보내기
markdown_text = result.document.export_to_markdown()
print(markdown_text)

Docling + 청킹 파이프라인

Docling의 내장 HybridChunker는 문서 구조를 인식하면서 토큰 기반 크기 제어를 동시에 수행합니다.
from docling.document_converter import DocumentConverter
from docling.chunking import HybridChunker

# 1. 문서 변환
converter = DocumentConverter()
result = converter.convert("document.pdf")

# 2. 구조 인식 + 토큰 기반 청킹
chunker = HybridChunker(
    tokenizer="gpt-4o",      # 토크나이저
    max_tokens=512,            # 청크당 최대 토큰
    merge_peers=True,          # 같은 레벨의 짧은 섹션 병합
)
chunks = list(chunker.chunk(result.document))

for chunk in chunks:
    print(f"[{chunk.meta.headings}] ({len(chunk.text)} chars)")
    print(chunk.text[:200])
    print("---")
파라미터설명기본값
tokenizer토크나이저 (모델명 또는 객체)"gpt2"
max_tokens청크당 최대 토큰 수512
merge_peers같은 레벨의 짧은 섹션을 병합True
HybridChunker는 헤딩, 단락, 표, 리스트 등 문서 구조를 인식하여 의미 단위를 존중합니다. 단순히 토큰 수로 자르지 않으므로, Docling 변환 결과에 가장 적합한 청킹 도구입니다.

지원 형식

입력 형식레이아웃 분석표 인식이미지 추출OCR
PDFOOOO
DOCXOOO-
PPTXO-O-
HTMLOOO-
이미지 (PNG, JPG)---O
MarkdownOO--

PyMuPDF4LLM — PDF 전용 변환

PyMuPDF4LLM은 PyMuPDF(fitz) 기반의 PDF 전용 변환 도구로, PDF를 LLM에 최적화된 Markdown으로 변환합니다. 빠른 속도와 정확한 텍스트 추출이 강점입니다.
pip install pymupdf4llm
import pymupdf4llm

# PDF -> Markdown 변환
md_text = pymupdf4llm.to_markdown("document.pdf")
print(md_text)

PyMuPDF4LLM + 청킹 파이프라인

변환된 Markdown을 LangChain 또는 Chonkie로 청킹하는 전체 파이프라인입니다.
import pymupdf4llm
from langchain_text_splitters import MarkdownHeaderTextSplitter
from langchain_core.documents import Document
from pathlib import Path

# 1. PDF -> Markdown 변환 (이미지 포함)
image_dir = Path("output/images")
image_dir.mkdir(parents=True, exist_ok=True)

md_text = pymupdf4llm.to_markdown(
    "document.pdf",
    write_images=True,
    image_path=str(image_dir),
    image_format="png",
    dpi=150,
)

# 2. Markdown 헤딩 기반 청킹
splitter = MarkdownHeaderTextSplitter(
    headers_to_split_on=[
        ("#", "h1"),
        ("##", "h2"),
        ("###", "h3"),
    ],
)
chunks = splitter.split_text(md_text)

# 3. 이미지 링크가 포함된 청크 확인
for chunk in chunks:
    has_image = "![" in chunk.page_content
    print(f"[{chunk.metadata}] {'(이미지 포함)' if has_image else ''}")
    print(chunk.page_content[:200])
    print("---")
이미지 링크가 포함된 청크는 멀티모달 RAG 파이프라인에서 활용할 수 있습니다. 이미지 경로를 메타데이터로 추출하여, 검색 시 관련 이미지를 함께 제공하면 답변 품질이 향상됩니다.

주요 옵션

옵션설명기본값
write_images이미지를 파일로 추출False
image_path이미지 저장 디렉토리"."
image_format이미지 형식 ("png", "jpg")"png"
dpi이미지 해상도 (DPI)150
pages변환할 페이지 목록 (0-indexed)전체
page_chunks페이지별 분리 반환False
show_progress진행률 표시False

Docling vs PyMuPDF4LLM

항목DoclingPyMuPDF4LLM
지원 형식PDF, DOCX, PPTX, HTML, 이미지PDF 전용
변환 속도느림 (레이아웃 분석 포함)매우 빠름
레이아웃 분석AI 기반 레이아웃 분석규칙 기반
표 인식복잡한 병합 셀 처리기본 표 변환
이미지 추출구조화된 메타데이터 포함파일 추출 + MD 링크
OCR내장 (다국어 지원)미지원
청킹HybridChunker 내장외부 도구 필요
의존성무거움 (torch 등)가벼움 (PyMuPDF만)
적합한 경우복잡한 레이아웃, 다양한 형식PDF 빠른 처리, 단순 레이아웃
이미지 추출 시 저작권에 유의하세요. 추출된 이미지를 포함한 청크를 벡터 DB에 저장할 때, 이미지 파일의 저장 경로가 프로덕션 환경에서도 유효한지 확인해야 합니다.

도구 종합 비교

도구입력 형식핵심 기능이미지 추출적합한 경우
LangChain Splitters텍스트, MD, HTML, Code구조 기반 분할-LangChain 파이프라인
Chonkie텍스트토큰 기반 경량 청킹-토큰 관리 + 다양한 전략
DoclingPDF, DOCX, PPTX, HTML문서 변환 + 청킹O (MD 링크)복잡한 레이아웃, 다형식
PyMuPDF4LLMPDFPDF -> MD 변환O (MD 링크)빠른 PDF 전처리
추천 조합: 단순 PDF는 PyMuPDF4LLM → MarkdownHeaderTextSplitter, 복잡한 PDF(표, 다단, 스캔)는 Docling → HybridChunker, 텍스트 문서는 Chonkie RecursiveChunker를 사용하세요.