Microsoft MarkItDown에 대한 심층 분석
Min-jun Kim
Dev Intern · Leapcell

MarkItDown이란 무엇인가?
MarkItDown은 Microsoft에서 개발한 Python 라이브러리로, 다양한 파일 형식을 Markdown으로 변환합니다.
출시 이후 단 2주 만에 GitHub에서 25k개 이상의 별을 모으면서 빠르게 인기를 얻었습니다! 🤯
MarkItDown이 왜 그렇게 인기가 있을까요?
MarkItDown은 다음과 같은 다양한 파일 형식을 지원합니다.
- Office 문서: PowerPoint, Word, Excel
- 풍부한 미디어 파일: 이미지 (EXIF 및 이미지 설명 포함), 오디오 (전사 포함)
- 웹 및 구조화된 데이터: HTML, CSV, JSON, XML
- 아카이브: ZIP 파일
Word 및 Excel과 같은 일반적인 형식을 처리할 수 있을 뿐만 아니라 OCR 및 음성 인식을 활용하여 콘텐츠를 추출하여 멀티 모달 파일도 지원합니다.
무엇이든 Markdown으로 변환할 수 있는 기능은 MarkItDown을 LLM 교육을 위한 강력한 도구로 만듭니다. 도메인별 문서를 처리함으로써 LLM 기반 애플리케이션에서 더 정확하고 관련성 높은 응답을 생성하기 위한 풍부한 컨텍스트를 제공합니다.
MarkItDown 사용 방법
MarkItDown 사용은 매우 간단합니다. 단 4줄의 코드만 있으면 됩니다.
from markitdown import MarkItDown md = MarkItDown() result = md.convert("test.xlsx") print(result.text_content)
MarkItDown의 몇 가지 사용 사례는 다음과 같습니다.
Word 파일을 변환하면 정확한 Markdown 출력이 생성됩니다.
여러 시트가 있는 Excel 파일은 물론 간단합니다.
ZIP 파일도 처리할 수 있으며, ZIP 아카이브 내의 모든 콘텐츠가 재귀적으로 구문 분석됩니다.
이미지에서 콘텐츠를 추출하려고 하면 아무것도 반환되지 않습니다.
왜 아무것도 반환되지 않을까요? MarkItDown은 이미지 파일을 지원하도록 설계되었습니다!
문제는 이미지 설명을 추출하려면 LLM이 필요하다는 것입니다. 다음과 같이 호환되는 LLM 클라이언트를 MarkItDown과 통합하십시오.
from openai import OpenAI client = OpenAI(api_key="i-am-not-an-api-key") md = MarkItDown(llm_client=client, llm_model="gpt-4o")
구성되면 이미지 콘텐츠가 성공적으로 변환됩니다.
참고: LLM은 이미지에만 작동합니다. PDF에서 콘텐츠를 추출하려면 PDF가 OCR로 사전 처리되었는지 확인하십시오.
그러나 PDF에서 추출한 텍스트는 모든 서식이 손실되어 제목과 일반 텍스트를 구분하지 않습니다.
MarkItDown의 제한 사항
위에서 보듯이 MarkItDown에는 몇 가지 제한 사항이 있습니다.
- OCR되지 않은 PDF는 처리할 수 없습니다.
- PDF에서 추출할 때 서식을 사용할 수 없습니다.
MarkItDown은 오픈 소스 도구이므로 확장성이 매우 뛰어납니다. 깔끔한 코드베이스를 통해 개발자는 새로운 기능을 쉽게 추가할 수 있습니다.
MarkItDown은 어떻게 작동할까요?
MarkItDown의 아키텍처는 간단하고 깔끔하며 핵심 구현은 단 하나의 파일에 포함되어 있습니다.
코드베이스에서 DocumentConverter
클래스는 convert()
메서드와 함께 정의됩니다.
class DocumentConverter: """Abstract superclass of all DocumentConverters.""" def convert( self, local_path: str, **kwargs: Any ) -> Union[None, DocumentConverterResult]: raise NotImplementedError()
서로 다른 변환기는 이 기본 클래스에서 상속되고 초기화 중에 등록됩니다.
self.register_page_converter(PlainTextConverter()) self.register_page_converter(HtmlConverter()) self.register_page_converter(DocxConverter()) self.register_page_converter(XlsxConverter()) self.register_page_converter(Mp3Converter()) self.register_page_converter(ImageConverter()) # ...
이러한 모듈식 설계를 통해 MarkItDown은 확장성이 뛰어나 개발자가 필요에 따라 자체 변환기를 만들 수 있습니다.
서로 다른 파일 형식이 변환되는 방법
Office 파일
Office 파일은 먼저 mammoth
, pandas
및 pptx
와 같은 라이브러리를 사용하여 HTML로 변환된 다음 BeautifulSoup
를 사용하여 Markdown으로 구문 분석됩니다.
오디오 파일
오디오 파일은 Google의 API를 활용하여 전사를 위해 speech_recognition
라이브러리를 사용하여 처리됩니다.
(Microsoft, 여전히 Azure에 충성스럽나요? 💔)
이미지
이미지는 프롬프트와 함께 LLM을 호출하여 처리됩니다.
"이 이미지에 대한 자세한 캡션을 작성하십시오."
PDF는 pdfminer
라이브러리를 사용하여 구문 분석됩니다. 그러나 OCR이 내장되어 있지 않으므로 PDF 콘텐츠를 미리 추출할 수 있는지 확인해야 합니다.
MarkItDown을 API로 사용 (및 무료로 호스팅)
MarkItDown은 로컬에서 실행할 수 있지만 API로 호스팅하면 유연성이 향상되어 Zapier, n8n 또는 파일 변환 서비스를 제공하는 자체 웹 사이트와 같은 워크플로에 쉽게 통합할 수 있습니다.
FastAPI
를 사용하여 MarkItDown을 API로 호스팅하는 간단한 예는 다음과 같습니다.
import shutil from markitdown import MarkItDown from fastapi import FastAPI, UploadFile from uuid import uuid4 md = MarkItDown() app = FastAPI() @app.post("/convert") async def convert_markdown(file: UploadFile): hash = uuid4() folder_path = f"./tmp/{hash}" shutil.os.makedirs(folder_path, exist_ok=True) file_path = f"{folder_path}/{file.filename}" with open(file_path, "wb") as f: shutil.copyfileobj(file.file, f) result = md.convert(file_path) text = result.text_content shutil.rmtree(folder_path) return {"result": text}
다음과 같이 API를 호출할 수 있습니다.
const formData = new FormData(); formData.append('file', file); const response = await fetch('http://localhost:8000/convert', { method: 'POST', body: formData, });
API를 무료로 호스팅
Python API를 호스팅하는 것은 까다로울 수 있습니다. AWS EC2 또는 DigitalOcean과 같은 기존 서비스는 전체 서버를 임대해야 하므로 항상 비용이 많이 듭니다.
그러나 이제 Leapcell을 사용할 수 있습니다.
서버리스 방식으로 Python 코드베이스를 호스팅할 수 있는 플랫폼입니다. API 호출당 요금이 부과되며, 관대한 무료 티어 사용량이 제공됩니다.
GitHub 리포지토리를 연결하고 빌드 및 시작 명령을 정의하기만 하면 됩니다.
이제 클라우드에서 호스팅되는 MarkItDown API가 있으며, 워크플로에 통합할 준비가 되었으며, 가장 중요한 것은 실제로 호출될 때만 요금이 부과된다는 것입니다.
지금 바로 Leapcell에서 자체 MarkItDown API를 구축하세요! 😎