Granite Embedding Multilingual R2:Apache 2.0 ライセンスの多言語埋め込みモデルが 32K コンテキストに対応し、1 億パラメータ未満で最高クラスの検索品質を実現
IBM は Hugging Face 上で、Apache 2.0 ライセンスの「Granite Embedding Multilingual R2」を公開し、1 億パラメータ未満の軽量モデルでありながら 32K コンテキストと高品質な多言語検索を実現した。
キーポイント
高性能かつ軽量なアーキテクチャ
1 億パラメータ未満(Sub-100M)のコンパクトなモデルでありながら、大規模な埋め込みモデルに匹敵する検索品質を達成している。
32K の超長文コンテキスト対応
従来の多くの埋め込みモデルが制限していた入力長を超え、32,000 トークンのコンテキストウィンドウをサポートし、長文ドキュメントの処理に適している。
多言語サポートとオープンライセンス
英語だけでなく多言語に対応しており、Apache 2.0 ライセンス下で商用利用も可能な完全なオープンソースモデルとして提供される。
多言語サポートと最適化対象言語
200 以上の言語で事前学習された汎用エンコーダーですが、特に 52 の主要言語に対して検索ペアおよび異言語トレーニングを施し、高品質な検索性能を実現しています。
プログラミングコードの対応
Python や Java など主要なプログラミング言語で訓練されており、異なる言語間でのコード検索(cross-lingual code retrieval)もサポートしています。
サブ1億パラメータモデルの性能突破
97M パラメータの「granite-embedding-97m-multilingual-r2」は、MTEB Multilingual Retrieval ベンチマークで 60.3 を記録し、同サイズクラスの既存オープンモデルを約 9.4 ポイント上回る最高性能を達成しました。
ModernBERT アーキテクチャと 32K コンテキスト
R1 から完全再構築され、ModernBERT アーキテクチャの採用により Flash Attention 2.0 のサポートや回転位置埋め込みが可能となり、512 トークンから 32K トークンのコンテキストウィンドウへの拡張を実現しました。
影響分析・編集コメントを表示
影響分析
本リリースは、リソース効率性と検索精度の両立を求められている RAG システムの開発者にとって大きな転換点となります。特に、大規模モデルへの依存を減らしつつ長文処理能力を維持できるため、コスト削減とパフォーマンス向上を同時に実現する新たな標準として業界に浸透する可能性があります。
編集コメント
軽量モデルでありながら長文処理能力を維持した点は、実運用におけるコスト対効果を劇的に改善する可能性があり、RAG システムのアーキテクチャ再検討のきっかけとなるニュースです。
**
TL;DR:** ModernBERT を基盤とした 2 つの新しい Apache 2.0 マルチリンガル埋め込みモデルが登場しました。1 つは 97M パラメータのコンパクトなモデルで、MTEB マルチリンガル検索(60.3)において、すべてのオープンソースのサブ 100M マルチリンガル埋め込みモデルを上回る性能を記録しています。もう 1 つは 311M のフルサイズモデルで、Matryoshka サポートに対応し、MTEB マルチリンガル検索で 65.2 のスコアを獲得(500M パラメータ未満のオープンモデルの中で 2 位)しています。両モデルとも 200 以上の言語をカバーし、52 の言語でチューニングが施されており、32K トークンのコンテキスト(R1 の 64 倍)を処理可能です。さらに、9 つのプログラミング言語にわたるコード検索機能も追加されています。
この記事の内容: 設計思想: エンタープライズ対応 · 強力なサブ 100M マルチリンガルモデル · R1 からの変更点 · フルサイズ 311M モデルのトレーニング · コンパクトな 97M マルチリンガルモデルの構築 · ベンチマーク結果 · Matryoshka 埋め込み (311M) · デプロイオプション · フレームワーク統合者向け · どのモデルを使うべきか · モデルを試す
多言語埋め込みモデルは、広範な言語カバレッジを確保すると通常モデルサイズが大きくなり、小規模モデルでは言語数が犠牲になるという持続的な緊張関係に直面しています。複数の言語にまたがる作業(多言語コーパスに対する検索拡張生成、異言語検索、国際チームにおけるコード検索など)に従事している場合、処理速度が十分であることと精度が十分であることのどちらか一方を選ばざるを得ない状況に陥ったことがあるでしょう。
Granite Embedding Multilingual R2 のリリースはこのギャップを大幅に縮小します。私たちは新しい多言語埋め込みモデル 2 つを公開します:
- granite-embedding-311m-multilingual-r2 — 768 次元の埋め込みベクトル、Matryoshka(マトリョーシカ)次元サポート機能を備え、トップクラスの多言語検索品質を実現する 3.11 億パラメータのフルサイズモデル。
- granite-embedding-97m-multilingual-r2 — 384 次元の埋め込みベクトルを有し、そのサイズに対して強力な検索品質を提供する 9,700 万パラメータのコンパクトモデル。
両モデルは200 以上の言語をサポートし、52 の言語とプログラミングコードにおいて検索品質を強化しており、最大32,768 トークンのコンテキスト長を処理できます(先行する R1 モデルと比較して 64 倍の増加)。また、Apache 2.0ライセンスの下で公開されています。sentence-transformers や transformers とともにすぐに使用可能であり、タスク固有の指示は不要です。LangChain、LlamaIndex、Haystack、Milvusにおいて、モデル名の 1 行の変更だけでドロップイン代替品として互換性があります。現在英語のみをデフォルトとするフレームワークを使用している場合、その 1 行の変更により、コミュニティ内のすべてのユーザーが 200 以上の言語をサポートするようになります。API の変更も、新しい依存関係の追加も、ユーザー側でのコード変更も必要ありません。両モデルには CPU 最適化推論用の ONNX および OpenVINO 重み(weights)が付属しています。
52 の強化サポート対象言語(クリックして展開)
基盤となるエンコーダーは 200 以上の言語のテキストで事前学習されており、いずれの言語にも対応する汎用埋め込みベクトルを生成します。以下の 52 の言語については、より高品質な検索を実現するために、明示的な検索ペアおよび異言語間のトレーニングが施されています:
アルバニア語 (sq)、アラビア語 (ar)、アゼルバイジャン語 (az)、ベンガル語 (bn)、ブルガリア語 (bg)、カタルーニャ語 (ca)、中国語 (zh)、クロアチア語 (hr)、チェコ語 (cs)、デンマーク語 (da)、オランダ語 (nl)、英語 (en)、エストニア語 (et)、フィンランド語 (fi)、フランス語 (fr)、グルジア語 (ka)、ドイツ語 (de)、ギリシャ語 (el)、ヘブライ語 (he)、ヒンディー語 (hi)、ハンガリー語 (hu)、アイスランド語 (is)、インドネシア語 (id)、イタリア語 (it)、日本語 (ja)、カザフ語 (kk)、クメール語 (km)、韓国語 (ko)、ラトビア語 (lv)、リトアニア語 (lt)、マレー語 (ms)、マラーティー語 (mr)、ノルウェー語 (no)、ペルシャ語 (fa)、ポーランド語 (pl)、ポルトガル語 (pt)、ルーマニア語 (ro)、ロシア語 (ru)、セルビア語 (sr)、スロバキア語 (sk)、スロベニア語 (sl)、スペイン語 (es)、スワヒリ語 (sw)、スウェーデン語 (sv)、タガログ語 (tl)、テルグ語 (te)、タイ語 (th)、トルコ語 (tr)、ウクライナ語 (uk)、ウルドゥー語 (ur)、ウズベク語 (uz)、ベトナム語 (vi)。
さらに、モデルはプログラミングコード(Python, Go, Java, JavaScript, PHP, Ruby, SQL, C, C++)を用いてトレーニングされており、異言語間でのコード検索もサポートしています。
デザイン段階からエンタープライズ対応
必ず JSON 形式で返してください。translation フィールドのみ。他のフィールド (technical_terms 等) は一切追加しないこと — 余計なフィールドを書こうとして本文翻訳がトークン上限で打ち切られる事故を防ぐため:
{"translation": "翻訳全文"}
両方の埋め込みモデルは、IBM がキュレーションしたデータセット、公開されているデータ、および内部生成または合成データの混合体を用いてトレーニングされています。トレーニングに使用される公開ウェブ由来のデータは、下流の商用利用におけるリスクを低減することを意図した、IBM が開発した品質、重複排除、ガバナンスプロセスを用いて選択・フィルタリングされています。私たちは明示的な非商用ライセンス制限を持つ MS-MARCO トレーニングデータセットや他のデータセットの使用を意図的に避けています。これらのモデルは、GneissWeb を用いて事前トレーニングされており、これは IBM がキュレーションした公開ウェブコンテンツ由来のデータセットで、IBM のデータ準備およびガバナンスツールを用いて処理されたものです。これには追加の IBM によるキュレーションや他の公開ソースも含まれています。データセットは、ライセンスの考慮事項、所有権のシグナル、個人データのリスクを評価するために IBM のガバナンスレビューの対象となります。これらのプロセスは、責任ある利用とエンタープライズ展開に貢献するように設計されています。
強力なサブ 100M マルチリンガルモデル
今回のリリースで際立っているのは granite-embedding-97m-multilingual-r2 です。パラメータ数は 9,700 万ですが、18 か国語にわたる Multilingual MTEB Retrieval(多言語 MTEB 検索)で 60.3 のスコアを記録しています。これは、1 億未満のパラメータを持つオープンソースのマルチリンガル埋め込みモデルの中で見出した中で最高位の検索スコアです。同サイズのクラスにおける次点のモデルである multilingual-e5-small は、同じベンチマークで 50.9 のスコアであり、成熟したベンチマークにおいて +9.4 ポイント の差がついています。
311M のフルサイズモデルの約 3 分の 1 のサイズでありながら、多言語・コード・長文ドキュメントのベンチマークにおいて検索品質の大部分を維持しています。これは、新しいアーキテクチャ、より優れたトレーニングデータ、そして新規のプルーニング手法(後述)に支えられたものであり、直接の先行モデルと比較して MTEB Multilingual Retrieval で +12.2 ポイント の向上を実現しました。フルサイズの granite-embedding-311m-multilingual-r2 は、同じベンチマークで 65.2 を記録し、R1 版の先行モデルに対して +13.0 ポイント の改善を示しています。
R1 からの変更点
Granite Embedding Multilingual R1 モデルは、512 トークンのコンテキストウィンドウを持つ XLM-RoBERTa エンコーダーを基盤として構築されていました。一方、R2 世代はゼロからの再構築です。
ModernBERT は、直近のエンコーダーアーキテクチャであり、過去 5 年間のトランスフォーマー研究の技術を取り入れつつ、オリジナルの BERT デザインを見直すものです。この移行により、いくつかの実用的な利点がもたらされました。交互のアテンション長(attention lengths)は長系列における計算量を削減し(長系列でのスループットを大幅に向上させます)、回転位置埋め込み(rotary position embeddings)は、古くからのアーキテクチャで問題となっていた位置補間のハックなしで 32K のコンテキストウィンドウを実現可能にし、Flash Attention 2.0 サポートにより、最新の GPU 上でのエンコーディング速度が向上します。
新しい多言語トークナイザーは強調する価値があります。XLM-RoBERTa の 250K トークンの語彙を再利用するのではなく、強力な多言語およびコードカバレッジを持つ既存のトークナイザーを採用しました。311M モデルでは Gemma 3 トークナイザー(262K トークン)を使用し、97M モデルでは GPT-OSS トークナイザーを出発点として、広範な多言語カバレッジを維持しつつ埋め込みテーブルのパラメータ負荷を削減するコンパクトな 180K トークンの語彙に剪定しました。トークナイザーの効率性は、人々が認識している以上に重要です — 32K トークンのウィンドウは印象的に聞こえますが、タイ語の単一の段落をエンコードする際にその半分を消費してしまえば、その価値は失われます。
完全サイズ 311M モデルのトレーニング
311M モデルは、262K トークンの多言語語彙を持つ 22 レイヤーの ModernBERT エンコーダーであり、マルチステージ・パイプラインを通じてトレーニングされます:
- 知識蒸留(Knowledge distillation): モデルは複数の教師モデルから同時に学習します。教師モデルには Granite 3.3 Instruct および Mistral v0.2 Instruct デコーダーモデルが用いられ、これらはテキスト埋め込み用にさらにファインチューニングされており、検索に特化した知識を 311M エンコーダーアーキテクチャへ転移します。
- 対照的ファインチューニング(Contrastive fine-tuning): 52 の言語とコードにわたる多言語検索ペアに対する標準的な対照的トレーニング — 関連する文脈およびハードネガティブな文脈とマッチングされたクエリ — が、モデルが関連結果を無関係な結果から区別する能力を鋭敏化します。
- モデルの統合:トレーニング完了後、異なるトレーニング段階および設定からのチェックポイントを統合します。これにより、多言語の広範なカバレッジと英語の深さなど、異なる目的に最適化されたモデルの強みを、追加の計算リソースを要することなく単一の重みセットとして組み合わせることができます。
- マトリョーシカ表現学習:本モデルはマトリオシカ(ロシア人形)型の目標でトレーニングされており、768 次元の埋め込みベクトルを、品質の低下を最小限に抑えつつ 512、384、256、または 128 次元に切り詰めることが可能です(詳細は「マトリオシカ埋め込み」を参照)。
その結果、MTEB 多言語検索で 65.2、全体平均で 56.3 のスコアを獲得し、先行する R1 モデルと比較して平均で +14.5 ポイントの向上を実現しました。
コンパクトな 97M 規模の多言語モデルの構築
この 97M モデルは、語彙選択と知識蒸留を組み合わせてトレーニングされています:
- 語彙選択:262K トークンの語彙を、広範な多言語カバレッジを維持しつつ埋め込みテーブルのサイズを大幅に削減する、目的別に訓練された 180K トークンの語彙へと縮小します。
- 知識蒸留:剪定後のモデルは、Granite 4.1 8B や Mistral Instruct デコーダーベースの教師など複数の教師モデルからの知識蒸留と対照学習を用いてファインチューニングされ、検索品質を向上させます。
このアプローチは、複数の強力な教師モデルから検索に特化した知識を転移しつつ、言語カバレッジを犠牲にすることなくモデルパラメータを削減するものです。その結果、フルサイズのモデルが 65.2 のスコアを得る中、MTEB Multilingual Retrieval で 60.3 を記録し、かつサイズは約 3 分の 1 という極めて効率的なコンパクトモデルが実現されました。
ベンチマーク結果
多言語検索
モデルサイズ順に並べた主要ベンチマークスイート全体でのパフォーマンス。スコアは各ベンチマーク内のタスク間の平均値です(数値が高いほど優れています):
モデル
パラメータ数
アクティブパラメータ数
埋め込み次元
MTEB Multilingual Retrieval (18)
Code (12)
English Retrieval (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 のみ)
—
—
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 モデルは、約 3 倍小さいにもかかわらず、平均および個々のベンチマークの多くにおいて、multilingual-e5-base や gte-multilingual-base(パラメータ数が約 300M のモデル)を上回っています。
- paraphrase-multilingual-MiniLM-L12-v2 は広く使われているフレームワークのデフォルトですが、スコアは 36.6 で、97M R2 モデルより 23.7 ポイントも低いです。97M R2 モデルの方がわずかに小さく(パラメータ数:97M vs 110M)、出力次元数は同じ 384 です。
- LongEmbed が最も大きな R1 から R2 への改善を示しています: 97M モデルで +31.3 ポイント、311M モデルで +34.0 ポイントです。これは 32K コンテキストウィンドウの直接的な成果です。R1 の 512 トークンの制限により、法的契約書は最初のページのみで評価されていました。多くの実用的な多言語ワークロードでは、法的契約書、技術マニュアル、研究論文、複数ページのレポートなど、R1 では全文を見ることができない長い文書が扱われます。
- コード検索の精度も劇的に向上しました: R1 と比較して 97M で +19.7、311M で +15.3 の改善が見られ、これは新しいコードトレーニングセット、より大きなコンテキストウィンドウ、そして改善されたトレーニング手法を反映しています。
- より広範な競争環境において、harrier-oss-v1-270m は MTEB Multilingual Retrieval(66.4)と RaR-b(32.9)で首位を維持し、jina-embeddings-v5-text-nano は Code(71.2)および English Retrieval(58.8)で首位に立っています。311M の Granite モデルは平均性能(56.3)で競合しており、LongEmbed(71.7)では首位を占めると同時に、jina-embeddings-v5-text-nano と比較して大幅に高いエンコーディングスループットを提供します(速度表を参照)。
速度とスループット
エンコーディング速度は、数百万のドキュメントをインデックス化する必要がある場合や、低遅延クエリエンコーディングが必要な生産環境において特に重要です。512 トークンのチャンクを用いて、単一の NVIDIA H100 GPU でレイテンシとスループットを測定しました。
97M モデルは 1 秒あたり 2,500 ドキュメント以上をエンコード可能で、これは multilingual-e5-small と同等のスループットでありながら、大幅に高い検索品質を提供します。311M モデルは約 1,800 ドキュメント/秒の速度で動作し、検索品質(65.2 vs. 63.3)において jina-embeddings-v5-text-nano を上回ると同時に、エンコーディング速度では 5.5 倍以上の性能を発揮します(注:速度数値は最新のトランスフォーマーコードで計算されており、これは直近の 4.57 バージョンと比較して速度低下が生じています。Jina モデルおよび Granite モデルの両方に該当します。詳細は技術レポートを参照してください)。harrier-oss-v1-270m は、ここにリストされた競合他社の中で、速度と検索スコアの最適な組み合わせを提供しています。
Matryoshka Embeddings (311M)
311M モデルは Matryoshka Representation Learning をサポートしており、これにより 768 次元の完全な埋め込みベクトルを、512、384、256、または 128 次元に切り詰めることが可能で、品質は滑らかに低下します。これは、ストレージ、メモリ、あるいは類似度計算のコストが懸念される場合に有用です。例えば、256 次元の埋め込みベクトルは 768 次元のものよりもストレージを 3 分の 1 で済ませることができ、コサイン類似度の計算コストも比例して低くなります。
以下に、埋め込み次元に対する検索品質の維持状況を示します:
次元削減による品質低下は驚くほど小さいものです。768 次元から 256 次元へ切り詰める(ストレージと類似度計算コストが3 分の 1 に減少)ことで、MTEB Multilingual Retrieval のスコアはわずか 0.5 ポイント(65.2 → 64.7)、Code Retrieval は 0.5 ポイント(63.9 → 63.4)低下するだけです。さらに 128 次元(6 分の 1 に減少)に至っても、MTEB Multilingual Retrieval で 63.7、Code で 62.3 のスコアを維持し、完全な次元でのパフォーマンスの97% 以上を保持しています。実用上、これは結果品質への影響を最小限に抑えながら、インデックスサイズと検索レイテンシを大幅に削減できることを意味します。(なお、上記画像の結果は、英語および多言語検索ではコンテキスト長 1024、コード検索では 8192 で評価されたものです)
比較のために、384 次元に切り詰められた 311M モデル(97M モデルのネイティブ出力と同じ次元数)は、すべてのベンチマークにおいて依然として 97M モデルを上回っています。384 次元の埋め込みベクトルが必要で、311M モデルのエンコーディングコストを負担できる場合、Matryoshka 切り詰め(Matryoshka truncation)がより強力な選択肢となります。
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(Matryoshka)をサポートしていません。384 次元ですでにコンパクトなサイズとなっています。
クロスリンガル検索
MTEB Retrieval 内のクロスリンガルトasksにおける平均パフォーマンス。Belebele は 122 の言語にわたるクロスリンガル文書マッチングを測定し、MLQA は 7 か国語にわたる抽出型クロスリンガル質問応答検索を測定します。
Model
Belebele Retrieval
MLQA Retrieval
granite-embedding-107m-multilingual (R1)
55.1
60.5
granite-embedding-278m-multilingual (R1)
62.2
63.0
granite-embedding-97m-multilingual-r2
52.9
60.5
granite-embedding-311m-multilingual-r2
66.5
67.1
311M R2 モデルは、R1 先行モデルと比較して Belebele で +4.3、MLQA で +4.1 の向上を示し、両方のベンチマークにおいて大規模化によるクロスリンガル転移能力の改善が確認されました。
97M の R2 モデルは、Belebele ベンチマークでは 52.9 と R1 先行モデルの 55.1 より低スコア(−2.2)ですが、MLQA では同等の 60.5 を記録しています。この Belebele における差は、プルーニングと語彙削減プロセスに内在するトレードオフによるものです。R2 モデルのトレーニングでは、より広範な 18 ヶ国語対応の MTEB Multilingual Retrieval セット(R1 より +12.2 の向上)と長文検索(+31.3 の向上)が優先されましたが、より小さな語彙サイズ(180K トークン対 250K トークン)と層数の削減(12 層対 22 層)は、限定的な異言語間転移タスクに影響を与えています。多数の言語ペアにわたる異言語間転移が主要なユースケースである場合、フルサイズの 311M モデルの方がより適切な選択肢となります。
デプロイメントオプション
両モデルとも、本番環境での利用に向けた複数のデプロイパスを提供しています。コアライブラリは以下のようにインストールしてください:
pip install sentence-transformers
Sentence Transformers(多くのユーザーに推奨):
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer("ibm-granite/granite-embedding-97m-multilingual-r2")
queries = [
"What is the tallest mountain in Japan?", # English
"Wer hat das Lied Achy Breaky Heart geschrieben?", # German
"ドイツの首都はどこですか?", # Japanese
]
passages = [
"富士山は、静岡県と山梨県にまたがる活火山で、標高3776.12 mで日本最高峰の独立峰である。", # Japanese
"Achy Breaky Heart is a country song written by Don Von Tress.", # English
"Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.", # German
]
q_emb = model.encode(queries)
p_emb = model.encode(passages)
print(util.cos_sim(q_emb, p_emb))
各クエリは、言語を問わず対応するパッセージに対して最高スコアを獲得します
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.",
])
query = embeddings.embed_query("What is Japan's tallest mountain?")
LangChain が Embeddings オブジェクトを受け付けるあらゆる場所で差し替え可能
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}")
0.961 Mount Fuji is Japan's highest peak.
0.913 富士山は日本最高峰の独立峰です。
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']}")
0.961 Mount Fuji is Japan's highest peak.
0.913 富士山は日本最高峰の独立峰です。
両モデルとも、最適化された CPU/アクセラレータ推論用の事前変換済みのONNXおよびOpenVINO重み付きファイルを同梱しており、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 フレンドリー: 最適化された CPU 推論用の ONNX および OpenVINO 重みを同梱。入門チュートリアルでは GPU の依存は不要です。
- デフォルトで多言語対応: 現在のデフォルトが英語のみである場合、これは一行の置き換えで、コミュニティ内のすべてのユーザーにコードを変更することなく 200 以上の言語サポートを提供します。
- 安定した識別子: Hugging Face 上の ibm-granite/granite-embedding-97m-multilingual-r2。Granite モデルファミリーの下で IBM がメンテナンスしています。
これらのモデルをプロジェクトのデフォルトとして採用することについて議論するには、ibm-granite/granite-embedding-models でイシューを開いてください。
どのモデルを使用すべきか?
これら 2 つの多言語モデルは、より広範なGranite Embedding R2ファミリーの一部であり、同ファミリーには 2 つのパフォーマンスに優れた英語特化型モデルも含まれています: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 レポート からアクセスできます。ご質問、フィードバック、または問題については、GitHub の ibm-granite/granite-embedding-models をご覧ください。
フレームワークメンテナーの方へ: プロジェクトでこれらのモデルをデフォルトとして採用したい場合は、ibm-granite/granite-embedding-models にイシューを開いてください。統合、テスト、ライセンスや展開に関するご質問などについて、喜んでサポートいたします。
ぜひお試しください。もしこれらの埋め込み表現があなたの心を動かすなら、Hugging Face の ❤️ ボタンをぜひ押してください。私たちのモデルにも感情があり、すべての「いいね」が夜間の暖かさを保つのです。
原文を表示
TL;DR: Two new Apache 2.0 multilingual embedding models built on ModernBERT — a 97M-parameter compact model that beats every open sub-100M multilingual embedder on MTEB Multilingual Retrieval (60.3), and a 311M full-size model that scores 65.2 on MTEB Multilingual Retrieval (#2 among open models under 500M parameters) with Matryoshka support. Both cover 200+ languages, are tuned on 52 languages, handle 32K-token context (64x R1), and add code retrieval across 9 programming languages.
In this post: Enterprise-Ready by Design · A Strong Sub-100M Multilingual Model · What Changed from R1 · Training the Full-Size 311M Model · Building the compact 97M Multilingual Model · Benchmark Results · Matryoshka Embeddings · Deployment Options · For Framework Integrators · Which Model Should You Use? · Try The Models
Multilingual embedding models face a persistent tension: broad language coverage usually comes at the cost of model size, and small models usually sacrifice languages. If you work across languages — retrieval-augmented generation over multilingual corpora, cross-lingual search, code retrieval in international teams — you've likely had to choose between a model that's fast enough and one that's good enough.
The Granite Embedding Multilingual R2 release narrows that gap considerably. We're releasing two new multilingual embedding models:
- granite-embedding-311m-multilingual-r2 — A 311M-parameter full-size model with 768-dimensional embeddings, Matryoshka dimension support, and top-tier multilingual retrieval quality.
- granite-embedding-97m-multilingual-r2 — A 97M-parameter compact model with 384-dimensional embeddings that delivers strong retrieval quality for its size.
Both models support 200+ languages with enhanced retrieval quality for 52 languages and programming code, handle context lengths up to 32,768 tokens (a 64x increase over their R1 predecessors), and are released under the Apache 2.0 license. They work out of the box with sentence-transformers and transformers, require no task-specific instructions, and are compatible as drop-in replacements in LangChain, LlamaIndex, Haystack, and Milvus with a one-line model name change. For frameworks currently using an English-only default, that one line gives every user in your community support for 200+ languages — no API changes, no new dependencies, no code changes required on their end. Both models ship with ONNX and OpenVINO weights for CPU-optimized inference.
52 enhanced-support languages (click to expand)
The underlying encoder was pretrained on text from 200+ languages, producing general-purpose embeddings for any of them. The following 52 languages receive explicit retrieval-pair and cross-lingual training for higher-quality retrieval:
Albanian (sq), Arabic (ar), Azerbaijani (az), Bengali (bn), Bulgarian (bg), Catalan (ca), Chinese (zh), Croatian (hr), Czech (cs), Danish (da), Dutch (nl), English (en), Estonian (et), Finnish (fi), French (fr), Georgian (ka), German (de), Greek (el), Hebrew (he), Hindi (hi), Hungarian (hu), Icelandic (is), Indonesian (id), Italian (it), Japanese (ja), Kazakh (kk), Khmer (km), Korean (ko), Latvian (lv), Lithuanian (lt), Malay (ms), Marathi (mr), Norwegian (no), Persian (fa), Polish (pl), Portuguese (pt), Romanian (ro), Russian (ru), Serbian (sr), Slovak (sk), Slovenian (sl), Spanish (es), Swahili (sw), Swedish (sv), Tagalog (tl), Telugu (te), Thai (th), Turkish (tr), Ukrainian (uk), Urdu (ur), Uzbek (uz), Vietnamese (vi).
Additionally, the models are trained on programming code (Python, Go, Java, JavaScript, PHP, Ruby, SQL, C, C++) and support cross-lingual code retrieval.
Enterprise-Ready by Design
Both embedding models are trained on a mixture of IBM‑curated datasets, publicly available data, and internally generated or synthetic data. Public web‑derived data used in training is selected and filtered using IBM‑developed quality, deduplication, and governance processes intended to reduce risk in downstream commercial use. We intentionally avoid the use of the MS‑MARCO training dataset and datasets with explicit non‑commercial licensing restrictions. The models are pretrained using GneissWeb, an IBM‑curated dataset derived from publicly available web content and processed using IBM’s data preparation and governance tooling—along with additional IBM‑curated and other publicly available sources. Datasets undergo IBM governance review to assess licensing considerations, ownership signals, and personal data risks. These processes are designed to contribute to responsible use and enterprise deployment.
A Strong Sub-100M Multilingual Model
The standout of this release is granite-embedding-97m-multilingual-r2. At 97 million parameters, it scores 60.3 on Multilingual MTEB Retrieval across 18 languages — the highest retrieval score we've found for any open multilingual embedding model under 100M parameters. The next-best model in that size class, multilingual-e5-small, scores 50.9 on the same benchmark — a +9.4 point gap on a mature benchmark.
At roughly one-third the size of the 311M full-size model, it retains the majority of its retrieval quality across multilingual, code, and long-document benchmarks — a +12.2 point gain on MTEB Multilingual Retrieval over its direct predecessor, driven by a new architecture, better training data, and a novel pruning methodology (more on that below). The full-size granite-embedding-311m-multilingual-r2 scores 65.2 on the same benchmark, a +13.0 point gain over its R1 predecessor.
What Changed from R1
The Granite Embedding Multilingual R1 models were built on XLM-RoBERTa encoders with a 512-token context window. The R2 generation is a ground-up rebuild:
ModernBERT is a recent encoder architecture that revisits the original BERT design with techniques from the last five years of transformer research. The shift brings several practical benefits: alternating attention lengths reduce computation on long sequences (improves throughput on long sequences significantly), rotary position embeddings allow the 32K context window without the positional interpolation hacks that plague older architectures, and Flash Attention 2.0 support speeds up encoding on modern GPUs.
The new multilingual tokenizers are worth highlighting. Rather than reusing XLM-RoBERTa's 250K-token vocabulary, we adopted existing tokenizers with strong multilingual and code coverage. The 311M model uses the Gemma 3 tokenizer (262K tokens); the 97M model starts from the GPT-OSS tokenizer and prunes it down to a compact 180K-token vocabulary that preserves broad multilingual coverage while reducing the embedding table's parameter footprint. Tokenizer efficiency matters more than people realize — a 32K-token window sounds impressive until your tokenizer burns half of it encoding a single paragraph of Thai.
Training the Full-Size 311M Model
The 311M model is a 22-layer ModernBERT encoder with a 262K-token multilingual vocabulary, trained through a multi-stage pipeline:
- Knowledge distillation: The model learns from multiple teacher models simultaneously. The teachers are Granite 3.3 Instruct and Mistral v0.2 Instruct decoder models, further finetuned for text embeddings, which transfer retrieval-specific knowledge into the 311M encoder architecture.
- Contrastive fine-tuning: Standard contrastive training on multilingual retrieval pairs — queries matched with relevant and hard-negative passages across 52 languages and code — sharpens the model's ability to distinguish relevant from irrelevant results.
- Model merging: After training, we merge checkpoints from different training stages and configurations. This combines the strengths of models optimized for different objectives (e.g., multilingual breadth vs. English depth) into a single set of weights without additional training compute.
- Matryoshka Representation Learning: The model is trained with Matryoshka objectives so that its 768-dimensional embeddings can be truncated to 512, 384, 256, or 128 dimensions with minimal quality loss (see Matryoshka Embeddings below).
The result is a model that scores 65.2 on MTEB Multilingual Retrieval and 56.3 on the overall average — a +14.5 point average gain over its R1 predecessor.
Building the compact 97M Multilingual model
The 97M model is trained through a combination of vocabulary selection and knowledge distillation:
- Vocabulary selection: The 262K-token vocabulary is reduced to a purpose-trained 180K-token vocabulary that preserves broad multilingual coverage while cutting the embedding table size substantially.
- Knowledge distillation: The pruned model is then finetuned using knowledge distillation from multiple teacher models (including a Granite 4.1 8B and Mistral Instruct decoder-based teacher) and contrastive training to improve retrieval quality.
This approach transfers retrieval-specific knowledge from multiple strong teachers, while reducing the model parameters without sacrificing language coverage. The result is a highly efficient compact model — scoring 60.3 on MTEB Multilingual Retrieval vs. 65.2 for the full-size model, while being approximately 3x smaller.
Benchmark Results
Multilingual Retrieval
Performance across the main benchmark suite sorted by model size. Scores are averages across tasks within each benchmark (higher is better):
Model
Params
Active Params
Embed Dim
MTEB Multilingual Retrieval (18)
Code (12)
English Retrieval (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)
A few things stand out:
- The 97M R2 model beats multilingual-e5-base and gte-multilingual-base (~300M parameter models) on average and on most individual benchmarks, despite being roughly 3x smaller.
- paraphrase-multilingual-MiniLM-L12-v2 — a widely-used framework default — scores 36.6, a full +23.7 points behind the 97M R2 model, which is also slightly smaller (97M vs 110M parameters) with the same 384-dimensional output.
- LongEmbed is the biggest R1-to-R2 gain: +31.3 points for the 97M model, +34.0 for the 311M. This is the direct payoff of the 32K context window — R1's 512-token limit meant your legal contract was being judged by its first page. Many practical multilingual workloads involve long documents (legal contracts, technical manuals, research papers, multi-page reports) that R1 simply could not see in full.
- Code retrieval improves dramatically: +19.7 (97M) and +15.3 (311M) over R1, reflecting the new code training set, larger context window, and better training methodology.
- In the broader competitive field, harrier-oss-v1-270m leads on MTEB Multilingual Retrieval (66.4) and RaR-b (32.9), while jina-embeddings-v5-text-nano leads on Code (71.2) and English Retrieval (58.8). The 311M Granite model is competitive on average (56.3) and leads on LongEmbed (71.7), while offering substantially higher encoding throughput than jina-embeddings-v5-text-nano (see speed table below).
Speed and Throughput
Encoding speed matters for production workloads, especially when you're indexing millions of documents or need low-latency query encoding. We measured latency and throughput on a single NVIDIA H100 GPU using 512-token chunks:
The 97M model encodes over 2,500 documents per second — comparable throughput to multilingual-e5-small — while delivering substantially higher retrieval quality. The 311M model, at ~1,800 docs/sec, performs better than jina-embeddings-v5-text-nano on retrieval quality (65.2 vs. 63.3) at over 5.5x the encoding speed (note: speed numbers are computed with the latest transformer code, which had a speed regression vs the last 4.57 version - for both the Jina and granite models - see our technical report for details). harrier-oss-v1-270m offers the best combination of speed and retrieval score among the competitors listed here.
Matryoshka Embeddings (311M)
The 311M model supports Matryoshka Representation Learning, which lets you truncate embeddings from the full 768 dimensions down to 512, 384, 256, or 128 with graceful quality degradation. This is useful when storage, memory, or similarity-computation cost is a concern — a 256-dimensional embedding takes one-third the storage of a 768-dimensional one, and cosine similarity is proportionally cheaper to compute.
Here's how retrieval quality holds up across embedding dimensions:
The quality loss from dimension reduction is remarkably small. Cutting from 768 to 256 dimensions — a 3x reduction in storage and similarity-computation cost — drops MTEB Multilingual Retrieval by just 0.5 points (65.2 → 64.7) and Code Retrieval by 0.5 points (63.9 → 63.4). Even at 128 dimensions (a 6x reduction), the model still scores 63.7 on MTEB Multilingual Retrieval and 62.3 on Code — retaining over 97% of its full-dimension performance. In practice, this means you can substantially reduce your index size and search latency with minimal impact on result quality. (Note,results in the above picture were evaluated with a context length of 1024 for English and Multilingual Retrieval, and 8192 for Code).
For comparison, the 311M model truncated to 384 dimensions (the same dimensionality as the 97M model's native output) still outperforms the 97M model across all three benchmarks. If you need 384-dimensional embeddings and can afford the 311M model's encoding cost, Matryoshka truncation is the stronger option.
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)
The 97M model does not support Matryoshka — 384 dimensions is already compact.
Cross-lingual Retrieval
Average performance on cross-lingual tasks within MTEB Retrieval. Belebele measures cross-lingual passage matching across 122 languages; MLQA measures extractive cross-lingual question answering retrieval across 7 languages.
Model
Belebele Retrieval
MLQA Retrieval
granite-embedding-107m-multilingual (R1)
55.1
60.5
granite-embedding-278m-multilingual (R1)
62.2
63.0
granite-embedding-97m-multilingual-r2
52.9
60.5
granite-embedding-311m-multilingual-r2
66.5
67.1
The 311M R2 model gains +4.3 on Belebele and +4.1 on MLQA over its R1 predecessor, showing improved cross-lingual transfer at the larger scale across both benchmarks.
The 97M R2 model scores lower on Belebele (52.9 vs 55.1, −2.2) while matching its R1 predecessor on MLQA (60.5). The Belebele gap is a tradeoff inherent in the pruning and vocabulary reduction process — the R2 model's training prioritized the broader 18-language MTEB Multilingual Retrieval set (where it gains +12.2 over R1) and long-document retrieval (+31.3), while the smaller vocabulary (180K vs. 250K tokens) and reduced layer count (12 vs. 22) affect narrow cross-lingual transfer tasks. If cross-lingual transfer across many language pairs is your primary use case, the full-size 311M model is the better choice.
Deployment Options
Both models ship with multiple deployment paths for production use. Install the core library with:
pip install sentence-transformers
Sentence Transformers (recommended for most users):
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer("ibm-granite/granite-embedding-97m-multilingual-r2")
queries = [
"What is the tallest mountain in Japan?", # English
"Wer hat das Lied Achy Breaky Heart geschrieben?", # German
"ドイツの首都はどこですか?", # Japanese
]
passages = [
"富士山は、静岡県と山梨県にまたがる活火山で、標高3776.12 mで日本最高峰の独立峰である。", # Japanese
"Achy Breaky Heart is a country song written by Don Von Tress.", # English
"Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.", # German
]
q_emb = model.encode(queries)
p_emb = model.encode(passages)
print(util.cos_sim(q_emb, p_emb))
# Each query scores highest against its matching passage — across languages
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.",
])
query = embeddings.embed_query("What is Japan's tallest mountain?")
# 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"]:
print(f"{doc.score:.3f} {doc.content}")
# 0.961 Mount Fuji is Japan's highest peak.
# 0.913 富士山は日本最高峰の独立峰です。
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']}")
# 0.961 Mount Fuji is Japan's highest peak.
# 0.913 富士山は日本最高峰の独立峰です。
Both models also ship with pre-converted ONNX and OpenVINO weights for optimized CPU/accelerator inference, work as embedding endpoints via vLLM (vllm serve ... --task embed), and can be converted to GGUF for Ollama using llama.cpp. See the model cards for full deployment examples.
For Framework Integrators
If you maintain an embedding framework, vector store, or RAG pipeline library and are evaluating these models as a default, here's what you need to know:
- License: Apache 2.0, trained without MS-MARCO
- Drop-in behavior: No task-specific instruction prefix required — behaves like all-MiniLM-L6-v2 at the API level. Existing code that calls .encode() works unchanged.
- Dimensionality: 384-dimensional output (97M) and 768-dimensional output (311M), matching the most common existing defaults. No index migration required.
- Model size: The 97M model's weights are 195 MB (safetensors) — less than half the size of paraphrase-multilingual-MiniLM-L12-v2 (471 MB), the most common multilingual default. The quantized ONNX weights are just 98 MB, comparable to all-MiniLM-L6-v2 (91 MB) while covering 200+ languages.
- CPU-friendly: Ships with ONNX and OpenVINO weights for optimized CPU inference. No GPU dependency for a getting-started tutorial.
- Multilingual by default: If your current default is English-only, this is a one-line swap that gives every user in your community support for 200+ languages — without touching their code.
- Stable identifier: ibm-granite/granite-embedding-97m-multilingual-r2 on Hugging Face, maintained by IBM under the Granite model family.
To discuss adopting these models as a default in your project, open an issue at ibm-granite/granite-embedding-models.
Which Model Should You Use?
These two multilingual models are part of the broader Granite Embedding R2 family, which also includes two high-performing English-focused models: granite-embedding-english-r2 (149M parameters) and granite-embedding-small-english-r2 (47M parameters). If your data is predominantly English, the English models offer higher retrieval quality on English benchmarks at a smaller footprint, since they don't need to allocate capacity across 200+ languages.
If you need...
Use
Best multilingual retrieval quality
granite-embedding-311m-multilingual-r2
Flexible embedding dimensions (storage/speed tradeoff)
granite-embedding-311m-multilingual-r2 (Matryoshka)
Maximum throughput / edge deployment / low latency
granite-embedding-97m-multilingual-r2
Best cross-lingual transfer across many language pairs
granite-embedding-311m-multilingual-r2
Predominantly English data
granite-embedding-english-r2 or granite-embedding-small-english-r2
Try The Models
Both models are available now on Hugging Face under the IBM Granite Embedding collection:
- granite-embedding-311m-multilingual-r2
- granite-embedding-97m-multilingual-r2
You will also be able to try the small models interactively (on CPU) shortly via a Granite Embedding demo (coming soon) on Hugging Face Spaces, or run the full examples notebook in Google Colab:
You can access our detailed technical report covering the full training methodology, per-language evaluations, and pruning ablations here Granite Multilingual Embedding R2 report. For questions, feedback, or issues, visit ibm-granite/granite-embedding-models on GitHub.
Framework maintainers: If you'd like to adopt these models as a default in your project, open an issue at ibm-granite/granite-embedding-models — we're happy to help with integration, testing, and any questions about licensing or deployment.
Give them a try, and if the embeddings spark joy, smash that ❤️ button on Hugging Face. Our models have feelings too, and every +1 keeps them warm at night.
関連記事
今日のまとめ
AI日報で今日の重要ニュースをまとめ読み