
面向 LLM 和 RAG 的 PDF 转 Markdown 实战指南
为什么 Markdown 是把 PDF 喂给 LLM 和 RAG 流水线的最佳中间格式,以及如何把 PDF 转成章节级的 Markdown 分块。
如果你在搭 RAG 流水线或给 LLM 喂文档,语料里大概率全是 PDF:论文、手册、合同、书籍。如果你试过把 PDF 直接提取的裸文本贴进提示词,一定体会过那种痛苦——结构全没了,表格塌成词堆,检索质量直线下降。
先把 PDF 转成 Markdown 能解决大部分问题。本文讲清楚为什么,以及怎么做才好。
为什么 PDF 裸文本会拖累 LLM 质量
PDF 存的是带坐标的字形,不是文档结构。朴素的文本提取会给你:
- 标题和正文无法区分
- 表格单元格被拍平成语义不明的词序列
- 多栏版式逐行交错混杂
- 脚注、页眉、页码混进正文
每一项都会拉低 embedding 质量、干扰生成。模型分不清节标题和普通句子,分块边界切在错误的位置,检索自然带噪声。
为什么 Markdown 是正确的中间格式
Markdown 恰好保留了 LLM 需要的结构,而且语法紧凑、省 token:
#/##标题提供显式的层级——天然适合做结构化分块- Markdown 表格保持行列对齐,模型能正确读取表格数据
- 列表、引用、代码块都有语义标记
- 没有 XML/HTML 的冗余标签消耗上下文窗口
和 HTML 比,同等内容 Markdown 通常省得多;和纯文本比,它携带的信号多得多。这就是甜点区。
章节级拆分优于盲目分块
多数 RAG 教程按固定 token 数加重叠来分块。能用,但它会切穿逻辑单元——一个 chunk 常常断在段落中间,或把不相关的小节并在一起。
更好的默认策略:先按文档结构分块。如果你的 PDF 变成每章一个 Markdown 文件(且文件内小节都有规范标题),你就可以:
- 按标题切分出语义连贯的 chunk
- 把章节/小节标题作为 metadata,用于过滤和引用溯源
- 表格和代码块保持完整,不被拦腰截断
这正是 PDF Chapter Markdown 的产出:上传 PDF,下载到每章一个 Markdown 文件,标题、表格、图片都保留。把文件丢进你的摄取脚本,从这里开始分块即可。
一个最小接入流程
import glob
for path in glob.glob("converted/*.md"):
chapter = path.split("/")[-1].replace(".md", "")
text = open(path, encoding="utf-8").read()
# 按 '## ' 小节标题切分、embed、写入向量库
# metadata: {"chapter": chapter, "section": ...}因为每个文件已经是带真实标题的干净章节,即使朴素地按标题切分,效果也好过对裸文本做 token 窗口分块。
实用建议
- 扫描件必须 OCR。 对扫描件做文本提取什么都不会得到。用带 OCR 的模式(在 PDF Chapter Markdown 里是 Accurate)。
- 留好 Markdown,别只存向量。 给每个 chunk 存一份源 Markdown,排查检索问题时会容易得多。
- 尽早过滤样板文本。 转换后残留的页眉页脚要在 embedding 前删掉——对检索来说纯属噪声。
- 注意上下文预算。 Markdown 省 token,但密表格还是密表格,chunk 大小上限照常要设。
已知的限制
单个文件最大 200 页、50 MiB——大多数书籍和报告都够了。几百份文档的语料库,分批转换并按源文档组织好章节文件即可。
在转换页转换你的第一个 PDF——额度包 $9.90 起,12 个月有效,一个包足够覆盖一个不小的语料库。
更多文章
邮件列表
加入我们的社区
订阅邮件列表,及时获取最新消息和更新


