PDF 및 복합 문서 파싱

PDF는 실무에서 가장 널리 쓰이지만 형식이 고정되어 있어 기계가 구조를 파악하기 어려운 대표적 포맷입니다. 일반 텍스트 문장 외에도 표, 이미지, 수식 등이 무작위로 섞여 있어 난도가 높습니다.

1. 텍스트 vs 스캔 문서

  • 텍스트 기반 PDF: 문서 생성 프로그램에서 바로 저장되어 실제 텍스트 메타데이터가 존재합니다.
    • 사용 도구: PyMuPDF(fitz), pdfplumber, PyPDF2 등으로 비교적 쉽게 텍스트 좌표를 읽어 추출할 수 있습니다.
  • 스캔된 PDF (이미지 기반): 책이나 문서를 스캔하여 전체가 하나의 통 이미지로 되어 있습니다.
    • 사용 도구: 반드시 OCR (Tesseract, EasyOCR 등) 과정이 선행되어야 텍스트 데이터에 접근할 수 있습니다.

2. 최신 복합 문서 파싱 체계 (AI 기반)

최근에는 머신러닝/비전 언어 모델(VLM)을 파이프라인에 적용하여, 문서의 복잡한 레이아웃(헤딩, 단락, 표, 이미지 위치)을 시각적으로 통째로 이해하고 깨끗한 Markdown 형식으로 변환하는 접근이 주류가 되었습니다.

  • LlamaParse: LlamaIndex 생태계에서 제공하는 강력한 도구로, 표(Table)와 차트에 대한 구조적 이해가 매우 뛰어납니다. 복잡한 표를 텍스트 혹은 Markdown 구조로 완벽하게 유지해 RAG 효율을 극대화합니다.
  • Nougat (Meta): 메타에서 개발한 모델로, 학술 논문(Scientific Papers) 파싱에 특화되어 있습니다. 난해한 수학 수식을 LaTeX 코드로 오차 없이 번역해 내는 강점이 있습니다.
  • Marker / Unstructured: 문서 내의 요소를 블록(Block) 단위로 식별해 분할하고, 텍스트뿐만 아니라 레이아웃 계층 정보까지 담아 LLM이 문서 원본의 시각적 형태를 논리적으로 이해할 수 있도록 돕는 범용 데이터 처리 라이브러리들입니다.

3. 구조적 파싱: PDF를 HTML 및 Markdown으로 변환 후 처리 (Structural Parsing)

최근 RAG 시스템에서 가장 각광받는 필수 전략 중 하나는 단순히 텍스트만 뽑아내는 것을 넘어 PDF를 의미론적 구조(Semantic Structure)가 완벽히 유지되는 HTML이나 Markdown 포맷으로 1차 변환한 뒤 처리하는 방법입니다.

  • 필요성 (Necessity)
    • PDF 파일은 외견상 깔끔해 보이지만, 내부 정보는 XY 좌표계에 뿌려진 텍스트 덩어리일 뿐 논리적 구조(헤딩, 단락, 목록, 표 여부)를 담고 있지 않습니다.
    • 이를 AI 모델(예: LlamaParse, Docling, Unstructured의 고도화된 기능)을 통해 HTML/Markdown으로 렌더링하면 텍스트에 비로소 시맨틱 태그(<h1>, <p>, <table>)라는 뼈대가 부여됩니다.
  • 파이프라인 최적화 효과 (Pipeline Optimization)
    1. 의미론적 문서 분할 (Semantic Chunking): 일반적인 글자 수(예: 500토큰 단위) 자르기 방식을 사용할 경우 문서 중간에서 문맥이 끊어지는 심각한 결함이 발생합니다. 하지만 HTML 태그나 Markdown 헤더(Header)를 기준으로 자르면(Header-based Splitter) 내용이 완벽한 단위로 나뉘어 RAG 검색 정확도가 극도로 높아집니다.
    2. 메타데이터 상속 및 보존 (Metadata Inheritance): <h1>이나 <h2>와 같은 상위 섹션의 제목을 하위 청크(Chunk)들의 고정 메타데이터로 부여하여, 어떤 내용의 파편인지 언제든 추적하고 검색 결과의 신뢰도를 높일 수 있습니다.
    3. 노이즈 및 토큰 낭비 방지: 각 페이지에 반복되는 머리글(Header), 바닥글, 워터마크, 페이지 번호 등의 불필요한 시각적 노이즈를 HTML 파싱 단계에서 정규표현식 등을 통해 깨끗하게 날려 보내어 LLM의 토큰 낭비와 환각(Hallucination) 위험을 원천 차단합니다.

This site uses Just the Docs, a documentation theme for Jekyll.