RAG 系统进化论(七):Multimodal RAG(多模态 RAG),当知识存在于表格、图片和页面中

RAG 系统进化论(七):Multimodal RAG(多模态 RAG),当知识存在于表格、图片和页面中

本文导读: 企业知识不仅存在于文字中,还可能藏在扫描件、参数表格、结构图、截图和复杂页面布局里。本文将介绍 OCR(光学字符识别)、版面解析、表格结构保留、图片描述、多模态向量、页面检索与 VLM(视觉语言模型),理解 RAG 如何检索并回答非纯文本知识。

上一篇的 GraphRAG(基于知识图谱的 RAG)让系统能够连接跨文档实体和关系。

但到目前为止,我们处理的知识仍然主要是文本。

真实企业资料中,大量信息并不适合被简单抽取成纯文本:

text 复制代码
PDF(Portable Document Format,便携式文档格式)中的参数表格
产品结构图和接线图
扫描合同和历史档案
带图例的统计图表
故障截图
页面中的标题、脚注和分栏布局

假设一份产品手册中有一页:

text 复制代码
左侧:AX-2048-C 接收器连接示意图
右侧:不同指示灯颜色对应的状态表
底部:红灯闪烁三次时的重置说明

用户问:

text 复制代码
图中红灯闪烁三次代表什么?应该按哪个按钮重置?

如果只提取文字,系统可能得到:

text 复制代码
红灯 闪烁三次 重置 长按五秒

却不知道:

  • 哪个状态对应哪一行;
  • "长按五秒"指向图中的哪个按钮;
  • 文字属于哪张图;
  • 内容来自第几页的哪个区域。

这就是 Multimodal RAG 要解决的问题:

不只检索文本,还要保留并理解表格、图片、页面布局以及不同内容之间的对应关系。

什么是"多模态"?

Modality(模态)可以理解为信息的表现形式。

在 RAG 中,常见模态包括:

text 复制代码
文本:段落、标题、列表
表格:行、列、表头和单元格
图片:照片、示意图、截图
页面:版面、阅读顺序、位置关系
音频或视频:语音、画面和时间轴

这一篇主要讨论文档场景中的文本、表格、图片和页面。

Multimodal RAG 的目标不是让所有内容都变成图片,也不是只调用一次视觉模型,而是:

text 复制代码
正确解析不同模态
        ↓
为不同模态建立可检索索引
        ↓
根据问题召回文本、表格或页面
        ↓
使用适合的模型理解证据
        ↓
返回带页码和区域的答案

为什么纯文本 RAG 会丢失信息?

表格被打平成字符串

原始表格:

指示灯 闪烁次数 状态 处理方式
红色 3 配对信息丢失 长按连接按钮 5 秒
黄色 2 电量不足 连接充电线

错误的文本抽取可能变成:

text 复制代码
红色 3 配对信息丢失 长按连接按钮 5 秒
黄色 2 电量不足 连接充电线

数据还在,但行列关系和表头含义变弱了。

图片中的信息无法被普通文本检索看到

按钮位置、零部件形状和趋势图变化可能只存在于图片像素中。

如果没有图片描述或多模态向量,文本检索器根本不知道图片里有什么。

页面布局被破坏

双栏页面、脚注、图注和侧边栏如果按错误顺序拼接,会产生不存在的语义。

例如左栏第一段可能被错误接到右栏第二段后面。

因此,多模态 RAG 的第一步仍然不是"大模型回答",而是正确解析文档。

多模态 RAG 的完整流程

第一步:OCR 识别扫描文字

OCR 的全称是 Optical Character Recognition(光学字符识别)。

它把扫描件或图片中的文字转换成可以搜索的文本。

OCR 适合处理:

  • 扫描 PDF;
  • 拍照文档;
  • 图片中的标签;
  • 无文本层的历史档案。

但 OCR 只解决"看见文字",不自动理解:

  • 文字属于哪个表格单元格;
  • 标签指向图中的哪个部件;
  • 页面应该按什么顺序阅读;
  • 识别结果是否因为模糊而出错。

因此,OCR 结果还需要位置坐标和置信度。

ts 复制代码
interface OCRBlock {
  // 保存识别出的文字内容
  text: string;

  // 保存文字位于页面中的矩形区域
  boundingBox: BoundingBox;

  // 保存 OCR 对本次识别结果的置信度
  confidence: number;

  // 保存页码,便于后续回到原始页面
  pageNumber: number;
}

第二步:Layout-aware Parsing 保留页面结构

Layout-aware Parsing(布局感知解析)识别页面中的标题、段落、图片、表格、页眉、页脚和阅读顺序。

它不会只输出一长串文字,而是输出带类型和坐标的页面元素:

text 复制代码
标题:4.2 接收器故障
正文:红灯闪烁表示......
图片:接收器正面结构图
图注:图 4-3 连接按钮位置
表格:指示灯状态与处理方式

布局信息可以帮助系统:

  • 把图片和对应图注放在一起;
  • 保留表头与单元格关系;
  • 删除重复页眉和页脚;
  • 按正确顺序组织双栏页面;
  • 返回具体证据区域。
ts 复制代码
async function parsePage(
  page: PDFPage,
) {
  // 同时读取页面文本层和视觉布局,识别不同区域
  const layout = await detectLayout(page);

  // 对没有文本层的区域执行 OCR,并保留坐标与置信度
  const ocrBlocks = await runOCRForImageRegions(
    page,
    layout.imageRegions,
  );

  // 将标题、段落、表格、图片和图注按阅读顺序组织
  return assemblePageElements(layout, ocrBlocks);
}

第三步:保留表格的行列关系

Table Extraction(表格抽取)将表格解析为表头、行、列和单元格,而不是只保留视觉上的文字顺序。

可以为同一张表保存三种表示:

text 复制代码
结构化数据:
适合精确读取单元格和执行计算

Markdown 表格:
适合放入大模型上下文

自然语言摘要:
适合通过语义向量检索

例如,为前面的状态表生成摘要:

text 复制代码
该表描述机械键盘指示灯状态。
红灯闪烁三次表示配对信息丢失,需要长按连接按钮五秒。
黄灯闪烁两次表示电量不足,需要连接充电线。

摘要负责帮助召回,最终回答仍应回到原始表格行,避免摘要遗漏条件。

ts 复制代码
async function indexTable(
  table: ParsedTable,
) {
  // 保存表头、行列和单元格,保留可精确查询的结构
  await structuredTableStore.save(table);

  // 生成用于语义检索的表格摘要,但不替代原始数据
  const summary = await summarizeTable(table);

  // 为摘要建立向量,并关联原表、页码和坐标
  await vectorStore.add({
    content: summary,
    metadata: {
      type: "table",
      tableId: table.id,
      pageNumber: table.pageNumber,
      boundingBox: table.boundingBox,
    },
  });
}

第四步:让图片可以被检索

普通文本向量库无法直接理解图片。

常见做法有两种。

Image Captioning:先生成图片描述

Image Captioning(图片描述生成)使用视觉模型为图片生成文字说明:

text 复制代码
图片描述:
AX-2048-C 无线接收器正面示意图,
连接按钮位于 USB 接口右侧,标记为 B。

然后对描述建立文本向量。

优点是可以复用现有文本检索系统;缺点是描述可能遗漏细节,也可能产生错误描述。

Multimodal Embedding:把文本和图片映射到同一空间

Multimodal Embedding(多模态向量表示)可以把文本和图片转换到可比较的向量空间。

图:文本和图片分别转换为向量后进入同一个向量空间;语义越相关,两种向量之间的距离越近。

这样,文本问题可以直接召回相关图片。

两种方法可以组合:图片描述帮助关键词和文本检索,多模态向量负责跨模态召回。

第五步:直接检索完整页面

有些信息很难被拆成独立元素:

  • 图和说明文字共同表达含义;
  • 多个箭头连接不同部件;
  • 图例和数据点相互对应;
  • 页面布局本身决定阅读方式。

这时可以使用 Page Screenshot Retrieval(页面截图检索):

text 复制代码
PDF 每一页渲染为图片
        ↓
为页面图片生成多模态向量
        ↓
根据问题召回相关页面
        ↓
把完整页面交给视觉语言模型理解

这种方式保留的信息更完整,但页面粒度较大,也会增加视觉模型的推理成本。

因此常见组合是:

text 复制代码
元素级索引:用于快速精确召回文本、表格和图片
页面级索引:用于保留复杂布局和整体语境

第六步:使用 VLM 理解最终证据

VLM 的全称是 Vision-Language Model(视觉语言模型)。

它能够同时接收文字和图片,用于:

  • 读取图表趋势;
  • 理解示意图中的箭头和标签;
  • 对照问题定位表格行;
  • 结合页面文字与图片回答。

VLM 不应该默认读取整份 PDF。

更合理的方式仍然是先检索,再把少量相关页面或区域交给它:

text 复制代码
100 页产品手册
      ↓ 检索
第 23 页状态表 + 第 24 页结构图
      ↓ VLM
回答红灯状态和按钮位置

这保留了 RAG 的核心思想:

先缩小证据范围,再让模型理解证据。

第七步:返回页码和 Evidence Region

Evidence Region(证据区域)记录答案来自页面中的哪个位置。

一条多模态证据至少应该包含:

text 复制代码
文档 ID
页码
内容类型
区域坐标
原始文字或图片
解析版本
更新时间

用户不仅可以看到"来源于产品手册第 23 页",还可以在页面预览中高亮对应表格行或图片区域。

这对合同、财务报告和技术手册尤其重要。

把七个步骤串成多模态索引过程

ts 复制代码
async function buildMultimodalIndex(
  document: PDFDocument,
) {
  // 逐页渲染文档,保留页面截图作为完整视觉证据
  const pages = await renderDocumentPages(document);

  for (const page of pages) {
    // 识别页面布局、文本、表格、图片及其坐标
    const elements = await parsePage(page);

    // 为文本段落建立普通文本索引和向量索引
    await indexTextElements(elements.textBlocks);

    // 保存表格结构,并为表格摘要建立语义索引
    await Promise.all(
      elements.tables.map(indexTable),
    );

    // 为图片生成描述和多模态向量,并关联图注
    await indexImages(
      elements.images,
      elements.captions,
    );

    // 为完整页面建立多模态向量,保留复杂布局
    await indexPageScreenshot(page);
  }
}

完整的多模态查询过程

ts 复制代码
async function answerWithMultimodalRAG(
  question: string,
) {
  // 判断问题更可能需要文本、表格、图片还是完整页面
  const intent = await classifyModalities(question);

  // 并行检索与问题有关的不同模态证据
  const candidates = await retrieveByModalities(
    question,
    intent,
  );

  // 对候选结果去重和重排,只保留少量相关页面与区域
  const evidence = await rerankMultimodalEvidence(
    question,
    candidates,
  );

  // 让视觉语言模型结合文字、表格和页面图片回答
  const answer = await generateWithVLM(
    question,
    evidence,
  );

  // 返回答案、页码和区域坐标,支持原页面高亮
  return attachEvidenceRegions(answer, evidence);
}

Multimodal RAG 引入了哪些技术和方案?

Multimodal RAG 并不是简单地把图片交给大模型。

它在传统文本 RAG 的基础上,增加了从文档解析、内容表示、跨模态检索到视觉理解的一组能力:

技术 主要作用 产生的内容
OCR(光学字符识别) 识别扫描件和图片中的文字 文字、位置坐标和识别置信度
Layout-aware Parsing(布局感知解析) 恢复标题、段落、分栏、表格和图注之间的位置关系 带类型和坐标的页面元素
Table Extraction(表格抽取) 保留表头、行列和单元格结构 结构化表格、Markdown 或 JSON
Image Captioning(图片描述生成) 把图片主要内容转换成文字 可以参与关键词和文本向量检索的图片描述
Multimodal Embedding(多模态向量) 把文本和图片映射到同一个向量空间 文本向量、图片向量和跨模态相似度
Page-level Indexing(页面级索引) 把完整页面截图作为一个检索单元 页面图片、页面向量和页码
Multimodal Reranking(多模态重排) 同时判断问题与文本、表格、图片和页面的相关性 排序后的多模态证据
VLM(视觉语言模型) 结合文字和视觉内容理解最终证据 基于页面、表格和图片生成的答案
Evidence Region(证据区域) 记录答案来自页面的哪个位置 页码、区域坐标和高亮范围

这些技术不一定全部使用。常见落地方式可以分成三类。

方案一:文本增强型

text 复制代码
OCR / 布局解析 / 表格抽取 / 图片描述
                ↓
          统一转换为文本
                ↓
        继续使用文本检索与文本模型

这种方案对原有 RAG 改动较小、成本较低,适合文字为主、偶尔包含表格和简单图片的文档。

它的局限是视觉信息最终仍被压缩成文字,复杂图形、空间关系和页面布局可能继续丢失。

方案二:多索引混合型

text 复制代码
文本索引 + 表格索引 + 图片索引 + 页面索引
                       ↓
             并行检索与多模态重排
                       ↓
                 VLM 生成答案

这种方案同时保留不同模态的独立索引。系统根据问题选择一个或多个索引,再融合检索结果。

它适合技术手册、产品资料和财务报告,是效果、成本和可控性之间较均衡的方案。

方案三:页面原生型

text 复制代码
PDF 页面截图 → 页面向量检索 → VLM 直接理解完整页面

这种方案尽量保留原始页面,让模型直接看到表格、图片、图注和布局。

它适合版面关系决定含义的复杂 PDF,但页面图片占用更多存储和模型输入,检索与推理成本也更高。

实际系统经常把三种方案组合起来:

普通段落走文本检索,表格和图片建立独立索引,布局复杂的页面保留截图,最终只让 VLM 查看少量最相关证据。

Multimodal RAG 解决了什么?

1. 知识范围从文本扩展到多种模态

系统可以检索扫描件、表格、图片、图表和完整页面。

2. 减少纯文本抽取造成的信息损失

表格保留行列关系,图片保留视觉内容,页面保留布局和阅读顺序。

3. 支持跨模态问题

用户可以用文字问题查找图片,也可以让模型结合图和文字回答。

4. 引用可以精确到页面区域

答案能够回到原始页码、表格行或图片区域,而不是只提供文档名称。

应该选择哪种多模态方案?

文档特点 优先方案
以普通段落为主 文本解析与文本向量
包含大量规则表格 表格结构化抽取 + 表格摘要
图片内容相对简单 图片描述 + 文本检索
需要文本查图片 多模态向量
页面布局决定含义 页面截图检索 + VLM
文档类型复杂 元素级索引与页面级索引组合

技术不是越多越好。

一份纯文本说明书没有必要让每一页都经过昂贵的视觉模型;一份复杂电路图也不能只依赖 OCR。

Multimodal RAG 还留下了什么问题?

解析和索引成本更高

同一份文档可能同时产生文本、表格、图片和页面索引,还要保存坐标与原始文件。

错误来源变多

OCR 可能识别错误,表格可能错位,图片描述可能遗漏细节,视觉模型也可能看错。

推理延迟更高

图片和完整页面占用更多输入空间,视觉模型的推理通常也比纯文本更重。

复杂任务仍需要人为规定步骤

假设用户提出:

text 复制代码
分析过去六个月所有产品故障,
找出异常批次,对照结构图判断可能的零部件,
再给出调查计划。

系统需要:

  1. 拆解任务;
  2. 查询统计数据;
  3. 检索工单;
  4. 查看产品结构图;
  5. 根据中间结果继续调查;
  6. 决定什么时候结束。

固定的多模态检索流程并不足以完成这类开放式任务。

下一篇:Agentic RAG(智能体式 RAG)

下一篇进入 Agentic RAG。

系统将从:

text 复制代码
用户提问 → 执行一次预设流程 → 返回答案

演进到:

text 复制代码
理解目标 → 制订计划 → 选择工具
→ 多步检索 → 根据结果调整计划
→ 完成任务

Multimodal RAG 让系统能够理解更多形式的知识。

Agentic RAG 要解决的是:

面对开放式、多步骤任务,系统怎样自主决定先做什么、接下来查什么,以及何时停止?

相关推荐
QYR-分析1 小时前
RISC-V AI加速器SoC行业研究报告:开放架构赋能AI芯片,高增赛道开启国产化新机遇
人工智能·架构·risc-v
沐籽李1 小时前
HuDiff在抗体人源化项目中的工程化落地
人工智能·算法·aidd·抗体设计
IvorySQL1 小时前
PostgreSQL 日报| GiST 索引扫描可见性缺陷(8 月 3 日)
数据库·人工智能·postgresql·开源
众人皆醒我独醉1 小时前
KServe:Kubernetes 原生的模型推理平台——把 vLLM/TGI/Triton 变成 Serverless
人工智能·ci/cd·面试
studyrunner1 小时前
【AI开源】reverse-skill 实战教程:为 Claude Code、Cursor、Cline、Codex 配置 AI 逆向与安全技能路由
人工智能·安全·开源
大山同学1 小时前
第 2 篇(03-04 章):代理设计原则与工具使用设计模式
设计模式
zzzll11111 小时前
0基础入门大模型:一份清晰的学习路线图
人工智能·学习·chatgpt
用户667675093791 小时前
Java 是如何操作Redis的?从 Spring Data Redis中RedisTemplate 源码分析 ZSet 调用链
后端
zzz_23682 小时前
AI Coding 的稳定性,不能只靠 Prompt:一次 Harness 工程化拆解
人工智能·prompt