多模态 Embedding
问题
什么是多模态 Embedding?CLIP 模型如何实现图文跨模态检索?
答案
一、多模态 Embedding 概念
多模态 Embedding 将不同模态(文本、图像、音频等)映射到同一向量空间,使跨模态检索成为可能:
二、CLIP 模型
CLIP(Contrastive Language-Image Pre-training)是多模态 Embedding 的里程碑模型:
训练过程
核心训练目标:
对角线上的图文对是正样本,其余是负样本。
使用示例
from transformers import CLIPModel, CLIPProcessor
from PIL import Image
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
# 编码图片和文本到同一空间
image = Image.open("cat.jpg")
texts = ["一只猫", "一条狗", "一辆汽车"]
inputs = processor(
text=texts,
images=image,
return_tensors="pt",
padding=True
)
outputs = model(**inputs)
# image_embeds: [1, 512] — 图像向量
# text_embeds: [3, 512] — 文本向量
# 计算图文相似度
similarity = outputs.logits_per_image # [1, 3]
# → [0.92, 0.15, 0.03] "一只猫"最相似
三、主流多模态 Embedding 模型
| 模型 | 模态 | 维度 | 特点 |
|---|---|---|---|
| CLIP | 图+文 | 512/768 | 开山之作,生态丰富 |
| SigLIP | 图+文 | 768/1152 | Sigmoid 损失,效果更好 |
| Chinese-CLIP | 图+文 | 512/768 | 中文优化 |
| ImageBind | 图+文+音+视+深+热 | 1024 | Meta,6 种模态 |
| Jina CLIP v2 | 图+文 | 1024 | 多语言,长文本 |
| Nomic Embed Vision | 图+文 | 768 | 开源,统一模型 |
四、应用场景
| 场景 | 描述 | 示例 |
|---|---|---|
| 以文搜图 | 文本查询检索图片 | 电商"红色连衣裙"搜索 |
| 以图搜图 | 图片查询检索相似图片 | 拍照识物 |
| 以图搜文 | 图片查询检索文本描述 | 图片自动标注 |
| 零样本分类 | 用文字标签对图片分类 | 无需训练数据的图片分类 |
| 多模态 RAG | 文档中的图片也参与检索 | 技术文档图文混合检索 |
五、多模态 RAG
在 RAG 系统中处理图文混合文档:
常见面试问题
Q1: CLIP 的核心创新是什么?
答案:
- 使用对比学习在 4 亿图文对上训练,不需要人工标注类别
- 图像和文本共享向量空间,实现零样本迁移
- 预训练后无需微调即可完成分类、检索等多种任务
Q2: 多模态 Embedding 在 RAG 中怎么用?
答案:
- 文档处理:将文档中的图片和文本分别提取
- 双路编码:文本用文本 Embedding,图片用 CLIP 图像编码器
- 统一存储:图文向量存入同一个向量数据库,附带元数据区分类型
- 混合检索:查询同时检索文本和图片
- 多模态生成:将检索到的文本和图片一起送入多模态 LLM(如 GPT-4o)生成答案
Q3: 文本 Embedding 和 CLIP 文本编码器有什么区别?
答案:
- 文本 Embedding(BGE/E5):专为文本-文本匹配优化,文本语义检索效果更好
- CLIP 文本编码器:专为图文对齐优化,跨模态检索效果更好
- 实践建议:纯文本检索用文本 Embedding,涉及图片时用 CLIP