
前阵子帮自己重做了一遍个人知识库。东西都在,问题是格式乱成一锅粥——客户发的合同是 PDF,行业报告是 PPT,自己以前写的草稿是 Word,公众号导出来是 HTML,甚至还有几段录音转写。我想把这堆东西灌进 Obsidian 加一层向量检索,结果第一步就卡住了:每种格式都得单独写一段解析代码,光 PDF 就分扫描版、原生版、带表格版三种处理路径。
折腾到一半,我突然想起前几天在 trending 上瞄到的一个微软项目,叫 MarkItDown。本来以为又是一个糊一层 LLM 在前面忽悠人的东西,点进去看了眼源码,发现挺克制——它就是把"任何文件都先转成 Markdown"这件最不性感、但每个搞 AI 应用的人都得做一遍的脏活,给打包成了一个 Python 库。我装上试了一晚上,干掉了我那个知识库脚本里 80% 的格式处理代码。
这个东西本周冲到 Python 榜单前列不是没道理的。每个想自己搭个 RAG、自己整理资料库、自己做内容素材库的人,迟早都要撞上"文件格式太多"这道墙,而 MarkItDown 刚好就是那把先把墙拆掉的锤子。
📄 microsoft/markitdown —— 把 Office、PDF、图片、音频统统压成一份干净的 Markdown
项目亮点: 一个微软 AutoGen 团队出的 Python 小工具,专门把 PDF / Word / PPT / Excel / HTML / 图片 / 音频 等几乎所有常见格式,统一转成 LLM 最爱吃的 Markdown,输出干净到可以直接喂给向量库或者贴进 Obsidian。
本周数据: ⭐+1,410
它跟 pandoc 不一样的地方在于:pandoc 是给人看的(要保留排版细节),MarkItDown 是给 LLM 看的(结构清晰、噪音越少越好)。所以它做了很多"故意丢信息"的取舍——PPT 里那些花哨的渐变背景、Word 里那些没用的字体颜色、Excel 里合并单元格的视觉效果,它都不管,只留下文字、表头、层级、列表这些 LLM 真正能用得上的东西。
更有意思的是它对几种"难啃格式"的处理方式:PDF 走的是 pdfminer,Office 系列走 mammoth / python-pptx / openpyxl,图片直接调 OCR(可选 LLM 描述图意),音频则走语音转文字。一个库屏蔽掉七八个底层库的脾气,这种"我帮你把脏活打包了"的感觉,是它最值钱的地方。
🔗 https://github.com/microsoft/markitdown
🧑💻 普通人可以怎么自己用起来
第一种:把自己的资料库一次性洗成 Markdown
适合那种电脑里堆着几年来下载的 PDF 报告、客户合同、行业白皮书、自己写过的 Word 草稿的人。写一个 20 行的脚本,遍历目录,每个文件调一次 md = MarkItDown().convert(path),输出到对应的 .md 文件。我自己跑了一遍 3 年攒下来的 600 多个文件,半小时搞定,最后塞进 Obsidian 直接全文搜索,比以前在 PDF 里 Ctrl+F 痛苦了几年的体验强太多。
第二种:做公众号/小红书的素材库
做内容的人最痛苦的不是写,是"我记得有个数据在某份报告里,但忘了在哪了"。把所有素材统一转成 Markdown 之后,配合 ripgrep 或者 Obsidian 的反向链接,找素材这件事的成本会从"打开五个 PDF 翻一遍"降到"敲一个关键词"。
第三种:自建 RAG / 喂给 ChatGPT 的私人知识库
如果你已经在玩 Cherry Studio、AnythingLLM、Dify 这类本地 RAG 工具,你会发现它们自带的解析器对中文 PDF、对带表格的 PPT 基本都拉垮。把 MarkItDown 当成预处理层放在前面,先转 Markdown 再喂进去,召回质量肉眼可见地变好。
第四种:会议录音、播客笔记的自动整理
它支持音频转写(基于 Whisper 这条路径),意味着你录的会议、听的播客可以直接转成带时间戳的 Markdown 草稿,再丢给 Claude 让它整理成要点。我现在每周复盘会就是这么做的,省掉了"听一遍 + 边听边记"那一个小时。
第五种:学习别人的开源项目
有些项目的文档藏在 PDF 白皮书或者 PPT 演讲稿里(尤其是论文实现类项目),转成 Markdown 之后可以直接喂给 Claude Code 让它边读边给你讲,比自己肉眼啃白皮书快很多。
🛠️ 最小上手路径
pip install markitdown[all],注意一定要带 [all],否则音频、图片、PDF 这些"重格式"的依赖装不全,会在 convert 的时候静默退化成空字符串,挺坑。
然后写一个最简的脚本:
```python
from markitdown import MarkItDown
md = MarkItDown()
print(md.convert("某个文件.pdf").text_content)
```
跑通之后,再叠两层:第一层是批处理(os.walk 加一个白名单后缀),第二层是把 OCR 和音频转写按需打开(默认是关的,避免无脑烧 API)。
想接 LLM 增强(比如让它给图片生成描述、给 PPT 加摘要),就在初始化时塞一个 client:MarkItDown(llm_client=openai_client, llm_model="gpt-4o-mini")。注意这一步会真烧钱,按页数计费,第一次跑建议先拿 5-10 个文件试,估个均价再上规模。
整套下来一个晚上能跑通。如果你之前自己写过 PDF 解析,会发现以前两百行的代码现在五行搞定,节省的不是写代码的时间,是后面维护"为什么这种 PDF 解析不出来"的时间。
⚠️ 别踩的坑
扫描版 PDF 不要指望它直接出文字。 它默认走的是文本提取路径,扫描件需要单独开 OCR,而 OCR 的中文表现取决于你接的引擎,不接 LLM 的话精度有限,重要合同建议人工核对。
表格会被它压平。 复杂表格(合并单元格、跨页表格)转成 Markdown 后结构会有损失,做财务报表分析这种对表格强依赖的场景,得回头看一眼原文件。
默认是同步阻塞的。 大文件(比如 200 页的 PDF)一次 convert 可能要十几秒,要批处理几百个文件的话,自己包一层多进程,不然得跑一晚上。
权限边界一定要看。 README 里专门拿一个 IMPORTANT 框提醒了:它是用当前进程的权限去访问文件的,跟 open() 同级别的危险性。如果你在做一个让用户上传文件的服务,记得用 convert_stream() 而不是 convert_local(),避免被构造一个 file:// 协议的 URL 把服务器上的 /etc/passwd 给吐出来。
它不替代人工校对。 对于法律文书、医疗记录、财务报告这种容错率为零的场景,它最多是"加速预处理",不能直接出来就用。
别拿它转代码仓库。 它对 .py / .js / .ts 这种纯文本代码文件其实没什么处理,直接 cat 就行,别绕一道。
谁现在就该试,谁可以再等等
如果你符合下面任何一条,建议今晚就装来试:自己有一个本地知识库要整理、在玩 RAG / 本地 LLM、做内容工作经常需要从 PDF / PPT 里翻素材、有几年攒下来的乱七八糟文件想统一格式。它的甜区就是"个人级别的格式归一化",一个人用、一个晚上跑、跑完就开始享受成果。
但如果你的场景是"客户合同的法律级解析"、"扫描件 OCR 为主"、"几十万份文件每天增量入库"这种生产级别需求,它就不太够了——这种场景需要专门的文档智能服务,或者至少要在它前面加一层 OCR 引擎、后面加一层质检。MarkItDown 的定位很清楚,它是一个"个人和小团队的瑞士军刀",不是一个生产级 ETL 管道。
对我自己来说,它最大的价值是让我重新有了"把电脑里的资料盘点一遍"的动力——以前一想到要写一堆解析代码就放弃,现在跑一晚上就能看到结果,这种心理门槛的降低,比技术本身更重要。
🔗 项目链接汇总
· microsoft/markitdown · 把任意文件格式压成干净 Markdown 的 Python 小工具 · ⭐ +1,410
· markitdown
https://github.com/microsoft/markitdown
夜雨聆风