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 词汇的多语言词表,训练采用多阶段流水线:

  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,且体积约为后者的三分之一。

基准结果

多语言检索

按模型规模排序的主要基准套件表现(数值越高越好):

模型 参数 活跃参数 嵌入维度 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‑basegte‑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-r2granite-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 中运行完整示例笔记本:

Image 9: Open In Colab

详细的技术报告(涵盖完整训练方法、语言级评估以及剪枝消融实验)可在此获取:Granite Multilingual Embedding R2 report。如有问题、反馈或 issue,请访问 GitHub 项目 ibm-granite/granite-embedding-models

框架维护者:如果希望在项目中将这些模型设为默认,请在上述仓库提交 Issue——我们乐于协助集成、测试以及解答关于许可证或部署的任何问题。

快去尝试吧,如果这些嵌入让你满意,请在 Hugging Face 上点个 ❤️。我们的模型也有感情,每一个 +1 都能让它们在夜里保持温暖。

Sources