跳转到主要内容

文档解析是 RAG 系统的隐形天花板

阅读需 2 分钟Tian PanTian Pan

一个合规承包商构建了一个 RAG 系统,旨在回答有关 400 页政策文档的问题。系统通过了内部 QA,针对单主题查询的检索表现正确。然而系统上线后,在处理涉及例外条款的任何问题时,它开始返回语气自信、结构严谨但错误百出的答案。

调试过程似曾相识:更换嵌入模型、调整相似度阈值、试验分块大小、添加重排序器。几周过去了,改进微乎其微。真正的症结在于,一个关键的例外条款在段落边界处被分割到了两个分块(chunks)中 —— 这并非由于分块策略,而是因为 PDF 提取器在误读排版时,悄无声息地将该段落一分为二。孤立来看,这两个分块都无法检索或解析。系统无法通过幻觉得到正确答案,因为正确的信息从未完整地进入索引。

这就是“提取天花板”:即当下游优化再多也无法弥补受损或缺失的输入数据时,系统所面临的瓶颈。

PDF 的本质

PDF 是一种显示格式,而非数据格式。文件存储的是字符放置指令 —— 页面上的坐标 —— 而非语义结构。一篇双栏学术论文并不是两段有序的文本流,而是一组恰好在渲染时通过视觉形成分栏的字符位置集合。PDF 格式在语义上没有“这段文字在另一段文字之前”的概念。

这与 RAG 流水线所需的东西产生了根本性的错位:逻辑有序、保留结构的纯文本。提取工具必须从空间坐标中重建语义顺序,而它们往往以可预测的模式失败。

栏目合并。 标准的解析器在向下移动一行之前,会先读取整个页面的宽度。在双栏论文中,这会导致左栏和右栏的文本按行交错。输出看起来像英文句子,但顺序完全错误。PyMuPDF 在默认模式下按照“字符存储顺序而非阅读顺序”进行解析,在复杂布局中会产生混乱的结果。

表格扁平化。 将表格转换为顺序文本会破坏行、列关系。包含合并单元格、多级表头和子组行的财务报表,会变成一串没有任何位置上下文的数字。在评估复杂表格提取的基准测试中,LlamaParse 错误放置了一份包含 48 个单元格的可持续发展报告表格中的列值 —— 尽管捕获了正确的数据,但将其归属于错误的维度,导致表格无法解析。Unstructured 在处理同一文档时遭遇了列偏移错误,导致整个区域明细表不可用。

章节层级崩溃。 如果没有标题检测,一份 50 页的文档会被扁平化为毫无区别的正文内容。标题样式 —— 更大的字体、加粗、特定的位置 —— 是 PDF 作为原始字符属性存储的视觉提示。不进行布局分析的工具无法区分 H2 标题和恰好以大号单词开头的普通段落。

扫描版 PDF 损坏。 可搜索的 PDF 将 OCR 文本层叠加在扫描图像之上。光照条件、旋转、倾斜和手写注释都会在提取开始前降低 OCR 质量。文本记录可能会在任意位置断裂。存储为曲线而非文本字形的字符往往会被完全遗漏。

这四种失败模式的危险之处在于:它们都不会抛出异常。提取流水线正常返回文本,计算嵌入,相似度搜索检索分块,然后系统自信地给出错误的答案。

为什么你总是归咎于嵌入模型

当 RAG 系统表现不佳时,典型的调试路径会跳到检索层:嵌入模型、相似度阈值、分块重叠比例、重排序器。这些都处于提取流程的下游。如果相关信息从未被清晰地捕获,再怎么优化检索也无法让它浮现。

相关的实证证据非常惊人。在一项针对 800 多份文档的基准测试中,解析器实现了 74% 的文本准确率,但结构保留率仅为 35% —— 这两项指标的相关性仅为 0.174。极高的字符级准确率几乎无法说明结构是否得以保留。提取输出在 BLEU 和编辑相似度上可能得分很高,但同时却破坏了每个表格、合并了所有栏目并删除了所有标题上下文。

这种差距解释了一种常见的挫败感:更换嵌入模型带来的收益微乎其微。问题不在于表示形式,而在于被表示的内容。在针对 302 个问题的受控研究中,改进的 PDF 解析(基于深度学习而非基于规则)在 47% 的 RAG 问题上优于基准方案,在 38% 的问题上持平,仅在 15% 的问题上落败。该研究中近一半的问答改进完全归功于更好的提取,而没有对检索或生成部分做任何更改。

第二个复合效应是嵌入漂移(embedding drift)。当你更改解析器或分块逻辑时 —— 哪怕只是细微的改动 —— 文档会被重新处理,但来自原始分块的嵌入可能仍保留在向量库中。同一份文档在不同的提取运行下会产生结构迥异的分块,但旧的向量依然存在于索引中。开发者观察到检索召回率随时间下降,将其归因于模型漂移,并尝试新的嵌入模型。真正的原因是提取内容与当前索引内容之间的版本不匹配。

诊断框架:将提取与检索分离

正确的评估方法是孤立地测试每一层。在确定每一层独立贡献了什么之前,不要运行端到端评估。

第一层:提取审计。 在接触嵌入(embeddings)之前,先构建一个黄金提取集。抽样 50–100 页代表你所面临的棘手案例:表格、多栏布局、扫描页、脚注、嵌套列表。手动标注正确的文本和结构。针对这些页面运行你的解析器,并测量字符级 F1、n-gram 重叠(BLEU-4)和结构元素恢复率——具体来说,是否找到了所有表格,标题是否保留了下来?

几乎在每个 RAG 项目中,这一步都会被跳过。工程师们直接进入索引阶段,并因为没有抛出异常而假设提取工作正常。黄金集能捕捉到那些无声的失败。

第二层:检索评估。 在拥有已知良好的上下文集后,创建一个黄金问答集,其中你明确知道每个问题应该检索到哪些特定的块(chunks)。测量上下文召回率(相关块是否在 top-k 中?)和上下文精确度(不相关的块是否挤占了它们?)。这可以将检索算法的失败与提取失败区分开来。

诊断信号:如果上下文召回率低,先审计你的黄金提取集。只有在提取看起来干净时,才应该调查嵌入模型选择、分块大小或检索参数。

会员专享

余下内容仅对会员开放。

会员可读完整内容 —— 每一个公开发布的观点背后,那些框架、决策与推理的全貌。

  • 完整文章,包含未公开存档的部分
  • 可落地的工作框架,附带权衡与决策依据
  • 新文章抢先看,先于公开发布

随时取消 · 一次订阅,畅读全部

参考资料

保持联系,关注我获取更多内容

阅读需 11 分钟

当你的 RAG 流读取时发生的 Wiki 中途编辑问题

当你的 RAG 摄入任务在作者编辑中途运行时,索引可能会捕获一个在 Wiki 中从未真实存在的状态。本文将探讨为什么基于轮询的流水线在大规模场景下会产生脏读,以及如何通过 CDC、版本锁定和写入静默模式来解决这些问题。

insider
rag
阅读需 9 分钟

80% 陷阱:聚合 RAG 指标如何掩盖系统性长尾失效

报告 80% 检索准确率的 RAG 系统往往掩盖了长尾查询中的系统性失效。本文将探讨如何审计覆盖范围缺口,并在不降低头部性能的情况下进行修复。

insider
rag
阅读需 11 分钟

你的 Embedding 模型选择决定了 RAG 的上限,而 LLM 无法突破它

Embedding 模型决定了 RAG 质量的上限,而更换 LLM 无法提升该上限。本文提供了一个实用的选择框架:领域匹配、维度选择、多语言表现和指令微调。

insider
rag
阅读需 11 分钟

你的 RAG 分块器是一项无人 Review 代码的数据库 Schema

将你的 RAG 分块器视为预处理,每一次边界微调都会变成一次静默的 Schema 迁移。对其进行版本管理、灰度发布,并同步负责检索评估。

insider
rag
阅读需 9 分钟

GraphRAG vs. Vector RAG:知识图谱何时优于向量嵌入

在合规和企业领域的多实体查询中,向量嵌入的准确率往往会降至零。本文将探讨知识图谱在何时是更优选择,以及你将面临的运维成本。

insider
rag