多模态 RAG 怎么设计检索链路
P2 · rag · 🏢 美团
🏷 标签:multimodal, rag, retrieval, clip, fusion
1️⃣ 考察意图
面试官想看你是否理解多模态RAG不是简单“文本RAG+图片”,而是涉及异构数据对齐、检索策略取舍和生成瓶颈的系统设计题。考察类型是系统设计+工程取舍。刁钻点在于:多模态embedding如何统一空间?检索时是分路检索再融合,还是统一向量库?重排序如何跨模态打分?答好了能展示你对多模态检索前沿(如CLIP、ColPali、Late Interaction)的掌握,以及处理真实场景中数据异构、延迟、精度权衡的工程能力。
2️⃣ 标准答
多模态RAG检索链路设计,核心是解决“输入模态多样(文本+图像/音频/视频)”和“输出需融合多模态上下文”的问题。我分四个层面拆解:索引构建、检索策略、重排序、生成。
1. 索引构建:分模态还是统一?
- 分模态索引:对文本用BM25或DPR,图像用CLIP ViT-L/14提取embedding,音频用Whisper转文本或直接提取声学embedding。各模态独立建向量库(如FAISS、Milvus)。为什么这么做:各模态embedding维度、分布不同,统一索引需对齐空间,训练成本高。分模态灵活,可独立优化。
- 坑+解法:分模态后检索结果无法直接比较分数。解法:对每个模态的相似度做归一化(如min-max或z-score),或使用Late Interaction(如ColBERT的MaxSim)在token级对齐后再排序。 统一索引:用多模态模型(如CLIP、SigLIP)将文本和图像映射到同一embedding空间,直接建一个向量库。
- Trade-off:统一索引检索快(一次查询),但CLIP对细粒度文本-图像对齐(如“红色汽车左侧的轮胎”)效果差,且无法处理音频/视频。适合粗粒度场景。
2. 检索策略:早期融合 vs 晚期融合
- 早期融合(Fusion-in-Encoder):将用户查询(如文本+图像)拼接后,用多模态编码器(如BLIP-2的Q-Former)生成联合embedding,再检索统一向量库。优点:语义对齐好,适合查询本身是多模态(如“这张图里的建筑在哪?”)。
- 缺点:查询编码慢(需跑多模态模型),且向量库需支持多模态,扩展性差。 晚期融合(Fusion-in-Decoder):分路检索——文本查询走文本索引,图像查询走图像索引(或用户上传的图像直接用CLIP提取embedding检索)。各自返回Top-K,然后合并排序。
- 优点:模块化,可独立优化;延迟低(文本检索用BM25,图像检索用CLIP,可并行)。
- 工程落地:美团场景中,用户输入可能是“推荐这家店的招牌菜”+一张菜品图。我会用文本检索菜品描述,图像检索相似菜品图,然后按加权分数合并(如文本0.6、图像0.4)。权重可通过线上A/B测试调优。
3. 重排序:跨模态交叉编码
- 分路检索后,候选集可能包含文本片段和图像。直接拼接给LLM会浪费token。需要重排序器跨模态打分。
- 方法:使用多模态交叉编码器,如BLIP-2或LLaVA的视觉编码器+文本编码器。对每个候选(文本或图像)与查询计算相关性分数。具体操作:将查询文本和候选图像输入BLIP-2,输出一个匹配分数;文本候选则用标准交叉编码器(如Cross-Encoder)。最后按分数降序取Top-K。
- 坑+解法:交叉编码器计算成本高(O(n)次前向)。解法:先分路检索取Top-100,再重排序取Top-10,控制延迟在200ms内。或者用ColPali(基于视觉语言模型的Late Interaction),直接对文档图像做token级匹配,省去OCR步骤。
4. 生成:多模态LLM上下文注入
- 将重排序后的多模态片段(文本+图像)作为上下文,输入多模态LLM(如GPT-4V、Qwen-VL、CogVLM2)。
- 关键取舍:图像是直接传base64还是用描述文本替代?传图像:保留视觉细节,但token成本高(一张图≈256-1024 tokens),且LLM需支持视觉输入。
- 用描述文本(如BLIP2生成的caption):节省token,但丢失细粒度信息(如位置、颜色)。实际落地:对高精度场景(如医疗影像)传图像,对通用QA用描述文本+关键区域裁剪。
总结:多模态RAG检索链路没有银弹。我倾向晚期融合+分模态索引+多模态重排序,因为模块化、易扩展、延迟可控。具体实现时,用CLIP做图像检索,BM25做文本检索,BLIP-2做重排序,最后喂给Qwen-VL生成。
3️⃣ 答题模板(30 秒电梯版)
“这个问题我从索引构建、检索策略、重排序、生成四个层面回答。索引上,我倾向分模态建库,用CLIP和BM25分别处理图像和文本,避免统一空间的对齐成本;检索上,采用晚期融合,分路检索后加权合并,延迟低且可并行;重排序用BLIP-2做跨模态交叉编码,过滤噪声;生成时根据场景决定传图像还是描述文本。总结一句:多模态RAG的核心是模块化设计,用工程取舍平衡精度和延迟。”
4️⃣ 高频追问 & 应对
追问 1:如果用户输入是视频,你怎么处理?视频检索和图像检索有什么不同?
视频是图像序列,直接提取每帧embedding会爆炸。我会用关键帧提取:基于帧间差异(如PSNR<30)或场景切换检测(如PySceneDetect)采样,每段视频取5-10帧。然后对每帧用CLIP提取embedding,建索引时存为“视频ID+帧序号”的列表。检索时,用户查询与所有帧embedding计算相似度,取Top-K帧,再按视频ID聚合(如取平均分或最高分)。坑:视频可能包含音频,需用Whisper转文本后与视觉结果融合。Trade-off:关键帧越多召回越高,但索引膨胀,需控制帧率(如1fps)。
追问 2:多模态重排序时,文本候选和图像候选的分数怎么统一?
不能直接比较,因为BLIP-2输出的是匹配概率,而文本交叉编码器输出的是logits。解法:对每个模态的分数做归一化——用训练集统计每个模态的分数分布,做z-score标准化;或者用Platt Scaling(逻辑回归校准)。更工程的做法:在重排序阶段,对每个候选(无论模态)都输入同一个多模态模型(如LLaVA),让它输出一个0-1的相关性分数,这样分数天然可比。代价是计算量翻倍,但精度提升明显。
追问 3:如果数据量极大(10亿级),分模态索引的延迟怎么优化?
分模态索引本身可以并行检索,但10亿级下单个模态的检索延迟也会高。优化:1)量化:用PQ(乘积量化)将CLIP embedding从1024维压缩到128维,召回率下降<2%,延迟降低5倍。2)分层检索:先用粗粒度聚类(如IVF)取Top-1000,再用精确距离重排。3)缓存:对高频查询(如热门菜品图)做LRU缓存,命中率可达30%。4)异步流水线:文本检索和图像检索并行,等最慢的返回后再合并,整体延迟由最慢模态决定。
5️⃣ 避坑 · 常见错误答法
- ❌ 说“直接用CLIP统一索引,所有模态都映射到同一个embedding空间,简单高效” → ✅ 正确切入:CLIP统一空间只对图文对有效,对音频/视频无效,且细粒度对齐差。实际工程中分模态索引更灵活,能独立优化每个模态的检索器。
- ❌ 说“重排序直接用LLM对所有候选打分,省去交叉编码器” → ✅ 正确切入:LLM打分成本极高(O(n)次推理),且对图像候选需额外视觉编码。应该先用轻量级交叉编码器(如BLIP-2)过滤到Top-10,再让LLM生成答案。
- ❌ 说“生成时把所有图像都传给LLM,保留全部视觉信息” → ✅ 正确切入:图像token成本高(一张图≈256 tokens),且LLM上下文窗口有限。应该根据场景取舍:对高精度场景传图像,对通用QA用描述文本+关键区域裁剪。
6️⃣ 简历呼应
- 如果你有RAG项目:从“我在XX项目中用CLIP+BM25做多模态检索,发现晚期融合比早期融合召回率高5%,但延迟增加20%”切入,展示工程权衡。
- 如果你只做过传统NLP:用“文本RAG的检索链路(BM25→DPR→重排序)可以迁移到多模态,只是把文本embedding换成CLIP图像embedding,重排序换成BLIP-2”类比,强调模块化设计。
- 如果你是校招无项目:聚焦“我复现了ColPali论文,用视觉语言模型做文档检索,省去OCR步骤,在Flickr30k上达到SOTA”的demo,展示对前沿的理解。
7️⃣ 延伸阅读
- 《ColPali: Efficient Document Retrieval with Vision Language Models》
- 《BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models》
- 《CLIP: Learning Transferable Visual Models From Natural Language Supervision》
- 《Late Interaction with ColBERT: Efficient and Effective Passage Retrieval》
- 《Qwen-VL: A Versatile Vision-Language Model for Understanding, Localization, Text Reading, and Beyond》