摘要
9-27/01 的 RAG 把企业知识库接进 LLM,但只覆盖了纯文本——而真实企业知识散落在PDF、扫描件、表格、架构图、产品截图里。本文把 RAG 从"文本"扩展到"图文":用Docling做版面与表格结构解析、用ColPali / CLIP 晚期交互做跨模态表征、用图文混合检索接回 9-27/01 的 RAG 链路与 9-25 网关。企业 80% 的关键知识不在文字里,而在图和表里——读不懂图表的 RAG,只是半个知识库。
一句话结论:用 Docling 把 PDF/扫描件解析成带版面与表格结构的页面块,用 ColPali 的页面级晚期交互 embedding 做"以图搜图/以文搜图"的跨模态检索,再把命中的图文块拼进 9-27/01 的 RAG 生成链路,让模型既能读字也能读图。
1. 企业知识库不止是文本
9-27/01 的 RAG 假设知识是"一段段文字"。但企业真实资产里,非文本占比惊人:
| 知识形态 | 占比(典型企业) | 传统 RAG 能否处理 |
|---|---|---|
| Word/Markdown 纯文本 | ~20% | ✅ |
| PDF 报告(含图表) | ~35% | ⚠️ 只抽到乱码文字 |
| Excel/报表表格 | ~20% | ❌ 结构丢失 |
| 架构图/流程图/截图 | ~15% | ❌ 完全忽略 |
| 扫描件(OCR) | ~10% | ⚠️ 依赖 OCR 质量 |
只做文本 RAG,等于主动放弃 80% 的关键知识。多模态文档智能要解决的,是把"图"和"表"变成可检索、可生成的一等公民。
2. 文档解析:Docling 与版面/表格结构
PDF 不是"文字流",而是"带坐标的盒子"。Docling(IBM/Red Hat 开源)把页面解析成保留版面与阅读顺序的层次结构,并专门还原表格的逻辑结构(不是把单元格拍平成一串字符)。
fromdocling.document_converterimportDocumentConverterfromdocling_core.types.docimportTableItem,PictureItem conv=DocumentConverter()result=conv.convert("quarterly_report.pdf").documentforiteminresult.iterate_items():ifisinstance(item,TableItem):# 还原成 Markdown 表格,保留行列结构md=item.export_to_markdown()print("TABLE:",md)elifisinstance(item,PictureItem):# 图片切块,交给多模态 embeddingimg=item.get_image(result)img.save(f"page_{item.prov[0].page_no}.png")| 解析能力 | Docling | 传统 PyPDF 抽取 |
|---|---|---|
| 阅读顺序 | ✅ 版面感知 | ❌ 按坐标乱序 |
| 表格结构 | ✅ 行列树 | ❌ 拍平丢结构 |
| 图片/图表切块 | ✅ | ❌ |
| 公式 | ✅(可选) | ❌ |
3. 多模态表征:ColPali 与晚期交互
纯文本 RAG 用 bi-encoder(一个向量代表整段)。但图表无法被"读成一句话"就丢信息。ColPali 借鉴 Late Interaction(ColBERT 思路):一页切成多个 patch embedding,检索时让 query token 与 page patch 做细粒度匹配,图像细节不丢。
查询:"2026 Q2 华东区退货率为什么上升?" → query token embeddings 文档页(含折线图+表格) → page patch embeddings(视觉+布局) Late Interaction:每个 query token 与所有 page patch 算最大相似度,求和得分值 → 命中"含退货率折线图的那个页面"| 方案 | 表征粒度 | 图文检索 | 备注 |
|---|---|---|---|
| CLIP | 整图一个向量 | 中 | 简单,但细节被平均掉 |
| ColPali | 页面 patch 级 | 高 | 晚期交互保细节,索引稍大 |
| 文本 OCR+embedding | 文字级 | 低 | 图表语义大量丢失 |
工程建议:先用 Docling 抽文字做文本检索兜底,再用 ColPali 做图文检索,RRF 融合(呼应 9-27/01 的混合检索)。
4. 图文混合 RAG 架构
把 9-27/01 的链路从"纯文本"升级为"多通道":
文档 → Docling 解析 → 文本块(9-27/01 流程) ─┐ └→ 页面图片块 → ColPali embedding ─┤→ RRF 融合 → 重排 → 拼 Prompt 查询 → BM25+dense(文本) ─────────────────────┘ (图文块以图+caption 形式) → 多模态 LLM 生成(读图读文)关键点:命中图文块时,把图片本身(或 base64)与一段 caption 一起送进支持视觉的模型(如 9-02 DeepSeek V4-Flash-Vision、Gemini 3.8),让模型"看"图作答,而非靠 OCR 文字臆测。
5. 图表与表格问答
表格和图表是"结构化知识",应区别对待:
- 表格:Docling 还原为 Markdown 表格,可直接进上下文,模型能做数值推理;超大表用 9-27/01 的父子分块。
- 图表(折线/柱状/饼):ColPali 检索命中后,让视觉模型读趋势、读标注,回答"哪条线最高"“同比变化多少”,比 OCR 抽坐标鲁棒得多。
- 混合页(文字+小图):整页作为一个图文块,避免拆碎丢失上下文。
# 检索后组装多模态消息messages=[{"role":"system","content":"你是企业知识助手,可参考下方图文资料回答。"},{"role":"user","content":[{"type":"text","text":"2026 Q2 华东退货率为何上升?"},{"type":"image_url","url":f"data:image/png;base64,{img_b64}"},{"type":"text","text":caption},]},]6. 工程实现:Docling 解析 + ColPali 检索
fromdocling.document_converterimportDocumentConverterfromcolpali_engine.modelsimportColPali,ColPaliProcessorimporttorch# 1) Docling 解析出页面图片块conv=DocumentConverter()doc=conv.convert("report.pdf").document pages=[it.get_image(doc)foritindoc.iterate_items()ifit.__class__.__name__=="PictureItem"orTrue]# 2) ColPali 编码页面model=ColPali.from_pretrained("vidore/colpali-v1").eval()processor=ColPaliProcessor.from_pretrained("vidore/colpali-v1")batch=processor.process_images(pages).to(torch.float32)embeds=model(**batch).to(torch.float32)# [n_pages, n_patches, dim]# 3) 查询晚期交互打分(简化)deflate_interaction(q_emb,p_emb):sim=torch.einsum("id,jd->ij",q_emb,p_emb)# query token × page patchreturnsim.max(dim=1).values.sum()# 取每 token 最大相似度求和检索命中后,页面图片块与 9-27/01 的文本块经 RRF 融合、cross-encoder 重排,再拼进生成 Prompt——完全复用已有 RAG 链路,只是多了一条"视觉通道"。
7. 与 9-27/01 RAG 链路 / 9-25 网关的衔接
- 检索层:在 9-27/01 的"BM25+dense+RRF"之外加一路 ColPali 图文检索,三路 RRF 融合。
- 生成层:命中图文块时,请求路由到视觉模型后端(9-25 网关按能力路由,呼应 9-24 端云协同)。
- 评测层:扩展 9-26/03 的 Faithfulness/Context Recall,新增"图表引用准确率"指标,防模型编造图中没有的趋势。
- 护栏层:图片经 9-26 出站护栏做敏感信息(如含个人信息的截图)脱敏后再进上下文。
至此,RAG 从"只读字"升级为"读字+读图+读表",企业知识库真正闭合。
8. 常见问题 FAQ
Q1:所有 PDF 都要上 ColPali 吗?
A:不必。纯文字报告用 9-27/01 文本 RAG 更便宜;只有含大量图表/扫描件的语料才值得加 ColPali 视觉通道,按数据特征选型。
Q2:Docling 和传统的 PDF 解析库区别?
A:传统库只抽"字符流"且顺序乱;Docling 保留版面、阅读顺序与表格逻辑结构,并原生输出图片块,是多模态 RAG 的更优前置。
Q3:ColPali 索引会不会很大?
A:页面级 patch embedding 比单向量大,但远小于存原图;可用乘积量化(PQ)压缩,命中再取原图渲染。
Q4:图表问答为什么不直接 OCR?
A:OCR 抽坐标易错、丢趋势语义;视觉模型直接"看"图读趋势更鲁棒,尤其对手写标注、非标准图表。
Q5:图文块怎么防幻觉?
A:评测加"图表引用准确率"(9-26/03),要求答案中的每个图表结论都能在命中图片中溯源;超范围结论判为不忠实。
Q6:多模态 RAG 成本如何?
A:视觉模型推理比纯文本贵,用 9-25 网关按能力路由+9-25 语义缓存(命中图文查询走缓存),把高频图文问答成本压下来。
Q7:扫描件质量差怎么办?
A:Docling 前接 OCR 质量门(清晰度/置信度阈值),低质量页回退人工或标注"图像不可读",避免垃圾进索引。
9. 参考资料
- IBM / Red Hat,Docling: Document Conversion & Parsing, 开源项目 2026
- Faysse et al.,ColPali: Efficient Document Retrieval with Vision Language Models, arXiv 2024
- Radford et al.,CLIP: Learning Transferable Visual Models, 2021
- 本专栏,RAG 检索增强生成架构实战, 2026-09-27
- 本专栏,统一 LLM 推理网关实战, 2026-09-25
- 本专栏,AI 网关内容安全与提示注入防御实战, 2026-09-26