Skip to content

MarkItDown:把任何檔案餵給 LLM 之前,先讓它變成 Markdown

2026年4月18日 1 分鐘
TL;DR Microsoft 開源的輕量工具,把 PDF、Office、圖片、音訊等格式統一轉成 Markdown,專門為 LLM pipeline 設計。

把各種格式的文件餵給 LLM 之前,都要面對同一個問題:PDF 有排版雜訊、Word 有隱藏樣式、圖片沒有文字、Excel 是二進位格式。MarkItDown 是 Microsoft 開源的 Python 工具,核心就是做這一件事——把這些格式統一轉成 Markdown,讓 LLM 可以直接讀。

設計哲學:為機器,不為人類

MarkItDown 的文件開頭就說清楚了:它的輸出目標不是「人類閱讀美觀」,而是機器消費

這個取向決定了它的設計選擇。它不追求把 PDF 還原成一模一樣的排版,而是把標題、清單、表格、連結這些語義結構保留下來,其他裝飾性的東西丟掉。對 LLM 來說,語義結構才是重點,版面配置沒有意義。

跟常見替代方案比較:

  • PyMuPDF / pdfplumber:只處理 PDF,輸出是純文字,結構資訊容易丟失
  • python-docx:只處理 Word,需要自己解析 XML 結構
  • Unstructured.io:功能接近,但偏重非結構化文字的切割,MarkItDown 更聚焦格式轉換本身
  • MarkItDown:一個介面處理多種格式,輸出是結構化 Markdown

如果你的場景是「把公司的 PDF、PPT、Excel 全部轉成可以餵給 LLM 的格式」,MarkItDown 省掉了為每種格式找不同 parser 的麻煩。

支援格式

類別格式
辦公文件PDF、Word (docx)、PowerPoint (pptx)、Excel (xlsx/xls)
網頁 / 結構化資料HTML、CSV、JSON、XML
媒體圖片(EXIF metadata + OCR)、音訊(語音轉文字)
其他ZIP 壓縮檔、ePub、YouTube 影片字幕

圖片和音訊的轉換需要額外依賴,圖片走 OCR 或接 LLM 產生描述文字,音訊走語音轉文字(需要安裝對應 extras)。

安裝

# 完整安裝,支援所有格式
pip install 'markitdown[all]'

# 只裝需要的格式,減少依賴
pip install 'markitdown[pdf,docx,pptx]'

支援的 extras 包含:pdfdocxpptxxlsxxlsoutlookaudio-transcriptionyoutube-transcriptionaz-doc-intel

使用方式

CLI

markitdown document.pdf > output.md
markitdown document.pdf -o output.md
cat document.pdf | markitdown

CLI 適合快速測試或 shell 腳本批次處理。

Python API

基本用法很直接:

from markitdown import MarkItDown

md = MarkItDown()
result = md.convert("report.pdf")
print(result.text_content)

接 LLM 做圖片描述:

from markitdown import MarkItDown
from openai import OpenAI

client = OpenAI()
md = MarkItDown(llm_client=client, llm_model="gpt-4o")
result = md.convert("screenshot.png")
print(result.text_content)  # 包含 AI 生成的圖片描述

也支援直接轉 URL 和 YouTube 字幕:

result = md.convert("https://www.youtube.com/watch?v=xxxxx")

實際場景

RAG 前處理是最典型的場景。把公司內部的 PDF、Word、PPT 統一轉成 Markdown,再切 chunk、做 embedding,存進向量資料庫:

from markitdown import MarkItDown
from pathlib import Path

md = MarkItDown()
for pdf in Path("./docs").glob("**/*.pdf"):
    out = pdf.with_suffix(".md")
    out.write_text(md.convert(str(pdf)).text_content, encoding="utf-8")

直接餵給 Claude

import anthropic
from markitdown import MarkItDown

text = MarkItDown().convert("contract.docx").text_content

client = anthropic.Anthropic()
msg = client.messages.create(
    model="claude-opus-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": f"請摘要以下合約:\n\n{text}"}],
)

限制

  • PDF 掃描檔效果有限:如果 PDF 是圖片掃描,基本文字擷取會失效,需要搭配 OCR 或 Azure Document Intelligence
  • 複雜排版結構難還原:多欄位排版、巢狀表格等複雜格式,轉換結果可能跑掉
  • 媒體轉換需要系統依賴:音訊轉文字需要 ffmpeg,OCR 需要對應函式庫

Azure Document Intelligence 後端對複雜 PDF 效果更好:

md = MarkItDown(docintel_endpoint="https://<your-endpoint>.cognitiveservices.azure.com/")

整體來說

MarkItDown 的定位很清晰:格式轉換的瑞士刀,不做 chunking、不做 embedding、不做 parsing 以外的事。它把「把各種檔案變成 LLM 可以讀的東西」這個問題解決得夠好,然後讓你自己決定後續怎麼處理。

適合場景:異質格式文件的批次處理、RAG pipeline 的前處理、快速把公司文件轉成可查詢的格式。不適合場景:需要精確還原 PDF 排版、處理大量掃描檔(需要另外接 OCR 方案)。

參考資料