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 所有標準 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 提供了一條標準化路徑:

  1. 格式覆蓋全面 — 從 PDF、Office 到音訊、影片,幾乎涵蓋所有常見格式
  2. LLM 原生適配 — 輸出 Markdown,模型理解度最高,Token 消耗最低
  3. 易於整合 — 命令列一行搞定,Python API 可嵌入任意工作流程
  4. 可擴展 — 外掛系統 + Azure 整合,企業級能力開箱即用

關鍵資源: - GitHub 儲存庫(54k+ Star) - PyPI 套件 - 外掛開發指南

如果你正在建構 AI 應用、知識庫系統或文件處理流程,MarkItDown 是一個非常值得加入工具箱的開源利器。