为什么先统一格式,而不是先调模型

知识库答不准,第一步该查的不是模型,而是喂进去的文本。PDF 常见分栏、页眉页脚、脚注和扫描件的图,抽成纯文本后顺序会乱、噪声会多;Word 里带修订痕迹和批注,直接抽会把已经删掉的内容也带进去;网页正文夹着导航、cookie 提示和广告。这些噪声不会让检索「报错」,只会让召回悄悄变差,最后被归因成「模型不行」。

  • 顺序错乱:分栏 PDF 常被按行拼成乱句,一句话被拆到不相邻的两行
  • 噪声混入:页眉页脚、页码、目录、广告被当成正文反复命中
  • 结构丢失:标题层级、列表、表格没了,切块时正好切在句子中间
  • 隐性丢失:扫描件没有文本层,抽出来是空的,却没人发现

markitdown 做什么

markitdown 是微软开源的一个轻量转换工具,目标很明确:把各种格式转成适合 LLM 使用的 Markdown。它支持 PDF、Word、Excel、PowerPoint、图片、音频、HTML、CSV / JSON / XML、EPUB、ZIP 等,输出会尽量保留标题与列表结构,比裸抽文本更接近「人能读的样子」。它的定位不是最强解析器,而是把入口统一成一种好处理的格式。

# 安装(含各类格式所需的依赖)
pip install 'markitdown[all]'

# 命令行:单文件转换
markitdown report.pdf -o report.md
markitdown slides.pptx -o slides.md

# Python 调用
from markitdown import MarkItDown
md = MarkItDown()
result = md.convert('report.pdf')
print(result.text_content)

把它做成知识库的入口层:三步

  • 统一口径:所有来源先转 Markdown 再进切块与向量库,不要一部分原始 PDF、一部分转好的文本混着来
  • 保留可追溯信息:在转换产物头部记录原始文件名、页数或工作表名、转换时间与工具版本,出问题能回查
  • 把失败当一类:抽不出文字的(扫描件、加密文件、损坏文件)单独标记,不要静默产出空文档

边界与几个容易踩的坑

  • 扫描件不是它的强项:图片型 PDF 需要 OCR,markitdown 自带的 OCR 能力有限,建议先用专用 OCR 或视觉模型拿到文本层再转
  • 表格转 Markdown 只是「能用」:复杂合并单元格、多级表头仍可能错位,关键报表要人工抽查
  • 排版复杂的 PDF 顺序仍可能乱:多栏、图文混排、公式,转完要抽样读几页确认
  • 大文件要分批:几百页的文档一次转,内存与耗时都不友好,按章节或页段切开处理
  • 隐私优先本地跑:转换在本地完成即可,不要把内部文档上传到不明确的外部服务
一句话:知识库的上限,在你把文档转成文本的那一刻就已经定了一部分——先让入口干净、可追溯、可对照,再谈检索和模型。