HWP부터 Word, PPT까지: 사내 파편화 문서를 하나로 묶는 멀티 포맷 RAG 파이프라인 구축법
기업 내에서 검색 증강 생성(RAG) 시스템이나 지식 기반 AI 어시스턴트를 구축할 때 데이터 엔지니어가 마주하는 가장 큰 난관 중 하나는 사내 문서 포맷의 극심한 파편화입니다.
행정·공공 연계 부서는 HWP/HWPX, 기획·법무 부서는 DOCX(MS Word), 사업·영업 부서는 PPTX(PowerPoint), 그리고 배포된 최종 보고서는 PDF로 제각각 저장되어 사내 드라이브에 분산되어 있습니다.
이러한 다종 문서를 통합 벡터 DB에 적재하기 위해 개별 라이브러리를 임의로 연결하면 어떤 문제가 발생하며, 이를 단일 표준 마크다운(Markdown) 파이프라인으로 어떻게 정규화할 수 있는지 살펴보겠습니다.
포맷별 개별 파서 사용 시 발생하는 청킹(Chunking) 불일치 문제
문서 포맷별로 서로 다른 오픈소스 파서나 원시 텍스트 추출기를 도입할 경우, 추출된 텍스트의 구조와 서식이 제각각으로 출력되는 구조적 불일치가 발생합니다.
- HWP/HWPX: 단순 텍스트 덤프 시 표(Table)가 문자열로 뭉개지거나 누락되어 수치 데이터가 분실됩니다.
- DOCX: 제목 스타일(Heading 1~6)의 계층 관계가 사라지고 일반 본문 단락과 동일한 평문으로 추출됩니다.
- PPTX: 여러 텍스트 박스가 화면에 배치된 시각적 순서와 무관하게 XML 노드 순서대로 뒤섞여 문맥이 파괴됩니다.
이 상태에서 고정 크기(예: 500자 단위)의 문자열 분할(RecursiveCharacterTextSplitter)을 적용하면, 표 한가운데에서 청크가 잘리거나 슬라이드 제목과 본문이 서로 다른 청크로 나뉘어 임베딩 유사도 검색 시 엉뚱한 결과가 반환되는 원인이 됩니다.
표준 마크다운 단일 규격 정규화 워크플로우
RAG 아키텍처의 전처리 단계에서 모든 원본 문서를 구조화된 마크다운(Markdown) 단일 규격으로 1차 변환하면 문서 간 구조적 이질성을 효과적으로 제거할 수 있습니다.
마크다운은 LLM 사전 학습에 광범위하게 활용된 표준 표현 방식으로, 다음과 같은 구조적 이점을 제공합니다.
- 제목 위계의 통일: HWP의 개요 번호, Word의 Heading 스타일, PPT의 슬라이드 제목을
#,##,###표준 헤더로 통일하여 문서의 계층 트리를 일관되게 보존합니다. - 슬라이드 및 페이지 경계 명시: PPTX 발표 자료는
---구분선과# Slide N: [제목]형식을 적용하여 슬라이드 단위의 문맥 독립성을 유지합니다. - 표(Table) 데이터의 2차원 토폴로지 유지: 셀 병합이 포함된 복합 표를 표준 마크다운 표(
|---|---|)로 변환하여 행과 열의 교차 관계를 LLM이 직관적으로 파악할 수 있도록 합니다.
LangChain / LlamaIndex 연동 및 메타데이터 태깅 예제
표준 마크다운으로 정규화된 문서는 LangChain이나 LlamaIndex의 표준 마크다운 스플리터와 결합하여 문서 계층 기반의 의미론적 청킹(Semantic Chunking)을 손쉽게 구현할 수 있습니다.
from langchain_community.document_loaders import TextLoader from langchain_text_splitters import MarkdownHeaderTextSplitter # 1. 포맷에 관계없이 마크다운으로 1차 변환된 문서 로드 markdown_document = """ # 2026 사업 계획서 ## 1. 개요 본 사업은 엔터프라이즈 RAG 파이프라인 구축을 목표로 합니다. ## 2. 세부 예산안 | 항목 | 배정액(백만원) | 비고 | | --- | --- | --- | | 서버 인프라 | 150 | GPU 클러스터 | | 데이터 전처리 | 80 | 마크다운 파이프라인 | """ # 2. 마크다운 헤더 기반 시맨틱 청킹 정의 headers_to_split_on = [ ("#", "Header 1"), ("##", "Header 2"), ] markdown_splitter = MarkdownHeaderTextSplitter( headers_to_split_on=headers_to_split_on, strip_headers=False ) chunks = markdown_splitter.split_text(markdown_document) # 3. 청크별 포맷 및 부서 메타데이터 보강 for chunk in chunks: chunk.metadata.update({ "source_format": "hwp", # or "docx", "pptx", "pdf" "department": "기술기획팀", "created_at": "2026-08-27" }) print(f"[{chunk.metadata['Header 2']}] Metadata:", chunk.metadata) print(chunk.page_content) print("-" * 40)
위 코드처럼 표준 마크다운 스플리터를 사용하면, 원본 파일이 HWP이든 DOCX이든 관계없이 헤더 단위로 정확하게 청크가 분할되며 메타데이터 필터링을 위한 속성 태깅도 일관되게 처리됩니다.
결론: 전처리 표준화를 통한 사내 RAG 검색 파이프라인 운영 효율화
다양한 사내 문서 포맷을 사전에 표준 마크다운으로 정규화하는 파이프라인을 구축하면, 벡터 DB의 검색 품질을 높이고 청킹 로직의 유지보수 비용을 크게 낮출 수 있습니다.
비정형 문서의 구조적 손실을 줄이고 일관된 RAG 데이터 파이프라인을 운영하고자 하는 엔터프라이즈 환경이라면, MDChange의 다중 포맷 파싱 API를 통해 전처리 파이프라인을 표준화해 보세요.