Box 开始把表格、图表和整页 PDF 直接塞进同一个向量空间:传统 RAG 的“先转纯文本”正在过时
昨天 Google Cloud 和 Box 公布了 Gemini Multimodal Embeddings 2 在 Box Agentic Platform 里的一个企业级落地方向。
这篇材料里有一句话我很赞同:
企业数据本来就是多模态的。
但我们过去做 RAG 时,常常先把它们全部强行变成文本:
PDF → OCR → Text
Excel → CSV → Text
PPT → Text
Chart → Caption
Image → OCR
最后再:
Chunk
→ Embedding
→ Vector DB
这套方法能用,也仍然会长期存在。
但它有一个非常明显的代价:
文件里很多“位置关系”在转成纯文本时已经丢了。
最容易出问题的是财务表格
看一个表:
2025Q4 2026Q1 2026Q2
Revenue 120 135 150
Cost 80 92 103
Margin 40 43 47
如果 PDF Parser 最后输出:
2025Q4 2026Q1 2026Q2 Revenue 120 135 150 Cost 80 92 103 Margin 40 43 47
模型也许能猜回来。
但更复杂一点:
- 多层表头;
- 合并单元格;
- 脚注;
- 同比箭头;
- 颜色标记;
- 图表;
- 多栏布局;
纯文本很容易把结构拆散。
Google 和 Box 这次强调的一个能力,就是把文档页面、渲染后的 Spreadsheet Table、Chart、Image 和 Text 放进统一的多模态向量空间。
换句话说:
检索单位
不一定再只是文字 Chunk
它可以是一整页。
“整页 Embedding”解决的不是 OCR 准不准
OCR 解决:
图片里写了什么字?
Layout-aware Embedding 更关心:
这些内容在页面上是什么关系?
例如:
47%
单独 OCR 出来没有意义。
它可能属于:
APAC Revenue Growth
也可能属于:
Churn Rate
列、行、标题、图例和位置共同决定语义。
我觉得多模态 RAG 现在应该从“两路索引”开始
不要一上来把旧 Text RAG 全删掉。
我更建议:
Document
├─ Text Index
└─ Visual/Page Index
查询时按问题路由。
例如:
“合同的终止条件是什么?”
→ Text Retrieval
“第12页流程图里审批从哪个节点进入?”
→ Page/Visual Retrieval
“Q2 毛利率和图表中的趋势有没有矛盾?”
→ Hybrid Retrieval
一个简单的 Query Router
def choose_retrieval_mode(query: str):
visual_keywords = [
"图表", "表格", "流程图", "截图",
"哪一页", "布局", "颜色", "趋势"
]
if any(k in query for k in visual_keywords):
return "MULTIMODAL"
return "TEXT_FIRST"
真正生产可以用小模型分类,但没必要每次都用旗舰模型。
跨模态检索最有价值的地方:Text → Visual
用户输入:
“找出所有显示库存下降,但文字说明仍然写‘库存充足’的报告。”
这是非常典型的企业问题。
需要:
文本理解
+图表理解
+跨文档对比
传统 RAG 如果图表只被 OCR 成几个数字,几乎做不好。
统一多模态 Embedding 的价值就在这里:自然语言 Query 可以召回真正相关的图、表、页面。
Box 给出的三个方向都很实际
第一类是复杂财务和分析报告。
需要保持:
row-column semantics
chart trend
footnote
第二类是跨模态专业资料,例如临床照片、病理图和风险矩阵。
这里安全要求极高,不能把检索结果直接当诊断结论,但从搜索角度看,跨模态关联非常有价值。
第三类我觉得对普通企业最现实:
跨文档数据对账
例如:
PDF会议纪要
Excel最新价格
PNG宣传图
邮件确认
Agent 找出:
宣传图仍然是旧价格
这类任务非常适合企业内容 Agent。
传统 Chunking 在多模态里要重新定义
Text RAG 常见:
500 Token 一个 Chunk
Overlap 50
页面级多模态检索不能这么想。
可能的检索对象变成:
Page
Table
Chart
Image Region
Slide
Spreadsheet Range
每一种都有自己的粒度。
例如财务表:
整张表
可能比:
每 500 Token 切一次
更合理。
我会给 Evidence 加一个 Geometry
传统 Evidence:
public record Evidence(
String documentId,
String text,
int page) {
}
多模态以后:
public record MultimodalEvidence(
String documentId,
int page,
EvidenceType type,
BoundingBox region,
String text,
String imageRef,
String contentHash) {
}
其中:
public record BoundingBox(
double x,
double y,
double width,
double height) {
}
这样回答里不只是引用:
第 12 页
而可以高亮:
第 12 页右下角表格第 3 行
这会明显改善引用体验
用户问:
“毛利率是多少?”
回答:
47%
旁边可以直接显示:
来源:Q2-Report.pdf / Page 18
[高亮对应表格单元区域]
用户不用打开 PDF 再 Ctrl+F。
这就是多模态 Evidence 的真正产品价值。
但多模态 Embedding 也会带来一个新坑:你很难肉眼 Debug Vector
Text Chunk 召回错了,可以直接看文字。
Page Embedding 召回错了,需要同时看:
- 页面截图;
- OCR;
- Layout;
- Embedding Model;
- Query;
- Similarity;
- Reranker。
所以 Retrieval Trace 必须升级。
我希望能看到:
{
"query": "Q2利润率趋势",
"retrieval_mode": "MULTIMODAL",
"candidates": [
{
"doc": "report-q2.pdf",
"page": 18,
"type": "TABLE",
"score": 0.91,
"thumbnail": "artifact://..."
}
]
}
评测也不能再只有文本答案
至少增加几类 Dataset:
Text → Text
Text → Table
Text → Chart
Image → Text
Cross-file Conflict
Layout-sensitive QA
其中最值得测的是:
数字正确
+位置正确
+来源正确
因为多模态 RAG 最大风险之一,是模型看懂了图,但引用错页面。
我会专门做一个表格压力集
比如 100 张真实风格但脱敏的复杂表格:
- 合并单元格;
- 多层表头;
- 横向页面;
- 脚注;
- 百分比;
- 负数;
- 颜色;
- 同比箭头;
- 缺失值。
评测:
Cell Retrieval Accuracy
Header Binding Accuracy
Numeric Accuracy
Citation Accuracy
没有这套评测,Demo 看起来非常惊艳,上生产很容易数字串列。
成本也会变化
Page/Image Embedding 通常意味着更多预处理和存储。
你要重新算:
页面渲染
OCR
多模态 Embedding
向量存储
Thumbnail
Rerank
视觉模型生成
所以不是“全部文档都多模态”一定最好。
更现实的是分级:
纯文本文件
→ Text Index
复杂 PDF / PPT / XLSX
→ Text + Multimodal
高价值文档
→ Layout + Region Index
权限问题比以前更复杂
如果一张 PDF 页面里同时出现:
普通内容
+敏感表格
页面级向量可能把整个页面召回。
所以 ACL 不能只在 Document 层。
高敏环境需要考虑:
Document ACL
Page ACL
Region Redaction
Field Classification
否则模型虽然“检索正确”,却可能把不该看的区域一起拿进 Context。
一个现实的迁移路线
我不建议重建全部知识库。
第一阶段先挑:
PDF
PPT
财务Excel
这些最容易从多模态获益。
第二阶段建立:
Text Baseline
vs
Multimodal Candidate
比较:
- Recall@K;
- 数字准确;
- 引用准确;
- 延迟;
- 成本。
第三阶段只把优势明显的文档类型切过去。
最后一个判断
传统 RAG 过去有一个默认假设:
文档的主要语义可以被文本完整表达
这个假设对 FAQ、Wiki、合同正文仍然成立。
但对:
财报
PPT
流程图
技术图纸
表格
扫描文档
越来越不够。
Box 和 Google 这次的方向让我更确定一件事:下一阶段企业 RAG 的升级,不只是“换一个更强 Embedding Model”,而是重新定义什么叫一个可检索的知识单元。
它可能不是 500 Token。
可能是一张表、一张图、一页 Slide,甚至一个带坐标的页面区域。
当 RAG 能保留这些结构,Agent 才真正开始理解企业文件本来的样子,而不是理解一份被 Flatten 过的文本残影。
多模态索引的数据模型最好一开始就分层
我不会把所有向量都塞进一张表,然后靠一个 type 字段勉强区分。
至少要能表达:
Document
Page
Region
Modality
Parent-Child
例如:
create table multimodal_unit (
unit_id varchar(128) primary key,
document_id varchar(128) not null,
parent_unit_id varchar(128),
page_no integer,
unit_type varchar(32) not null,
content_hash varchar(128) not null,
text_content text,
visual_ref varchar(512),
geometry jsonb,
acl_ref varchar(128),
embedding_version varchar(64) not null
);
unit_type 可以是:
PAGE
TEXT_BLOCK
TABLE
CHART
IMAGE
REGION
这样检索后还可以沿 Parent 回到完整页面。
Page Recall 和 Region Recall 可以做两阶段
第一阶段:
召回相关页面
第二阶段:
在页面内部定位表格/区域
这比把一个复杂页面切成 50 个小视觉区域全部放入全局向量库更容易控制规模。
流程:
Query
→ Page Candidate Top 20
→ Region Search / Rerank
→ Evidence Top 5
不要忘记文本 Baseline
多模态方案演示很漂亮,但生产评测一定要保留 Text Baseline。
例如同样 500 个问题跑:
| 指标 | Text RAG | Multimodal RAG |
|---|---|---|
| Text QA | 92% | 92% |
| Table QA | 63% | 87% |
| Chart QA | 41% | 82% |
| Citation | 88% | 90% |
| P95 | 1.2s | 2.8s |
这里的数据必须来自自己的实测,我不会替项目虚构数字;这张表只是告诉你应该怎么比较。
真正上线时,很可能不是全量替换,而是:
Text QA → 继续旧链路
Table / Chart → 多模态链路
Embedding Version 变化要考虑双索引迁移
多模态 Embedding 模型升级后,不建议直接原地覆盖向量。
用:
index_v1
index_v2
双写或离线重建,再拿真实 Query 对比 Recall。
因为向量模型变化后,即使维度相同:
相似度分布也可能完全改变
原来的阈值 0.78 未必还能用。
所以版本升级必须重新校准:
TopK
Similarity Threshold
Reranker
Fallback
更多企业级 AI 应用、Agent、RAG 与模型工程化内容,我会继续整理在 智元界:
https://www.zyentor.com/