多模态RAG这个词,今年在各种技术群里的出现频率快赶上"智能体"了。前两天做企业知识库的朋友跑来问我:他们手上有一堆产品手册,里面全是结构图、流程图和参表格,本地部署的RAG系统只把文字抽了出来,用户问"故障排查图里的第二步到底是先断电还是先拔网线",系统完全答不上来。这正是我最近一直在做的方向——把多模态能力接进RAG链路,给LLM装上"视觉之眼",让图文混合文档真正变成可检索、可问答的知识。
说白了,纯文本RAG再好,遇到图片、表格、图表、扫描件就会抓瞎。而当前多模态大模型(视觉语言模型)已经成熟到可以本地部署、甚至量化之后跑在消费级显卡上,那我们完全可以把"看图"这件事拆成"检索到图+理解这张图"两步,让RAG的检索能力覆盖视觉信息。这篇文章我会把整个方案的选型、解析、索引、检索、问答链路,以及我在真实业务文档上踩过的坑,一次性讲清楚。
1. 多模态RAG的设计思路:为什么不是直接让LLM看图
1.1 先理解传统RAG的边界在哪
传统RAG本质上是给LLM配一个"外部记忆库"。文档被切成文本块,embedding成向量,存进向量数据库。用户提问时,系统把问题向量化,在库里做相似度检索,找到最相关的几个文本块,塞进提示词让LLM综合回答。
这个链路对大段文字、结构化文本很有效,但它有一个致命盲区:切块和向量化都只发生在文本层面。PDF里的结构图、流程图,Word里的表格截图,论文里的实验数据曲线,合同里的手写批注——这些信息在传统RAG里要么被丢弃,要么被OCR成"识别不准的文字片段",结果就是用户问一个图里的问题,系统要么答非所问,要么干脆说"知识库中没有相关内容"。
我见过最典型的案例是机器维修手册。手册里写着"若指示灯闪烁,请参照图3-2排查故障",但图3-2在RAG系统里根本不存在,或者被OCR成了一堆错乱的文字。用户问"指示灯闪烁怎么办",系统给出的回答是"请参照图3-2"——等于没答。这就是传统RAG的边界,它根本不知道文档里有图,更不知道图里画了什么。
1.2 三条技术路线的对比与选型
要给RAG装上视觉能力,业界目前走的是三条路线,我逐个说清楚它们各自的逻辑和适用场景。
第一条路线是"图片转文本"。先用OCR加图像理解模型把图片里的内容翻译成文字描述,再把这段描述当成普通文本块进入传统RAG链路。优点是改动最小,检索、存储全部复用现有体系;缺点也很明显:视觉信息经过一次"转译"必然丢失细节,流程图的分支逻辑、表格的层级结构、图表的坐标趋势,转成文字后基本面目全非。这个方案只适合那种"图文本身信息冗余不高"的文档。
第二条路线是"多模态embedding"。用CLIP、SigLIP这类图文对齐模型把图片直接编码成向量,和文本向量一起入库。检索时,用户问题可以被编码进同一个向量空间,直接"图文通吃"。这条路在语义层面很干净,问题在于CLIP类模型对细粒度视觉特征(比如图里的具体数值、小字标注)感知偏弱,而且对中文场景、复杂版面效果不稳定。
第三条路线是"混合架构",也是我现在主力使用的方案:文档解析阶段把图片单独抽出来存成图片块,文本切成文本块,文本检索用稠密向量,图片检索用视觉embedding,检索结果通过融合排序合并,最后把"文本块+对应图片"一并喂给多模态LLM做生成。这条路最适配真实业务文档,因为它保留了两类信息的原始形态,坏处是实现工作量偏大,需要自己搭不少胶水代码。
从我的经验看,如果你的文档里图片只是点缀,用方案一就够了;如果你做的是学术文献、医疗影像报告这类"图即核心"的文档,直接上方案三,别在方案二上浪费时间调参。
1.3 多模态RAG适合谁、解决什么问题
我在实际交付中总结,最需要多模态RAG的场景有三类:第一类是技术文档/产品手册,大量结构图、电路图、安装示意图;第二类是研究报告和论文,实验结果、趋势图、对比表格是核心信息载体;第三类是合同和档案扫描件,既有排版信息又有签章、手写批注等非文本元素。
这三类文档有一个共同点:视觉信息不是辅料,是主料。用户问"第三季度哪个区域销量最高"这类问题,答案藏在柱状图里而不是正文里;用户问"这个型号的接线端子怎么接",答案是电路图而不是文字段落。这些场景下,传统RAG再怎么优化prompt、再怎么调切片策略都没用,因为它根本没把视觉信息当成可检索的知识。
所以,如果你正在做RAG相关项目,建议先盘点一下手头文档的图文比例。只有文字的文档,把检索和生成做好就够了;图文混合、图为核心的文档,多模态RAG就不是锦上添花,而是必需品。
2. 核心链路实操:从文档解析到向量索引构建
2.1 文档解析:多模态切块的第一步
多模态RAG的地基在解析层,这一层做不好,后面检索和生成全是空中楼阁。常规的PDF解析库只能抽出文字流和图片文件,根本不够用。我的方案是"版面分析+元素抽取"两步走:先用版面分析模型把每一页划分成文本块、标题、表格、图片、公式等区域,再按区域把对应内容抽出来。
版面分析我目前最常用的是PaddleOCR的PP-Structure系列,它对中文文档的表格和图片识别比较扎实,能输出每个元素在页面上的坐标和类型。另外RAGFlow里内置的DeepDoc也很顺手,它能把PDF解析成带布局信息的Markdown,图片会以独立元素保留,还保留了页码和坐标。流程上,我会把电子版PDF和扫描件分开处理:电子版直接用解析库抽取文字和图片;扫描件先走OCR拿到文本层,再做版面分析。
这块有一个关键点一定要强调:表格必须单独处理。直接把表格图片丢给视觉embedding模型,检索效果很差;直接把表格转成纯文本,又会丢失行列结构。我的做法是用表格识别模型把表格结构还原成Markdown格式,把表头和行列关系保留下来,同时把原表格截图也保存一份。这样查询涉及具体数值时,走Markdown文本检索;查询涉及表格整体布局时,走图片检索,两条路都通。
2.2 图文切块策略:把文档变成可检索的知识单元
解析完成后,得到的是"文本块+图片+坐标+所属页面"的原始元素,接下来要决定怎么切块。传统RAG里按固定字符数切块的做法,在多模态场景下必须升级为"语义块"策略。
我是这样设计的:以版面分析结果为基准,把每个标题下的段落作为一个文本chunk;每一张图片单独作为一个image chunk,但保存它的ID、所属页面、相邻文本引用关系。关键在"图文绑定"这一步——文档里文字往往会引用图片,比如"如图2-1所示",我解析时会检测这种引用关系,把图片和引用它的文本段落关联起来。这样检索阶段如果召回了一段文本,可以顺着关联关系把对应图片也拉出来;召回的是图片,也能把上下文文本带上。
这种绑定关系我用parent-child结构实现:图片是parent,引用它的段落是child;反过来文本是parent,被它引用的图是child。实际建索引时,我会同时索引这三类数据:纯文本chunk、图片chunk、图文组合chunk。组合chunk承载"图+围绕图的说明文字",在检索阶段单独一条索引,因为很多问题的答案需要图文共同决定。
切块实践中我踩过最大的坑是过度切碎。有过一次把一页技术手册切成了七个文本chunk加两张图,结果用户问一个综合问题时,七个chunk全被召回,但彼此之间缺少上下文衔接,LLM生成的答案前言不搭后语。后面我改成"以语义段落为最小单位,一张图所属的说明段落尽量合并"的策略,效果明显好转。多模态场景下,切块宁大勿小,因为图片本身自带很强的上下文锚定能力,不像纯文本那样需要精细切分来精确定位。
2.3 向量化与索引:如何让图片也能被"搜索"
切块完成后进入向量化与索引环节。文本chunk我使用BGE-M3或者bge-large-zh这类中文场景表现稳定的embedding模型,输出1024维向量;图片chunk我使用视觉embedding模型,实测下来SigLIP和BGE-Visualized效果较好,尤其是中文图文检索场景,BGE-Visualized比直接套用CLIP稳定不少。
技术上有一个关键决策:文本和图片要不要进同一个向量空间。我测试过把文本和图片都用同样的投影维度映射到统一空间,直观上很优雅,但实际检索效果并不理想——文本向量的语义空间和图片向量的视觉空间天然有偏差,强行对齐反而互相干扰。我的最终方案是分开建索引:文本向量和图片向量各自存储在独立的collection里,查询时同一个query分别检索两个collection,再用融合算法合并排序。
向量库我用得最多的是Milvus,2.x版本支持多collection、混合检索和标量过滤,配合MinIO做图片对象的存储,整体链路很顺。数据量不大也可以用Qdrant或者LanceDB,部署更轻量。不过要提醒一句:图片chunk的存储别直接用向量库存base64,既浪费空间又拖慢检索,正确做法是向量库里存图片路径或对象存储地址,需要展示时再取。
索引字段上,我给每个chunk打上了document_id、page_num、element_type、caption等标量字段,方便检索阶段做过滤,也方便前端的引用溯源。这一点对问答系统尤其重要——用户看到答案时能定位到具体是哪一页的哪张图,可信度直接上一个台阶。
3. 检索与问答:让LLM真正"看见"并提供答案
3.1 检索阶段:图文双路召回与融合排序
多模态RAG的检索明显比纯文本复杂。同一个问题,可能相关的是文本,也可能是图,还可能是"图+配套文字"的组合。我的实践是用双路召回加融合排序。
先说召回。用户查询先过一个轻量的query改写模块(可以用小模型,也可以直接让LLM做),把口语化问题改写成更利于索引匹配的形式,比如"那个图里第二步到底先干嘛"改写为"故障排查图 第二步 操作顺序"。改写后的query分别走文本向量检索和图片向量检索,各取top20。同时这两个collection里都开了BM25稀疏检索,目的是兜底专有名词和编号,比如用户问"图3-2",靠稠密向量不一定能命中,但BM25可以精确匹配"图3-2"这个字符串。
召回完成后进入融合排序。我使用经典的RRF(Reciprocal Rank Fusion)算法,把多路召回的结果按排名倒数求和,得到融合得分,取top8作为最终候选。RRF的优势是不需要调权重,对文本和图片这两路差异很大的检索结果比较鲁棒。之后我会加一个重排模型——纯文本候选走cross-encoder重排,图片候选则用CLIP-style模型计算query和图片的相似度重排。如果项目有预算上CoPali这种基于VLM的文档检索重排模型,效果还会更好,但推理成本会明显增加。
这里有一个我在迭代中优化过的细节:检索结果必须保证图文比例不过度失衡。曾经出现过一次查询全是文本命中,图片全被挤出top8,导致用户问的问题明明有配图却拿不到图的情况。后面我在融合排序时加入一个最少图片数约束——top8里至少保留2张候选图片,如果图片一路召回数量够的话。这个约束很糙但很有效,大幅减少了"答了但没图可引用"的尴尬。
3.2 上下文组装:图片怎么"喂"给多模态LLM
检索完不是把所有候选一股脑塞进prompt就行,上下文组装直接决定问答质量。多模态LLM输入图片的方式有两类:传图片URL/路径(服务端模型会自己拉取),或者把图片转成base64编码直接放进请求体。本地部署的Ollama、vLLM两种都支持,云端API则各有差异,实践中最稳妥的方式是查对应模型的接口文档。
在prompt模板设计上,我会把检索到的文本块和它们的引用关系整理成结构化上下文,每张候选图片在上下文里有一个编号,同时附带它的来源页码和截图文本(也就是我们之前存的caption)。Prompt里明确告诉模型:"以下是从知识库检索到的文本片段与图片,回答时请综合这些信息;如果使用了某张图片的内容,请引用它的编号和页码。"这样既能让模型准确引用来源,也能在图文信息冲突时让模型优先参考图片内容。
Prompt模板示意:
你是一名智能文档助手。请根据以下检索到的参考信息回答用户问题。 文本参考: [1](第3页)当指示灯闪烁时,请先断开电源,然后检查连接线是否松动。 图片参考: [图A](第4页,故障排查流程示意图) [图B](第5页,接线端子示意图) 回答要求: - 优先参考图片中的信息,图片与文本不一致时以图片为准。 - 回答中若引用图片内容,请用"参见图A"标注。 - 若参考信息不足以回答问题,请明确说明知识库中无相关内容。 用户问题:指示灯闪烁应该先做什么?这一段组装逻辑是整个系统的"承重墙":太简略会让LLM发挥过度,太详细又会挤占token。我建议在真实项目中多试几版,找到自己领域文档的最佳模板结构。
3.3 问答效果:跨图推理与图表分析实战
链路搭好后,最激动人心的就是看效果。我用一份四十页的智能设备产品手册做过测试,里面涵盖安装说明、电路图、参数表格和故障排查流程图。测试问题分三类:纯文本问答、纯图片问答、图文混合问答。
纯文本问答几乎没难度,和传统RAG表现一致。真正体现多模态RAG价值的是后两类。比如用户问"设备后盖的螺丝规格是什么",这个问题对应的是产品规格表里的一行数据,传统RAG很可能检索到一个含糊的段落回答"请参考规格说明",而我们系统能直接定位到表格图片的对应区域,生成回答时引用表格截图,用户一眼看到原表,心里就踏实了。
更有价值的是跨图推理。我提的问题是"如果设备开机后网络指示灯不亮,按照手册应该先检查哪个部件",这个问题的答案分散在两张图里:一张是"网络指示灯说明图",另一张是"故障排查流程图"。系统从两张图中分别提取信息,综合出"先检查网线连接状态,再检查交换机端口指示灯"这个答案,并且分别引用了图A和图B。如果只靠文本,这个答案根本拼不出来,因为流程图的判断逻辑藏在图形分支里。
图表问答是另一个惊喜场景。数据报告里的柱状图,用户问"去年四个季度哪个季度增长最快",系统能读图得出答案并指出是第四季度,还引用了图表原图。这类问题对视觉LLM来说本身不算难,但难点在于"从几十页报告里精准找到那张图",这正是多模态RAG的看家本领。
4. 工程落地经验:数据评估、部署优化与避坑指南
4.1 评估体系:多模态RAG效果怎么量化衡量
多模态RAG不能只靠感觉调优。我建议把RAGAS指标引入评估流程,再针对多模态特性做一些扩展。
基础指标沿用RAGAS三件套:faithfulness(忠实度,衡量回答是否基于上下文)、answer_relevancy(答案相关性,衡量回答是否切题)、context_relevancy(上下文相关性,衡量检索回来的片段是否精准命中)。多模态场景下我会额外加两个指标:图片引用正确率(回答中引用图片的编号是否和实际使用的图一致)和图文一致性(回答和图片内容是否矛盾)。
评估集用golden set的方式人工构建,至少覆盖三类问题:纯文本题、纯图片题、图文混合题。每类10到20条就够了,关键是要覆盖真实用户会问的方式。我在实际项目里发现,让业务方提供真实历史问题来构造评估集,效果远好于自己拍脑袋编问题。
评估跑起来后,典型问题会暴露出来:faithfulness低,说明检索到的上下文不够或prompt引导不利;图片引用正确率低,说明图片检索的召回和排序有问题,或者图文绑定关系没建好。这种"指标定位问题"的思路,比我之前纯靠肉眼抽检高效得多。
4.2 部署选型与成本控制:本地模型还是云端API
多模态RAG的部署选择比纯文本RAG更纠结,因为视觉LLM对显存和带宽的要求远高于纯文本模型。
本地部署方面,我的经验是:32G内存的Mac或24G显存的消费级显卡,跑Qwen2.5-VL-7B或者MiniCPM-V 8B完全够用,Ollama+vLLM都可以加载量化版本,CLI和OpenAI兼容接口都有,整合起来不费劲。如果文档量大、并发高,建议上vLLM部署Qwen2.5-VL-72B这类大模型,但显存至少需要48G以上,成本就上去了。说实话,7B量级的视觉LLM在表格和图标理解上的能力已经不错,绝大多数企业知识库场景可以接受。
云端API我常用的有几家:GPT-4o、Claude系列、Gemini系列,对复杂图表、公式、手写体的理解能力明显更强,而且不用操心显存和部署。成本上按token计费,一张普通图片进入上下文大约消耗数百到一千多token,如果每次问答都带上5张图,单次成本确实不低。我的建议是:检索排序质量越高,带进上下文的图越少,成本越低。所以优化重点放在检索召回上,而不是依赖大模型硬看堆图。
在不涉及敏感数据的场景下,云端API开发和本地部署的成本差异要自己算清楚。我见过不少项目前期用API做demo非常顺利,一上生产就发现图片token消耗比文本高出一个量级,被迫切回本地模型。建议架构层面就做一层模型接口抽象,方便在API和本地模型之间无缝切换。
4.3 常见问题速查表与避坑技巧
多模态RAG踩坑经验整理成一张速查表,基本覆盖我见过的绝大多数问题:
| 问题现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 图片从未被检索到 | 图片未建立索引、视觉embedding模型不匹配 | 检查解析输出是否包含图片;换用中文效果更好的视觉embedding模型 |
| 回答正确但引用图片编号错误 | 检索结果中图文关联关系错乱 | 检查parent-child绑定逻辑,重点看跨页图片引用 |
| LLM忽略图片只看文本 | prompt中图片说明不足或图片不在模型可见范围内 | 调整prompt,明确告知存在图片及图片编号;检查API是否传图成功 |
| OCR乱码导致检索不到 | 扫描件原本质量差或用了通用OCR模型 | 使用文档级OCR模型,或对图像做预处理(去噪、纠偏) |
| 图文内容矛盾,回答不可信 | 检索回的文本与图片来自不同章节 | 增加"文档级分组"约束,确保同一文档内检索,不跨文档混搭 |
| 图片召回太多挤压文本空间 | 融合排序未做图文比例控制 | 在RRF排序后加入最少文本/最少图片约束 |
| 图大导致token爆炸 | 原图分辨率太高 | 对图片做压缩/缩放/分块处理,长图按区域切分再编码 |
还有一个我自己反复踩过的坑:图片在向量化之前没有做预处理。PDF解析出来的图片很多自带大块白色边框,分辨率虚高,直接进入视觉embedding不仅浪费存储,检索效果还差。我在解析流水线里加了一步集中处理:去除白边、统一压缩到合理分辨率(一般长边1024以内)、必要时做轻微增强。这一步对检索效果的提升,比换模型还明显。
5. 工具选型全景:常用框架与模型组合盘点
5.1 开源框架怎么选:LlamaIndex、LangChain还是RAGFlow
多模态RAG的工程链路比较长,完全自己写胶水代码也可以,但用开源框架能省不少事。我按实际使用体验排个序:RAGFlow对多模态文档的解析和切块支持最完整,内置了DeepDoc,对中文文档版面分析和表格还原效果不错,而且自带一个可运行的Web UI,适合快速看效果。LlamaIndex的多模态支持最灵活,文档里也提供了一些多模态reader和retriever的示例,适合有定制需求的场景。LangChain的组件生态最齐全,但多模态相关的文档相对较散,需要自己拼装理解。
我现在的做法是混合使用:RAGFlow负责解析和初步切块,把处理结果导出为标准JSON;检索与问答链路自己用Python实现,核心的检索、排序、prompt组装逻辑控制在几百行代码内。这样既享受了框架的解析红利,又保留了核心链路的可定制性。不要为了用框架而用框架,尤其是涉及多模态,框架的默认配置往往比较老,需要自己调。
5.2 模型组合推荐:从轻量到旗舰的搭配方案
视觉embedding模型方面,轻量方案用CLIP系列开源模型即可,但在中文场景我更推荐BGE-Visualized,它在中文文档检索上的表现明显好于CLIP;重排阶段如果预算允许,可以试ColPali,它对整页PDF的视觉检索非常强,把一页文档当作"一张图"来做检索,在图文混排场景效果显著。
多模态问答LLM方面,我列一个组合表方便参考:
| 场景 | 推荐方案 | 备注 |
|---|---|---|
| 本地开发调试 | Ollama + Qwen2.5-VL-7B | 部署简单,资源占用可控 |
| 本地生产/隐私敏感 | vLLM + Qwen2.5-VL-32B或InternVL2.5 | 需要多卡或大显存,推理速度稳定 |
| 海外云API | GPT-4o / Claude | 复杂图表理解最强 |
| 中文场景云API | Qwen-VL-Max / GLM-4V-Plus | 中文语义理解好,成本比海外API低 |
这里顺便提一下热词里常常出现的"多模态微调",如果现有开源模型在特定文档类型上表现不够好,可以用LoRA做低成本微调,只训练一部分参数,也就是常说的"最小微调单位"思路——多数情况下,微调视觉编码器的部分层就够了,不必全量微调。但在RAG链路里,模型的微调优先级远低于检索质量的优化,建议先把检索练扎实再考虑微调。
5.3 数据流全景:从一个PDF到一次完整问答
把前面的模块串起来,一条完整的数据流是这样的:文档进入解析服务,通过版面分析抽出文本块、表格块、图片块,图片去白边压缩后存入对象存储;文本块向量化后存入Milvus文本collection,图片块经视觉embedding后存入图片collection,都打上document_id、page_num等标量标签;用户提问时,query改写模块先改写,然后双路召回,RRF融合排序,重排模块精排,最后图文上下文组装成prompt,交给多模态LLM生成回答。
这套数据流的每个环节都可以单独替换组件,这很重要。今天用Milvus,明天想换Qdrant,只需要改一下向量库的初始化代码;今天用Qwen2.5-VL,明天想换GPT-4o,只需要改一下LLM调用接口。模块之间用标准JSON传递中间结果,接口字段定义清楚,整个系统就非常好迭代。
6. 实战调优记录:我的三个关键优化心得
6.1 检索质量上不去,先检查解析而不是模型
这是我最想强调的一条。有段时间图片检索的准确率始终在六成徘徊,我以为是CLIP模型能力不够,换了好几个视觉embedding模型都没用。最后排查发现,问题出在解析阶段——PDF里大量图片被解析成了带白边的整页截图,图片内容本身只占画面的一半,视觉embedding自然只能提取到无意义的背景特征。
解决方式就是前面提到的图片预处理:用图像边缘检测裁剪掉白边,再缩放到合适分辨率。就这么一个步骤,图片检索准确率从六成直接拉到八成五。所以调优时,先确认输入模型的图片是不是"干净的、聚焦内容的"图片,再考虑模型替换和参数调整。
6.2 信息密度高的文档,用"agentic路由"动态决定检索策略
标准的多模态RAG是"一次检索、一次生成",但我在处理设备手册这种图文交叉非常密集的文档时,发现一个问题:用户提问往往需要多轮检索。比如"配好网络后设备还是连不上,是怎么回事",第一次检索到的图文可能只覆盖"配网步骤",没覆盖"故障排查",需要基于第一轮的内容判断还缺什么,再补一次针对性检索。
我参考了Agentic RAG的思路,在问答链路里加了一个轻量的路由模块:LLM先看问题,判断是否需要走多次检索,如果需要就规划子查询,分别检索文本和图片,然后汇总多轮检索结果再生成。这种动态规划的方式在信息密度高的专业文档上效果非常显著,代价是延迟和token消耗都上涨了,需要根据业务场景做取舍。如果只是做科普类图文知识库,一次性检索已经足够。
6.3 知识库管理:版本更新后怎么保证图文同步
最后一个实战心得是关于知识库更新的。多模态知识库比纯文本知识库更容易出现版本不一致:文档更新后,文本重新索引了,但图片还是旧版的,导致检索结果图文矛盾。我在系统里加了一个"文档版本号"机制,文本块和图片块都带上version字段,更新知识库时按文档整体重建索引,旧版本的全部删除,新版本的原子写入。查询时也默认只查询最新版本,彻底杜绝图文不同步的问题。
这套多模态RAG方案落地之后,我最大的体会是:瓶颈往往不在模型,而在"从文档里把视觉信息完整地提取出来,并和文本建立正确的上下文关联"这一环。多模态大模型的能力已经足够强,缺的是一个能把"恰到好处的图"准确送进模型视野的检索系统。我做过的所有项目里,凡是解析和切块做得扎实的,问答效果都远超预期;凡是急于上模型、忽略底层链路的,后期都要花几倍时间返工。
最后再分享一个小技巧:项目启动时,别急着搭完整系统。找一份最有代表性的业务文档,手工标注出它包含的所有图片、表格和关键文本结构,用这份"金标准"清单去验证你的解析、检索、问答链路。链路通到位再自动化扩展,否则你只会在错误的通道上越跑越远。