第 2 章 — 智能文档解析

发布于: 2026-03-19 最后更新于: 2026-06-09 版本: 1

第 2 章 — 智能文档解析

LLM Primer III: Enhancing Enterprise AI with RAG 章节走读的第二篇。一个检索系统会继承它输入的质量 — 而那个让 RAG 质量平庸的最常见原因,就悄悄住在输入层。


这一章为什么存在

一条 RAG 流水线的第一版,几乎总是顺手抓起手边那个 PDF-to-text 工具就用。看起来像那么回事的文本流出来了,索引填上了,模型也给出像那么回事的回答。几个月之后,团队才发现:表格被悄悄压成了散文,多栏论文被一行一行交错读了,脚注被插进了正文,图说则干脆没了。检索质量的天花板,在检索还没开始配置之前就已经定死。这一章讲的,是认真对待输入层这一件事 — 因为解析器丢掉的东西,下游谁也捞不回来。

一句话总结:PDF 是一份排版规格,不是一个文本文件 — 一个不懂版面的解析器,产出的是这份文件的字符流,不是这份文档的字符流。

2.1 把 PDF 压平,为什么会把要紧的东西全弄丢

PDF 是一串带坐标的字形,绘制在尺寸已知的页面上。人眼看到的视觉结构 — 栏、表、图说、边栏 — 没有任何语义层面的存档。它只存在于被渲染出的那张图像里。所以「从 PDF 抽出文本」这件事比听起来难:朴素抽取器按字形写入顺序读,在两栏页面上就会把两栏一行一行交错过来。流出来的是语法怪、语义碎的句子,组成它的每一个词都是这份文档里真实存在的词 — 这种翻车,抽查时最难发现。

表格更糟。第 3 行第 4 列的 1,427,意思是 2024 年第三季度东北区 的交叉点。在朴素抽取器眼里,它就是一个数字,跟那两个字符串没有任何关系 — 因为那两个字符串是在页面别处画上去的。表格化成一串用空白隔开的数字,「东北区 Q3 营收」之类的查询什么也找不到 — 那个含 1,427 的块里,根本没有「东北区」近到能与之产生关联,嵌入里就建立不起这一层关系。表单是同款失败:label 和值各成一截,索引里只剩下了值,没了字段名。OCR 在扫描件上的字符错,偏偏密集出现在专业术语和专有名词上 — 那刚好是检索对拼写最敏感的地方。

2.2 版面感知解析:把那些信号放回来

回应这件事的,是一类把文档当作二维制品而不是字形流的工具。把页面渲染成图像,版面检测模型把它分割成区域(段、表、图、页眉),用文档版面启发式把阅读顺序拼回来,表格则交给专门的模型把行列结构恢复成 HTML、Markdown 或 JSON。流出来的不再是一根扁平的字符串 — 是一个保留了层级、把图说系回它所属的图、把元数据暴露给下游分块器去切的结构化表示。

代价在算力 — 每页一到几秒,相比朴素抽取的毫秒级,在百万页语料上就是个数。失败的形态也变了:朴素抽取器把表搞乱了至少还吐出文字;版面感知解析器把某一块认错了,可能很自信地吐出结构化的错答案 — 图被当成了表、页眉被当成了正文。团队得在大规模上线之前,挑代表性的复杂页面亲自抽查。

2.3 当前的工具版图

这块地大致收敛在半打值得知道的工具上。LlamaParse 是 LlamaIndex 的托管解析器 — 表格和表单做得硬,如果你已经在 LlamaIndex 那一栈里、能接受托管服务,这就是合理的默认。Docling 是 IBM 的开源版面感知解析器,TableFormer 负责复杂表格;数据不能出本地的私有部署,首选这个。Unstructured 主打覆盖面 — 多种输入格式、按类型分块的模型、一致的下游接口 — 在异构企业语料上,先试这个最稳。Marker-PDF 把一件事做得极好:PDF 转干净 Markdown,对标题、列表、代码块特别用心。Firecrawl 处理网页这一侧的输入问题 — URL 进、干净 Markdown 出、模板噪声剥掉。DeepSeek-OCR,2025 年末发布,把页面编码成极少的视觉 token,显存和算力都大幅下来,吞吐量主导预算时是个硬选手。

实操评估大致这样:挑五十份覆盖了语料难度区间的代表性文档,每一个工具都跑一遍,在对你语料最要紧的几个维度上人工对比 — 表格保真、多栏阅读顺序、扫描件 OCR 准确率、图的处理、吞吐量。胜出者很少在每一维上都最优,只在对你语料最重要的几维上最优,代价又是预算消化得起的。

2.4 多模态那条平行路

另一条平行的路,把这套提法整个否了。如果一个视觉语言模型能直接读懂页面、能基于页面答问,那为什么还要先转成文本?后交互的多模态检索器 — 比如 ColPaliColQwen2 — 把 ColBERT 那套思想推到了图像上:页面的每一小块给一个嵌入,用 max-similarity 与查询 token 聚合打分。检索器能浮现一些纯文本检索拿不到的页面,因为相关信息在表里、图里,或者在文本抽取会被弄坏的版面里。视觉语言模型直接读那张页面。

代价很可观,值得算得具体一点。一个标准文本块出一个 ~1,024 维的嵌入 — 几个 KB。一个 ColPali 编码的页面出大约一千个 ~128 维的 patch 嵌入 — 每页约半 MB。百万页的索引体量从 GB 涨到几百 GB,打分更贵,生成端要的是视觉语言模型。在表和图密集的语料上,这一档升级值得;在散文为主、预算又紧的语料上,把文本好好解析了再检索仍然是有性价比的默认。混合配置 — ColPali 做检索、文本化的文本做生成,或者反过来 — 是接下来一年里绝大多数生产多模态 RAG 的落点。

值得记住:RAG 质量平庸,最常见的原因不是检索器、不是重排器、也不是 prompt — 是解析器。团队看到「模型在幻觉」,转头去调 prompt,真正的病灶在三步之前已经发生:文档被弄坏了。先把解析修好;上游丢了的东西,下游什么也救不回来。

第 2 章接下去会怎么走

一份干净、版面感知的解析,对高质量 RAG 是必要条件,但不是充分条件。解析过的文档还是文档 — 它得被切成小到能嵌入、又大到能自成一意的块。一个不理会解析器留下的结构线索的分块器,会把解析器辛辛苦苦保住的东西一刀丢回去。这两层得放在一起设计,第 3 章走的是分块这一整条谱,和那两项把这套算盘重新打过的前沿技术。


明天 — 第 3 章:进阶分块框架从定长到结构感知这整条分块谱、那个「重叠率」迷思、context cliff,以及把这套算盘重新打过的两项前沿 — 上下文检索与 late chunking。

想看完整的全貌?书里把每一个工具配上具体的「与你语料合不合」的建议,给了一份在解析器升级时让索引保持一致的版本化剧本,还展开讲了真正在生产里浮上来的多模态驻留与访问控制问题。在 Amazon 查看 LLM Primer III →

下田 昌平
下田 昌平
作为株式会社Receipt Roller的CEO兼CTO,目前负责开发电子收据服务以及自动将对话分类并生成行动任务的系统「ACTIONBRIDGE」。从小便接触编程,1996年参与开发测量仪器的相关程序,始终保持着对技术的深刻探索与热情。 在此前的职业生涯中,曾担任日本最大呼叫中心行业企业的子公司——一家研究开发公司的CEO/CTO,领导了多个技术开发项目。目前,我依然活跃在编程的最前沿,持续书写代码。