🧠 图解记忆:多模态 RAG 要分层判断瓶颈在召回、生成还是图文一致性,再分别用混合召回、融合精排和证据约束优化,而不是只盯最终答案分数;点击图片可查看原图。
💡 答案要点
多模态 RAG = 检索图片和文本,生成答案
系统架构:
用户问题:"这张产品图的价格是多少?"
↓
1. 多模态检索
- 图像检索:CLIP 找相似图片
- 文本检索:BM25 + Embedding 找相关文档
↓
2. 融合排序
- 图片:产品照片
- 文档:产品说明、价格信息
↓
3. 多模态 LLM 生成
- GPT-4V / BLIP-2
- 输入:图片 + 文档 + 问题
- 输出:答案评估指标:
1. 检索质量:
| 指标 | 说明 | 计算方式 |
|---|---|---|
| Recall@K | 前K个结果包含答案的比例 | 正确检索数 / 总问题数 |
| MRR | 平均倒数排名 | 1/N Σ(1/rank_i) |
| NDCG | 归一化折扣累积增益 | 考虑排序质量 |
2. 生成质量:
| 指标 | 说明 |
|---|---|
| 准确率 | 答案正确的比例 |
| 忠实度 | 答案基于检索内容的程度 |
| 相关性 | 答案与问题的匹配度 |
3. 多模态特有指标:
| 指标 | 说明 |
|---|---|
| 图像相关性 | 检索的图像是否相关 |
| 跨模态一致性 | 图像和文本信息是否一致 |
优化策略:
1. 混合检索(Hybrid Retrieval):
python
def hybrid_retrieve(query, query_image=None):
results = []
# 文本检索(BM25 + 向量)
if query:
text_results = text_retriever.search(query, k=20)
results.extend(text_results)
# 图像检索(CLIP)
if query_image:
image_results = clip_retriever.search(query_image, k=10)
results.extend(image_results)
# 融合排序(RRF - Reciprocal Rank Fusion)
final_results = reciprocal_rank_fusion(results)
return final_results[:10]2. 多模态 Rerank:
python
def multimodal_rerank(query, query_image, candidates):
scores = []
for doc in candidates:
# 文本相似度
text_score = compute_text_similarity(query, doc.text)
# 图像相似度(如果文档包含图片)
if doc.image and query_image:
image_score = clip_similarity(query_image, doc.image)
else:
image_score = 0
# 融合得分
final_score = 0.6 * text_score + 0.4 * image_score
scores.append(final_score)
# 排序
ranked = sorted(zip(candidates, scores),
key=lambda x: x[1], reverse=True)
return ranked3. 提示词优化:
python
# 针对多模态的 Prompt
prompt = f"""
基于以下检索到的信息回答问题:
图片信息:
[包含 {len(images)} 张相关图片]
文本信息:
{retrieved_text}
问题:{user_question}
要求:
1. 优先使用图片中的信息
2. 如果图片和文本冲突,说明原因
3. 如果无法确定答案,明确指出
"""案例:电商客服
场景: 用户上传商品图片,询问价格、尺寸等
实现:
展开 Python 代码示例(30 行)
python
def ecommerce_qa(user_image, user_question):
# 1. 图像检索:找相似商品
similar_products = clip_search(user_image, k=5)
# 2. 文本检索:找商品详情
product_ids = [p.id for p in similar_products]
product_details = database.query(product_ids)
# 3. 构造上下文
context = ""
for product in product_details:
context += f"""
商品名:{product.name}
价格:{product.price}
尺寸:{product.size}
图片相似度:{product.similarity:.2f}
"""
# 4. 生成答案
prompt = f"""
用户上传了一张商品图片,问题是:{user_question}
检索到的相似商品:
{context}
请回答用户问题。如果有多个匹配商品,列出前3个。
"""
answer = gpt4v.generate(prompt, images=[user_image])
return answer效果提升:
| 优化 | Recall@5 | 准确率 | 用户满意度 |
|---|---|---|---|
| 基线(纯文本 RAG) | 65% | 72% | 3.2/5 |
| + CLIP 图像检索 | 78% | 81% | 3.8/5 |
| + 多模态 Rerank | 85% | 87% | 4.2/5 |
| + GPT-4V 生成 | 85% | 92% | 4.5/5 |
面试话术:
"多模态 RAG 的难点在于跨模态融合。我用 CLIP 做图像检索,BM25+向量做文本检索,RRF 融合排序。关键是 Rerank 阶段同时考虑图像和文本相似度,Recall@5 从 65% 提升到 85%。"
📚 参考:RAGAS:评估框架(多模态扩展)
