RAG 学习笔记:多模态嵌入技术实战
RAG多模态CLIPBGE图文检索
RAG 学习笔记:多模态嵌入技术实战
前言
现代 AI 的一项重要突破,是将简单的词向量发展成了能统一理解图文、音视频的复杂系统。本文将深入探讨多模态嵌入技术,特别是 CLIP 模型和 bge-visualized-m3 的核心原理与实践应用。
一、为什么需要多模态嵌入?
核心原因
| 原因 | 说明 | 影响 |
|---|---|---|
| 打破模态墙 | 传统文本嵌入无法理解图像查询 | 支持图文混合检索 |
| 语义对齐 | 将不同模态映射到统一向量空间 | 实现跨模态语义理解 |
| 应用拓展 | 支持图像搜索、图文问答等场景 | 扩大 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) | 短句到 8192 token 长文档 | 覆盖广泛应用需求 |
3.2 技术架构
视觉编码器 (EVA-CLIP)
↓
图像 Patch Token
↓
映射到文本维度
↓
与文本 Token 联合编码
↓
统一向量表示
四、环境准备
4.1 安装依赖
# 进入 visual_bge 目录
cd code/C3/visual_bge
# 安装 visual_bge 模块及其依赖
pip install -e .
# 返回上级目录
cd ..
4.2 下载模型权重
# 运行模型下载脚本
python download_model.py
模型会自动下载到 ../../models/bge/ 目录。
五、代码实战
5.1 基础示例
import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"
import torch
from visual_bge.visual_bge.modeling import Visualized_BGE
# 加载模型
model = Visualized_BGE(
model_name_bge="BAAI/bge-base-en-v1.5",
model_weight="../../models/bge/Visualized_base_en_v1.5.pth"
)
model.eval()
# 多模态编码
with torch.no_grad():
# 纯文本编码
text_emb = model.encode(text="datawhale开源组织的logo")
# 纯图像编码
img_emb_1 = model.encode(image="../../data/C3/imgs/datawhale01.png")
# 图文联合编码
multi_emb_1 = model.encode(
image="../../data/C3/imgs/datawhale01.png",
text="datawhale开源组织的logo"
)
img_emb_2 = model.encode(image="../../data/C3/imgs/datawhale02.png")
multi_emb_2 = model.encode(
image="../../data/C3/imgs/datawhale02.png",
text="datawhale开源组织的logo"
)
# 计算相似度
sim_1 = img_emb_1 @ img_emb_2.T
sim_2 = img_emb_1 @ multi_emb_1.T
sim_3 = text_emb @ multi_emb_1.T
sim_4 = multi_emb_1 @ multi_emb_2.T
print("=== 相似度计算结果 ===")
print(f"纯图像 vs 纯图像: {sim_1}")
print(f"图文结合1 vs 纯图像: {sim_2}")
print(f"图文结合1 vs 纯文本: {sim_3}")
print(f"图文结合1 vs 图文结合2: {sim_4}")
5.2 运行结果
=== 相似度计算结果 ===
纯图像 vs 纯图像: tensor([[0.8318]])
图文结合1 vs 纯图像: tensor([[0.8291]])
图文结合1 vs 纯文本: tensor([[0.7627]])
图文结合1 vs 图文结合2: tensor([[0.9058]])
5.3 结果分析
| 对比项 | 相似度 | 分析 |
|---|---|---|
| 纯图像 vs 纯图像 | 0.8318 | 两张相似图像的向量接近 |
| 图文结合 vs 纯图像 | 0.8291 | 图文联合编码与纯图像编码相似度高 |
| 图文结合 vs 纯文本 | 0.7627 | 图文联合编码与纯文本编码相似度适中 |
| 图文结合1 vs 图文结合2 | 0.9058 | 相同文本的不同图像图文联合编码最相似 |
六、核心概念对比
6.1 编码方式对比
| 编码方式 | 输入 | 特点 | 适用场景 |
|---|---|---|---|
| 纯文本编码 | 文本 | 保持原始 BGE 文本嵌入能力 | 文本检索 |
| 纯图像编码 | 图像 | 使用 EVA-CLIP 视觉编码器 | 图像检索 |
| 图文联合编码 | 图像 + 文本 | 融合图文特征到统一空间 | 多模态检索 |
6.2 应用场景矩阵
| 场景 | 推荐编码方式 | 原因 |
|---|---|---|
| 文本到图像检索 | 纯文本编码 + 纯图像编码 | 跨模态匹配 |
| 图像到图像检索 | 纯图像编码 | 同模态相似度 |
| 图文组合查询 | 图文联合编码 | 融合多模态信息 |
| 多模态知识检索 | 图文联合编码 | 精准语义理解 |
七、技术要点
7.1 模型参数说明
Visualized_BGE(
model_name_bge="BAAI/bge-base-en-v1.5", # 底层 BGE 文本嵌入模型
model_weight="../../models/bge/Visualized_base_en_v1.5.pth" # 预训练权重
)
参数解析:
model_name_bge:指定底层 BGE 文本嵌入模型,继承其强大的文本表示能力model_weight:Visual BGE 的预训练权重文件,包含视觉编码器参数
7.2 相似度计算原理
# 使用矩阵乘法计算余弦相似度
similarity = vector1 @ vector2.T
关键点:
- 所有嵌入向量都被标准化到单位长度
- 确保相似度值在合理范围内(0-1)
- 值越接近 1 表示越相似
八、实践建议
8.1 最佳实践
| 实践 | 说明 | 重要性 |
|---|---|---|
| 模型选择 | 根据任务选择合适的编码方式 | ⭐⭐⭐⭐⭐ |
| 批量处理 | 批量编码提升效率 | ⭐⭐⭐⭐ |
| GPU 加速 | 使用 GPU 加速编码过程 | ⭐⭐⭐⭐ |
| 向量缓存 | 缓存常用向量避免重复计算 | ⭐⭐⭐ |
8.2 常见问题
❌ 问题 1:模型加载失败
- 解决:检查模型路径和网络连接
❌ 问题 2:内存不足
- 解决:减小批量大小或使用 CPU
❌ 问题 3:相似度计算异常
- 解决:确保向量已归一化
九、学习收获
核心认知
- 多模态嵌入打破模态墙:将文本和图像映射到统一向量空间,实现跨模态理解
- CLIP 定义了有效范式:双编码器架构 + 对比学习成为主流方案
- bge-visualized-m3 更全面:多语言、多功能、多粒度的现代多模态嵌入模型
下一步计划
- 实践使用 bge-visualized-m3 构建图文检索系统
- 对比不同多模态嵌入模型的性能
- 探索多模态 RAG 应用场景
- 学习其他多模态模型(如 BLIP, ALIGN)
结语
多模态嵌入技术为 RAG 系统打开了新的大门,使其能够处理文本、图像等多种模态的数据。掌握这项技术,将帮助你构建更强大、更智能的 AI 应用。
关键要点:多模态嵌入的核心是跨模态对齐,CLIP 和 bge-visualized-m3 是当前最优秀的代表模型,选择合适的编码方式是成功的关键。