使用 Sentence Transformers 的多模态 Embedding 与 Reranker 模型

Hugging Face Blog 工具

摘要

Sentence Transformers v5.4 引入了对多模态嵌入和重排序的支持,允许用户使用统一的 API 对文本、图像、音频和视频进行编码和比较。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/05/08 09:09

多模态 Embedding 与 Reranker 模型:Sentence Transformers 实践指南

来源:https://huggingface.co/blog/multimodal-sentence-transformers 返回文章列表 (https://huggingface.co/blog)

Tom Aarsen 的头像 (https://huggingface.co/tomaarsen)

  • 目录 (https://huggingface.co/blog/multimodal-sentence-transformers#table-of-contents)
  • 什么是多模态模型? (https://huggingface.co/blog/multimodal-sentence-transformers#what-are-multimodal-models)
  • 安装 (https://huggingface.co/blog/multimodal-sentence-transformers#installation)
  • 多模态 Embedding 模型 (https://huggingface.co/blog/multimodal-sentence-transformers#multimodal-embedding-models)- 加载模型 (https://huggingface.co/blog/multimodal-sentence-transformers#loading-a-model) - 编码图像 (https://huggingface.co/blog/multimodal-sentence-transformers#encoding-images) - 跨模态相似度 (https://huggingface.co/blog/multimodal-sentence-transformers#cross-modal-similarity) - 编码查询与文档 (https://huggingface.co/blog/multimodal-sentence-transformers#encoding-queries-and-documents)
  • 多模态 Reranker 模型 (https://huggingface.co/blog/multimodal-sentence-transformers#multimodal-reranker-models)- 多模态文档排序 (https://huggingface.co/blog/multimodal-sentence-transformers#ranking-mixed-modality-documents) - 预测配对分数 (https://huggingface.co/blog/multimodal-sentence-transformers#predicting-pair-scores)
  • 检索与重排序 (https://huggingface.co/blog/multimodal-sentence-transformers#retrieve-and-rerank)
  • 输入格式与配置 (https://huggingface.co/blog/multimodal-sentence-transformers#input-formats-and-configuration)- 支持的输入类型 (https://huggingface.co/blog/multimodal-sentence-transformers#supported-input-types) - 检查模态支持 (https://huggingface.co/blog/multimodal-sentence-transformers#checking-modality-support) - Processor 与 Model kwargs (https://huggingface.co/blog/multimodal-sentence-transformers#processor-and-model-kwargs)
  • 支持的模型 (https://huggingface.co/blog/multimodal-sentence-transformers#supported-models)- 支持的多模态 Embedding 模型 (https://huggingface.co/blog/multimodal-sentence-transformers#supported-multimodal-embedding-models) - 支持的多模态 Reranker 模型 (https://huggingface.co/blog/multimodal-sentence-transformers#supported-multimodal-reranker-models) - 纯文本 Reranker 模型(v5.4 新特性) (https://huggingface.co/blog/multimodal-sentence-transformers#text-only-reranker-models-also-new-in-v54) - CLIP 模型 (https://huggingface.co/blog/multimodal-sentence-transformers#clip-models)
  • 其他资源 (https://huggingface.co/blog/multimodal-sentence-transformers#additional-resources)- 文档 (https://huggingface.co/blog/multimodal-sentence-transformers#documentation) - 训练 (https://huggingface.co/blog/multimodal-sentence-transformers#training) - Hugging Face Hub (https://huggingface.co/blog/multimodal-sentence-transformers#hugging-face-hub) - 相关博客 (https://huggingface.co/blog/multimodal-sentence-transformers#companion-blogposts)

Sentence Transformers (https://sbert.net/) 是一个用于使用和训练 embedding 与 reranker 模型的 Python 库,适用于检索增强生成(RAG)、语义搜索等场景。随着 v5.4 版本的更新,你现在可以使用熟悉的 API 来编码和对比文本、图像、音频和视频。在本篇博客中,我将展示如何在 embedding 和 reranking 中使用这些新多模态能力。

多模态 embedding 模型将不同模态的输入映射到共享的 embedding 空间,而多模态 reranker 模型则对混合模态配对的相关性进行打分。这开启了视觉文档检索、跨模态搜索、多模态 RAG 流水线等应用场景。

如果你想训练自己的多模态模型,请查看配套博客:使用 Sentence Transformers 训练与微调多模态 Embedding & Reranker 模型

目录 (https://huggingface.co/blog/multimodal-sentence-transformers#table-of-contents)

  • 什么是多模态模型? (https://huggingface.co/blog/multimodal-sentence-transformers#what-are-multimodal-models)
  • 安装 (https://huggingface.co/blog/multimodal-sentence-transformers#installation)
  • 多模态 Embedding 模型 (https://huggingface.co/blog/multimodal-sentence-transformers#multimodal-embedding-models)- 加载模型 (https://huggingface.co/blog/multimodal-sentence-transformers#loading-a-model) - 编码图像 (https://huggingface.co/blog/multimodal-sentence-transformers#encoding-images) - 跨模态相似度 (https://huggingface.co/blog/multimodal-sentence-transformers#cross-modal-similarity) - 编码查询与文档 (https://huggingface.co/blog/multimodal-sentence-transformers#encoding-queries-and-documents)
  • 多模态 Reranker 模型 (https://huggingface.co/blog/multimodal-sentence-transformers#multimodal-reranker-models)- 多模态文档排序 (https://huggingface.co/blog/multimodal-sentence-transformers#ranking-mixed-modality-documents) - 预测配对分数 (https://huggingface.co/blog/multimodal-sentence-transformers#predicting-pair-scores)
  • 检索与重排序 (https://huggingface.co/blog/multimodal-sentence-transformers#retrieve-and-rerank)
  • 输入格式与配置 (https://huggingface.co/blog/multimodal-sentence-transformers#input-formats-and-configuration)- 支持的输入类型 (https://huggingface.co/blog/multimodal-sentence-transformers#supported-input-types) - 检查模态支持 (https://huggingface.co/blog/multimodal-sentence-transformers#checking-modality-support) - Processor 与 Model kwargs (https://huggingface.co/blog/multimodal-sentence-transformers#processor-and-model-kwargs)
  • 支持的模型 (https://huggingface.co/blog/multimodal-sentence-transformers#supported-models)
  • 其他资源 (https://huggingface.co/blog/multimodal-sentence-transformers#additional-resources)

什么是多模态模型? (https://huggingface.co/blog/multimodal-sentence-transformers#what-are-multimodal-models)

传统的 embedding 模型将文本转换为固定大小的向量。多模态 embedding 模型在此基础上扩展,将来自不同模态(文本、图像、音频或视频)的输入映射到共享的 embedding 空间。这意味着你可以使用熟悉的相似度函数,将文本查询与图像文档进行对比(反之亦然)。

类似地,传统的 reranker(Cross Encoder)模型计算文本配对之间的相关性分数。多模态 reranker 则可以对其中一个或两个元素为图像、图文组合文档或其他模态的配对进行打分。

例如,你可以将文本查询与图像文档对比、找到与描述匹配的视频片段,或构建跨模态工作的 RAG 流水线。

安装 (https://huggingface.co/blog/multimodal-sentence-transformers#installation)

多模态模型需要额外的依赖。根据你需要的模态安装对应的 extras(详见安装文档):

# 图像支持
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 需要至少约 8 GB VRAM 的 GPU。对于 8B 版本,预计需要约 20 GB。如果没有本地 GPU,可考虑使用云 GPU 服务或 Google Colab。在 CPU 上运行这些模型会非常慢;纯文本或 CLIP 模型更适合 CPU 推理。

多模态 Embedding 模型 (https://huggingface.co/blog/multimodal-sentence-transformers#multimodal-embedding-models)

加载模型 (https://huggingface.co/blog/multimodal-sentence-transformers#loading-a-model)

加载多模态 embedding 模型的方式与加载纯文本模型完全相同:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("Qwen/Qwen3-VL-Embedding-2B")

部分模型目前可能需要 revision 参数,如果其集成 PR 尚未合并。合并后,就可以像上面那样直接加载,无需指定 revision。

模型会自动检测支持的模态,无需额外配置。如需控制图像分辨率、模型精度等参数,请参阅 Processor 与 Model kwargs

编码图像 (https://huggingface.co/blog/multimodal-sentence-transformers#encoding-images)

加载多模态模型后,model.encode() (https://sbert.net/docs/package_reference/sentence_transformer/SentenceTransformer.html#sentence_transformers.SentenceTransformer.encode) 可同时接受图像和文本。图像可通过 URL、本地文件路径或 PIL Image 对象提供(详见支持的输入类型):

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("Qwen/Qwen3-VL-Embedding-2B")

# 从 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)

跨模态相似度 (https://huggingface.co/blog/multimodal-sentence-transformers#cross-modal-similarity)

由于模型将文本和图像映射到同一空间,你可以计算它们之间的相似度:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("Qwen/Qwen3-VL-Embedding-2B")

# 编码图像
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",
])

# 编码文本查询(每张图像一个匹配项 + 一个难负例)
text_embeddings = model.encode([
    "A green car parked in front of a yellow building",
    "A red car driving on a highway",
    "A bee on a pink flower",
    "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]])

如预期所示,“A green car parked in front of a yellow building” 与汽车图像最相似(0.51),“A bee on a pink flower” 与蜜蜂图像最相似(0.67)。难负例(“A red car driving on a highway”、“A wasp on a wooden table”)正确获得了较低分数。

你可能注意到即使最佳匹配分数(0.51、0.67)也离 1.0 较远。这是由于模态差距:不同模态的 embedding 倾向于聚集在空间的不同区域。跨模态相似度通常低于同模态相似度(如文本-文本),但相对排序得以保留,因此检索效果仍然良好。

编码查询与文档 (https://huggingface.co/blog/multimodal-sentence-transformers#encoding-queries-and-documents)

对于检索任务,推荐使用 encode_query() (https://sbert.net/docs/package_reference/sentence_transformer/SentenceTransformer.html#sentence_transformers.SentenceTransformer.encode_query) 和 encode_document() (https://sbert.net/docs/package_reference/sentence_transformer/SentenceTransformer.html#sentence_transformers.SentenceTransformer.encode_document)。许多检索模型会根据输入是查询还是文档来前置不同的指令提示,类似于聊天模型根据目标应用不同的系统提示。模型作者可以在模型配置中指定提示词,encode_query()/encode_document() 会自动加载并应用正确的提示:

  • encode_query() 使用模型的 "query" 提示(如可用),并设置 task="query"
  • encode_document() 使用 "document""passage""corpus" 中第一个可用的提示,并设置 task="document"

底层而言,两者都是 encode() 的轻量封装,仅负责提示词选择。以下是跨模态检索的示例:

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("Qwen/Qwen3-VL-Embedding-2B")

# 使用查询提示编码文本查询
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://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/car.jpg",
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg",
])

# 计算相似度
similarities = model.similarity(query_embeddings, doc_embeddings)
print(similarities)
# tensor([[0.3907, 0.1490],
#         [0.1235, 0.4872]])

这些方法接受与 encode() 相同的输入类型(图像、URL、多模态字典等),并透传相同的参数。对于没有专门查询/文档提示的模型,它们的行为与 encode() 完全一致。

多模态 Reranker 模型 (https://huggingface.co/blog/multimodal-sentence-transformers#multimodal-reranker-models)

多模态 reranker(CrossEncoder)模型对输入配对的相关性进行打分,每个元素可以是文本、图像、音频、视频或它们的组合。它们在质量上通常优于 embedding 模型,但速度较慢,因为需要逐对处理。目前可用的预训练多模态 reranker 主要聚焦文本和图像输入,但架构支持底层模型能处理的任何模态。

多模态文档排序 (https://huggingface.co/blog/multimodal-sentence-transformers#ranking-mixed-modality-documents)

rank() (https://sbert.net/docs/package_reference/cross_encoder/cross_encoder.html#sentence_transformers.cross_encoder.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 = [
    # 图像文档(URL 或本地文件路径)
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/car.jpg",
    "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/bee.jpg",
    # 文本文档
    "A vintage Volkswagen Beetle painted in bright green sits in a driveway.",
    # 图文组合文档
    {
        "text": "A car in a European city",
        "image": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/car.jpg",
    },
]

rankings = model.rank(query, documents)
for rank in rankings:
    print(f"{rank['score']:.4f}\t(document {rank['corpus_id']})")
"""
0.9375  (document 0)
0.5000  (document 3)
-1.2500 (document 2)
-2.4375 (document 1)
"""

Reranker 正确识别出汽车图像(document 0)为最相关结果,其次是关于汽车的图文组合文档(document 3)。

相似文章

你的嵌入模型比你想象的更聪明

Hugging Face Daily Papers

SMART是一个框架,能够解锁单向量模型中的潜在多向量能力,用于多模态检索,通过对比训练和后期交互推理,在降低计算成本的同时提升最先进的性能。

通过多模态突破纯文本瓶颈?

Reddit r/AI_Agents

本文讨论了多模态 AI 模型(如 GPT-4o 和 Claude 3.5 Sonnet)如何通过支持可视化调试、音频转数据以及增强型 RAG 系统,来克服纯文本处理的瓶颈。