MarkItDown 是什麼?
MarkItDown 是微軟 AutoGen 團隊開源的輕量級 Python 工具,專門將各種檔案格式轉換為 Markdown。它目前在 GitHub 上已獲得 超過 54k Star,是文件轉 Markdown 領域最受歡迎的開源專案之一。
為什麼需要 MarkItDown?
在 LLM(大型語言模型)時代,Markdown 幾乎成了最佳的資料交換格式:
- LLM 原生理解:GPT-4、Claude 等模型在訓練時大量接觸 Markdown 資料,能精準識別標題、清單、表格、程式碼區塊等結構
- Token 效率高:相比 HTML 或富文本,Markdown 的標記更少、更緊湊
- 純文字友好:無二進位資料,便於版本控制和文字分析
而現實中,我們的知識資產分散在 PDF、Word、Excel、PowerPoint、甚至音訊和影片中。MarkItDown 的核心價值就是:一行指令,把這些異質文件統一成 LLM 友好的 Markdown 格式。
支援的格式
| 格式類別 | 支援的檔案類型 |
|---|---|
| 辦公文件 | Word (.docx)、PowerPoint (.pptx)、Excel (.xlsx)、Outlook (.msg) |
| 所有標準 PDF 檔案(支援掃描件 OCR) | |
| 資料檔案 | CSV、JSON、XML |
| 多媒體 | 圖片(EXIF + OCR)、音訊(語音轉錄)、YouTube 影片(字幕提取) |
| 電子書 | EPUB |
| 壓縮檔 | ZIP(自動遍歷內部檔案) |
| 網頁 | HTML |
MarkItDown vs textract
| 特性 | textract | MarkItDown |
|---|---|---|
| 輸出格式 | 純文字 | Markdown(保留結構) |
| LLM 適配 | 一般 | 優秀(專為 LLM 設計) |
| 多媒體支援 | 弱 | 圖片 OCR + 音訊轉錄 + YouTube |
| 外掛系統 | 無 | 支援(社群可擴展) |
| Azure 整合 | 無 | Document Intelligence + Content Understanding |
| Star 數 | ~10k | ~54k+ |
安裝與快速上手
環境需求
MarkItDown 需要 Python 3.10+,推薦使用虛擬環境避免依賴衝突。
# 建立虛擬環境
python3 -m venv .venv
source .venv/bin/activate
# 安裝 MarkItDown(完整版,包含所有格式的依賴)
pip install 'markitdown[all]'
提示:如果你只需要特定格式支援,可以按需安裝以減小依賴體積: ```bash
只安裝 PDF + Word + Excel 支援
pip install 'markitdown[pdf,docx,xlsx]' ```
命令列用法
這是最簡單的使用方式,適合快速轉換單個檔案:
# 將 PDF 轉為 Markdown 並輸出到終端
markitdown 報告.pdf
# 使用 -o 參數指定輸出檔案
markitdown 年度報告.pdf -o 年度報告.md
# 批次轉換:透過管道處理多個檔案
cat 合約.pdf | markitdown -o 合約.md
# 轉換 Word 文件
markitdown 產品說明.docx -o 產品說明.md
# 轉換 Excel 表格
markitdown 財務報表.xlsx -o 財務報表.md
Python API 用法
在程式碼中使用 MarkItDown 更靈活,適合整合到自動化工作流程中:
from markitdown import MarkItDown
# 初始化轉換器
md = MarkItDown()
# 轉換本機檔案
result = md.convert("產品手冊.pdf")
print(result.text_content)
# 轉換遠端檔案
result = md.convert("https://example.com/report.pptx")
print(result.text_content)
MarkItDown 也支援按位元組流和檔案物件轉換,適合處理上傳檔案:
from markitdown import MarkItDown
from io import BytesIO
md = MarkItDown()
# 從位元組流轉換(比如使用者上傳的檔案)
with open("財務報表.xlsx", "rb") as f:
result = md.convert_stream(f, file_extension=".xlsx")
print(result.text_content)
實戰:MarkItDown + LLM 工作流程
這是 MarkItDown 最強大的使用場景。將文件轉為 Markdown 後,直接餵給 LLM 進行分析、摘要或問答。
情境一:PDF 論文摘要
from markitdown import MarkItDown
from openai import OpenAI
# 1. 將論文 PDF 轉為 Markdown
md = MarkItDown()
result = md.convert("research_paper.pdf")
# 2. 呼叫 OpenAI 產生摘要
client = OpenAI(api_key="your-api-key")
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一名科研助手,請對以下論文進行摘要。"},
{"role": "user", "content": result.text_content[:8000]} # 注意控制 token 長度
]
)
print(response.choices[0].message.content)
情境二:批次處理企業文件
假設你有一批企業文件需要提取關鍵資訊:
import os
from markitdown import MarkItDown
md = MarkItDown()
document_dir = "/path/to/documents"
# 遍歷目錄下所有支援的格式
supported_extensions = {".pdf", ".docx", ".pptx", ".xlsx", ".csv", ".html", ".epub"}
for filename in os.listdir(document_dir):
ext = os.path.splitext(filename)[1].lower()
if ext in supported_extensions:
filepath = os.path.join(document_dir, filename)
result = md.convert(filepath)
# 儲存為 Markdown 檔案
output_path = os.path.splitext(filepath)[0] + ".md"
with open(output_path, "w", encoding="utf-8") as f:
f.write(result.text_content)
print(f"✅ {filename} → {os.path.basename(output_path)}")
情境三:YouTube 影片內容提取
MarkItDown 可以直接從 YouTube URL 提取字幕文字,這對影片內容分析非常有用:
from markitdown import MarkItDown
md = MarkItDown()
# 傳入 YouTube URL 自動提取字幕
result = md.convert("https://www.youtube.com/watch?v=dQw4w4WgXcQ")
print(result.text_content[:500])
進階功能
外掛系統
MarkItDown 支援社群外掛擴展功能。以 OCR 外掛為例,可以讓圖片中的文字也被提取出來:
# 安裝 OCR 外掛
pip install markitdown-ocr openai
# 在程式碼中啟用
from markitdown import MarkItDown
from openai import OpenAI
md = MarkItDown(
enable_plugins=True,
llm_client=OpenAI(api_key="your-api-key"),
llm_model="gpt-4o"
)
# 轉換包含圖片的文件(圖片內容會被 OCR 提取)
result = md.convert("含圖片的文件.pdf")
print(result.text_content)
Azure 整合
企業使用者可以使用 Azure Document Intelligence 或 Content Understanding 獲得更高品質的轉換:
# 安裝 Azure 支援
pip install 'markitdown[az-content-understanding]'
from markitdown import MarkItDown
# 使用 Azure Content Understanding 進行高精度轉換
md = MarkItDown(
cu_endpoint="https://your-resource.cognitiveservices.azure.com/",
cu_key="your-api-key"
)
# 支援文件、圖片、音訊、影片的統一轉換
result = md.convert("complex_document.pdf")
print(result.text_content)
Azure Content Understanding 還支援: - 結構化欄位提取:自動識別發票金額、合約日期等 - 自訂分析器:在 Azure Content Understanding Studio 中設定 - 影片處理:內建轉換器不支援影片,但 CU 可以
與 RAG 系統整合
MarkItDown 是建構 RAG(Retrieval-Augmented Generation)系統的理想資料預處理工具:
from markitdown import MarkItDown
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# 1. 文件轉 Markdown
md = MarkItDown()
result = md.convert("公司知識庫.pdf")
# 2. 文字分塊
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200
)
chunks = splitter.split_text(result.text_content)
# 3. 建構向量資料庫
embeddings = OpenAIEmbeddings()
db = Chroma.from_texts(chunks, embeddings)
# 4. 檢索相關文件
query = "公司的年假政策是什麼?"
results = db.similarity_search(query, k=3)
for doc in results:
print(f"---\n{doc.page_content}\n")
安全注意事項
MarkItDown 文件中特別提到了安全考量:
MarkItDown 以目前處理程序的權限執行 I/O 操作。在不可信環境中,請對輸入進行消毒處理,並呼叫最窄的轉換函式(如
convert_stream()而非convert())。
實踐建議:
# ✅ 推薦:使用最窄的轉換函式
from markitdown import convert_stream, convert_local
# 限制轉換範圍
with open("untrusted_file.pdf", "rb") as f:
result = convert_stream(f, file_extension=".pdf")
# ❌ 避免:直接信任使用者輸入的路徑
# md.convert(user_input_path)
總結
MarkItDown 解決了 LLM 時代一個最實際的痛點:如何把散落在各處的文件變成機器可讀的格式。相比手動複製貼上或依賴不穩定的解析工具,MarkItDown 提供了一條標準化路徑:
- 格式覆蓋全面 — 從 PDF、Office 到音訊、影片,幾乎涵蓋所有常見格式
- LLM 原生適配 — 輸出 Markdown,模型理解度最高,Token 消耗最低
- 易於整合 — 命令列一行搞定,Python API 可嵌入任意工作流程
- 可擴展 — 外掛系統 + Azure 整合,企業級能力開箱即用
關鍵資源: - GitHub 儲存庫(54k+ Star) - PyPI 套件 - 外掛開發指南
如果你正在建構 AI 應用、知識庫系統或文件處理流程,MarkItDown 是一個非常值得加入工具箱的開源利器。