Post

이걸 왜 이제 알았을까? RAG 파이프라인의 구원자, MS MarkItDown 솔직 분석 및 후기

이걸 왜 이제 알았을까? RAG 파이프라인의 구원자, MS MarkItDown 솔직 분석 및 후기

엑셀, PPT 파싱하다 현타 온 개발자들 모여라

요새 회사에서 RAG(검색 증강 생성) 파이프라인 구축하시거나, LLM에 사내 문서 연동하는 작업 하시는 분들 많으시죠? 저도 최근에 이 작업 때문에 며칠 밤을 샜는데요. 진짜… PDF랑 엑셀, PPT 파일에서 텍스트 예쁘게 뽑아내는 게 생각보다 엄청난 노가다더라고요.

흔히들 ‘Garbage In, Garbage Out’이라고 하잖아요? LLM이 아무리 똑똑해도 전처리된 텍스트가 엉망이면 환각(Hallucination) 대잔치가 열립니다. PyPDF2로 읽었더니 텍스트가 안드로메다로 날아가고, 엑셀 표는 줄바꿈이 다 깨져서 LLM이 표 안의 데이터를 엉뚱하게 조합해버리기 일쑤였죠. ‘아, 그냥 내가 파서를 처음부터 짤까?’ 하는 극단적인 생각까지 들 무렵, 깃허브 트렌딩을 뒤적거리다가 엄청난 녀석을 발견했습니다.

바로 마이크로소프트에서 조용히 릴리즈한 MarkItDown이라는 오픈소스 툴이에요. 처음엔 ‘뭐 또 뻔한 텍스트 추출기겠지’ 하고 반신반의하며 써봤는데, 결과물을 보고 진짜 모니터 앞에서 기립 박수를 쳤습니다.

💡 TL;DR (한 마디로?) 모든 형태의 문서(PDF, Word, Excel, PPT, HTML, 심지어 이미지와 오디오까지)를 LLM이 가장 완벽하게 이해할 수 있는 ‘마크다운(Markdown)’ 포맷으로 한 번에 바꿔주는 만능 변환기.


🔥 1. 뭐가 그렇게 특별한데? (기존 파서들과의 차별점)

개발자라면 다들 공감하실 텐데요. 우리가 LLM한테 문서를 컨텍스트로 넘길 때, 그냥 날것의 평문(Plain text)을 던져주는 것보다 마크다운 형태로 구조화해서 주면 모델의 이해도와 추론 성능이 미친 듯이 올라갑니다. 헤딩(#), 리스트(-), 표(|---|) 같은 마크다운 요소들이 LLM에게는 일종의 이정표 역할을 하니까요.

문제는 ‘어떻게’ 원본 문서의 복잡한 레이아웃을 유지하면서 마크다운으로 깔끔하게 바꾸냐는 건데, MarkItDown은 이 귀찮은 작업을 단 3줄의 코드로 끝내버립니다.

1
2
3
4
5
6
from markitdown import MarkItDown

# 단 세 줄이면 끝납니다. 거짓말 안 보태고요.
md = MarkItDown()
result = md.convert("복잡한_회사_실적보고서.xlsx")
print(result.text_content)

과연 성능은 어땠을까요? 정말 경이로울 정도로 엑셀의 시트 구조와 표 형태를 그대로 마크다운 테이블로 렌더링해주더라고요. PPT 파일을 넣으면 슬라이드 제목은 # 헤딩으로, 본문은 불릿 포인트 리스트로 깔끔하게 떨어집니다. 심지어 ZIP 파일을 통째로 넣으면 압축을 풀고 그 안의 파일들까지 재귀적으로 알아서 처리해주는 디테일에는 진짜 혀를 내둘렀습니다.

제가 기존에 고통받으며 쓰던 방식들과 간단히 표로 비교해볼게요.

비교 항목기존 방식 (PyPDF2, pandas, bs4 등)MarkItDown 🚀
코드 복잡도포맷마다 다른 라이브러리 세팅, 예외 처리 지옥MarkItDown() 객체 하나로 통일
표(Table) 처리텍스트 뭉개짐, 탭(Tab)으로 겨우 구분 (LLM이 오해함)완벽한 Markdown Table 포맷팅
이미지/오디오별도의 OCR 모델이나 Whisper 파이프라인 구축 필요LLM API 연동 시 한 큐에 텍스트화 가능
LLM 친화도매우 낮음 (정규식으로 전처리 엄청나게 해야 함)매우 높음 (그냥 갖다 먹이면 됨)

🎯 2. 가장 소름 돋았던 기능: 시각적 콘텐츠의 자동 텍스트화 (VLM 연동)

사실 텍스트 추출만 잘해도 절하면서 쓸 텐데, 제가 진짜 감탄한 포인트는 따로 있습니다. 바로 ‘멀티모달’ 시대에 걸맞은 이미지 처리 방식이에요.

문서 안에 다이어그램이나 사진이 덜렁 있으면 보통의 문서 파서들은 그냥 무시하거나 <image> 태그 하나 띡 남기고 끝나잖아요? 그런데 MarkItDown은 객체를 생성할 때 OpenAI나 Azure OpenAI 클라이언트를 쓱 밀어 넣어주면, 문서 내 이미지를 LLM(정확히는 VLM)이 인식해서 알아서 마크다운 alt text나 상세한 설명으로 바꿔줍니다.

1
2
3
4
5
6
7
from markitdown import MarkItDown
from openai import OpenAI

# GPT-4o를 활용한 이미지 자동 해석 파이프라인
client = OpenAI()
md = MarkItDown(llm_client=client, llm_model="gpt-4o")
result = md.convert("아키텍처_다이어그램_포함.pdf")

이렇게 코드를 돌리면, PDF 안의 복잡한 다이어그램 이미지를 gpt-4o가 쓱 보고 본문 사이에 [이미지 설명: 이 이미지는 AWS 클라우드 아키텍처 다이어그램이며, EC2 인스턴스가 로드밸런서를 통해 S3 버킷과 통신하는 구조를 보여줍니다...] 하는 식으로 자연스럽게 녹여냅니다. 이거 진짜 미친 기능 아닌가요? 이미지 처리를 위한 별도의 멀티모달 RAG 파이프라인을 짤 필요가 아예 사라진 겁니다.


💡 3. 개발자들을 위한 꿀팁: 로컬 LLM으로 비용 0원 만들기

MarkItDown이 API 기반으로 작동하다 보니, 비용 걱정하시는 분들 분명히 계실 겁니다. 문서 하나에 이미지가 수십 장 들어있다면 GPT-4o API 호출 비용이 감당이 안 될 테니까요.

여기서 제가 테스트해 본 꿀팁 하나를 공유할게요. Ollama와 LLaVA 같은 오픈소스 비전 모델을 활용하면 이 비용을 완벽하게 ‘0원’으로 만들 수 있습니다. 호환되는 API 인터페이스를 제공하는 로컬 모델 서버를 띄워두고, MarkItDown의 llm_client base_url만 로컬호스트로 싹 바꿔치기하는 거죠. 속도는 클라우드 API보다 조금 느리겠지만, 사내 보안 문서 유출 걱정도 없고 비용도 안 드니 일석이조의 효과를 볼 수 있습니다.


🤔 4. 솔직한 리뷰: 장점만 있을까? (현실적인 한계점)

물론 며칠간 실무 데이터로 빡세게 굴려보면서 느낀 명확한 한계점들도 있었습니다. 무지성으로 프로덕션에 도입하기 전에 이 부분들은 반드시 체크하셔야 해요.

  1. 복잡한 다단 레이아웃(Multi-column)의 한계: 논문이나 잡지처럼 2단, 3단으로 쪼개져 있고 중간중간 표와 이미지가 섞여 있는 복잡한 PDF는 여전히 텍스트 읽는 순서가 살짝 꼬일 때가 있습니다. (사실 이 부분은 Layout Parser 기반의 무거운 모델을 쓰지 않는 이상 어떤 파서나 겪는 고질병이긴 합니다 😅)
  2. 기괴하게 병합된 엑셀 셀 처리: 실무에서 엑셀 쓰다 보면 시각적인 미관(?)을 위해 셀을 요상하게 병합해 놓는 분들 계시죠? 이런 파일은 마크다운 표로 변환될 때 빈칸이 어색하게 엇나가거나 테이블 구조가 깨지는 경우가 종종 발생했습니다.
  3. 정교한 메타데이터 추출의 부재: Unstructured 같은 거대 라이브러리들은 텍스트 청크마다 이게 ‘제목’인지 ‘본문’인지 메타데이터를 정교하게 발라주는 기능이 있는데, MarkItDown은 말 그대로 순수한 마크다운 ‘텍스트’만 뱉어냅니다. 청킹(Chunking) 전략을 세울 때 마크다운 헤더(#)를 기준으로 직접 파싱 로직을 한 번 더 짜야 한다는 점은 살짝 아쉬웠어요.

🚀 5. 결론: RAG 전처리 생태계의 새로운 게임 체인저

여러 가지 한계점에도 불구하고, 한 마디로 제 감상을 정리하자면 “현재로서 가장 가볍고, 압도적으로 편리한 실용적인 대안”입니다.

기존에 Unstructured 같은 무겁고 의존성 꼬이는 라이브러리를 쓰면서 환경 세팅에 지치셨거나, 랭체인(LangChain)의 기본 도큐먼트 로더들이 뱉어내는 띄어쓰기 엉망인 텍스트에 넌더리가 나셨다면 오늘 당장 터미널을 열고 pip install markitdown을 타이핑해보세요.

짜증 났던 문서 전처리 코드가 절반 이하로 줄어들고, LLM의 답변 퀄리티가 수직 상승하는 마법을 경험하실 수 있을 겁니다. 다음 사내 지식베이스 연동 프로젝트 때는 저도 주저 없이 이 녀석을 메인 파서로 올릴 생각입니다.

여러분도 직접 적용해보시고 어떤 엣지 케이스가 있었는지, 어떻게 해결하셨는지 댓글로 후기 공유해주시면 너무 재밌을 것 같네요! 오랜만에 커피 한 잔 곁들여가며 동료 개발자들과 밤새 수다 떨고 싶어지는, 아주 매력적이고 ‘개발자 친화적인’ 툴이었습니다. 해피 코딩하세요! ☕️🚀

References

  • https://github.com/microsoft/markitdown
  • https://pypi.org/project/markitdown/
This post is licensed under CC BY 4.0 by the author.