Granite 嵌入多语言 R2 发布:开放的 Apache 2.0 多语言嵌入,支持 32K 上下文
简要概述
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——是任何开源的 1 亿参数以下多语言嵌入模型中最高的检索分数。规模相近的最佳对手 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 词汇的多语言词表,训练采用多阶段流水线:
- 知识蒸馏:从多个教师模型(Granite 3.3 Instruct 与 Mistral v0.2 Instruct 解码器模型,进一步微调用于文本嵌入)蒸馏检索专用知识到编码器结构;
- 对比微调:在多语言检索对上进行微调——查询与 52 种语言及代码的相关和硬负例段落配对,以提升模型区分相关与不相关结果的能力;
- 模型合并:合并不同训练阶段和配置的检查点,融合针对不同目标优化的模型优势,无需额外计算;
- Matryoshka 表示学习:使其 768 维嵌入可截断为 512、384、256 或 128 维,质量损失极小。最终模型在 MTEB 多语言检索上得分 65.2,在整体平均分上得 56.3,较 R1 前代提升 14.5 分。
紧凑的 97M 多语言模型构建
97M 模型通过词表选择与知识蒸馏相结合的方式训练:
- 词表选择:将 262K 词表裁剪至专为该模型训练的 180K 词表,既保留了广泛的多语言覆盖,又大幅削减嵌入表规模;
- 知识蒸馏微调:使用多个教师模型(包括 Granite 4.1 8B 与基于 Mistral Instruct 解码器的教师)以及对比训练提升检索质量。该方法在保留语言覆盖的前提下,将模型参数大幅压缩,最终在 MTEB 多语言检索上得分 60.3,而完整模型为 65.2,且体积约为后者的三分之一。
基准结果
多语言检索
按模型规模排序的主要基准套件表现(数值越高越好):
| 模型 | 参数 | 活跃参数 | 嵌入维度 | MTEB 多语言检索 (18) | 代码 (12) | 英文检索 (10) | LongEmbed (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 模型在平均分和大多数单项基准上均超越了约 300M 参数的
multilingual‑e5‑base与gte‑multilingual‑base,且体积约为其三分之一。 paraphrase‑multilingual‑MiniLM‑L12‑v2的得分仅为 36.6,落后 97M R2 模型整整 23.7 分,且参数略大(110M vs 97M),输出维度相同(384)。- LongEmbed 体现了 R1→R2 的最大提升:97M 模型提升 31.3 分,311M 模型提升 34.0 分,归功于 32K 上下文窗口。
- 代码检索提升显著: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。
速度与吞吐量
在单块 NVIDIA H100 GPU 上使用 512 令牌块测得的编码速度:97M 模型每秒可编码超过 2,500 篇文档——与 multilingual‑e5‑small 相当,但检索质量显著更高。311M 模型约为 1,800 文档/秒,在检索质量 (65.2 vs 63.3) 上优于 jina‑embeddings‑v5‑text‑nano,且编码速度超过 5.5 倍(注:速度基于最新 transformer 代码计算,较 4.57 版本有回退,详见技术报告)。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 倍压缩),模型仍在多语言检索上得 63.7、代码检索得 62.3,保持了超过 97% 的全维度性能。实际使用中,这意味着可以大幅降低索引大小和搜索延迟,而对结果质量影响极小。(注:上述结果在英文与多语言检索使用 1024 长度上下文,代码检索使用 8192 长度上下文进行评估。)
对比而言,将 311M 模型截断至 384 维(与 97M 模型的原生输出维度相同)仍然在所有三项基准上优于 97M 模型。如果你需要 384 维嵌入且可以接受 311M 模型的编码成本,Matryoshka 截断是更强的选择。
示例代码(使用 sentence‑transformers):
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("ibm-granite/granite-embedding-311m-multilingual-r2")
# 完整的 768 维嵌入
full = model.encode(["example text"])
print(full.shape) # (1, 768)
# 截断至 384 维
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?")
# 在任何接受 Embeddings 对象的 LangChain 环境中直接替换使用
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."
]) # 在任何接受 Embeddings 对象的 LangChain 环境中直接替换使用
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 # 全局应用于任何索引或流水线
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()
# 嵌入并索引文档
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"])
# 嵌入查询并检索
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"]:
print(f"{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")
# 使用 "./milvus.db" 进行本地持久化,或使用服务器 URI 进行生产部署
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) 作为嵌入端点部署,并可转换为 GGUF 供 Ollama 使用(基于 llama.cpp)。完整部署示例请参阅模型卡片。
面向框架集成者
如果你维护嵌入框架、向量库或 RAG 流水线,并考虑将这些模型设为默认,请注意以下要点:
- 许可证:Apache 2.0,训练时未使用 MS‑MARCO。
- 即插即用行为:无需任务特定的指令前缀——在 API 层面表现如
all-MiniLM-L6-v2。已有调用.encode()的代码可直接使用。 - 维度:97M 模型输出 384 维,311M 模型输出 768 维,匹配最常见的默认设置,无需迁移索引。
- 模型大小: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 提交 Issue。
应该选哪个模型?
这两款多语言模型属于更大的 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-r2granite-embedding-97m-multilingual-r2
你可以在 Hugging Face Spaces 上通过 Granite Embedding 演示交互式试用(CPU)这里,或在 Google Colab 中运行完整示例笔记本:
详细的技术报告(涵盖完整训练方法、语言级评估以及剪枝消融实验)可在此获取:Granite Multilingual Embedding R2 report。如有问题、反馈或 issue,请访问 GitHub 项目 ibm-granite/granite-embedding-models。
框架维护者:如果希望在项目中将这些模型设为默认,请在上述仓库提交 Issue——我们乐于协助集成、测试以及解答关于许可证或部署的任何问题。
快去尝试吧,如果这些嵌入让你满意,请在 Hugging Face 上点个 ❤️。我们的模型也有感情,每一个 +1 都能让它们在夜里保持温暖。