TRENDSHIFT #16 · 2026.05.23 · microsoft/markitdown

모든 문서를 LLM이
먹기 좋은 마크다운으로

Microsoft의 가벼운 파이썬 도구. PDF·Word·Excel·PPT·이미지·오디오·유튜브 URL까지 한 줄 명령으로 마크다운 텍스트를 뽑아낸다. 123k stars, AutoGen 팀이 만든 LLM 전처리 표준.

0먼저, MarkItDown이 뭔가?

아주 기초부터 — 왜 굳이 마크다운으로 변환하나?

요즘 챗GPT나 Claude한테 "이 PDF 좀 요약해줘" 하면 그냥 파일을 던지면 되지만, 개발자가 코드로 그걸 하려면 얘기가 달라진다. 대형 언어 모델은 글자(텍스트)를 먹는 기계라서, PDF나 워드 파일을 그대로 못 먹는다. 그래서 우리가 미리 "PDF 안의 글자만 깔끔하게 뽑아내는 작업"을 해줘야 한다.

용어
LLM (Large Language Model, 대형 언어 모델)
GPT-4, Claude, Gemini 같은 AI 모델. 글자만 먹고 글자를 내뱉는다. 이미지나 PDF, 엑셀을 직접 못 다루기 때문에 사람이 "텍스트로 풀어줘야" 한다.

그런데 그냥 글자만 뽑으면 문제가 생긴다. 표가 무너지고, 제목인지 본문인지 구분이 사라지고, 글머리표가 흩어진다. MarkItDown은 이 문제를 마크다운으로 구조를 살려서 뽑는 방식으로 해결한다.

용어
Markdown (마크다운, 가벼운 문서 형식)
'#'으로 제목, '*'로 강조, '|'로 표를 만드는 단순 텍스트 규칙. README 파일에서 매일 보는 그 형식. 일반 텍스트라 사람이 읽을 수 있고, GPT/Claude도 학습 과정에서 마크다운을 엄청 많이 봤기 때문에 "마크다운으로 줘"라고 하면 가장 잘 이해한다.
비유

요리에 비유하면 — PDF는 통째로 든 식재료(닭 한 마리·당근·양파)다. LLM은 잘게 썬 재료만 먹는 까다로운 요리사. MarkItDown은 밑작업 도마다. 재료를 받아 LLM이 바로 먹을 수 있는 크기로 자르고, 어떤 게 단백질이고 어떤 게 채소인지 라벨까지 붙여서 내준다.

1프로젝트 한줄 요약

이 글의 핵심 메시지.

핵심 메시지

"PDF·DOCX·XLSX·이미지·오디오·유튜브,
전부 마크다운 텍스트로. 한 줄로."

MarkItDown은 Microsoft가 자사 AutoGen 팀에서 직접 만든 다중 포맷 → 마크다운 변환기다. textract 같은 옛 라이브러리와 비슷한 위치지만, 차이가 명확하다 — 단순히 "글자만 뽑기"가 아니라 제목·표·리스트·링크 같은 문서 구조를 살려서 마크다운으로 표현한다.

최종 출력은 사람도 읽을 만하지만, 본질적으로는 LLM의 입력으로 가장 효율적인 형태다. 마크다운은 토큰 효율도 좋아서 같은 정보를 적은 비용으로 모델에 넣을 수 있다.

2왜 주목받는가

123k stars의 이유 — 트렌딩 배경.

2024년 말 공개 이후 빠르게 별을 모은 이유는 세 가지로 정리된다.

이유 1

Microsoft 공식 + AutoGen 팀 출신

저자가 Adam Fourney(adamfo@microsoft.com). Microsoft Research의 AutoGen 팀이 직접 만들었다. AutoGen은 멀티 에이전트 LLM 프레임워크인데, 거기서 문서 입력 전처리가 골칫거리였고 그 내부 도구를 외부로 푼 결과물이다. "진짜 LLM 파이프라인을 운영하던 팀이 만든 도구"라는 신뢰가 별점으로 이어졌다.

이유 2

경쟁 도구 대비 명확한 포지셔닝

비슷한 도구로 textract, unstructured, docling(IBM) 등이 있다. MarkItDown은 "가벼움 + 마크다운 출력 + 폭넓은 포맷"이라는 세 가지 축에서 균형을 잡았다. unstructured처럼 모든 걸 다 처리하려 욕심내지 않고, textract처럼 글자만 던지지 않는다.

"we focus on preserving important document structure and content as Markdown (including: headings, lists, tables, links, etc.)" — README에서 직접 인용한 차별점.
이유 3

LLM 워크플로의 표준 부속품으로 자리잡음

LangChain·LlamaIndex 같은 RAG 프레임워크의 문서 로더 자리에 자연스럽게 들어갔다. Microsoft 자사의 AutoGen, Azure AI Foundry 등에서도 추천한다. 무엇보다 의존성 최소화 설계로 "프로젝트에 슬쩍 끼워 넣기" 좋다 — pip install markitdown 한 줄.

비유

요리 기구로 치면 "좋은 식칼"이다. 푸드 프로세서(unstructured)는 다 갈아주지만 무겁고 복잡하다. 가위(textract)는 가볍지만 못 자르는 게 많다. MarkItDown은 식칼 — 가볍고 잘 들고, 대부분의 식재료를 처리하면서도 모양을 유지한다.

3기술 스택 전체 지도

의존성 트리로 본 MarkItDown의 뼈대.

MarkItDown은 99.7% 파이썬(나머지 0.3%는 Dockerfile)이다. 코어는 매우 가볍게 유지하고, 포맷별 무거운 라이브러리는 "optional dependency"로 분리해 사용자가 필요한 것만 깔도록 설계했다.

코어 의존성 (모두 설치)

의존성
beautifulsoup4 + markdownify + magika + charset-normalizer + defusedxml + requests
HTML 파싱(bs4) → 마크다운 변환(markdownify) + 파일 종류 자동 감지(Google magika, ML 기반 file-type detector) + 텍스트 인코딩 감지 + XML 안전 파싱(defusedxml으로 XXE 공격 방어) + 원격 URL 가져오기(requests). 이 여섯 가지가 모든 변환의 기본 토대.

포맷별 옵션 의존성

[pdf]    → pdfminer.six + pdfplumber  (텍스트 추출)
[docx]   → mammoth + lxml             (Word를 HTML로 → 마크다운)
[xlsx]   → pandas + openpyxl          (시트 → 표)
[xls]    → pandas + xlrd              (오래된 엑셀)
[pptx]   → python-pptx                (슬라이드 파싱)
[outlook]→ olefile                    (.msg 메시지)
[audio-transcription]    → pydub + SpeechRecognition
[youtube-transcription]  → youtube-transcript-api
[az-doc-intel]           → Azure Document Intelligence
[az-content-understanding] → Azure AI Content Understanding

이 분리 덕에 pip install 'markitdown[pdf,docx]'처럼 딱 필요한 포맷만 설치할 수 있다. Docker 이미지 크기 줄이거나 의존성 충돌 피하는 데 결정적이다.

인프라/배포

스택

빌드 + 테스트 + 배포

빌드 시스템: hatchling (PEP 517 기반 모던 파이썬 패키징, setuptools의 후속). 테스트: hatch test로 격리 환경에서 멀티 파이썬 버전(3.10/3.11/3.12) 매트릭스 테스트. 코드 품질: pre-commit hooks + mypy 타입체크. 배포: PyPI 패키지(pip install markitdown) + Dockerfile(컨테이너 실행) + dev-container(.devcontainer/로 VS Code Codespaces 지원).

LLM 통합

이미지/PPTX의 그림을 설명하려면 LLM Vision이 필요하다. MarkItDown은 OpenAI 호환 클라이언트를 받아 쓰는 패턴이다 — Anthropic·Mistral·로컬 Ollama도 OpenAI 포맷만 맞추면 다 꽂힌다.

from markitdown import MarkItDown
from openai import OpenAI

md = MarkItDown(
    llm_client=OpenAI(),       # Claude·Ollama도 OpenAI 호환 어댑터로 가능
    llm_model="gpt-4o",
)
result = md.convert("slides.pptx")
print(result.text_content)
용어
Azure Document Intelligence
마이크로소프트의 클라우드 OCR/문서 분석 서비스(구 Form Recognizer). 스캔된 PDF, 손글씨, 영수증, 표가 복잡한 문서를 정확히 뽑아주는 API. MarkItDown은 -d -e <endpoint> 옵션으로 이걸 백엔드로 쓸 수 있다 — 로컬 라이브러리로 못 푸는 어려운 PDF를 Azure에 위임한다.

4아키텍처 심화 분석

시스템 구조도 + 핵심 설계 패턴.

MarkItDown의 아키텍처는 "Converter Registry 패턴"으로 한 마디 정리된다. MarkItDown 객체가 컨버터 목록을 들고 있고, 입력이 들어오면 어떤 컨버터가 처리할 수 있는지 자동으로 결정한다.

시스템 구조도

   ┌────────────────────────────────────────────────────────────┐
   │                  사용자 호출                                │
   │  md.convert("file.pdf") / md.convert("https://...")         │
   └─────────────────┬──────────────────────────────────────────┘
                     ▼
   ┌────────────────────────────────────────────────────────────┐
   │  MarkItDown 코어 (_markitdown.py)                           │
   │  • 입력 라우팅 (file / URL / stream / bytes)               │
   │  • magika로 파일 종류 감지 (MIME + 확장자 + 매직넘버)       │
   │  • 컨버터 후보 선택 → 우선순위 정렬                         │
   └─────────────────┬──────────────────────────────────────────┘
                     ▼
   ┌────────────────────────────────────────────────────────────┐
   │              StreamInfo (메타 + 파일 스트림)                │
   │   extension · mimetype · charset · url · filename           │
   └─────────────────┬──────────────────────────────────────────┘
                     ▼
   ┌────────────────────────────────────────────────────────────┐
   │  Converter Registry (converters/__init__.py)                │
   │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐           │
   │  │PdfConverter │ │DocxConverter│ │PptxConverter│  …17개+    │
   │  └─────────────┘ └─────────────┘ └─────────────┘           │
   │     ↓ accepts()? → True인 것만 convert() 호출               │
   └─────────────────┬──────────────────────────────────────────┘
                     ▼
   ┌────────────────────────────────────────────────────────────┐
   │  각 컨버터의 변환 로직                                       │
   │  • PDF: pdfminer.six로 텍스트 추출 → 후처리                 │
   │  • DOCX: mammoth로 HTML 변환 → markdownify                  │
   │  • XLSX: pandas DataFrame → 마크다운 표                     │
   │  • IMG: EXIF + LLM Vision으로 캡션                          │
   └─────────────────┬──────────────────────────────────────────┘
                     ▼
   ┌────────────────────────────────────────────────────────────┐
   │  DocumentConverterResult                                    │
   │   .text_content (마크다운 문자열) + .title                  │
   └────────────────────────────────────────────────────────────┘
  

핵심 설계 패턴 ①: Strategy + Registry

모든 컨버터는 DocumentConverter를 상속한다. 인터페이스는 단순하다 — accepts(stream_info)로 "내가 처리할 수 있나" 답하고, convert(stream, stream_info)로 실제 변환을 수행한다.

class DocumentConverter:
    def accepts(self, file_stream, stream_info, **kwargs) -> bool:
        """이 컨버터가 stream_info를 처리할 수 있는가?"""
        return stream_info.extension == ".pdf" or \
               stream_info.mimetype == "application/pdf"

    def convert(self, file_stream, stream_info, **kwargs) -> DocumentConverterResult:
        """실제 변환 — text_content(마크다운)를 반환"""
        ...

새 포맷을 추가하려면 이 클래스 하나만 상속해서 만들고 등록하면 끝. 컨버터마다 자기 책임 영역이 명확해서 테스트도 컨버터 단위로 격리된다 — 전형적인 Strategy 패턴.

비유

병원 응급실의 분류(triage) 시스템과 비슷하다. 환자(파일)가 들어오면 접수처(MarkItDown 코어)가 증상(파일 종류)을 보고 어느 진료과(컨버터)로 보낼지 결정한다. 각 진료과는 자기 전문 분야만 처리한다 — 정형외과는 X-ray만, 안과는 눈만. 새 진료과 추가는 간판만 달면 된다.

핵심 설계 패턴 ②: Stream-First API

README의 보안 섹션이 길게 강조하는 부분. convert()는 너무 관대해서 위험할 수 있다 — 로컬 파일·HTTP URL·bytes 스트림을 다 받는다. 신뢰할 수 없는 입력은 가장 좁은 API로:

함정
convert()에 사용자 입력 직접 넣기

웹 서버에서 사용자가 입력한 URL을 그대로 md.convert(user_input)에 넘기면, 공격자가 file:///etc/passwdhttp://169.254.169.254/(AWS 메타데이터) 같은 URL을 주입할 수 있다. SSRF 공격의 전형.

해결책
용도별로 좁은 API 사용

로컬 파일만 변환할 거면 convert_local(). URL은 직접 requests.get()으로 검증 후 convert_response(). 가장 안전한 방식은 본인이 스트림을 열어 convert_stream()에 넘기는 것. "최소 권한 원칙"의 API 버전.

핵심 설계 패턴 ③: Plugin System

3rd-party 플러그인을 명시적으로 지원. 진입점(entry_points) 메커니즘으로 PyPI에 올라간 외부 패키지를 자동 발견한다. 예를 들어 markitdown-ocr 플러그인은 LLM Vision으로 PDF/DOCX 안의 이미지에서 글자를 뽑는 기능을 추가한다 — 코어를 건드리지 않고.

markitdown --list-plugins              # 설치된 플러그인 목록
markitdown --use-plugins file.pdf      # 플러그인 활성화하고 변환

5디렉토리 구조 해부

레포 안에서 어디에 무엇이 있는가.

microsoft/markitdown/
├── .devcontainer/         ← VS Code dev container 설정 (Codespaces 1클릭 환경)
├── .github/               ← GitHub Actions CI 워크플로
├── packages/              ← 멀티 패키지 monorepo
│   ├── markitdown/        ← 본체 패키지
│   │   ├── src/markitdown/
│   │   │   ├── __init__.py
│   │   │   ├── __main__.py        ← CLI 진입점
│   │   │   ├── _markitdown.py     ← MarkItDown 클래스 (코어)
│   │   │   ├── _base_converter.py ← DocumentConverter 추상 클래스
│   │   │   ├── _stream_info.py    ← StreamInfo 메타데이터
│   │   │   ├── _uri_utils.py      ← URL/file:// 라우팅
│   │   │   ├── converters/        ← 포맷별 컨버터 (이 폴더가 핵심!)
│   │   │   │   ├── _pdf_converter.py        (20KB, 가장 큼)
│   │   │   │   ├── _cu_converter.py         (Azure Content Understanding)
│   │   │   │   ├── _doc_intel_converter.py  (Azure Doc Intelligence)
│   │   │   │   ├── _pptx_converter.py
│   │   │   │   ├── _xlsx_converter.py
│   │   │   │   ├── _docx_converter.py
│   │   │   │   ├── _image_converter.py
│   │   │   │   ├── _audio_converter.py      ← 음성 STT
│   │   │   │   ├── _youtube_converter.py    ← 자막 fetch
│   │   │   │   ├── _zip_converter.py        ← ZIP 풀어서 내부 파일 재귀 변환
│   │   │   │   ├── _epub_converter.py
│   │   │   │   ├── _html_converter.py
│   │   │   │   ├── _rss_converter.py
│   │   │   │   ├── _wikipedia_converter.py  ← 위키 전용 클린업
│   │   │   │   ├── _bing_serp_converter.py  ← Bing 검색 결과 페이지
│   │   │   │   ├── _outlook_msg_converter.py
│   │   │   │   ├── _csv_converter.py
│   │   │   │   ├── _ipynb_converter.py      ← Jupyter 노트북
│   │   │   │   ├── _plain_text_converter.py ← 최후의 fallback
│   │   │   │   ├── _markdownify.py          ← HTML → MD 헬퍼
│   │   │   │   ├── _llm_caption.py          ← LLM Vision 캡션
│   │   │   │   ├── _transcribe_audio.py     ← 음성 STT 헬퍼
│   │   │   │   └── _exiftool.py             ← EXIF 메타 추출
│   │   │   └── __about__.py       ← 버전 문자열
│   │   ├── tests/                 ← pytest 테스트
│   │   └── pyproject.toml         ← Hatch 빌드 설정 + 의존성
│   ├── markitdown-mcp/            ← MCP 서버 패키지 (Claude/Cursor 연결용)
│   ├── markitdown-ocr/            ← OCR 플러그인 (LLM Vision 기반)
│   └── markitdown-sample-plugin/  ← 3rd-party 플러그인 작성 예제
├── Dockerfile                     ← stdin → stdout 컨테이너
├── README.md
├── LICENSE                        ← MIT
├── SECURITY.md                    ← 보안 이슈 신고 가이드
└── .pre-commit-config.yaml        ← pre-commit hooks
  

주목할 폴더 3개

핵심

packages/markitdown/src/markitdown/converters/

여기가 진짜 본체. 파일 19개 + 헬퍼 4개. 새 포맷 지원을 추가하고 싶다면 이 폴더에 _xxx_converter.py를 하나 만들고 등록하면 끝. 각 파일이 독립적이라 코드 읽기도 쉽다. 파이썬으로 컨버터 패턴을 배우기 가장 좋은 실전 예제 폴더.

확장

packages/markitdown-mcp/

별도 패키지로 MCP (Model Context Protocol) 서버를 제공. Claude Desktop이나 Cursor에 등록하면 AI 어시스턴트가 직접 MarkItDown을 호출해서 파일을 변환할 수 있다. "AI에게 도구를 쥐여주는 방식"의 모범 사례.

학습

packages/markitdown-sample-plugin/

플러그인을 어떻게 만드는지 보여주는 샘플. pyproject.toml[project.entry-points."markitdown.plugins"] 섹션이 핵심. 본 레포가 "라이브러리 확장성 설계"의 교과서가 되는 이유.

6학습 포인트

이 레포에서 무엇을 배울 수 있는가.

MarkItDown은 코드량이 크지 않다(파이썬 200KB 안팎). 그런데 그 안에 현업 파이썬 패키지의 모범 사례가 줄줄이 들어 있다. 학습 관점에서 6가지로 쪼개보자.

학습 포인트 1

Converter Registry 패턴 (Strategy + Discovery)

converters/__init__.py에서 모든 컨버터를 import + __all__로 노출. MarkItDown 클래스는 생성 시 이 리스트를 받아 등록한다. 사용자가 새 컨버터를 만들면 md.register_converter(MyConverter())로 동적 추가도 가능.

실습 아이디어: 자기 프로젝트에서 비슷한 "여러 종류의 입력을 처리해야 하는" 상황(예: 여러 결제 게이트웨이, 여러 알림 채널)에 같은 패턴 적용해보기.

학습 포인트 2

Optional Dependencies로 패키지 슬림화

pyproject.toml[project.optional-dependencies] 활용법이 교본. all·pdf·docx 같은 그룹으로 의존성을 묶고, 사용자가 pip install 'markitdown[pdf,docx]'처럼 골라 설치. 컨테이너 이미지 크기 60%~80% 줄이는 핵심 테크닉.

실습 아이디어: 본인의 파이썬 패키지에 optional dep 그룹을 도입. 무거운 시각화 라이브러리(matplotlib)·ML 라이브러리(torch)를 옵션으로 떼어내기.

학습 포인트 3

Hatch 빌드 시스템

setuptools·poetry 다음 세대인 Hatch가 빌드/테스트/배포를 모두 관리. hatch shell로 격리 환경 진입, hatch test로 매트릭스 테스트, hatch publish로 PyPI 배포. tool.hatch.envs.* 섹션 읽으면 패턴이 보인다.

실습 아이디어: 새 파이썬 프로젝트를 Hatch로 시작해보기. hatch new myproject.

학습 포인트 4

magika로 파일 타입 감지

Google의 magika는 ML 기반 파일 타입 감지기 — 확장자가 거짓말해도(또는 없어도) 매직넘버 + 내용 패턴으로 정확히 맞춘다. MarkItDown은 이걸로 "PDF인 줄 알았는데 실제론 HTML" 같은 케이스를 잡는다.

실습 아이디어: 업로드 폴더 안의 파일을 magika로 스캔해 실제 타입과 확장자가 다른 의심 파일 찾기.

학습 포인트 5

LLM Vision 통합 패턴

_llm_caption.py + _image_converter.py를 보면 OpenAI 클라이언트만 받고 모델명은 외부에서 주입. 이 단순한 약속(OpenAI 호환 인터페이스)이 Claude·Gemini·Ollama 같은 다른 프로바이더를 동시에 지원하게 만든다.

실습 아이디어: 본인 도구에 "LLM 옵션"을 넣을 때 같은 패턴 따르기. 특정 SaaS에 락인되지 말 것.

학습 포인트 6

보안 의식적인 API 설계

defusedxml 사용(XXE 방지), convert_local() 같은 좁은 API 제공, README의 보안 섹션 명시. "공격자가 입력을 조작할 수 있다"는 가정으로 설계한 흔치 않은 오픈소스. SSRF·XXE·Path Traversal 같은 웹 보안 개념 학습에 좋은 살아 있는 예제.

실습 아이디어: 본인 코드에서 사용자 입력을 받는 함수를 골라 "공격 입력이 들어오면?"으로 점검 + 좁은 API 제공.

7하드웨어/시스템 요구사항

어디서 어떻게 돌릴 수 있나.

필수

최소 환경

Python 3.10 이상(3.13까지 공식 지원). OS 무관 — 윈도우·맥·리눅스 모두. 메모리는 대부분 파일에서 200MB 이내로 충분. 대형 PDF(수백 페이지)나 큰 엑셀에서 잠시 1GB까지 쓸 수 있다.

권장

가상환경 사용

README가 직접 권하는 패턴 — venv·uv·conda 셋 다 안내. uv는 Astral의 차세대 패키징 도구로 pip보다 10배 이상 빠르다. 2026년 기준 신규 파이썬 프로젝트는 uv가 기본값이라고 봐도 무방.

uv venv --python=3.12 .venv
source .venv/bin/activate
uv pip install 'markitdown[all]'
선택

Docker

레포 루트에 Dockerfile 제공. 컨테이너로 격리해서 stdin/stdout으로 변환:

docker build -t markitdown:latest .
docker run --rm -i markitdown:latest < my.pdf > out.md

이미지 크기는 모든 의존성 포함 시 1GB 이내. "파이프라인의 한 단계로 끼워 넣을 때" 컨테이너가 깔끔하다 — Airflow·n8n·Zapier 같은 워크플로 도구에서 쓰기 좋음.

선택

외부 서비스 (옵션)

Azure Document Intelligence — 어려운 스캔 PDF용. 사용량 기반 과금(첫 500페이지/월 무료). OpenAI API — 이미지 캡션·PPTX 슬라이드 이미지 설명용. 반드시 필요하진 않다 — 기본 변환은 전부 로컬에서 무료로 작동한다.

비유

커피머신 같다. 기본 모델은 손으로 직접 내리는 드립(로컬 라이브러리). 무거운 PDF를 자주 다루면 에스프레소 머신(Azure Doc Intel) 끼워 넣기. 이미지 안의 글자를 자주 본다면 우유 거품기(LLM Vision) 추가. 처음엔 기본만 깔고 필요할 때 옵션 추가하면 된다.

8직접 해볼 수 있는 실습 과제

난이도별 5개 — 짧게 시작해서 깊게.

난이도 ★ (입문, 10분)

PDF 한 개를 마크다운으로 뽑기

pip install 'markitdown[pdf]' 후 손에 있는 PDF로 markitdown report.pdf > out.md. 결과 마크다운을 텍스트 에디터로 열어보고 — 표·제목·리스트가 어떻게 살아 있는지 관찰. 학습 포인트: 글자만 뽑힌 게 아니라 구조가 유지된다는 걸 직접 확인.

난이도 ★★ (초보, 30분)

유튜브 자막 → 요약 파이프라인

markitdown 'https://youtu.be/<id>' > transcript.md로 자막을 마크다운으로 뽑고, ChatGPT나 Claude에 붙여서 5줄 요약 요청. 학습 포인트: "텍스트 추출 → LLM 요약"이라는 RAG 워크플로의 미니어처. 강의 영상 학습 노트 만들기 같은 실용 케이스도 바로.

난이도 ★★★ (중급, 1~2시간)

커스텀 컨버터 작성 (.eml 메일 파일)

DocumentConverter를 상속해 .eml(표준 이메일 포맷) 변환기를 만들어보기. 파이썬 표준 라이브러리 email 모듈로 헤더·본문 파싱 → 마크다운 출력. 학습 포인트: Strategy 패턴 직접 구현 + Python 표준 라이브러리 활용. 끝나면 패키지의 _outlook_msg_converter.py(.msg용)와 비교하면서 차이 학습.

난이도 ★★★★ (중상급, 한나절)

RAG 챗봇용 전처리 파이프라인

업로드 폴더 안 PDF·DOCX·XLSX·PPTX를 모두 마크다운으로 변환 → 청크 분할(LangChain 또는 직접 구현) → 임베딩(OpenAI text-embedding-3-small 또는 로컬 bge-small) → SQLite + sqlite-vec 또는 Chroma DB에 저장 → 질의 시 유사도 검색 → LLM에게 컨텍스트로 제공. 학습 포인트: MarkItDown이 어디서 빛나는지 체감 — "전처리"가 RAG 품질의 절반.

난이도 ★★★★★ (고급, 며칠)

플러그인 패키지 만들어 PyPI에 올리기

markitdown-sample-plugin을 참고해 본인만의 플러그인을 작성·배포. 아이디어 예: 'markitdown-notion' (Notion API 페이지를 마크다운으로), 'markitdown-korean-ocr' (한국어 특화 OCR로 스캔 PDF 처리), 'markitdown-slack-export' (Slack export ZIP을 시간순 마크다운 일지로). 학습 포인트: PyPI 배포·entry_points·pre-commit·GitHub Actions까지 풀패키지 라이프사이클 체험. 잘 만들면 본 레포의 사용자들이 실제로 깐다.

9관련 기술 심화 학습 로드맵

주차별 학습 계획 — 4주 코스.

1주차

파이썬 패키지 생태계

주제: pyproject.toml · Hatch · uv · optional-dependencies · entry_points. 학습: MarkItDown의 pyproject.toml 정독 → 동일 구조로 자기 미니 패키지를 만들고 TestPyPI에 올려보기. 읽을거리: PEP 517·518·621, Hatch 공식 문서. 파이썬 패키지를 "사용자"에서 "제작자"로 한 단계 올리는 주차.

2주차

문서 파싱 라이브러리

주제: pdfminer.six · pdfplumber · mammoth · python-pptx · openpyxl. 학습: 각 라이브러리 README 읽고 각각 PDF/DOCX/PPTX/XLSX 한 개씩 직접 파싱해보기. 발견: "왜 MarkItDown은 pdfminer + pdfplumber를 함께 쓰나?" 답을 코드에서 찾기. 심화: 표가 복잡한 PDF를 잡아 어떻게 망가지는지 관찰.

3주차

RAG(검색 증강 생성) 기초

주제: 청크 분할 · 임베딩 · 벡터 DB · 시맨틱 검색. 학습: MarkItDown으로 자기 문서 컬렉션을 마크다운화 → LangChain 또는 LlamaIndex로 RAG 챗봇 빌드. 벡터 DB 선택: 무료 옵션은 Chroma·Qdrant·SQLite + sqlite-vec. 도전: 한국어 문서로 RAG할 때 임베딩 모델 선택(bge-m3 vs jhgan/ko-sroberta-multitask) 비교.

4주차

MCP(Model Context Protocol)와 AI 어시스턴트 통합

주제: MCP 서버 작성 · Claude Desktop·Cursor에 연결 · 도구를 LLM에 노출. 학습: markitdown-mcp 패키지 코드 정독 → 자기만의 MCP 서버 작성(예: 회사 위키 검색 도구). 읽을거리: Anthropic의 MCP 공식 문서 + fastmcp 라이브러리(github.com/PrefectHQ/fastmcp). "AI에게 손을 달아주는" 다음 시대 기술의 시작점.

10핵심 키워드 사전

레포에 등장하는 주요 기술 용어 — 한 번에 정리.

키워드
AutoGen (오토젠)
Microsoft Research의 멀티 에이전트 LLM 프레임워크. 여러 AI 에이전트가 대화하면서 작업을 협업한다. MarkItDown은 AutoGen 팀이 자체 파이프라인 전처리용으로 만들었다가 외부에 공개한 것.
키워드
Hatch / Hatchling
PEP 517 기반 모던 파이썬 빌드 도구. Hatchling은 빌드 백엔드, Hatch는 프로젝트 매니저 CLI. setup.py 시대의 다음 세대.
키워드
magika
Google이 만든 ML 기반 파일 타입 감지기. Gmail·Drive·Safe Browsing에 대규모 적용 중. 확장자가 거짓이거나 없어도 내용 패턴으로 진짜 타입을 알아낸다.
키워드
markdownify
파이썬 라이브러리. HTML 문자열을 마크다운 문자열로 변환. BeautifulSoup 위에 얹혀 있음. MarkItDown의 거의 모든 컨버터가 최종 단계에서 이걸 호출.
키워드
pdfminer.six / pdfplumber
PDF 텍스트 추출 라이브러리. pdfminer.six는 저수준(글자 좌표까지 정확히), pdfplumber는 그 위의 고수준(표 인식 자동). MarkItDown은 둘 다 써서 보완.
키워드
mammoth
.docx(Word) 파일을 깨끗한 HTML로 변환하는 파이썬 라이브러리. 워드의 복잡한 스타일을 의미 있는 HTML 태그(h1, p, ul)로 매핑하는 게 강점.
키워드
defusedxml
파이썬 표준 xml 모듈의 XXE(XML External Entity) 공격 방어 버전. 사용자가 제공한 XML이 외부 리소스를 불러와 정보를 빼가는 공격을 막는다.
키워드
SSRF (Server-Side Request Forgery)
서버 측 요청 위조. 공격자가 서버를 속여 내부 망의 자원(http://localhost, AWS 메타데이터)을 요청하게 만드는 공격. MarkItDown의 convert()에 URL을 직접 넘기면 발생 가능.
키워드
RAG (Retrieval-Augmented Generation, 검색 증강 생성)
LLM이 답변하기 전에 외부 지식 베이스에서 관련 문서를 먼저 검색해 컨텍스트로 받는 패턴. 챗봇이 회사 내부 문서를 안다고 느끼게 만드는 핵심 기술.
키워드
MCP (Model Context Protocol, 모델 컨텍스트 프로토콜)
Anthropic이 제안한 LLM 도구 통신 표준. Claude Desktop·Cursor·Codex 같은 클라이언트가 외부 도구(파일·DB·API)를 표준 방식으로 호출할 수 있게 한다. MarkItDown은 markitdown-mcp 패키지로 MCP 서버 제공.
키워드
entry_points
파이썬 패키지가 다른 패키지에서 자기 객체를 발견하게 해주는 매니페스트. pyproject.toml[project.entry-points]에 등록하면 MarkItDown이 --use-plugins로 자동 감지.
키워드
Strategy Pattern
GoF 디자인 패턴. "여러 알고리즘을 갈아끼울 수 있게" 인터페이스로 추상화. MarkItDown의 DocumentConverter가 정석적인 예.
키워드
uv
Astral사가 만든 차세대 파이썬 패키징 도구. pip + virtualenv + poetry를 합친 형태로, Rust로 작성돼 매우 빠르다. 2025~2026년 사이 신규 프로젝트의 사실상 표준이 됨.

11참고 링크

더 깊이 파고들 자료들.

공식

본 레포 / 패키지

• GitHub: github.com/microsoft/markitdown (123k stars, MIT)
• PyPI: pypi.org/project/markitdown/
• Discussions: github.com/microsoft/markitdown/discussions — 사용자 Q&A, 플러그인 공유
• Trendshift 순위 페이지: trendshift.io/repositories/12961

관련 도구

비교 학습

unstructured.io — 더 무겁지만 다양한 포맷. 엔터프라이즈용 OSS.
IBM docling — IBM의 경쟁작. 표·수식 보존이 강점.
textract — 마크다운 안 만드는 옛 도구. 비교용.
pandoc — 문서 변환의 만능 도구(Haskell). 마크다운 변환도 가능하지만 LLM 친화적이진 않음.

생태계

위·아래 단계 기술

AutoGen: github.com/microsoft/autogen — MarkItDown의 부모 프로젝트.
LangChain / LlamaIndex — RAG 프레임워크. 둘 다 MarkItDown 통합 가능.
Anthropic MCP: modelcontextprotocol.io — MCP 표준 문서.
Hatch: hatch.pypa.io — 패키징 도구.
uv: astral.sh/uv — 차세대 파이썬 패키지 매니저.

실용 가이드

지금 바로 시도해볼 만한 것들

  1. 5분 안에 PDF → 마크다운. pip install 'markitdown[pdf]'markitdown 가까이 있는 PDF > out.md. 결과를 보고 표·제목이 얼마나 잘 살아 있는지 확인. 본 도구를 처음 느끼는 가장 빠른 방법.
  2. 업무 문서 일괄 변환 스크립트 만들기. 자기 컴퓨터의 Documents/회의록 같은 폴더를 글로브로 훑어 모든 .docx·.pdf·.pptx를 마크다운으로 변환 → ChatGPT/Claude에 통째로 던져 분기 요약. 실제 업무 시간이 줄어드는 첫 자동화.
  3. RAG 챗봇 미니 프로토타입. MarkItDown으로 회사 위키나 PDF 매뉴얼을 마크다운화 → Chroma DB에 임베딩 저장 → Streamlit으로 검색 UI. 주말 한나절짜리 프로젝트지만, RAG의 전체 그림을 손에 잡힌다.
  4. 플러그인 작성에 도전. packages/markitdown-sample-plugin을 복사해 본인이 자주 다루는 파일 포맷용 컨버터 작성. 예: 자기 회사 사내 ERP가 뱉는 특수 포맷, Notion export, Slack export. 잘 만들어지면 PyPI에 올려 다른 사람도 쓰게 한다.
  5. 코드 읽기 챌린지. _pdf_converter.py(20KB) 한 파일을 처음부터 끝까지 읽어보기. pdfminer + pdfplumber를 어떻게 조합하는지, 표를 어떻게 처리하는지 관찰. 가벼운 코드지만 "현업 파이썬"의 모든 요소가 농축돼 있다.
원문 · microsoft/markitdown README + 코드, 2026.05.23 (TrendShift #16) · github.com/microsoft/markitdown