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 的基石,但大多数项目不需要它。根据实际需求选择,不要过度设计。