乐于分享
好东西不私藏

把 PDF 直接丢进知识库后:我用 PDFlux 找出了 RAG 检索差的真正原因

把 PDF 直接丢进知识库后:我用 PDFlux 找出了 RAG 检索差的真正原因
RAG 实测手记 · 内部资料2026.08

RAG 检索差的真凶 · PDF 解析

不是模型不行,不是检索算法不行,是入库前的那一步解析。A/B 双库实测 + 入库 SOP,一次讲清。

DOODLE

垃圾进,垃圾出——分段质量决定 RAG 效果的天花板

RAGPDF 入库 SOP

EDITOR NOTE

本文摘要

RAG 检索差的真凶:不是模型,是入库前的 PDF 解析。A/B 实测 + 入库 SOP,一次讲清。

01

PART

问题复现

REPRODUCE · 知识库搭好了,用起来总差口气

前段时间我在 FastGPT 上搭了一个财报问答知识库,想验证一个一直没空细究的问题:为什么很多团队的知识库「看起来搭好了,用起来总是差口气」。

真实需求:用财务数据搭一个问答知识库,我准备测试的数据文档是贵州茅台 2025 年年度报告的财务部分——财报是 PDF 解析里最典型的「硬骨头」:表格密度高、数值颗粒度细,三张主表动辄跨页。截取 18 页(主要会计数据 + 审计报告 + 合并资产负债表 / 利润表 / 现金流量表),上传 FastGPT 知识库,默认分段,建库、训练、索引,一路顺利,没有任何报错。

然后我问了第一个问题:

...question

贵州茅台 2025 年度的营业收入是多少?

模型开始一本正经地输出。数字是有的,但和原文对不上;再问一句「2025 年末公司的负债合计是多少」,这次干脆答非所问,把资产端的项目搬了过来。

让人崩溃的是,这份 PDF 是文字版,不是扫描件——在阅读器里用鼠标选中、复制,都完全正常。营业收入 168,838,102,514.79 元,明明白白写在第二页「主要会计数据」表格的第一行;负债合计 49,875,590,112.37 元,就在资产负债表里。数据就在库里,模型就是拿不对。

PDFlux 解析过的 md 格式导入知识库后能正确索引到:

不是模型不行,不是检索算法不行 是你喂给它的「料」从入库那一刻起就已经坏了。如果你也遇到过类似的场景——知识库搭建得无可挑剔,问答效果却时好时坏,简单问题能答、涉及表格数字就翻车——这篇文章可以给你解答。

下面拆开讲清楚:PDF 进知识库到底发生了什么;主流解析方法为什么容易掉链子;以及一套我现在自己在用的 PDF 入库 SOP。

02

PART

原因分析

ANALYSIS · 绘制指令、八步链路与效果上限

CAUSEPDF 的存储原理:绘制指令集,而非结构化文本2.1

很多人对 PDF 有个根深蒂固的误解,以为它像 Word 一样「存着文字和段落」。实际上,PDF 内部存储的是一条条绘图指令:「在坐标 (503, 688) 处,用 8.5 号字、白色,绘制字形 m」。你看到的每一行文字、每一条表格线,都是阅读器根据这些指令实时渲染出来的。PDF 之于文字,就像图纸之于房子:图纸精确记录了每面墙的位置,但「哪三面墙围成卧室」这个信息,只存在于看图的人脑中。

做个实验进行测试:随手打开一份带表格的 PDF,选中一张表,复制,粘贴到记事本里。大概率你会得到一堆行列错乱的文字--这就是「绘制指令」被强行读成「文字流」的后果。人眼看着完好的表格,复制出来是碎的,因为结构信息从来就没有被存储过。

具体来说,PDF 不知道:

  • 哪些字形属于同一个表格、同一行、同一列
  • 阅读顺序是先左栏还是先右栏,横排还是竖排
  • 哪个段落跨页了,哪条表格线只是行分隔、哪条是表边界
  • 哪些重复出现的文字是页眉页脚,不属于正文
  • 哪行字是大标题、哪行是正文

PDF 是为「人眼阅读和打印」发明的格式,不是为机器检索设计的格式

PIPELINE链路拆解:从 PDF 到答案的八个处理环节2.2

文档进知识库不是「整存整取」。一份 PDF 要变成可检索的知识,要走过一条完整的处理链路:

...pipeline

文档解析 -> OCR -> 结构还原 -> Markdown输出 -> 清洗 -> 切分 -> 入库 -> 检索

每道工序都可能产生损耗,而上游的损耗会被下游成倍放大。

 ① 文档解析:把绘制指令读成文本 

解析器按坐标顺序读字,而文档是按视觉逻辑组织的。于是每页顶部的「贵州茅台酒股份有限公司 2025 年年度报告」和页脚的「57/143」,会被当成正文读出来;双栏文档的左右栏可能串行。我在实测里数过,18 页的文档,页眉页脚混入了几十处--它们不但污染所在分段,还会在检索「贵州茅台」「年度报告」这类词时制造大量虚假命中。

 ② OCR:只对扫描件生效,且只解决「识字」 

文字版 PDF 直接走文本层;扫描件和图片型 PDF 才需要 OCR。要强调的是:OCR 解决的是「把图变成字」,不等于「把文档变成结构」--识别率再高的 OCR,吐出来的如果还是一串线性文本,表格行列、标题层级、阅读顺序的问题一个都不会少。很多同学以为「我做过 OCR 了,解析就没事了」,这是最常见的误区之一。

 ③ 结构还原:把线性文本重建成文档树 

这是决定财报场景成败的一步。资产负债表在 PDF 里视觉上是「货币资金 | 51,690,610,946.50 | 59,295,822,956.89」这样规整的一行;线性化之后变成「货币资金 1 51,690,610,946.50 59,295,822,956.89」--科目、附注编号、本期值、上期值挤成一串,相邻行的数字互相污染。更隐蔽的是单元格内换行:我在实测里抓到一个典型 case,科目「筹资活动产生的现金流量净额」因为单元格内换行,在文本层里被拆成两截,直接搜完整科目名,搜不到。

 ④ Markdown 输出:给知识库一个「友好格式」 

结构还原的结果需要一个载体输出。为什么是 Markdown?因为它是主流知识库工具的原生分段依据:标题层级天然对应分段边界,表格有标准语法,后续切分和检索都能「读懂」结构。输出成纯文本,前面还原的结构等于白做。

使用 PDFlux 解析的效果:

导出成 md 格式后结构没有丢失,非常清晰:

 ⑤ 清洗:去掉不参与语义的内容 

页眉页脚、页码、水印文字、目录里的点线--这些内容对检索毫无贡献,混进去只会制造噪音。理想情况下在切分前剔除;很多解析方案没有这一步,只能靠知识库的分段规则「碰运气」。

 ⑥ 切分:把长文档切成可检索的分段 

FastGPT 这类系统按「分隔符 + 长度上限」切段。输入是干净文本时,切出来的段落语义完整、向量表征准确;输入是乱文本时,切分器只能按长度硬切--于是出现「孤儿数字段」(整段只有几个数字,没有科目名)、「标题正文分家」(标题进了 A 段、内容在 B 段)、「半张表」(前几列在段 A,合计行在段 B)。

 ⑦ 入库 + ⑧ 检索:后面的一切都取决于前面 

向量化、相似度检索、重排,本质都是在「已经切好的分段」里找答案。检索不会发明内容,embedding 也无法把一段乱码表征成「营业收入的准确数值」。

跨页问题值得单独说一句,它是 ③ 和 ⑥ 的复合伤害:茅台的合并资产负债表横跨 4 页,合并现金流量表横跨 3 页。解析按页处理,一张表从第 8 页断到第 9 页,断口处的行要么丢失、要么散落进两个互不相干的分段。

这是一种沉默的数据丢失 不专门核对根本发现不了。

VERDICT核心判断:解析质量决定 RAG 的效果上限2.3

垃圾进,垃圾出--分段质量决定了整个 RAG 系统的上限 后面你去调 top-k、调相似度阈值、换 embedding 模型、加重排,本质上都是在天花板下面挣扎。这就是为什么同一套 FastGPT 配置,喂不同的预处理结果,效果能差出一个档次。

03

PART

对比实验

EXPERIMENT · A/B 双库实测与方案盘点

道理讲完,拿实战数据说话:

 文档 

贵州茅台 2025 年年度报告(巨潮资讯网公开下载),截取 18 页财务部分

 A 库 

PDF 直接上传 FastGPT,默认分段--模拟「大多数人的默认做法」

 B 库 

先用 PDFlux 把同一份 PDF 解析成 Markdown,再上传 FastGPT

 控制变量 

两库索引模型、检索参数完全一致

 测试集 

12 个问题,覆盖五类场景

场景类型
示例问题
考察点
单点数值
「2025 年度营业收入是多少?」
表格单元格提取
双字段比较
「营收和归母净利润哪个增速更快?」
多单元格关联
表格结构
「流动资产包括哪些项目?」
结构还原完整性
跨页表格
「年末负债合计是多少?」
跨页断口处理
陷阱题
「2026 年经营目标是多少?」
幻觉与引用行为

设计思路说明:正文类问题(审计机构、签字会计师)作为对照组--两库内容相同,理论上都该答对,差距应该只出现在表格和跨页题上;如果对照组都翻车,说明实验配置有问题。

GROUP A直接上传组(A 库):检索命中与生成可用性的分离3.1

先看最基础的单点数值题:「2025 年度营业收入是多少?」

打开 FastGPT 的搜索测试,返回的片段里确实有 168,838,102,514.79 这个数--单看「命中率」,A 库是合格的。但点开片段看内容,问题就来了:数值和相邻科目的数字混排在一起,本期上期两列数据糊成一串,科目归属要靠猜。

检索层面的「命中」,不等于生成层面的「可用」 大模型从这样一段文本里取数,取错列、错行是大概率事件--回看开篇的翻车,营业收入答错,根子就在这。

第二层真相在跨页题上:「2025 年末负债合计是多少?」标准答案 49,875,590,112.37 元,位于资产负债表跨页断口之后。A 库的搜索测试没有返回任何包含这个数值的片段。这次连「命中但乱」都做不到,是彻头彻尾的未命中--跨页拆散让内容在分段层面就不存在了,检索算法无辜,纯粹是「库里没有」。

真实的说,A 库并非完全不可用:正文类问题表现正常--「审计机构是哪家」(天健会计师事务所)、「签字会计师是谁」(李青龙、梁正勇、曾志)都能命中并正确回答。

差距集中在表格数值和跨页内容上,而这恰恰是财报问答这类场景的核心需求。这个现象本身也是个重要提示:如果你的知识库问答「简单问题都对、复杂表格全错」,问题几乎一定出在解析,而不是模型。

LANDSCAPE主流解析方案在 RAG 前处理中的局限3.2

实验之前,我也盘点过手头能用的解析方案,大概三类,各有各的坑:

 第一类:开源文本抽取库 

PyPDF2、pdfplumber 这类。它们做的事情是「把文本层读出来」,定位是轻量通用。对纯文字文档够用;但它们不做(或只做很浅的)结构还原--表格靠启发式猜,跨页合并基本不管,标题层级靠字号猜且经常猜错。我准备实验问题时用 pdfplumber 读这份年报,连「筹资活动产生的现金流量净额」这样的科目名都被换行拆断,完整短语检索不到。这不是库的 bug,是「文本抽取」和「文档结构识别」本来就是两件事。

 第二类:知识库平台自带的文件解析 

胜在零门槛,上传即用。局限同样明显:解析是入库流程的附属步骤,以「能读出文字」为目标,不保证表格完整、不管跨页合并,更没有清洗环节。对规章制度、FAQ 这类简单文档完全够用;对报表类文档,就是本文实验展示的样子。

 第三类:通用 OCR 服务 

如果文档是扫描件,很多人的第一反应是「找个 OCR 识别一下」。如 2.2 节所说,OCR 只解决「识字」,不解决「结构」--识别输出的依然是线性文本,表格行列、阅读顺序、标题层级的问题原样保留,只是从「图片里的乱」变成了「文本里的乱」。

它们都停在链路的第 ①② 步,而 RAG 真正需要的,是走完 ③④⑤(结构还原、Markdown 输出、清洗)的完整链路 这也是我在给 B 库选解析方案时的核心标准--不是「识别率多高」,而是「能不能把文档结构完整地交到切分环节手上」。

TOOLINGPDFlux:满足 RAG 前处理需求的解析方案3.3

TOOL

本文选用的解析方案

PDFlux -- PDF Data Extraction,官方站点 pdflux.com

为了让我的 RAG 前置文档数据清晰、结构合理,我选了 PDFlux。PDFlux 的定位是高精度提取 PDF / 图片 / 扫描件中的表格和文本,官方口径表格提取准确率可达 99%,尤其擅长财务报表--正好是本实验最刁钻的部分。识别引擎是自研的 FinOCR,针对金融文档里最常见的低分辨率扫描件、印章遮挡、水印干扰做了专门优化,模糊扫描、无框线表格也能识别。庖丁科技本身就是从金融文档智能起家的,这条产品线在财报场景的行业纵深体现得很明显。

更关键的是它的「文档全景结构识别」能力,恰好覆盖了 2.2 节链路里的关键工序:物理对象检测、跨页(栏)对象合并、阅读顺序调整、文档逻辑结构识别,最终输出带层级的 Markdown。对照本文的诊断,四步正好回应四个损耗点:

PDFlux 处理步骤
对应的损耗点
物理对象检测(表格、标题、段落)
表格打散
跨页(栏)对象合并
跨页断裂、双栏乱序
阅读顺序调整
文本乱序
文档逻辑结构识别
标题层级丢失、切分失真

病因和药理对上了,这才是我选它的原因 --先诊断出问题,再找恰好解决这些问题的工具,而不是反过来先选工具再找理由。

如果你想先上手感受一下:PDFlux 有 Web 版(webtool.pdflux.com,扫码登录即可体验)、客户端和小程序,适合零散文档的交互式处理--识别结果可视化核对,可手动框选修正;面向生产系统提供 SaaS API 和私有化部署。建议直接拿一份自己的真实报表试一次,比看十篇评测都直观。

GROUP B解析入库组(B 库):检索完整性与答案质量的提升3.4

用 API 把 18 页年报解析成 Markdown 后,我没有直接入库,而是先做了一轮程序化验收--这一步本身就是 SOP 的一部分。方法很朴素:把 12 个问题的标准答案数值整理成清单,写几行脚本在 Markdown 里逐个检索,再统计表格语法行数、标题层级数,和原文结构对照:

 硬数值全覆盖 

12 个测试问题涉及的标准答案数值,7 个硬数值(营业收入、货币资金、归母净利润、流动资产合计、流动负债合计、负债合计、期末现金及现金等价物余额)全部完整存在于 Markdown 中

 结构完整 

全文 481 行规整的 Markdown 表格语法、36 个层级标题,三张主表全部是连续完整的表格

 断词修复 

那个在原文本层被换行拆断的「筹资活动产生的现金流量净额」,在 Markdown 里是完整的

然后走完全相同的入库流程:上传 FastGPT、默认 Markdown 分段、同样的索引模型和检索参数,再跑同一组问题:

 单点数值题 

命中,数值坐在规整的表格行里,科目、本期、上期各归各位

 跨页题「负债合计」 

这次命中了--资产负债表在 Markdown 里是连续完整的表格,跨页断口在解析阶段就被合并掉了,「库里没有」的问题从根上消失

最有说服力的是对话环节。保持应用配置完全不变,只把关联知识库从 A 换成 B,问开篇同样两个问题:营业收入张口就来,精确到分;负债合计 49,875,590,112.37,一字不差;并且每次回答都带着清晰的来源引用,可溯源到具体分段。

两库对比一句话总结:差距不在检索算法,不在大模型,只在入库前那一步解析。

A 库 · 直接上传

检索命中了也不敢用--数值混排、跨页未命中

vs

B 库 · 解析后入库

检索命中且直接可用--数值精确、来源可溯

04

PART

实践方案

PLAYBOOK · 可直接照抄的 PDF 入库 SOP

实验做完,我把这套流程固化成了 SOP,你可以直接抄作业。

SOP · 01入库前质量判断标准4.1

任何 PDF 入库前,抽查 3-5 页(必须包含至少一页复杂表格、一页跨页表格),过一遍这四个判断:

判断标准
怎么查
不合格的表现
解析结果是否清晰
通读分段,有无乱码糊行
乱码、断词、科目被拆断
表格是否完整
找数值型表格,逐格对照原文
行列错位、数字糊成一片
文本顺序是否正常
看双栏多栏页
左右栏串行、页眉页脚混入
是否便于后续切分
看标题层级与分段边界
标题正文分家、整表被切断
SOP · 02处理流程4.2
...flow

PDF -> 专业解析(输出 Markdown) -> 抽查复核 -> 入库切分 -> 检索测试验收

                ↓ 不合格

               人工修正 / 更换解析方案

两个要点:第一,「抽查复核」不能省--工具再准也有边界 case,PDFlux 也支持手动框选调整表格,但入库前的人工抽查永远是最后一道质量闸门;第二,「检索测试验收」用你平台的搜索测试功能跑几个真实问题,别等用户来当测试员。这两步我在实验里都实际做了:数值逐项对照、每题检索验证。

SOP · 03适用性判断:何时需要专业解析4.3

不吹不黑,给一个诚实的判断标准。

直接上传就够的场景:纯文字文档、几乎没有表格、对召回精度要求不高--产品 FAQ、规章制度、会议纪要这类。解析带来的边际收益有限,别为了解析而解析。

必须上专业解析的场景:

 ① 报表类文档 

财务报表、运营数据、研究报告--答案藏在表格单元格里,线性化即报废

 ② 扫描件 / 图片型 PDF 

文本层根本没有内容,不 OCR 就是空库,而且 OCR 之后依然要走结构还原。这个场景比文字版 PDF 更隐蔽--上传不报错、建库不报错,但扫描页在库里的内容是空的,检索时安静地返回「未找到」

 ③ 复杂版式 

双栏论文、招股书、政府公文--乱序和层级丢失的重灾区

 ④ 业务系统批量接入 

需要稳定、结构化、可校验的输出,而不是「看运气」

如果粘出来是乱的,你的知识库拿到的就是这份乱的 一个 10 秒自测法:把 PDF 里最复杂的一张表格复制粘贴到记事本--区别只是你看没看见。

SOP · 04批量处理:基于 API 的解析流水线4.4

个人零散文档,用网页工具交互式处理就够了;但 RAG 建设者面对的往往是几百上千份文档,人工点点点不现实,这时候要走 API。PDFlux 的 SaaS API 流程很简单,三步(token 在 saas.pdflux.com 的「API 密钥」页直接获取):

...bash

# ① 上传文件,自动触发全景结构识别,记下返回的 uuid

curl --location 'https://saas.pdflux.com/api/v1/saas/upload' \

 --header 'Authorization: Bearer <你的token>' \

 --form 'file=@"年报节选.pdf"' \

 --form 'force_update="true"'

# ② 轮询解析状态,直到返回 "parsed": 2(解析完毕:0待解析/1解析中/-1异常)

curl --location 'https://saas.pdflux.com/api/v1/saas/document/<uuid>' \

 --header 'Authorization: Bearer <你的token>'

# ③ 取 Markdown 结果,直接作为知识库输入

curl --location 'https://saas.pdflux.com/api/v1/saas/document/<uuid>/markdown' \

 --header 'Authorization: Bearer <你的token>' \

 -o '年报节选.md'

这三步套个循环、加个失败重试,就是一条「PDF 进、Markdown 出」的批量预处理流水线;下游接 FastGPT 的开放 API 自动建库,全程无人值守。本文实验的 18 页测试集就是这么处理的。

SOP · 05解析工具选型标准4.5

经过这次实验,我总结 RAG 前处理工具的四条硬标准:表格能不能整表还原、跨页能不能合并、输出是不是知识库友好的格式(Markdown)、有没有 API 支持批量。拿这四条去测你手头的真实文档,合格的就用--不用迷信参数,你的文档说了算。

前三条决定质量上限,第四条决定能不能进生产

CRITERIA

05

PART

实验复盘

REVIEW · 结论立住了,按角色给建议

回到开头的翻车。同样的 FastGPT、同样的模型、同样的应用配置、同样的问题,只把「PDF 直接入库」换成「PDFlux 解析成 Markdown 再入库」:营业收入精确到分,负债合计一字不差,来源引用清清楚楚。真实文档、真实入库、真实检索--经过 PDFlux 处理的文档,检索效果确实立住了。

最后按角色给三条可立刻执行的建议:

角色
今天就能做的动作
个人知识库搭建者
花十分钟抽查已有分段里表格的样子--十有八九会有「惊喜」
团队知识库项目负责人
把「入库前解析验收」写进流程,验收标准就用 4.1 那张表,谁入库谁负责
平台 / 业务系统建设者
把专业解析做成入库流水线的固定前置步骤:API 化、可校验、可重跑

本文没有讲任何高深的检索优化技巧,但它可能是你做检索优化之前最该先做的一步:垃圾进,垃圾出;好料进,基线就有了。向量模型、重排、混合检索这些优化,全都建立在「分段本身是好的」这个前提上--前提不成立,优化就是在流沙上盖楼。

INTERNAL SUMMARY

知识库问答效果不稳定,先别急着调参。如果抽查出来的分段是一团糊掉的线性文本,问题根本不在检索,而在入库之前的那一步。

NEXT ACTION

随手抽查一个含表格的分段,看看它长什么样。

///

END

总结

SUMMARY · 六个核心要点

RAG 效果的天花板在入库前就定了--PDF 是为打印设计的格式,不是为检索设计的数据格式;解析质量决定分段质量,分段质量决定检索上限,调参优化都在天花板下面。

 ① PDF 不含结构信息 

内部存储的是绘制指令而非文档结构,表格行列、标题层级、阅读顺序从未被存储;直接入库,等于把「看起来完好」的视觉内容交给只能读文本流的系统

 ② 链路前半段最易被跳过 

解析、OCR、结构还原、Markdown、清洗这五步,常被「直接上传」一笔带过,却决定切分与检索的质量;OCR 只解决识字,不等于结构还原

 ③ 实测结论 

A 库数值题「命中但不可用」、跨页题彻底未命中;B 库全部命中、答案精确、来源可溯;差距不在模型与检索,只在入库前那一步解析

 ④ 入库前判断四问 

解析结果是否清晰?表格是否完整?文本顺序是否正常?是否便于后续切分?

 ⑤ 场景判断 

纯文字、低精度要求(FAQ、制度、纪要)直接上传即可;报表类、扫描件、复杂版式、批量接入,必须走专业解析

 ⑥ 工具选型四条标准 

表格能否整表还原、跨页能否合并、输出是否为 Markdown、有无 API 批量;前三条定质量上限,第四条定生产可行性

垃圾进,垃圾出;好料进,基线就有了

如果你觉得今天这篇有收获,欢迎点赞、在看、转发三连,我们下篇见

在看
收藏

THANKS FOR READING