Featured Post

Unstructured - 문서 파싱: PDF·Word를 LLM용 데이터로 바꾸는 RAG 전처리 실무 가이드

Unstructured - 문서 파싱 관련 이미지

대형 언어 모델 기반 RAG 시스템에서 난도 높은 작업은 비정형 문서 전처리입니다. Unstructured - 문서 파싱은 PDF, Word, HTML을 LLM이 활용 가능한 구조화 데이터로 변환해 검색 품질과 답변 근거의 일관성을 높이는 실무적 방법입니다.

Unstructured - 문서 파싱 아키텍처와 프로젝트 구성

Unstructured 라이브러리는 텍스트, 이미지, 표가 혼재된 비정형 문서에서 의미 단위 요소를 추출하고, 각 요소에 메타데이터를 부여하는 전처리 도구입니다. 단순 텍스트 추출과 달리 Title, NarrativeText, Table, ListItem 등 문서 구성 요소를 유형별로 분류하므로 RAG 파이프라인에서 검색 근거를 더 정교하게 관리할 수 있습니다. 실무에서는 원본 문서, 파서, 청커, 실행 파일을 분리해 배치 처리와 장애 추적이 가능한 구조로 설계하는 편이 안정적입니다.

project-root/
├── data/
│   └── sample_document.pdf
├── src/
│   ├── __init__.py
│   ├── parser.py
│   └── chunker.py
├── requirements.txt
└── main.py

이 구조는 원본 데이터와 처리 로직을 분리해 대량 문서 전처리 시 재현성을 확보하는 데 유리합니다. parser.py는 파일 형식별 파싱을 담당하고, chunker.py는 검색 품질에 맞춘 청킹 전략을 관리하도록 설계합니다. 이렇게 역할을 분리하면 이후 벡터 DB 적재, 임베딩 모델 교체, 문서 유형별 후처리 정책 변경이 쉬워집니다.

파이썬 기반 Unstructured 문서 전처리 코드

Python 환경에서 Unstructured를 사용하려면 기본 패키지 외에도 PDF, DOCX, OCR 처리에 필요한 의존성을 함께 준비해야 합니다. 특히 스캔본 PDF나 표가 많은 보고서는 Tesseract, Poppler 같은 외부 도구의 설치 상태가 결과 품질에 직접 영향을 줍니다. 문서 레이아웃과 표 구조를 최대한 보존해야 하는 경우에는 strategy 값을 hi_res로 설정하고, 테이블 구조 추론 옵션을 함께 사용하는 방식이 적합합니다.

# requirements.txt 설정 예시
# unstructured[pdf]>=0.10.0
# unstructured[docx]>=0.10.0

from unstructured.partition.pdf import partition_pdf

def parse_pdf_document(file_path):
    elements = partition_pdf(
        filename=file_path,
        strategy="hi_res",
        infer_table_structure=True,
        chunking_strategy="by_title",
        max_characters=1000,
        combine_under_n_chars=200
    )

    parsed_data = []
    for element in elements:
        parsed_data.append({
            "type": element.category,
            "text": element.text,
            "metadata": element.metadata.to_dict()
        })
    return parsed_data

if __name__ == "__main__":
    file_path = "data/sample_document.pdf"
    results = parse_pdf_document(file_path)
    for res in results[:3]:
        print(f"[{res['type']}] {res['text'][:100]}...")

위 코드는 PDF 문서를 요소 단위로 분해하고, 제목 기준 청킹을 적용해 문맥 흐름을 유지하는 예시입니다. 파싱 결과를 바로 LLM에 넣기보다 줄바꿈, 머리글, 바닥글, 페이지 번호 같은 반복 노이즈를 제거한 뒤 임베딩하는 것이 바람직합니다. 정제된 문서를 요약·검토하는 별도 분석 흐름이 필요하다면 NotebookLM으로 문서 분석 자동화하기 글도 함께 참고할 수 있습니다.

RAG 성능 향상을 위한 전략 선택과 주의점

Unstructured - 문서 파싱을 실무에 적용할 때는 처리 속도와 추출 정확도 사이의 균형을 명확히 정해야 합니다. 텍스트 기반 PDF는 fast 전략만으로도 충분한 경우가 많지만, 이미지 기반 PDF, 복잡한 표, 다단 편집 문서는 hi_res 전략이 더 적합합니다. 다만 hi_res는 OCR 및 레이아웃 추론 과정에서 CPU와 GPU 자원을 많이 사용하므로 대량 처리 환경에서는 큐 기반 배치 처리, 파일 크기 제한, 실패 재시도 정책을 함께 설계해야 합니다.

전처리 방식 장점 한계
Fast Strategy 처리 속도가 빠르고 리소스 사용량이 낮습니다. 이미지 텍스트와 복잡한 표 인식에는 한계가 있습니다.
Hi-Res Strategy 표, 차트, 복잡한 레이아웃 분석에 유리합니다. 처리 시간이 길고 외부 OCR 의존성이 커집니다.

검색 정확도를 높이려면 파싱된 요소를 그대로 저장하지 말고 문서 제목, 페이지 번호, 섹션명, 표 설명을 메타데이터로 보강해야 합니다. 표 데이터는 HTML 구조만 저장하면 검색 단계에서 의미가 약해질 수 있으므로, LLM에 표 내용을 자연어 설명으로 변환시키고 원본 표와 함께 저장하는 방식이 효과적입니다. 코드와 문서 구조를 더 효율적으로 다루는 접근은 AI 코딩의 숨은 고수, Tree-sitter 글의 토큰 절약 관점과도 연결됩니다.

AI 프롬프트를 활용한 후처리 팁

Unstructured 파싱 결과는 LLM 후처리와 결합할 때 활용도가 높아집니다. 예를 들어 Table 요소가 추출되면 표의 행과 열을 설명하는 문장을 생성하도록 지시하고, NarrativeText 요소에는 핵심 주제와 적용 범위를 태깅하도록 요청할 수 있습니다. 프롬프트는 “문서에 없는 내용을 보완하지 말 것”, “표의 수치를 변경하지 말 것”, “근거 페이지를 유지할 것”처럼 제약 조건을 명시해야 합니다.

    • 스캔본 PDF는 OCR 오류율을 확인한 뒤 임베딩 대상 여부를 결정해야 합니다.
    • 반복되는 머리글과 바닥글은 검색 결과를 오염시키므로 제거해야 합니다.
    • 표는 원본 구조와 자연어 설명을 함께 저장하는 방식이 안정적입니다.
    • 문서별 파싱 로그를 남겨 실패 파일과 누락 페이지를 추적해야 합니다.

실무 총평으로 볼 때 Unstructured는 PDF, Word, HTML 등 다양한 비정형 문서를 RAG 시스템에 투입하기 위한 핵심 전처리 도구입니다. 사내 지식 기반 검색을 구축하는 개발자, 대량 보고서와 논문을 정제하는 데이터 엔지니어, LLM 답변의 근거 품질을 높이려는 AI 서비스 기획자에게 적합합니다.


👨‍💻

작성자: 20년 경력 IT 전문 아키텍트

실무 개발과 아키텍처 설계를 거쳐 현재는 AI 바이브 코딩과 개발 자동화를 연구하고 있습니다. 직접 삽질하며 깨달은 실전 꿀팁과 에러 극복 사례만 투명하게 공유합니다.

댓글