使用 Sentence Transformers 进行多模态嵌入与重排序模型
速览
Sentence Transformers 库现已支持多模态嵌入和重排序模型,允许处理文本、图像等多种数据类型的联合表示。这一更新显著增强了跨模态检索任务的准确性与灵活性。开发者可以利用这些模型构建更智能的搜索和推荐系统。
AI 深度解读
多模态嵌入与重排序模型:Sentence Transformers 的深度解读
背景
传统的自然语言处理模型主要专注于单一模态,特别是文本。传统的嵌入模型(Embedding Models)将文本转换为固定大小的向量,而传统的重排序模型(Reranker,通常指 Cross Encoder)则计算文本对之间的相关性得分。然而,随着多模态人工智能的发展,应用场景日益复杂,用户不再局限于纯文本搜索,而是需要处理图像、音频甚至视频。
多模态嵌入模型的核心突破在于将来自不同模态(如文本、图像、音频、视频)的输入映射到一个共享的嵌入空间中。这意味着可以使用相同的相似度函数,直接比较文本查询与图像文档(或反之)。同样,多模态重排序模型能够评估混合模态对的相关性,例如一个文本查询与一个图像文档的组合,或者包含图文混合内容的文档。
这种技术能力开启了诸如视觉文档检索、跨模态搜索以及多模态检索增强生成(RAG)管道等全新用例。Sentence Transformers 库通过引入对这些多模态模型的支持,使得开发者能够更轻松地构建和部署此类应用。
核心内容
1. 安装与环境配置
多模态模型需要额外的依赖项。用户需要根据需求安装特定的扩展包:
- 图像支持:
pip install -U "sentence-transformers[image]" - 音频支持:
pip install -U "sentence-transformers[audio]" - 视频支持:
pip install -U "sentence-transformers[video]" - 组合安装:例如同时需要图像和视频训练功能,可执行
pip install -U "sentence-transformers[image,video,train]"
硬件要求提示: 基于视觉语言模型(VLM)的模型(如 Qwen3-VL-2B)对显存要求较高。Qwen3-VL-2B 至少需要约 8 GB VRAM,而 8B 变体则需要约 20 GB VRAM。如果没有本地 GPU,建议使用云 GPU 服务或 Google Colab。在 CPU 上运行这些模型速度极慢,此时建议使用纯文本模型或 CLIP 模型进行推理。
2. 多模态嵌入模型
加载模型
加载多模态嵌入模型的方式与加载纯文本模型完全相同:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("Qwen/Qwen3-VL-Embedding-2B")
部分模型可能暂时需要指定 revision 参数,直到相关的集成 Pull Request 被合并。模型会自动检测其支持的模态,无需额外配置。
编码图像
model.encode() 方法现在接受图像与文本。图像可以通过 URL、本地文件路径或 PIL Image 对象提供。
# 编码来自 URL 的图像
img_embeddings = model.encode([
"https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/car.jpg",
"https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg",
])
print(img_embeddings.shape)
# 输出: (2, 2048)
跨模态相似度计算
由于模型将文本和图像映射到同一空间,可以直接计算它们之间的相似度。
# 编码图像
img_embeddings = model.encode([...]) # 同上
# 编码文本查询(包含正例和难负例)
text_embeddings = model.encode([
"A green car parked in front of a yellow building", # 匹配 car.jpg
"A red car driving on a highway", # 难负例
"A bee on a pink flower", # 匹配 bee.jpg
"A wasp on a wooden table", # 难负例
])
# 计算跨模态相似度
similarities = model.similarity(text_embeddings, img_embeddings)
print(similarities)
# 输出示例:
# tensor([[0.5115, 0.1078],
# [0.1999, 0.1108],
# [0.1255, 0.6749],
# [0.1283, 0.2704]])
关于“模态间隙”(Modality Gap)的说明: 即使最佳匹配得分(如 0.51 或 0.67)也远低于 1.0,这是正常现象。不同模态的嵌入倾向于在空间中聚集在不同的区域,导致跨模态相似度通常低于模态内相似度(如文本到文本)。然而,相对排序保持不变,因此检索效果依然良好。
查询与文档的专用编码方法
为了优化检索任务,Sentence Transformers 提供了 encode_query() 和 encode_document() 方法。许多检索模型会根据输入是“查询”还是“文档”来添加不同的指令提示(Prompt)。
encode_query():使用模型配置中的 "query" 提示,并设置task="query"。encode_document():使用 "document"、"passage" 或 "corpus" 中第一个可用的提示,并设置task="document"。
这两个方法是 encode() 的轻量级封装,自动处理提示选择。
# 使用专用方法编码
query_embeddings = model.encode_query([
"Find me a photo of a vehicle parked near a building",
"Show me an image of a pollinating insect",
])
doc_embeddings = model.encode_document([
"https://.../car.jpg",
"https://.../bee.jpg",
])
similarities = model.similarity(query_embeddings, doc_embeddings)
3. 多模态重排序模型
多模态重排序模型(CrossEncoder)对输入对进行评分,其中每个元素可以是文本、图像、音频、视频或它们的组合。虽然它们比嵌入模型速度慢(因为需逐个处理每对输入),但在相关性排序质量上通常更优。目前可用的预训练多模态重排序器主要关注文本和图像输入。
混合模态文档排序
rank() 方法支持对混合模态的文档列表进行评分和排序。
from sentence_transformers import CrossEncoder
model = CrossEncoder("Qwen/Qwen3-VL-Reranker-2B")
query = "A green car parked in front of a yellow building"
documents = [
"https://.../car.jpg", # 图像文档
"https://.../bee.jpg", # 图像文档
"A vintage Volkswagen..." # 文本文档
]
# 对文档进行排序
results = model.rank(query, documents)
关键要点
- 统一空间映射:多模态嵌入模型将文本、图像、音频等映射到共享空间,允许使用标准相似度函数进行跨模态比较。
- 安装模块化:通过
sentence-transformers[image/audio/video]按需安装依赖,避免不必要的资源占用。 - 硬件门槛:基于 VLM 的多模态模型对 GPU 显存要求较高(2B 模型需 ~8GB,8B 模型需 ~20GB),CPU 推理性能较差。
- 模态间隙现象:跨模态相似度得分通常低于模态内得分,但相对排序有效,不影响检索准确性。
- 专用检索方法:使用
encode_query()和encode_document()可自动应用模型特定的指令提示,优化检索效果。 - 重排序优势:多模态 CrossEncoder 模型在排序质量上优于嵌入模型,适合对精度要求高且计算资源允许的场景。
- 输入格式灵活:支持 URL、本地路径、PIL 对象等多种图像输入格式。
意义与影响
Sentence Transformers 对多模态模型的支持标志着开源生态在构建复杂检索系统方面的重大进步。
- 简化多模态 RAG 开发:开发者可以轻松构建跨模态的检索增强生成管道,例如从包含图片和文档的混合知识库中检索信息,从而提升 LLM
