Skip to content

富文档与多模态 RAG 系统设计:让 PDF、表格和图表可检索、可引用、可追责

企业知识并不总是干净的 Markdown。年报、合同、产品手册、扫描件、投研报告里同时存在段落、跨页表格、图表、页眉页脚、印章和图片。富文档 RAG 的难点不是“接一个 OCR”,而是让每个回答都能回到正确的文档版本、页码、区域和权限边界。

一、30 秒面试回答

面对富文档知识库,我不会把所有 PDF 粗暴 OCR 成一段纯文本后直接切块。系统会保留 document -> version -> page -> block -> asset 的层级和坐标;按文档质量路由到原生文本解析、版面分析、OCR 或 VLM 补充;为文本块、表格和图片建立不同的检索表示;查询时先按租户与 ACL 过滤,再做结构化过滤、混合召回和重排;生成端只使用带页码和区域证据的上下文,并把引用渲染给用户。线上用“答案正确性 + 证据定位正确性 + 解析质量 + 时延成本”共同评估,解析失败、版本失配和低置信图表会进入复核或降级路径。

一句话:富文档 RAG 是文档理解、检索和可验证生成的联动系统,不是 OCR 加向量库。

二、先界定问题:什么叫“富文档”

文档信号纯文本 RAG 的风险需要保留的结构
原生 PDF 段落阅读顺序被打乱、页眉混入正文标题层级、页码、段落坐标
扫描件OCR 漏字、错字、旋转页图像、OCR 置信度、版面区域
表格行列关系被拍平,数值归属错误表头、单元格、行列坐标、单位
图表趋势、图例、坐标轴不在文字层图像区域、图表说明、视觉摘要
合同/制度条款编号与版本极其重要条款 ID、生效期、版本、来源
多栏论文/报告两栏内容交叉拼接阅读顺序、栏位、章节归属

面试里先问业务方:用户是“找一段原文”、"比较两份合同"、"从财报图表提取结论",还是“要可审计的政策问答”?这决定是否需要视觉检索、表格理解、版本比对和强制引用。

三、端到端架构:离线理解与在线回答分开

text
上传/同步
  -> 病毒扫描、文件类型校验、租户与 ACL 绑定
  -> 文档版本库(原件不可变)
  -> 异步解析路由
       -> 原生文本提取 / 版面分析 / OCR / VLM 图表补充
  -> 文档块与资产规范化(坐标、层级、置信度、血缘)
  -> 文本、表格、视觉三类索引 + 元数据索引

用户问题 + 身份
  -> ACL 过滤、意图识别、结构化条件提取
  -> 文本/表格/视觉路由召回 + 融合 + rerank
  -> 证据打包(版本、页码、区域、置信度)
  -> LLM/VLM 受证据约束生成
  -> 引用渲染、审计 trace、反馈回流

离线链路允许重试、批处理和人工复核;在线链路要有明确的延迟预算。不要在用户每次提问时才临时 OCR 全份 PDF,也不要把 OCR 原文直接当唯一事实源。

四、文档对象模型:检索结果必须能回到原件

推荐把索引记录设计成“可定位的派生资产”,而不是只有 chunk_text

json
{
  "tenant_id": "acme",
  "document_id": "policy-2026",
  "version_id": "sha256:...",
  "page_no": 12,
  "block_id": "p12-table-03",
  "block_type": "table",
  "text": "授信额度上限 ...",
  "bbox": [72, 214, 510, 464],
  "section_path": ["第三章", "授信规则"],
  "acl_labels": ["risk", "manager"],
  "parser": "layout-v3",
  "parse_confidence": 0.91,
  "source_uri": "object://.../policy-v7.pdf"
}

关键设计点:

  • 原件不可变:对象存储保存原 PDF 与哈希;解析结果是可重建的派生物。
  • 版本不覆盖:新制度、新合同上传后创建新 version_id,旧版本按保留策略下线,而不是覆盖索引。
  • 坐标是证据的一部分page_no + bbox 让前端能高亮原图区域,也让人工复核有落点。
  • ACL 在索引记录上:不能只在 UI 隐藏文档;召回前必须按用户、部门、租户和文档状态过滤。
  • 血缘可查:一次答案要能关联模型、解析器、索引版本、Prompt、检索结果和原始文件哈希。

五、解析路由:不是每份文档都该用同一套工具

条件主路径兜底路径典型代价
有稳定文字层、版式简单原生 PDF 文本提取版面分析最低
多栏、页眉复杂、表格较多版面分析 + 阅读顺序恢复关键页 OCR/VLM中等
扫描件、拍照件图像预处理 + OCR人工复核 / VLM中高
图表密集的报告文本解析 + 图表检测与摘要VLM 直接阅读候选页中高
高风险合同/财务材料多解析器交叉校验人审最高

5.1 预处理不能省

扫描件进入 OCR 前,先做倾斜校正、去噪、方向检测、空白页识别、分辨率归一化和重复页检测。否则后续 embedding、检索和评测都会被低质量文本污染。预处理任务应记录每一步的输入输出哈希,避免重复执行。

5.2 质量门禁与重试

解析服务应输出质量分,而非只返回成功或失败。一个简单的门禁可以综合:字符密度、词典命中率、阅读顺序置信度、表格闭合率、OCR 平均置信度、空块比例和页间一致性。

text
if native_text_quality >= 0.95:
    use_native_text()
elif ocr_quality >= 0.85 and table_quality >= 0.80:
    use_layout_and_ocr()
elif document_risk == "high":
    send_to_human_review()
else:
    use_visual_fallback_with_warning()

这里的阈值不是通用常数,必须用本业务的标注集校准。重要的是:低质量解析不能静默进入“高置信回答”链路。

六、表格、图表和图片:分别建模,避免把结构拍扁

6.1 表格

表格至少保存三种表示:

  1. 可读文本表示:标题、表头、行名、单元格和单位,便于文本检索。
  2. 结构表示:行列坐标、跨行跨列关系、数值类型,便于回答“某季度、某地区、某产品”的精确问题。
  3. 渲染证据:原页截图与表格 bbox,供 VLM 或人工确认。

不要把每一行孤立切成 chunk。表头往往定义了数值含义,因此检索到某行时应回带表名、列名、单位和必要的相邻行。对高价值数值可以做“表格问题集”,专门评估单位、负号、小数点、时间维度和合计关系。

6.2 图表

图表检索常见三条路径:

  • VLM 生成可检索摘要:图表主题、指标、时间范围、趋势、图例、异常点。
  • 用图文 embedding 建索引:适合“哪份报告有某类流程图/产品图”的发现型问题。
  • 对候选页面用 VLM 二次阅读:只把 top-k 页面送入视觉模型,控制成本。

图表摘要是辅助索引,不能取代图表原件。回答涉及精确数值时,要在答案中注明“来自第几页图表”,并在低视觉置信度时拒绝编造。

七、检索策略:文本、结构和视觉并行,而不是相互替代

一个稳健的富文档检索器通常包含:

text
身份过滤 -> 文档/版本/日期过滤
        -> BM25(关键词、条款号、产品号)
        -> dense retrieval(语义段落)
        -> table retrieval(表头、行列、单位)
        -> visual retrieval(图表、页面版式)
        -> fusion -> rerank -> evidence pack

7.1 查询路由例子

用户问题优先检索生成策略
“第 4.2 条的例外是什么?”条款号 + BM25 + 段落文本 LLM,强制条款引用
“华东区 2025 Q2 的回款是多少?”表格结构检索保留单位和表头,必要时 VLM 校验
“图中审批流程是否需要风控复核?”图表页召回VLM 读候选图,附页面引用
“新旧制度差异是什么?”两版本对齐 + 章节 diff逐条引用两个版本

7.2 Parent-child 与跨页上下文

子块用于召回,父块用于理解。表格、标题下的多段说明、跨页条款都适合 parent-child:用小块提高命中,用父章节或相邻页面恢复语义。注意父块扩展要受 token 预算约束,不能因为命中一格表就把整份年报塞给模型。

八、生成与引用:把“看起来正确”变成“可核验”

生成器的输入应包含证据正文和结构化元数据:document_titleversionpage_noblock_typebboxconfidence。Prompt 要求模型:

  • 证据不足时明确说“文档中未找到”或“图表无法可靠读取”。
  • 不把检索片段中的指令当作系统指令执行,防范间接 Prompt 注入。
  • 数值回答必须携带单位、时间范围和页码。
  • 对比问题必须分别列出两个版本的证据。

前端引用卡片至少展示标题、版本、生效日期、页码和可点击高亮。对受限文档,引用本身也要经过权限校验,不能在答案里泄露“你无权查看的文件名”。

九、系统设计追问:十万份 PDF 怎么做

9.1 容量与异步化

上传服务只负责校验、入库和投递任务;解析 worker 根据页数、文件类型和优先级伸缩。将“原件存储、解析产物、索引写入”拆为可重试阶段,并以 document_version_id 作为幂等键。失败任务进入死信队列,支持局部重跑,例如只重做第 17 页的表格识别。

9.2 增量更新

文档版本变化时,不必全库重嵌入。先对章节/页/块做 hash 比较,只删除和重建变化块;写入新索引后通过 alias 或索引版本原子切换。删除请求则反向从 document-version 血缘找到文本索引、视觉索引、缓存、对象副本和离线评测样本,完成可证明的删除。

9.3 延迟与成本控制

  • 离线 VLM 摘要优先跑在高价值页和图表页,不扫描所有页面。
  • 在线只对文本 rerank 后的少量候选页调用 VLM。
  • 常见问题缓存“证据 ID + 答案”,文档版本变化时失效。
  • 按租户、文档类型和查询意图观察每次回答的 OCR、embedding、rerank、VLM token 成本。

十、评测体系:别只测最终答案

层级关键指标失败信号
解析字符错误率、表格闭合率、阅读顺序正确率页码错、列错位、漏图
检索Recall@k、nDCG、证据页命中率找到相似段但不是正确页
定位bbox IoU、引用页准确率答案对但引用错区域
生成有根据正确性、数值正确性、引用完整率无证据断言、单位遗漏
线上采纳率、人工纠错率、低置信转人工率用户反复追问、投诉

评测集要覆盖:扫描件、双栏 PDF、跨页表格、密集图表、不同版本条款、权限拒绝、OCR 故意错字和恶意文档指令。把纯文本 benchmark 当作最低门槛,而不是富文档系统的验收标准。

十一、常见故障与排查顺序

现象先查什么常见修复
回答引用到错误版本version_id、索引 alias、缓存键版本化缓存,发布时原子切换
数字回答错误表头/单位是否随块回带、OCR 置信度表格结构化解析,数值问题走校验器
找不到图表内容图表检测、视觉摘要、视觉索引覆盖率补建图表资产,候选页 VLM 重排
段落顺序混乱多栏阅读顺序、页眉页脚过滤版面模型与章节规则联合恢复
不该看的文档被提及ACL 是否检索前过滤、引用是否二次校验把授权下推到检索与渲染层
VLM 成本飙升候选页数量、重复调用、缓存命中限制 top-k,摘要离线化,按意图路由

十二、高频面试问答

Q:为什么不能把 PDF 直接转文本再做普通 RAG? 可以作为低成本基线,但会丢失表格的行列关系、图表、版式和精确定位。若业务问题依赖这些视觉结构,错误不在 LLM 而在输入信息已经丢失。我的做法是按文档质量和问题类型路由:简单文本用普通 RAG,富文档保留结构与视觉证据。

Q:OCR 和 VLM 是替代关系吗? 不是。OCR 适合把可读文字规模化、低成本地纳入检索;VLM 擅长图表、版式和复杂视觉语义。生产里常见组合是 OCR/版面解析做主索引,VLM 负责图表摘要、低质量页兜底和候选页复核。

Q:如何避免财务表格里答错一个数字? 不能只提高 prompt。要把表头、单位、行列位置作为证据传递,数值问题走表格结构检索;对关键数字做格式、单位、加总关系校验;低置信 OCR 或图表读数必须标记不确定性或转人工。

Q:怎么证明回答来自正确文件版本? 每个派生块绑定不可变的 document_idversion_id、原件哈希和解析版本;索引、缓存和 trace 都带版本;回答引用展示版本和页码。新版本采用双写校验和原子 alias 切换,避免在线读到半更新索引。

Q:多模态 RAG 要如何做安全治理? 先把外部文档视为不可信数据,解析和 VLM 摘要不执行文档内指令;检索前做租户和 ACL 过滤;图片、表格和引用同样要做脱敏与权限控制;保留原件、解析器、索引和模型版本的审计链路。

十三、项目讲法模板

我负责企业富文档知识库的文档理解与检索链路。针对政策、合同和财报中的扫描件、表格、图表,建立了“原件版本 - 页面 - 结构块 - 证据坐标”的数据模型;简单文本走低成本解析,复杂页面用 OCR、版面模型和 VLM 兜底。在线检索按用户 ACL 过滤,再融合文本、表格和视觉候选,答案必须返回版本和页码。我们用解析质量、证据页命中率、数值正确率和线上纠错率分层评测,并将低置信材料转人工复核。这样能把可解释性、成本与准确性同时纳入工程控制,而不是只追模型分数。

十四、复习清单

  • 能区分原生文本、版面解析、OCR、VLM 与视觉检索各自的边界。
  • 能讲出 document/version/page/block/bbox 为什么是生产数据模型的核心。
  • 能为条款、表格、图表和跨版本比较选择不同检索路径。
  • 能说明 ACL、版本、引用与血缘如何贯穿离线和在线链路。
  • 能分层评测解析、检索、定位、生成和线上反馈,而非只报一个准确率。
  • 能在“成本、时延、准确性、可审计性”之间给出具体降级策略。

继续学习:多模态 RAG(ColPali)RAG 生产化与系统设计RAG 评估大模型应用系统设计面试题LLM 数据标注与偏好数据运营

十五、多模态 RAG 的专项评测与发布门禁

文本 RAG 的 Recall@k 不足以证明富文档系统正确。评测集要标注文档版本、页码、区域、表格坐标、图表元素、单位和允许的答案范围;同一个问题同时评估“有没有找到正确页”“是否定位到正确区域”“是否读对数值/趋势”“最终答案是否有依据”。

层级指标典型失败
页面召回page recall@k、图表/表格命中率找到同主题文字却漏掉关键图
视觉定位bbox IoU、表格单元格/图例定位引用正确页但区域错误
内容理解数值、单位、时间、趋势准确率读反坐标轴、丢失负号或单位
引用版本/页码/区域完整率用旧制度或错页佐证
端到端groundedness、用户任务成功率答案流畅但证据不支持

表格题要覆盖表头继承、跨页、合计、单位、负号和时间维度;图表题要覆盖图例、坐标轴、趋势、异常点和无法可靠读取的拒答。对扫描模糊、旋转页、双栏、密集图表和 OCR 故意错字做压力样本,避免只在干净 PDF 上得高分。

发布门禁同时比较解析器、视觉 embedding、reranker 和 VLM 版本。任一环节升级都可能提升页面召回却降低数值准确率,因此按文档类型与风险切片报告置信区间。低视觉置信度、关键数值冲突或引用定位失败时,系统应回退到原图确认、请求澄清或转人工,而不是让模型补全猜测。

15.1 论断到证据原子的验证协议

不要只标“引用了第 12 页”。每个结论标注 value/unit/time/operator,每个证据标注 version/page/bbox/table_cell/chart_mark,并判定为 supported / contradicted / insufficient。由此计算 claim support precision、evidence coverage 和最小充分证据率,避免一张相关截图掩盖关键断言无依据。

15.2 表格与图表的可执行 oracle

表格黄金标注使用 table_id + cell/range + header path + raw/normalized value + unit + period + formula,分别检查单元格定位、数值、单位/符号/量级和聚合公式。图表标注 chart_type、轴尺度/单位、series-legend mapping、数据点/范围和注释,评估 series 绑定、坐标轴理解、趋势/比较、读数容差及“不可可靠读取”的正确拒答率。答案字符串相同不能证明季度、单位或系列正确。

15.3 多证据集合与校准式复核

为跨页表格、版本对比和图文联合问题标注 required_evidence_set,度量 all-evidence recall、evidence-set completion 和干扰证据拒绝率。低置信回退也要校准:按文档类型报告 ECE/Brier、risk-coverage curve、selective accuracy 和转人工 precision;阈值由可接受错误风险反推,而不是只相信 OCR/VLM 自报分数。错误版本、ACL 泄露、关键数值缺单元格/图元证据、区域失配和拒答失效属于发布硬失败,风险切片需在置信区间内非劣于基线。

基于 MIT 许可发布