使用 Sentence Transformers 構建多模態嵌入與重排序模型
Sentence Transformers v5.4 引入了對多模態嵌入與重排序模型的支援,讓使用者能將文字與圖像映射至共享空間,以實現進階的檢索與 RAG 流水線。
使用 Sentence Transformers 的多模態嵌入與重排序模型
多模態嵌入模型(Multimodal embedding models)將來自不同模態的輸入映射到共享的嵌入空間中,而多模態重排序模型(Multimodal reranker models)則對混合模態對的相關性進行評分。這開啟了諸如視覺文件檢索、跨模態搜索以及多模態 RAG 流水線等應用場景。
目錄
什麼是多模態模型?
傳統的嵌入模型將文本轉換為固定大小的向量。多模態嵌入模型則透過將不同模態(文本、圖像、音訊或影片)的輸入映射到共享的嵌入空間來擴展這一功能。這意味著你可以使用你已經熟悉的相同相似度函數,將文本查詢與圖像文件進行比較(反之亦然)。
同樣地,傳統的重排序(Cross Encoder)模型計算成對文本之間的相關性分數。多模態重排序模型可以對其中一個或兩個元素為圖像、文本與圖像結合的文件或其他模態的配對進行評分。
例如,你可以將文本查詢與圖像文件進行比較,尋找符合描述的影片片段,或構建跨模態運作的 RAG 流水線。
安裝
多模態模型需要一些額外的依賴項。請根據你需要的模態安裝額外組件(詳見「安裝」部分):
基於 VLM 的模型(如 Qwen3-VL-2B)需要至少約 8 GB 顯存(VRAM)的 GPU。對於 8B 變體,預計需要約 20 GB。如果你沒有本地 GPU,請考慮使用雲端 GPU 服務或 Google Colab。在 CPU 上,這些模型會非常緩慢;純文本或 CLIP 模型更適合 CPU 推論。
多模態嵌入模型
加載模型
加載多模態嵌入模型的方法與加載純文本模型完全相同:
目前需要 revision 參數,因為這些模型的整合拉取請求(Pull Requests)仍在處理中。一旦合併,你將無需指定 revision 即可加載它們。
模型會自動檢測其支援的模態,因此無需額外配置。如果你想控制圖像解析度或模型精度等設置,請參閱 Processor 和 Model 關鍵字參數(kwargs)。
編碼圖像
加載多模態模型後,model.encode() 可以同時接受圖像和文本。圖像可以作為 URL、本地文件路徑或 PIL 圖像對象提供(詳見「支援的輸入類型」以了解所有接受的格式):
跨模態相似度
你可以計算文本嵌入與圖像嵌入之間的相似度,因為模型將兩者映射到同一個空間:
正如預期的那樣,「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。這是由於「模態間隙」(modality gap):來自不同模態的嵌入傾向於聚集在空間的不同區域。跨模態相似度通常低於同模態相似度(例如文本對文本),但相對順序會被保留,因此檢索功能仍然運作良好。
編碼查詢與文件
對於檢索任務,建議使用 encode_query() 和 encode_document() 方法。許多檢索模型會根據輸入是查詢還是文件來添加不同的指令提示詞(instruction prompts),類似於聊天模型根據目標應用不同的系統提示詞。模型作者可以在模型配置中指定其提示詞,而 encode_query() / encode_document() 會自動加載並應用正確的提示詞:
在底層,這兩者都是 encode() 的薄封裝,它們只是為你處理提示詞選擇。以下是跨模態檢索的範例:
這些方法接受與 encode() 相同的輸入類型(圖像、URL、多模態字典等)並傳遞相同的參數。對於沒有專門查詢/文件提示詞的模型,它們的行為與 encode() 完全一致。
多模態重排序模型
多模態重排序(CrossEncoder)模型對成對輸入之間的相關性進行評分,其中每個元素可以是文本、圖像、音訊、影片或其組合。它們在質量上往往優於嵌入模型,但由於需要單獨處理每一對輸入,速度較慢。目前可用的預訓練多模態重排序模型主要集中在文本和圖像輸入,但其架構支援底層模型可以處理的任何模態。
對混合模態文件進行排序
rank() 方法針對查詢對文件列表進行評分和排序,支援混合模態:
重排序模型正確地將汽車圖像(文件 0)識別為最相關的結果,其次是關於歐洲城市汽車的文本+圖像組合文件(文件 3)。蜜蜂圖像(文件 1)得分最低。
請記住,模態間隙可能會影響絕對分數:文本-圖像對的分數範圍可能與文本-文本或圖像-圖像對的分數範圍不同。
你也可以使用 modalities 和 supports() 來檢查重排序模型支援哪些模態,就像嵌入模型一樣:
預測配對分數
你也可以使用 predict() 來獲取特定輸入對的原始相關性分數:
檢索與重排序
一個常見的模式是使用嵌入模型進行快速的初步檢索,然後使用重排序模型對頂部結果進行精煉:
由於語料庫嵌入是預先計算的,即使在數百萬份文件中,初始檢索也很快。重排序模型隨後在較小的候選集中提供更準確的評分。
輸入格式與配置
支援的輸入類型
多模態模型接受多種輸入格式。以下是你可以傳遞給 model.encode() 的內容摘要:
檢查模態支援
你可以使用 modalities 屬性和 supports() 方法檢查模型支援哪些模態:
「message」模態表示模型接受帶有交錯內容的聊天式消息輸入。在實踐中,你很少需要直接使用它。當你傳遞字串、URL 或多模態字典時,模型會在內部將它們轉換為適當的消息格式。Sentence Transformers 支援兩種消息格式:
格式會從模型的聊天模板(chat template)中自動檢測。
由於所有輸入在內部都會轉換為相同的消息格式,因此你可以在單次 encode() 調用中混合輸入類型:
如果模型不遵循上述任何一種格式,而你需要完全控制,可以直接傳遞帶有 role 和 content 鍵的原始消息字典:
這會繞過自動格式轉換,並將消息直接傳遞給處理器的 apply_chat_template()。
Processor 與 Model 關鍵字參數
你可能想要控制圖像解析度邊界或模型精度。加載模型時請使用 processor_kwargs 和 model_kwargs:
有關這些關鍵字參數的更多詳細資訊,請參閱 SentenceTransformer API 參考文件。
在 Sentence Transformers v5.4 中,tokenizer_kwargs 已重命名為 processor_kwargs,以反映多模態模型使用的是處理器(processors)而不僅僅是分詞器(tokenizers)。舊名稱仍被接受但已棄用。
支援的模型
以下是 v5.4 支援的多模態模型,也可在 v5.4 整合集合中找到:
支援的多模態嵌入模型
支援的多模態重排序模型
純文本重排序模型(也是 v5.4 的新功能)
CLIP 模型
舊有的 CLIP 模型繼續受到支援:
這些簡單的 CLIP 模型在低資源硬體上仍然表現良好。
額外資源
文件
訓練
我將在未來幾週發布一篇關於訓練和微調多模態模型的部落格文章,敬請期待!與此同時,你可以嘗試對預訓練模型進行推論,或嘗試使用訓練文件進行訓練實驗:
Hugging Face Hub
本文中提到的模型 10
本文中提到的集合 1
更多來自我們部落格的文章
![]()
Falcon 2:一個擁有 11B 參數的預訓練語言模型和 VLM,在超過 5000B 個 token 和 11 種語言上進行了訓練
![]()
Sentence Transformers 加入 Hugging Face!
社群
· 註冊或登入以發表評論