RAG 学习笔记:多模态嵌入技术实战
RAG多模态CLIPBGE图文检索
RAG 学习笔记:多模态嵌入技术实战
深入理解 CLIP 模型和 bge-visualized-m3,掌握图文多模态嵌入的核心原理与实践方法。
目录
一、为什么需要多模态嵌入?
核心原因
| 原因 | 说明 | 影响 |
|---|---|---|
| 打破模态墙 | 传统文本嵌入无法理解图像查询 | 支持图文混合检索 |
| 语义对齐 | 将不同模态映射到统一向量空间 | 实现跨模态语义理解 |
| 应用拓展 | 支持图像搜索、图文问答等场景 | 扩大 RAG 应用范围 |
直观理解
想象一下,一段描述”一只奔跑的狗”的文字,其向量会非常接近一张真实小狗奔跑的图片向量。这就是多模态嵌入的魔力——它打破了文本和图像之间的”模态墙”,让机器能够理解不同模态数据之间的语义关联。
📘 背景
多模态嵌入的核心价值在于"以文搜图"和"以图搜图"的统一。电商平台(拍照找同款)、医学影像(按描述搜病例)、安防监控("穿红色衣服的人")都是典型场景。但注意:大多数通用 RAG 项目只需要文本嵌入,多模态只在特定场景下才有必要引入。
二、CLIP 模型浅析
2.1 核心架构
CLIP (Contrastive Language-Image Pre-training) 采用双编码器架构:
图像编码器 (ViT/ResNet) 文本编码器 (Transformer)
↓ ↓
图像向量 文本向量
↓ ↓
└────────→ 共享向量空间 ←─────┘
2.2 对比学习原理
训练目标:
- ✅ 最大化正确图文对的向量相似度
- ❌ 最小化错误配对的相似度
核心思想:“拉近正例,推远负例”
2.3 零样本识别能力
CLIP 能将传统分类任务转化为”图文检索”问题:
任务:判断图片是否为猫
方法:计算图片向量与 "a photo of a cat" 文本向量的相似度
优势:无需针对特定任务微调
三、bge-visualized-m3 模型详解
3.1 核心特性(M3)
| 特性 | 说明 | 优势 |
|---|---|---|
| 多语言性 (Multi-Linguality) | 支持 100+ 语言 | 跨语言图文检索 |
| 多功能性 (Multi-Functionality) | 密集检索、多向量检索 | 灵活的检索范式 |
| 多粒度性 (Multi-Granularity) | 支持不同长度的输入 | 适应各种场景 |
3.2 代码实现
from transformers import AutoModel, AutoTokenizer
from PIL import Image
import torch
# 加载模型
model = AutoModel.from_pretrained("BAAI/bge-visualized-m3")
tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-visualized-m3")
# 文本编码
text = "一只奔跑的狗"
text_inputs = tokenizer(text, return_tensors="pt")
text_embedding = model.get_text_features(**text_inputs)
# 图像编码
image = Image.open("dog.jpg")
image_inputs = model.get_image_processor(image, return_tensors="pt")
image_embedding = model.get_image_features(**image_inputs)
# 计算相似度
similarity = torch.cosine_similarity(text_embedding, image_embedding)
print(f"相似度: {similarity.item()}")
💡 技巧
bge-visualized-m3 支持 100+ 语言,非常适合跨语言图文检索场景。使用时注意:模型权重较大(约 2GB),首次加载需要较长时间。建议在生产环境中使用模型缓存,并考虑使用
torch.compile 或 ONNX 推理加速。
四、图文检索应用
4.1 应用场景
| 场景 | 说明 | 示例 |
|---|---|---|
| 电商产品搜索 | 用图片搜索相似商品 | 拍照找同款 |
| 医学影像分析 | 用文字描述搜索相似病例 | ”肺部CT显示结节” |
| 安防监控 | 用文字描述搜索监控画面 | ”穿红色衣服的人” |
| 内容审核 | 用文字描述搜索违规图片 | ”暴力内容” |
4.2 实现流程
用户查询(文字/图片)
↓
多模态编码器 → 查询向量
↓
向量数据库检索 → 相似图文对
↓
返回结果(图片/文字)
4.3 代码示例
from pymilvus import Collection
import numpy as np
# 假设已经有图文向量数据
collection = Collection("multimodal_search")
collection.load()
# 用文字搜索图片
text_embedding = get_text_embedding("一只奔跑的狗")
results = collection.search(
data=[text_embedding],
anns_field="embedding",
param={"metric_type": "L2", "params": {"ef": 100}},
limit=5,
output_fields=["image_path"]
)
<hr/>
<div class="callout callout-info">
<strong>📘 背景</strong>
以文搜图的核心流程是"文本 → 向量 → 向量库检索 → 返回图片路径"。反之,以图搜文则是"图片 → 向量 → 向量库检索 → 返回文本描述"。两者共用同一套向量索引,区别仅在于输入编码器不同。这种对称设计让多模态检索系统的架构非常简洁。
</div>
for hits in results:
for hit in hits:
print(f"图片路径: {hit.entity.get('image_path')}")
五、选型建议
5.1 决策树
是否需要图文混合检索?
├─ 否
│ └─ 用文本嵌入(BGE、OpenAI Embedding)
└─ 是
├─ 通用场景?→ CLIP
├─ 多语言场景?→ bge-visualized-m3
└─ 特定领域?→ 微调 CLIP
5.2 最佳实践
| 实践 | 说明 | 重要性 |
|---|---|---|
| 选择合适的模型 | 通用场景用 CLIP,多语言用 BGE | ⭐⭐⭐⭐⭐ |
| 预处理图像 | 统一尺寸、归一化 | ⭐⭐⭐⭐ |
| 批量编码 | 提升编码效率 | ⭐⭐⭐⭐ |
| 索引优化 | 选择合适的向量索引 | ⭐⭐⭐ |
结语
多模态嵌入是 RAG 系统的扩展能力,让系统能够理解和检索图文混合内容。但大多数 RAG 项目只需要处理纯文本,只有在特定场景(如电商、医学、安防)才需要多模态嵌入。建议读者根据实际需求选择,不要盲目追求”多模态”。
关键要点:CLIP 是多模态 RAG 的基石,但大多数项目不需要它。根据实际需求选择,不要过度设计。