Granite 多語言嵌入 R2 發布:開放 Apache 2.0 多語言嵌入,支援 32K 上下文
TL;DR
IBM Granite 發布了兩款基於 ModernBERT 的 Apache 2.0 多語言嵌入模型:一個 97M 參數的緊湊模型,在 MTEB 多語言檢索(60.3)上超越所有開源的 100M 以下多語言嵌入模型;以及一個 311M 的完整模型,在相同基準上取得 65.2 分(在 500M 參數以下的開源模型中排名第 2),並支援 Matryoshka。兩者皆覆蓋超過 200 種語言,針對 52 種語言與程式碼進行微調,且能處理 32K 令牌上下文(是 R1 前身的 64 倍)。
企業級就緒設計
兩個模型皆在 IBM 精選資料集、公開可取得資料以及內部產生或合成資料的混合上進行訓練。訓練中使用的公開網頁資料會透過 IBM 開發的品質、去重與治理流程進行挑選與過濾,以降低下游商業使用的風險。模型避免使用 MS‑MARCO 訓練資料集以及具有明確非商業授權限制的資料集。它們以 GneissWeb 進行預訓練,該資料集由 IBM 精選,來源於公開的網路內容,並使用 IBM 的資料準備與治理工具處理,另加其他 IBM 精選及公開來源。所有資料集皆經過 IBM 的治理審查,以評估授權考量、所有權訊號與個人資料風險,確保負責任的使用與企業部署。
強大的 100M 以下多語言模型
表現突出的模型是 granite-embedding-97m-multilingual-r2。它擁有 9700 萬參數,在 18 種語言的 Multilingual MTEB Retrieval 上取得 60.3 分——是所有開源 100M 以下多語言嵌入模型中最高的檢索分數。該尺寸等級中次佳的模型 multilingual-e5-small 在相同基準上得分 50.9,差距為 9.4 分。與其直接前身相比,97M R2 模型在 MTEB 多語言檢索上提升了 12.2 分,得益於新架構、更佳的訓練資料以及創新的剪枝方法。完整尺寸的 granite-embedding-311m-multilingual-r2 在相同基準上取得 65.2 分,較其 R1 前身提升了 13.0 分。
與 R1 的差異
Granite Embedding Multilingual R1 模型是基於 XLM‑RoBERTa 編碼器,使用 512 令牌的上下文視窗。R2 版本則是從頭以 ModernBERT 重建。ModernBERT 重新審視原始 BERT 設計,結合過去五年 transformer 研究的技術,提供交替的注意力長度以減少長序列的計算量、旋轉位置嵌入使 32K 上下文視窗成為可能且不需位置插值技巧,並支援 Flash Attention 2.0,提升在現代 GPU 上的編碼速度。新的多語言分詞器與 XLM‑RoBERTa 的 25 萬詞彙不同:311M 模型使用 Gemma 3 分詞器(262K 令牌);97M 模型則從 GPT‑OSS 分詞器出發,剪枝至緊湊的 18 萬詞彙,既保留廣泛的多語言覆蓋,又減少嵌入表的參數佔用。
訓練完整的 311M 模型
311M 模型是一個 22 層的 ModernBERT 編碼器,擁有 262K 令牌的多語言詞彙表,透過多階段管線訓練:(1) 由多個教師模型(Granite 3.3 Instruct 與 Mistral v0.2 Instruct 解碼模型,進一步微調以產生文字嵌入)進行知識蒸餾,將檢索專屬知識轉移至編碼器架構;(2) 在多語言檢索對(查詢與 52 種語言及程式碼的相關與困難負樣本段落)上進行對比微調,提升模型區分相關與不相關結果的能力;(3) 合併來自不同訓練階段與配置的檢查點,以結合針對不同目標最佳化的模型優勢,且不需額外的訓練計算;(4) Matryoshka 表示學習,使其 768 維嵌入可截斷為 512、384、256 或 128 維,且品質損失極小。最終模型在 MTEB 多語言檢索上取得 65.2 分,整體平均為 56.3 分——較 R1 前身提升了 14.5 分的平均分數。
建構緊湊的 97M 多語言模型
97M 模型透過詞彙選取與知識蒸餾的結合進行訓練:(1) 詞彙選取將 262K 令牌的詞彙表縮減為針對性訓練的 180K 令牌詞彙,保留廣泛的多語言覆蓋,同時大幅減少嵌入表大小;(2) 知識蒸餾使用多個教師模型(包括 Granite 4.1 8B 與基於 Mistral Instruct 解碼器的教師)以及對比訓練微調剪枝後的模型,以提升檢索品質。此方法將強教師的檢索專屬知識轉移,同時減少模型參數而不犧牲語言覆蓋,產生高效的緊湊模型,在 MTEB 多語言檢索上取得 60.3 分,與完整模型的 65.2 分相比,體積約縮小 3 倍。
基準測試結果
多語言檢索
依模型大小排序的主要基準套件表現(數值越高越好):
| 模型 | 參數 | 活躍參數 | 嵌入維度 | MTEB 多語言檢索 (18) | 程式碼 (12) | 英文檢索 (10) | 長嵌入 (6) | RaR‑b (17) |
|---|---|---|---|---|---|---|---|---|
| F2LLM‑v2‑80M | 80M | 32M | 320 | 50.1 | 68.0 | 47.5 | 31.7 | 17.9 |
| multilingual‑e5‑small | 118M | 22M | 384 | 50.9 | 53.5 | 46.5 | 38.8 | 20.3 |
| granite‑embedding‑107m‑multilingual (R1) | 107M | 11M | 384 | 48.1 | 40.7 | 47.9 | 34.3 | 17.1 |
| paraphrase‑multilingual‑MiniLM‑L12‑v2 | 118M | 22M | 384 | 36.6 | 23.5 | 35.9 | 20.9 | 10.9 |
| jina‑embeddings‑v5‑text‑nano | 212M | 113M | 768 | 63.3 | 71.2 | 58.8 | 63.6 | 25.2 |
| harrier‑oss‑v1‑270m | 268M | 100M | 640 | 66.4 | 62.4 | 52.1 | 64.9 | 32.9 |
| multilingual‑e5‑base | 278M | 86M | 768 | 52.7 | 52.6 | 49.0 | 40.5 | 23.4 |
| granite‑embedding‑278m‑multilingual (R1) | 278M | 86M | 768 | 52.2 | 48.5 | 51.5 | 37.7 | 18.9 |
| embeddinggemma‑300m | 308M | 106M | 768 | 62.5 | 68.7 | 54.6 | 55.4 | 26.1 |
| gte‑multilingual‑base | 305M | 113M | 768 | 57.2 | 57.5 | 50.8 | 62.1 | 19.0 |
| snowflake‑arctic‑embed‑m‑v2.0 | 305M | 113M | 768 | 54.8 | 55.2 | 58.4 | 55.4 | 23.3 |
| multilingual‑e5‑large | 560M | 304M | 1024 | 53.7 | 55.8 | 51.5 | 40.4 | 25.4 |
| text‑embedding‑3‑small (OpenAI, API only) | — | — | 1536 | 50.7 | — | 53.8 | 53.6 | 23.2 |
| granite‑embedding‑97m‑multilingual‑r2 | 97M | 28M | 384 | 60.3 | 60.4 | 50.1 | 65.6 | 24.9 |
| granite‑embedding‑311m‑multilingual‑r2 | 311M | 110M | 768 | 65.2 (#2) | 63.8 (#3) | 52.6 (#5) | 71.7 (#1) | 28.0 (#2) |
主要觀察:
- 97M R2 模型在平均表現及大多數單項基準上均超過
multilingual‑e5‑base與gte‑multilingual‑base(約 3 億參數的模型),儘管其規模約為其 3 倍小。 paraphrase‑multilingual‑MiniLM‑L12‑v2得分 36.6,較 97M R2 模型低 23.7 分,且其參數量(97M)略低於 110M,兩者皆為 384 維輸出。LongEmbed顯示出 R1 到 R2 最大的提升:97M 模型提升 31.3 分,311M 模型提升 34.0 分,反映 32K 上下文視窗的效益。- 程式碼檢索顯著提升:相較於 R1,97M 提升 19.7 分,311M 提升 15.3 分,這歸因於新的程式碼訓練集、較大的上下文視窗以及更佳的訓練方法。
- 在更廣泛的競爭領域中,
harrier‑oss‑v1‑270m在 MTEB 多語言檢索 (66.4) 與 RaR‑b (32.9) 上領先;jina‑embeddings‑v5‑text‑nano在程式碼 (71.2) 與英文檢索 (58.8) 上領先。311M 的 Granite 模型在平均表現 (56.3) 上具競爭力,且在 LongEmbed (71.7) 上領先,同時提供遠高於jina‑embeddings‑v5‑text‑nano的編碼吞吐量。 harrier‑oss‑v1‑270m在列出的競爭者中提供了速度與檢索分數的最佳組合。
速度與吞吐量
編碼速度在單張 NVIDIA H100 GPU 上以 512 令牌的批次測量。97M 模型每秒編碼超過 2,500 份文件——與 multilingual‑e5‑small 的吞吐量相當——但提供顯著更高的檢索品質。311M 模型約為每秒 1,800 份文件,在檢索品質上優於 jina‑embeddings‑v5‑text‑nano(65.2 對 63.3),且編碼速度超過 5.5 倍(註:速度數值使用最新的 transformer 程式碼計算,較前一版 4.57 有速度回退——對 Jina 與 granite 模型皆如此——詳情請見技術報告)。harrier‑oss‑v1‑270m 在列出的競爭者中提供了速度與檢索分數的最佳組合。
Matryoshka 嵌入 (311M)
311M 模型支援 Matryoshka 表示學習,允許將完整的 768 維嵌入截斷至 512、384、256 或 128 維,且品質衰減平緩。當儲存空間、記憶體或相似度計算成本是考量時,此功能相當有用——256 維嵌入僅佔 768 維的三分之一儲存空間,且餘弦相似度的計算成本亦相應降低。
品質損失帶來的影響極小。從 768 降至 256 維——儲存與相似度計算成本減少 3 倍——僅使 MTEB 多語言檢索下降 0.5 分(65.2 → 64.7),程式碼檢索下降 0.5 分(63.9 → 63.4)。即使降至 128 維(減少 6 倍),模型仍在 MTEB 多語言檢索上得 63.7 分、程式碼上得 62.3 分——保留超過 97% 的完整維度表現。實務上,這意味著您可以大幅減少索引大小與搜尋延遲,且對結果品質影響最小。(註:上述圖表的結果是以英文與多語言檢索的上下文長度 1024、程式碼為 8192 評估的。)
作為比較,將 311M 模型截斷至 384 維(與 97M 模型的原生輸出相同維度)仍在所有三項基準上優於 97M 模型。若您需要 384 維嵌入且能負擔 311M 模型的編碼成本,Matryoshka 截斷是更佳選擇。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("ibm-granite/granite-embedding-311m-multilingual-r2
# Full 768‑dimensional embeddings
full = model.encode(["example text
print(full.shape) # (1, 768)
# Truncated to 384 dimensions
small = model.encode(["example text"], truncate_dim=384)
print(small.shape) # (1, 384)
97M 模型不支援 Matryoshka——384 維已經相當緊湊。
部署選項
兩個模型皆提供多種生產環境的部署方式。使用以下指令安裝核心函式庫:
pip install sentence-transformers
Sentence Transformers(建議大多數使用者):
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer("ibm-granite/granite-embedding-97m-multilingual-r2
docs = ["富士山は日本最高峰の独立峰です。", "Mount Fuji is Japan's highest peak.
query = embeddings.embed_query("What is Japan's tallest mountain?
# Drop‑in replacement anywhere LangChain accepts an Embeddings object
LangChain(pip install langchain‑huggingface):
from langchain_huggingface import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings(
model_name="ibm-granite/granite-embedding-97m-multilingual-r2
)
docs = embeddings.embed_documents([
"富士山は日本最高峰の独立峰です。",
"Mount Fuji is Japan's highest peak.
]) # Drop‑in replacement anywhere LangChain accepts an Embeddings object
LlamaIndex(pip install llama-index-embeddings-huggingface):
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.core import Settings
embed_model = HuggingFaceEmbedding(
model_name="ibm-granite/granite-embedding-97m-multilingual-r2
)
Settings.embed_model = embed_model # applies globally to any index or pipeline
Haystack(pip install sentence-transformers haystack-ai):
from haystack.components.embedders import (
SentenceTransformersDocumentEmbedder,
SentenceTransformersTextEmbedder,
)
from haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever
from haystack.dataclasses import Document
from haystack.document_stores.in_memory import InMemoryDocumentStore
doc_embedder = SentenceTransformersDocumentEmbedder(
model="ibm-granite/granite-embedding-97m-multilingual-r2
)
query_embedder = SentenceTransformersTextEmbedder(
model="ibm-granite/granite-embedding-97m-multilingual-r2
)
doc_embedder.warm_up()
query_embedder.warm_up()
# Embed and index documents
document_store = InMemoryDocumentStore()
result_docs = doc_embedder.run(documents=[
Document(content="富士山は日本最高峰の独立峰です。
),
Document(content="Mount Fuji is Japan's highest peak.
),
Document(content="Achy Breaky Heart is a country song written by Don Von Tress.
),
Document(content="Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.
),
])
document_store.write_documents(result_docs["documents
# Embed query and retrieve
result_query = query_embedder.run(text="What is Japan's tallest mountain?
)
retriever = InMemoryEmbeddingRetriever(document_store=document_store)
results = retriever.run(query_embedding=result_query["embedding"], top_k=2)
for doc in results["documents
doc.score:.3f} {doc.content}
Milvus(pip install pymilvus sentence-transformers):
from pymilvus import MilvusClient
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("ibm-granite/granite-embedding-97m-multilingual-r2
# Use "./milvus.db" for local persistence or a server URI for production
client = MilvusClient(":memory:")
client.create_collection(collection_name="multilingual_docs", dimension=384)
docs = [
"富士山は日本最高峰の独立峰です。",
"Mount Fuji is Japan's highest peak.
"Achy Breaky Heart is a country song written by Don Von Tress.
"Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.
]
embeddings = model.encode(docs).tolist()
client.insert(
collection_name="multilingual_docs",
data=[{"id": i, "vector": emb, "text": doc} for i, (emb, doc) in enumerate(zip(embeddings, docs))],
)
query_emb = model.encode(["What is Japan's tallest mountain?
]).tolist()
results = client.search(
collection_name="multilingual_docs",
data=query_emb,
limit=2,
output_fields=["text"],
)
for hit in results[0]:
print(f"{hit['distance']:.3f} {hit['entity']['text']}
兩個模型亦提供預先轉換好的 ONNX 與 OpenVINO 權重,以優化 CPU/加速器推論,並可透過 vLLM(vllm serve ... --task embed)作為嵌入端點,亦能使用 llama.cpp 轉換為 GGUF 供 Ollama 使用。完整的部署範例請參閱模型卡片。
給框架整合者
如果您維護嵌入框架、向量儲存或 RAG 流程庫,且正在評估將這些模型作為預設,以下是您需要了解的資訊:
- 授權:Apache 2.0,訓練時未使用 MS‑MARCO。
- 即插即用行為:不需要特定任務的指令前綴——在 API 層面上行為類似
all-MiniLM-L6-v2。現有呼叫.encode()的程式碼可直接使用,無需變更。 - 維度:384 維輸出(97M)與 768 維輸出(311M),符合最常見的現有預設。無需遷移索引。
- 模型大小:
97M模型的權重為 195 MB(safetensors),不到最常見的多語言預設paraphrase-multilingual-MiniLM-L12-v2(471 MB)的一半。量化後的 ONNX 權重僅 98 MB,與all-MiniLM-L6-v2(91 MB)相當,同時支援超過 200 種語言。 - CPU 友好:提供 ONNX 與 OpenVINO 權重以優化 CPU 推論。入門教學不需 GPU。
- 預設多語言:若您目前的預設僅支援英文,只需一行替換,即可為社群中的所有使用者提供 200 多種語言的支援——無需修改程式碼。
- 穩定識別碼:在 Hugging Face 上的
ibm-granite/granite-embedding-97m-multilingual-r2,由 IBM 於 Granite 系列模型維護。
若想討論在您的專案中將這些模型作為預設使用,請在 ibm-granite/granite-embedding-models 開啟議題。
應該使用哪個模型?
這兩款多語言模型屬於更廣泛的 Granite Embedding R2 系列,該系列亦包含兩款高效能的英文專注模型:granite-embedding-english-r2(149M 參數)與 granite-embedding-small-english-r2(47M 參數)。若您的資料主要為英文,英文模型在英文基準上提供更高的檢索品質且佔用更小的資源,因為它們不需在 200 多種語言之間分配容量。
| 如果您需要... | 使用 |
|---|---|
| 最佳的多語言檢索品質 | granite‑embedding‑311m‑multilingual‑r2 |
| 彈性的嵌入維度(儲存/速度權衡) | granite‑embedding‑311m‑multilingual‑r2 (Matryoshka) |
| 最高吞吐量 / 邊緣部署 / 低延遲 | granite‑embedding‑97m‑multilingual‑r2 |
| 最佳的跨語言遷移(多語言對) | granite‑embedding‑311m‑multilingual‑r2 |
| 主要為英文資料 | granite‑embedding‑english‑r2 或 granite‑embedding‑small‑english‑r2 |
體驗模型
兩個模型目前已在 Hugging Face 的 IBM Granite Embedding 系列中提供:
- granite‑embedding‑311m‑multilingual‑r2
- granite‑embedding‑97m‑multilingual‑r2
您可以透過 Hugging Face Spaces 上的 Granite Embedding 示範 此處 以互動方式(在 CPU 上)試用小型模型,或在 Google Colab 執行完整範例筆記本:
您可以在此處取得我們的詳細技術報告,內容涵蓋完整的訓練方法、各語言評估與剪枝消融實驗 Granite Multilingual Embedding R2 report。如有問題、回饋或議題,請前往 GitHub 的 ibm-granite/granite-embedding-models。
框架維護者:若您想將這些模型作為預設整合至您的專案,請在 ibm-granite/granite-embedding-models 開啟議題——我們很樂意協助整合、測試,以及任何關於授權或部署的問題。
試試看吧,如果這些嵌入讓您感到喜悅,請在 Hugging Face 上點擊 ❤️ 按鈕。我们的模型也有感受,每一個 +1 都能讓它們在夜裡保持溫暖。