MarkItDown: chuyển PDF, Word, Excel, ảnh sang Markdown cho LLM
Tóm tắt
MarkItDown biến PDF, Office, ảnh, âm thanh, HTML thành Markdown giữ tiêu đề và bảng, định dạng LLM đọc tốt và tiết kiệm token. Với input không tin cậy, dùng hàm chuyển đổi hẹp nhất vì thư viện chạy với quyền của tiến trình.
Đưa một file Word, PowerPoint hay Excel cho LLM xử lý, bạn sẽ gặp ngay vấn đề: định dạng nhị phân, bảng biểu, tiêu đề lộn xộn. Copy-paste thì mất cấu trúc; tự viết parser cho từng loại file thì tốn công. MarkItDown của Microsoft là thư viện Python nhẹ chuyển hầu hết loại file thường gặp sang Markdown, định dạng LLM đọc tốt nhất, giữ lại tiêu đề, danh sách, bảng và liên kết.
Hỗ trợ những gì?
| Nhóm | Định dạng |
|---|---|
| Văn phòng | PDF, Word, PowerPoint, Excel |
| Media | Ảnh (metadata EXIF, OCR), âm thanh (metadata, chuyển giọng nói thành chữ) |
| Web và dữ liệu | HTML, CSV, JSON, XML, YouTube URL, EPub |
| Gói | ZIP (duyệt từng file bên trong) |
Cài và dùng
pip install 'markitdown[all]' # hoặc chỉ [pdf, docx, pptx]
markitdown bao-cao-q3.pdf > bao-cao-q3.md
markitdown slide.pptx -o slide.md
from markitdown import MarkItDown
md = MarkItDown()
result = md.convert("hop-dong.docx")
print(result.text_content) # Markdown sẵn sàng đưa vào prompt
Yêu cầu Python 3.10 trở lên. Có thể cài riêng từng nhóm phụ thuộc để gọn nhẹ. MarkItDown còn hỗ trợ plugin, ví dụ plugin OCR dùng model vision để trích chữ từ ảnh nhúng trong PDF, Word, PowerPoint, Excel.
Vì sao Markdown?
- LLM đã thấy rất nhiều Markdown khi huấn luyện, nên hiểu tốt cấu trúc tiêu đề, bảng, danh sách.
- Markdown gọn hơn HTML hay XML, tiết kiệm token.
- Giữ cấu trúc giúp chia chunk cho RAG theo tiêu đề tự nhiên hơn.
Đặt vào pipeline
- Chuyển file sang Markdown bằng MarkItDown.
- Chia chunk theo tiêu đề (
#,##). - Embed và đánh chỉ mục, hoặc đưa thẳng vào prompt nếu tài liệu nhỏ.
- Lưu Markdown trung gian để debug khi câu trả lời sai.
Rủi ro và lưu ý
- Chạy với quyền của tiến trình hiện tại: README cảnh báo MarkItDown đọc file và URL với quyền của tiến trình, như
open()hayrequests.get(). Với input không tin cậy, làm sạch đầu vào và dùng hàm chuyển đổi hẹp nhất (ví dụconvert_stream()), tránh để người dùng truyền đường dẫn hay URL tuỳ ý. - Không dành cho bản chuyển đổi đẹp cho người đọc: mục tiêu là cho máy phân tích; bố cục phức tạp có thể bị mất.
- PDF scan: không có lớp chữ thì cần OCR; chất lượng phụ thuộc ảnh.
- Bảng phức tạp: ô gộp, bảng lồng có thể bị dàn phẳng sai; kiểm tra với tài liệu thật.
- Dữ liệu nhạy cảm: plugin dùng model vision từ xa sẽ gửi ảnh ra ngoài.
Áp dụng thế nào?
- Dev: Thay các đoạn code parse riêng từng loại file bằng MarkItDown; viết test với vài file mẫu khó (bảng gộp, PDF nhiều cột).
- Tech Lead: Chạy chuyển đổi trong môi trường cô lập khi xử lý file người dùng tải lên.
- PM: Tính năng "hỏi đáp trên tài liệu của bạn" có thể làm prototype trong một ngày với MarkItDown cộng Claude.
Nguồn & tham khảo
- markitdown — Microsoft (GitHub)