{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-05-14-granite-embedding-multilingual-r2-open-apache-2-0/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "> **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.\n\n[![Granite Embedding Multilingual R2](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/LrZQDi73p2iIqRJTd25f7.png \"Granite Multilingual Embedding Intro Picture\")](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/LrZQDi73p2iIqRJTd25f7.png)\n\n**In this post:** [Enterprise-Ready by Design](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#enterprise-ready-by-design) · [A Strong Sub-100M Multilingual Model](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#a-strong-sub-100m-multilingual-model) · [What Changed from R1](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#what-changed-from-r1) · [Training the Full-Size 311M Model](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#training-the-full-size-311m-model) · [Building the compact 97M Multilingual Model](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#building-the-compact-97m-multilingual-model) · [Benchmark Results](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#benchmark-results) · [Matryoshka Embeddings](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#matryoshka-embeddings-311m) · [Deployment Options](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#deployment-options) · [For Framework Integrators](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#for-framework-integrators) · [Which Model Should You Use?](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#which-model-should-you-use) · [Try The Models](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#try-the-models)\n\nMultilingual 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.\n\nThe Granite Embedding Multilingual R2 release narrows that gap considerably. We're releasing two new multilingual embedding models:\n\n- [**granite-embedding-311m-multilingual-r2**](https://huggingface.co/ibm-granite/granite-embedding-311m-multilingual-r2) — A 311M-parameter full-size model with 768-dimensional embeddings, Matryoshka dimension support, and top-tier multilingual retrieval quality.\n- [**granite-embedding-97m-multilingual-r2**](https://huggingface.co/ibm-granite/granite-embedding-97m-multilingual-r2) — A 97M-parameter compact model with 384-dimensional embeddings that delivers strong retrieval quality for its size.\n\nBoth 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.\n\n**52 enhanced-support languages** (click to expand)\n\nThe 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:\n\nAlbanian (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).\n\nAdditionally, the models are trained on **programming code** (Python, Go, Java, JavaScript, PHP, Ruby, SQL, C, C++) and support cross-lingual code retrieval.\n\n## Enterprise-Ready by Design\n\nBoth 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](https://huggingface.co/datasets/ibm-granite/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.\n\n## A Strong Sub-100M Multilingual Model\n\nThe 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.\n\nAt 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.\n\n## What Changed from R1\n\nThe 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:\n\n[![Granite Embedding R2 Architecture](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/jhz201_Ud5zUWfA3k4ITA.png)](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/jhz201_Ud5zUWfA3k4ITA.png)\n\n[ModernBERT](https://huggingface.co/blog/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.\n\nThe 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.\n\n## Training the Full-Size 311M Model\n\nThe 311M model is a 22-layer ModernBERT encoder with a 262K-token multilingual vocabulary, trained through a multi-stage pipeline:\n\n1. **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.\n2. **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.\n3. **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.\n4. **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](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#matryoshka-embeddings-311m) below).\n\nThe 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.\n\n## Building the compact 97M Multilingual model\n\nThe 97M model is trained through a combination of **vocabulary selection** and **knowledge distillation**:\n\n1. **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.\n2. **Knowledge distillation**: The pruned model is then finetuned using knowledge distillation from multiple teacher models (including a [Granite 4.1 8B](https://huggingface.co/ibm-granite/granite-4.1-8b) and Mistral Instruct decoder-based teacher) and contrastive training to improve retrieval quality.\n\nThis 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.\n\n## Benchmark Results\n\n### Multilingual Retrieval\n\nPerformance across the main benchmark suite sorted by model size. Scores are averages across tasks within each benchmark (higher is better):\n\n| Model                                      | Params   | Active Params | Embed Dim | MTEB Multilingual Retrieval (18) | Code (12)     | English Retrieval (10) | LongEmbed (6) | RaR-b (17)    |\n| ------------------------------------------ | -------- | ------------- | --------- | -------------------------------- | ------------- | ---------------------- | ------------- | ------------- |\n| F2LLM-v2-80M                               | 80M      | 32M           | 320       | 50.1                             | 68.0          | 47.5                   | 31.7          | 17.9          |\n| multilingual-e5-small                      | 118M     | 22M           | 384       | 50.9                             | 53.5          | 46.5                   | 38.8          | 20.3          |\n| granite-embedding-107m-multilingual (R1)   | 107M     | 11M           | 384       | 48.1                             | 40.7          | 47.9                   | 34.3          | 17.1          |\n| paraphrase-multilingual-MiniLM-L12-v2      | 118M     | 22M           | 384       | 36.6                             | 23.5          | 35.9                   | 20.9          | 10.9          |\n| jina-embeddings-v5-text-nano               | 212M     | 113M          | 768       | 63.3                             | 71.2          | 58.8                   | 63.6          | 25.2          |\n| harrier-oss-v1-270m                        | 268M     | 100M          | 640       | 66.4                             | 62.4          | 52.1                   | 64.9          | 32.9          |\n| multilingual-e5-base                       | 278M     | 86M           | 768       | 52.7                             | 52.6          | 49.0                   | 40.5          | 23.4          |\n| granite-embedding-278m-multilingual (R1)   | 278M     | 86M           | 768       | 52.2                             | 48.5          | 51.5                   | 37.7          | 18.9          |\n| embeddinggemma-300m                        | 308M     | 106M          | 768       | 62.5                             | 68.7          | 54.6                   | 55.4          | 26.1          |\n| gte-multilingual-base                      | 305M     | 113M          | 768       | 57.2                             | 57.5          | 50.8                   | 62.1          | 19.0          |\n| snowflake-arctic-embed-m-v2.0              | 305M     | 113M          | 768       | 54.8                             | 55.2          | 58.4                   | 55.4          | 23.3          |\n| multilingual-e5-large                      | 560M     | 304M          | 1024      | 53.7                             | 55.8          | 51.5                   | 40.4          | 25.4          |\n| text-embedding-3-small (OpenAI, API only)  | —        | —             | 1536      | 50.7                             | —             | 53.8                   | 53.6          | 23.2          |\n|                                            |          |               |           |                                  |               |                        |               |               |\n| **granite-embedding-97m-multilingual-r2**  | **97M**  | **28M**       | **384**   | **60.3**                         | **60.4**      | **50.1**               | **65.6**      | **24.9**      |\n| **granite-embedding-311m-multilingual-r2** | **311M** | **110M**      | **768**   | **65.2 (#2)**                    | **63.8 (#3)** | **52.6 (#5)**          | **71.7 (#1)** | **28.0 (#2)** |\n\nA few things stand out:\n\n- **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.\n- **`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.\n- **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.\n- **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.\n- **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).\n\n### Speed and Throughput\n\nEncoding 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:\n\n[![Speed vs. Quality: 97M model matches 300M-class quality at 3x the parameter efficiency](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/1ltJtX2knfzUA5BekMQsh.png \"Speed vs Throughput For Top Multilingual Embedding Models under 500M params\")](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/1ltJtX2knfzUA5BekMQsh.png)\n\nThe 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.\n\n## Matryoshka Embeddings (311M)\n\nThe 311M model supports [Matryoshka Representation Learning](https://arxiv.org/abs/2205.13147), 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.\n\nHere's how retrieval quality holds up across embedding dimensions:\n\n[![Matryoshka embeddings: graceful quality degradation across truncated dimensions](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/myYhY1YHLY9Vs3l0gyMJB.png \"Performance Change While Prunning the Embeddings to Fewer Entries\")](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/myYhY1YHLY9Vs3l0gyMJB.png)\n\nThe 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).\n\nFor 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.\n\n```python\nfrom sentence_transformers import SentenceTransformer\n\nmodel = SentenceTransformer(\"ibm-granite/granite-embedding-311m-multilingual-r2\")\n\n# Full 768-dimensional embeddings\nfull = model.encode([\"example text\"])\nprint(full.shape)  # (1, 768)\n\n# Truncated to 384 dimensions\nsmall = model.encode([\"example text\"], truncate_dim=384)\nprint(small.shape)  # (1, 384)\n```\n\nThe 97M model does not support Matryoshka — 384 dimensions is already compact.\n\n### Cross-lingual Retrieval\n\nAverage performance on cross-lingual tasks within MTEB Retrieval. [Belebele](https://huggingface.co/datasets/facebook/belebele) measures cross-lingual passage matching across 122 languages; MLQA measures extractive cross-lingual question answering retrieval across 7 languages.\n\n| Model                                      | Belebele Retrieval | MLQA Retrieval |\n| ------------------------------------------ | ------------------ | -------------- |\n| granite-embedding-107m-multilingual (R1)   | 55.1               | 60.5           |\n| granite-embedding-278m-multilingual (R1)   | 62.2               | 63.0           |\n| granite-embedding-97m-multilingual-r2      | 52.9               | 60.5           |\n| **granite-embedding-311m-multilingual-r2** | **66.5**           | **67.1**       |\n\nThe 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.\n\nThe 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.\n\n## Deployment Options\n\nBoth models ship with multiple deployment paths for production use. Install the core library with:\n\n```bash\npip install sentence-transformers\n```\n\n**Sentence Transformers** (recommended for most users):\n\n```python\nfrom sentence_transformers import SentenceTransformer, util\n\nmodel = SentenceTransformer(\"ibm-granite/granite-embedding-97m-multilingual-r2\")\n\nqueries = [\n    \"What is the tallest mountain in Japan?\",          # English\n    \"Wer hat das Lied Achy Breaky Heart geschrieben?\", # German\n    \"ドイツの首都はどこですか？\",                            # Japanese\n]\n\npassages = [\n    \"富士山は、静岡県と山梨県にまたがる活火山で、標高3776.12 mで日本最高峰の独立峰である。\",  # Japanese\n    \"Achy Breaky Heart is a country song written by Don Von Tress.\",                        # English\n    \"Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.\",                # German\n]\n\nq_emb = model.encode(queries)\np_emb = model.encode(passages)\nprint(util.cos_sim(q_emb, p_emb))\n# Each query scores highest against its matching passage — across languages\n```\n\n**LangChain** (`pip install langchain-huggingface`):\n\n```python\nfrom langchain_huggingface import HuggingFaceEmbeddings\n\nembeddings = HuggingFaceEmbeddings(\n    model_name=\"ibm-granite/granite-embedding-97m-multilingual-r2\"\n)\n\ndocs = embeddings.embed_documents([\n    \"富士山は日本最高峰の独立峰です。\",\n    \"Mount Fuji is Japan's highest peak.\",\n])\nquery = embeddings.embed_query(\"What is Japan's tallest mountain?\")\n# Drop-in replacement anywhere LangChain accepts an Embeddings object\n```\n\n**LlamaIndex** (`pip install llama-index-embeddings-huggingface`):\n\n```python\nfrom llama_index.embeddings.huggingface import HuggingFaceEmbedding\nfrom llama_index.core import Settings\n\nembed_model = HuggingFaceEmbedding(\n    model_name=\"ibm-granite/granite-embedding-97m-multilingual-r2\"\n)\nSettings.embed_model = embed_model  # applies globally to any index or pipeline\n```\n\n**Haystack** (`pip install sentence-transformers haystack-ai`)\n\n```python\nfrom haystack.components.embedders import (\n    SentenceTransformersDocumentEmbedder,\n    SentenceTransformersTextEmbedder,\n)\nfrom haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever\nfrom haystack.dataclasses import Document\nfrom haystack.document_stores.in_memory import InMemoryDocumentStore\n\ndoc_embedder = SentenceTransformersDocumentEmbedder(\n    model=\"ibm-granite/granite-embedding-97m-multilingual-r2\"\n)\nquery_embedder = SentenceTransformersTextEmbedder(\n    model=\"ibm-granite/granite-embedding-97m-multilingual-r2\"\n)\ndoc_embedder.warm_up()\nquery_embedder.warm_up()\n\n# Embed and index documents\ndocument_store = InMemoryDocumentStore()\nresult_docs = doc_embedder.run(documents=[\n    Document(content=\"富士山は日本最高峰の独立峰です。\"),\n    Document(content=\"Mount Fuji is Japan's highest peak.\"),\n    Document(content=\"Achy Breaky Heart is a country song written by Don Von Tress.\"),\n    Document(content=\"Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.\"),\n])\ndocument_store.write_documents(result_docs[\"documents\"])\n\n# Embed query and retrieve\nresult_query = query_embedder.run(text=\"What is Japan's tallest mountain?\")\nretriever = InMemoryEmbeddingRetriever(document_store=document_store)\nresults = retriever.run(query_embedding=result_query[\"embedding\"], top_k=2)\nfor doc in results[\"documents\"]:\n    print(f\"{doc.score:.3f}  {doc.content}\")\n# 0.961  Mount Fuji is Japan's highest peak.\n# 0.913  富士山は日本最高峰の独立峰です。\n```\n\n**Milvus** (`pip install pymilvus sentence-transformers`)\n\n```python\nfrom pymilvus import MilvusClient\nfrom sentence_transformers import SentenceTransformer\n\nmodel = SentenceTransformer(\"ibm-granite/granite-embedding-97m-multilingual-r2\")\n\n# Use \"./milvus.db\" for local persistence or a server URI for production\nclient = MilvusClient(\":memory:\")\nclient.create_collection(collection_name=\"multilingual_docs\", dimension=384)\n\ndocs = [\n    \"富士山は日本最高峰の独立峰です。\",\n    \"Mount Fuji is Japan's highest peak.\",\n    \"Achy Breaky Heart is a country song written by Don Von Tress.\",\n    \"Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.\",\n]\nembeddings = model.encode(docs).tolist()\nclient.insert(\n    collection_name=\"multilingual_docs\",\n    data=[{\"id\": i, \"vector\": emb, \"text\": doc} for i, (emb, doc) in enumerate(zip(embeddings, docs))],\n)\n\nquery_emb = model.encode([\"What is Japan's tallest mountain?\"]).tolist()\nresults = client.search(\n    collection_name=\"multilingual_docs\",\n    data=query_emb,\n    limit=2,\n    output_fields=[\"text\"],\n)\nfor hit in results[0]:\n    print(f\"{hit['distance']:.3f}  {hit['entity']['text']}\")\n# 0.961  Mount Fuji is Japan's highest peak.\n# 0.913  富士山は日本最高峰の独立峰です。\n```\n\nBoth models also ship with pre-converted **ONNX** and **OpenVINO** weights for optimized CPU/accelerator inference, work as embedding endpoints via **[vLLM](https://docs.vllm.ai/)** (`vllm serve ... --task embed`), and can be converted to GGUF for **[Ollama](https://ollama.com/)** using [llama.cpp](https://github.com/ggerganov/llama.cpp). See the model cards for full deployment examples.\n\n## For Framework Integrators\n\nIf 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:\n\n- **License**: Apache 2.0, trained without MS-MARCO\n- **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.\n- **Dimensionality**: 384-dimensional output (97M) and 768-dimensional output (311M), matching the most common existing defaults. No index migration required.\n- **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.\n- **CPU-friendly**: Ships with ONNX and OpenVINO weights for optimized CPU inference. No GPU dependency for a getting-started tutorial.\n- **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.\n- **Stable identifier**: `ibm-granite/granite-embedding-97m-multilingual-r2` on Hugging Face, maintained by IBM under the Granite model family.\n\nTo discuss adopting these models as a default in your project, open an issue at [ibm-granite/granite-embedding-models](https://github.com/ibm-granite/granite-embedding-models).\n\n## Which Model Should You Use?\n\nThese 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](https://huggingface.co/ibm-granite/granite-embedding-english-r2) (149M parameters) and [granite-embedding-small-english-r2](https://huggingface.co/ibm-granite/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.\n\n| If you need...                                         | Use                                                                                                                                                                                                              |\n| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Best multilingual retrieval quality                    | [granite-embedding-311m-multilingual-r2](https://huggingface.co/ibm-granite/granite-embedding-311m-multilingual-r2)                                                                                             |\n| Flexible embedding dimensions (storage/speed tradeoff) | granite-embedding-311m-multilingual-r2 (Matryoshka)                                                                                                                                                              |\n| Maximum throughput / edge deployment / low latency     | [granite-embedding-97m-multilingual-r2](https://huggingface.co/ibm-granite/granite-embedding-97m-multilingual-r2)                                                                                               |\n| Best cross-lingual transfer across many language pairs | granite-embedding-311m-multilingual-r2                                                                                                                                                                           |\n| Predominantly English data                             | [granite-embedding-english-r2](https://huggingface.co/ibm-granite/granite-embedding-english-r2) or [granite-embedding-small-english-r2](https://huggingface.co/ibm-granite/granite-embedding-small-english-r2) |\n\n## Try The Models\n\nBoth models are available now on Hugging Face under the [IBM Granite Embedding collection](https://huggingface.co/collections/ibm-granite/granite-embedding-models):\n\n- [granite-embedding-311m-multilingual-r2](https://huggingface.co/ibm-granite/granite-embedding-311m-multilingual-r2)\n- [granite-embedding-97m-multilingual-r2](https://huggingface.co/ibm-granite/granite-embedding-97m-multilingual-r2)\n\nYou can try the small models interactively (on CPU) via a Granite Embedding demo [here](https://huggingface.co/spaces/ibm-granite/granite-embedding) on Hugging Face Spaces, or run the full examples notebook in Google Colab:\n\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/ibm-granite/granite-embedding-models/blob/main/code/multilingual_r2_examples.ipynb)\n\nYou can access our detailed technical report covering the full training methodology, per-language evaluations, and pruning ablations here [Granite Multilingual Embedding R2 report](https://arxiv.org/abs/2605.13521). For questions, feedback, or issues, visit [ibm-granite/granite-embedding-models](https://github.com/ibm-granite/granite-embedding-models) on GitHub.\n\n**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](https://github.com/ibm-granite/granite-embedding-models) — we're happy to help with integration, testing, and any questions about licensing or deployment.\n\nGive 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.\n",
  "authors": [],
  "captured_at": "2026-10-19T01:26:53.998049939+00:00",
  "category": "ai",
  "content_html": "<blockquote>\n<p><strong>TL;DR:</strong> 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.</p>\n</blockquote>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/LrZQDi73p2iIqRJTd25f7.png\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/LrZQDi73p2iIqRJTd25f7.png\" alt=\"Granite Embedding Multilingual R2\" title=\"Granite Multilingual Embedding Intro Picture\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p><strong>In this post:</strong> <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#enterprise-ready-by-design\">Enterprise-Ready by Design</a> · <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#a-strong-sub-100m-multilingual-model\">A Strong Sub-100M Multilingual Model</a> · <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#what-changed-from-r1\">What Changed from R1</a> · <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#training-the-full-size-311m-model\">Training the Full-Size 311M Model</a> · <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#building-the-compact-97m-multilingual-model\">Building the compact 97M Multilingual Model</a> · <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#benchmark-results\">Benchmark Results</a> · <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#matryoshka-embeddings-311m\">Matryoshka Embeddings</a> · <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#deployment-options\">Deployment Options</a> · <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#for-framework-integrators\">For Framework Integrators</a> · <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#which-model-should-you-use\">Which Model Should You Use?</a> · <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#try-the-models\">Try The Models</a></p>\n<p>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.</p>\n<p>The Granite Embedding Multilingual R2 release narrows that gap considerably. We're releasing two new multilingual embedding models:</p>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ibm-granite/granite-embedding-311m-multilingual-r2\"><strong>granite-embedding-311m-multilingual-r2</strong></a> — A 311M-parameter full-size model with 768-dimensional embeddings, Matryoshka dimension support, and top-tier multilingual retrieval quality.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ibm-granite/granite-embedding-97m-multilingual-r2\"><strong>granite-embedding-97m-multilingual-r2</strong></a> — A 97M-parameter compact model with 384-dimensional embeddings that delivers strong retrieval quality for its size.</li>\n</ul>\n<p>Both models support <strong>200+ languages</strong> with enhanced retrieval quality for <strong>52 languages and programming code</strong>, handle context lengths up to <strong>32,768 tokens</strong> (a 64x increase over their R1 predecessors), and are released under the <strong>Apache 2.0</strong> license. They work out of the box with <code>sentence-transformers</code> and <code>transformers</code>, require no task-specific instructions, and are compatible as drop-in replacements in <strong>LangChain</strong>, <strong>LlamaIndex</strong>, <strong>Haystack</strong>, and <strong>Milvus</strong> 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.</p>\n<p><strong>52 enhanced-support languages</strong> (click to expand)</p>\n<p>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:</p>\n<p>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).</p>\n<p>Additionally, the models are trained on <strong>programming code</strong> (Python, Go, Java, JavaScript, PHP, Ruby, SQL, C, C++) and support cross-lingual code retrieval.</p>\n<h2>Enterprise-Ready by Design</h2>\n<p>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 <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/ibm-granite/GneissWeb\">GneissWeb</a>, 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.</p>\n<h2>A Strong Sub-100M Multilingual Model</h2>\n<p>The standout of this release is <strong>granite-embedding-97m-multilingual-r2</strong>. At 97 million parameters, it scores <strong>60.3 on Multilingual MTEB Retrieval</strong> 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 <strong>+9.4 point gap</strong> on a mature benchmark.</p>\n<p>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 <strong>+12.2 point gain on MTEB Multilingual Retrieval</strong> over its direct predecessor, driven by a new architecture, better training data, and a novel pruning methodology (more on that below). The full-size <strong>granite-embedding-311m-multilingual-r2</strong> scores <strong>65.2</strong> on the same benchmark, a <strong>+13.0 point gain</strong> over its R1 predecessor.</p>\n<h2>What Changed from R1</h2>\n<p>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:</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/jhz201_Ud5zUWfA3k4ITA.png\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/jhz201_Ud5zUWfA3k4ITA.png\" alt=\"Granite Embedding R2 Architecture\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/modernbert\">ModernBERT</a> 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.</p>\n<p>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.</p>\n<h2>Training the Full-Size 311M Model</h2>\n<p>The 311M model is a 22-layer ModernBERT encoder with a 262K-token multilingual vocabulary, trained through a multi-stage pipeline:</p>\n<ol>\n<li><strong>Knowledge distillation</strong>: 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.</li>\n<li><strong>Contrastive fine-tuning</strong>: 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.</li>\n<li><strong>Model merging</strong>: 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.</li>\n<li><strong>Matryoshka Representation Learning</strong>: 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 <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#matryoshka-embeddings-311m\">Matryoshka Embeddings</a> below).</li>\n</ol>\n<p>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.</p>\n<h2>Building the compact 97M Multilingual model</h2>\n<p>The 97M model is trained through a combination of <strong>vocabulary selection</strong> and <strong>knowledge distillation</strong>:</p>\n<ol>\n<li><strong>Vocabulary selection</strong>: 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.</li>\n<li><strong>Knowledge distillation</strong>: The pruned model is then finetuned using knowledge distillation from multiple teacher models (including a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ibm-granite/granite-4.1-8b\">Granite 4.1 8B</a> and Mistral Instruct decoder-based teacher) and contrastive training to improve retrieval quality.</li>\n</ol>\n<p>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.</p>\n<h2>Benchmark Results</h2>\n<h3>Multilingual Retrieval</h3>\n<p>Performance across the main benchmark suite sorted by model size. Scores are averages across tasks within each benchmark (higher is better):</p>\n<table>\n<thead>\n<tr>\n<th>Model</th>\n<th>Params</th>\n<th>Active Params</th>\n<th>Embed Dim</th>\n<th>MTEB Multilingual Retrieval (18)</th>\n<th>Code (12)</th>\n<th>English Retrieval (10)</th>\n<th>LongEmbed (6)</th>\n<th>RaR-b (17)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>F2LLM-v2-80M</td>\n<td>80M</td>\n<td>32M</td>\n<td>320</td>\n<td>50.1</td>\n<td>68.0</td>\n<td>47.5</td>\n<td>31.7</td>\n<td>17.9</td>\n</tr>\n<tr>\n<td>multilingual-e5-small</td>\n<td>118M</td>\n<td>22M</td>\n<td>384</td>\n<td>50.9</td>\n<td>53.5</td>\n<td>46.5</td>\n<td>38.8</td>\n<td>20.3</td>\n</tr>\n<tr>\n<td>granite-embedding-107m-multilingual (R1)</td>\n<td>107M</td>\n<td>11M</td>\n<td>384</td>\n<td>48.1</td>\n<td>40.7</td>\n<td>47.9</td>\n<td>34.3</td>\n<td>17.1</td>\n</tr>\n<tr>\n<td>paraphrase-multilingual-MiniLM-L12-v2</td>\n<td>118M</td>\n<td>22M</td>\n<td>384</td>\n<td>36.6</td>\n<td>23.5</td>\n<td>35.9</td>\n<td>20.9</td>\n<td>10.9</td>\n</tr>\n<tr>\n<td>jina-embeddings-v5-text-nano</td>\n<td>212M</td>\n<td>113M</td>\n<td>768</td>\n<td>63.3</td>\n<td>71.2</td>\n<td>58.8</td>\n<td>63.6</td>\n<td>25.2</td>\n</tr>\n<tr>\n<td>harrier-oss-v1-270m</td>\n<td>268M</td>\n<td>100M</td>\n<td>640</td>\n<td>66.4</td>\n<td>62.4</td>\n<td>52.1</td>\n<td>64.9</td>\n<td>32.9</td>\n</tr>\n<tr>\n<td>multilingual-e5-base</td>\n<td>278M</td>\n<td>86M</td>\n<td>768</td>\n<td>52.7</td>\n<td>52.6</td>\n<td>49.0</td>\n<td>40.5</td>\n<td>23.4</td>\n</tr>\n<tr>\n<td>granite-embedding-278m-multilingual (R1)</td>\n<td>278M</td>\n<td>86M</td>\n<td>768</td>\n<td>52.2</td>\n<td>48.5</td>\n<td>51.5</td>\n<td>37.7</td>\n<td>18.9</td>\n</tr>\n<tr>\n<td>embeddinggemma-300m</td>\n<td>308M</td>\n<td>106M</td>\n<td>768</td>\n<td>62.5</td>\n<td>68.7</td>\n<td>54.6</td>\n<td>55.4</td>\n<td>26.1</td>\n</tr>\n<tr>\n<td>gte-multilingual-base</td>\n<td>305M</td>\n<td>113M</td>\n<td>768</td>\n<td>57.2</td>\n<td>57.5</td>\n<td>50.8</td>\n<td>62.1</td>\n<td>19.0</td>\n</tr>\n<tr>\n<td>snowflake-arctic-embed-m-v2.0</td>\n<td>305M</td>\n<td>113M</td>\n<td>768</td>\n<td>54.8</td>\n<td>55.2</td>\n<td>58.4</td>\n<td>55.4</td>\n<td>23.3</td>\n</tr>\n<tr>\n<td>multilingual-e5-large</td>\n<td>560M</td>\n<td>304M</td>\n<td>1024</td>\n<td>53.7</td>\n<td>55.8</td>\n<td>51.5</td>\n<td>40.4</td>\n<td>25.4</td>\n</tr>\n<tr>\n<td>text-embedding-3-small (OpenAI, API only)</td>\n<td>—</td>\n<td>—</td>\n<td>1536</td>\n<td>50.7</td>\n<td>—</td>\n<td>53.8</td>\n<td>53.6</td>\n<td>23.2</td>\n</tr>\n<tr>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n<td></td>\n</tr>\n<tr>\n<td><strong>granite-embedding-97m-multilingual-r2</strong></td>\n<td><strong>97M</strong></td>\n<td><strong>28M</strong></td>\n<td><strong>384</strong></td>\n<td><strong>60.3</strong></td>\n<td><strong>60.4</strong></td>\n<td><strong>50.1</strong></td>\n<td><strong>65.6</strong></td>\n<td><strong>24.9</strong></td>\n</tr>\n<tr>\n<td><strong>granite-embedding-311m-multilingual-r2</strong></td>\n<td><strong>311M</strong></td>\n<td><strong>110M</strong></td>\n<td><strong>768</strong></td>\n<td><strong>65.2 (#2)</strong></td>\n<td><strong>63.8 (#3)</strong></td>\n<td><strong>52.6 (#5)</strong></td>\n<td><strong>71.7 (#1)</strong></td>\n<td><strong>28.0 (#2)</strong></td>\n</tr>\n</tbody>\n</table>\n<p>A few things stand out:</p>\n<ul>\n<li><strong>The 97M R2 model beats multilingual-e5-base and gte-multilingual-base</strong> (~300M parameter models) on average and on most individual benchmarks, despite being roughly 3x smaller.</li>\n<li><strong><code>paraphrase-multilingual-MiniLM-L12-v2</code> — a widely-used framework default — scores 36.6</strong>, a full <strong>+23.7 points</strong> behind the 97M R2 model, which is also slightly smaller (97M vs 110M parameters) with the same 384-dimensional output.</li>\n<li><strong>LongEmbed is the biggest R1-to-R2 gain</strong>: +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.</li>\n<li><strong>Code retrieval improves dramatically</strong>: +19.7 (97M) and +15.3 (311M) over R1, reflecting the new code training set, larger context window, and better training methodology.</li>\n<li><strong>In the broader competitive field</strong>, 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).</li>\n</ul>\n<h3>Speed and Throughput</h3>\n<p>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:</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/1ltJtX2knfzUA5BekMQsh.png\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/1ltJtX2knfzUA5BekMQsh.png\" alt=\"Speed vs. Quality: 97M model matches 300M-class quality at 3x the parameter efficiency\" title=\"Speed vs Throughput For Top Multilingual Embedding Models under 500M params\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>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.</p>\n<h2>Matryoshka Embeddings (311M)</h2>\n<p>The 311M model supports <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/abs/2205.13147\">Matryoshka Representation Learning</a>, 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.</p>\n<p>Here's how retrieval quality holds up across embedding dimensions:</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/myYhY1YHLY9Vs3l0gyMJB.png\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/myYhY1YHLY9Vs3l0gyMJB.png\" alt=\"Matryoshka embeddings: graceful quality degradation across truncated dimensions\" title=\"Performance Change While Prunning the Embeddings to Fewer Entries\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>The quality loss from dimension reduction is remarkably small. Cutting from 768 to 256 dimensions — a <strong>3x reduction</strong> 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 <strong>6x reduction</strong>), the model still scores 63.7 on MTEB Multilingual Retrieval and 62.3 on Code — retaining over <strong>97%</strong> 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).</p>\n<p>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.</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">sentence_transformers</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">SentenceTransformer</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">model</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">SentenceTransformer</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">ibm-granite/granite-embedding-311m-multilingual-r2<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Full 768-dimensional embeddings\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">full</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">model</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">encode</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">example text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">print</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">full</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">shape</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>  <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> (1, 768)\n</span>\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Truncated to 384 dimensions\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">small</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">model</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">encode</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">example text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">truncate_dim</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">384</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">print</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">small</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">shape</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>  <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> (1, 384)\n</span></span></span></code></pre>\n<p>The 97M model does not support Matryoshka — 384 dimensions is already compact.</p>\n<h3>Cross-lingual Retrieval</h3>\n<p>Average performance on cross-lingual tasks within MTEB Retrieval. <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/datasets/facebook/belebele\">Belebele</a> measures cross-lingual passage matching across 122 languages; MLQA measures extractive cross-lingual question answering retrieval across 7 languages.</p>\n<table>\n<thead>\n<tr>\n<th>Model</th>\n<th>Belebele Retrieval</th>\n<th>MLQA Retrieval</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>granite-embedding-107m-multilingual (R1)</td>\n<td>55.1</td>\n<td>60.5</td>\n</tr>\n<tr>\n<td>granite-embedding-278m-multilingual (R1)</td>\n<td>62.2</td>\n<td>63.0</td>\n</tr>\n<tr>\n<td>granite-embedding-97m-multilingual-r2</td>\n<td>52.9</td>\n<td>60.5</td>\n</tr>\n<tr>\n<td><strong>granite-embedding-311m-multilingual-r2</strong></td>\n<td><strong>66.5</strong></td>\n<td><strong>67.1</strong></td>\n</tr>\n</tbody>\n</table>\n<p>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.</p>\n<p>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.</p>\n<h2>Deployment Options</h2>\n<p>Both models ship with multiple deployment paths for production use. Install the core library with:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">pip</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> install sentence-transformers</span>\n</span></span></code></pre>\n<p><strong>Sentence Transformers</strong> (recommended for most users):</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">sentence_transformers</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">SentenceTransformer</span><span class=\"syntax-punctuation syntax-separator syntax-import-list syntax-python\">,</span> <span class=\"syntax-meta syntax-generic-name syntax-python\">util</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">model</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">SentenceTransformer</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">ibm-granite/granite-embedding-97m-multilingual-r2<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">queries</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span>\n    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">What is the tallest mountain in Japan?<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>          <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> English\n</span>    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Wer hat das Lied Achy Breaky Heart geschrieben?<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span> <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> German\n</span>    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">ドイツの首都はどこですか？<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>                            <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Japanese\n</span><span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">passages</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span>\n    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">富士山は、静岡県と山梨県にまたがる活火山で、標高3776.12 mで日本最高峰の独立峰である。<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>  <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Japanese\n</span>    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Achy Breaky Heart is a country song written by Don Von Tress.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>                        <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> English\n</span>    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>                <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> German\n</span><span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">q_emb</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">model</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">encode</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">queries</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">p_emb</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">model</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">encode</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">passages</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">print</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">util</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">cos_sim</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">q_emb</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">p_emb</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Each query scores highest against its matching passage — across languages\n</span></span></span></code></pre>\n<p><strong>LangChain</strong> (<code>pip install langchain-huggingface</code>):</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">langchain_huggingface</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">HuggingFaceEmbeddings</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">embeddings</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">HuggingFaceEmbeddings</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\">\n    <span class=\"syntax-variable syntax-parameter syntax-python\">model_name</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">ibm-granite/granite-embedding-97m-multilingual-r2<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span>\n</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">docs</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">embeddings</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">embed_documents</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span>\n    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">富士山は日本最高峰の独立峰です。<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Mount Fuji is Japan&#39;s highest peak.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">query</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">embeddings</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">embed_query</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">What is Japan&#39;s tallest mountain?<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Drop-in replacement anywhere LangChain accepts an Embeddings object\n</span></span></span></code></pre>\n<p><strong>LlamaIndex</strong> (<code>pip install llama-index-embeddings-huggingface</code>):</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">llama_index</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-import-name syntax-python\">embeddings</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-import-name syntax-python\">huggingface</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">HuggingFaceEmbedding</span></span>\n<span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">llama_index</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-import-name syntax-python\">core</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">Settings</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">embed_model</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">HuggingFaceEmbedding</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\">\n    <span class=\"syntax-variable syntax-parameter syntax-python\">model_name</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">ibm-granite/granite-embedding-97m-multilingual-r2<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span>\n</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Settings</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">embed_model</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">embed_model</span></span>  <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> applies globally to any index or pipeline\n</span></span></span></code></pre>\n<p><strong>Haystack</strong> (<code>pip install sentence-transformers haystack-ai</code>)</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">haystack</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-import-name syntax-python\">components</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-import-name syntax-python\">embedders</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-punctuation syntax-section syntax-import-list syntax-begin syntax-python\">(</span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\">\n    <span class=\"syntax-meta syntax-generic-name syntax-python\">SentenceTransformersDocumentEmbedder</span><span class=\"syntax-punctuation syntax-separator syntax-import-list syntax-python\">,</span>\n    <span class=\"syntax-meta syntax-generic-name syntax-python\">SentenceTransformersTextEmbedder</span><span class=\"syntax-punctuation syntax-separator syntax-import-list syntax-python\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-import-list syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">haystack</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-import-name syntax-python\">components</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-import-name syntax-python\">retrievers</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-import-name syntax-python\">in_memory</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">InMemoryEmbeddingRetriever</span></span>\n<span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">haystack</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-import-name syntax-python\">dataclasses</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">Document</span></span>\n<span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">haystack</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-import-name syntax-python\">document_stores</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-import-name syntax-python\">in_memory</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">InMemoryDocumentStore</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">doc_embedder</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">SentenceTransformersDocumentEmbedder</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\">\n    <span class=\"syntax-variable syntax-parameter syntax-python\">model</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">ibm-granite/granite-embedding-97m-multilingual-r2<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span>\n</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">query_embedder</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">SentenceTransformersTextEmbedder</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\">\n    <span class=\"syntax-variable syntax-parameter syntax-python\">model</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">ibm-granite/granite-embedding-97m-multilingual-r2<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span>\n</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">doc_embedder</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">warm_up</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">query_embedder</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">warm_up</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Embed and index documents\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">document_store</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">InMemoryDocumentStore</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">result_docs</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">doc_embedder</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">run</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">documents</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span>\n    <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">Document</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">content</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">富士山は日本最高峰の独立峰です。<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n    <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">Document</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">content</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Mount Fuji is Japan&#39;s highest peak.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n    <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">Document</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">content</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Achy Breaky Heart is a country song written by Don Von Tress.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n    <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">Document</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">content</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">document_store</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">write_documents</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">result_docs</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">documents<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Embed query and retrieve\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">result_query</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">query_embedder</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">run</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">text</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">What is Japan&#39;s tallest mountain?<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">retriever</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">InMemoryEmbeddingRetriever</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">document_store</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">document_store</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">results</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">retriever</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">run</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">query_embedding</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">result_query</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">embedding<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">top_k</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">2</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-statement syntax-for syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-for syntax-python\">for</span> <span class=\"syntax-meta syntax-generic-name syntax-python\">doc</span> <span class=\"syntax-meta syntax-statement syntax-for syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-for syntax-in syntax-python\">in</span></span></span><span class=\"syntax-meta syntax-statement syntax-for syntax-python\"> <span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">results</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">documents<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span><span class=\"syntax-punctuation syntax-section syntax-block syntax-for syntax-python\">:</span></span>\n    <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">print</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-storage syntax-type syntax-string syntax-python\">f</span><span class=\"syntax-meta syntax-string syntax-interpolated syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-interpolated syntax-python\"><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-begin syntax-python\">{</span><span class=\"syntax-source syntax-python syntax-embedded\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">doc</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">score</span></span></span><span class=\"syntax-meta syntax-format-spec syntax-python\"><span class=\"syntax-constant syntax-other syntax-format-spec syntax-python\">:.3f</span></span></span><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-end syntax-python\">}</span></span><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">  </span><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-begin syntax-python\">{</span><span class=\"syntax-source syntax-python syntax-embedded\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">doc</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">content</span></span></span></span><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-end syntax-python\">}</span></span><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> 0.961  Mount Fuji is Japan&#39;s highest peak.\n</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> 0.913  富士山は日本最高峰の独立峰です。\n</span></span></span></code></pre>\n<p><strong>Milvus</strong> (<code>pip install pymilvus sentence-transformers</code>)</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">pymilvus</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">MilvusClient</span></span>\n<span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">sentence_transformers</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">SentenceTransformer</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">model</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">SentenceTransformer</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">ibm-granite/granite-embedding-97m-multilingual-r2<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Use &quot;./milvus.db&quot; for local persistence or a server URI for production\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">client</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">MilvusClient</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">:memory:<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">client</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">create_collection</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">collection_name</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">multilingual_docs<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">dimension</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">384</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">docs</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span>\n    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">富士山は日本最高峰の独立峰です。<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Mount Fuji is Japan&#39;s highest peak.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Achy Breaky Heart is a country song written by Don Von Tress.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n    <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-list syntax-python\">,</span>\n<span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">embeddings</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">model</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">encode</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">docs</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">tolist</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">client</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">insert</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\">\n    <span class=\"syntax-variable syntax-parameter syntax-python\">collection_name</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">multilingual_docs<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n    <span class=\"syntax-variable syntax-parameter syntax-python\">data</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span><span class=\"syntax-meta syntax-structure syntax-dictionary-or-set syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-begin syntax-python\">{</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">id<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">i</span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">vector<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">emb</span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary-or-set syntax-python\">,</span> <span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-key-value syntax-python\">:</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">doc</span></span><span class=\"syntax-punctuation syntax-section syntax-dictionary-or-set syntax-end syntax-python\">}</span></span> <span class=\"syntax-meta syntax-expression syntax-generator syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-for syntax-generator syntax-python\">for</span> <span class=\"syntax-meta syntax-generic-name syntax-python\">i</span><span class=\"syntax-punctuation syntax-separator syntax-target-list syntax-python\">,</span> (<span class=\"syntax-meta syntax-generic-name syntax-python\">emb</span><span class=\"syntax-punctuation syntax-separator syntax-target-list syntax-python\">,</span> <span class=\"syntax-meta syntax-generic-name syntax-python\">doc</span>) <span class=\"syntax-keyword syntax-control syntax-flow syntax-for syntax-in syntax-python\">in</span></span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">enumerate</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">zip</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">embeddings</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">docs</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">query_emb</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">model</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">encode</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">What is Japan&#39;s tallest mountain?<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span><span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">tolist</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">results</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">client</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">search</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\">\n    <span class=\"syntax-variable syntax-parameter syntax-python\">collection_name</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">multilingual_docs<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n    <span class=\"syntax-variable syntax-parameter syntax-python\">data</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">query_emb</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n    <span class=\"syntax-variable syntax-parameter syntax-python\">limit</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">2</span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n    <span class=\"syntax-variable syntax-parameter syntax-python\">output_fields</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-structure syntax-list syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-list syntax-begin syntax-python\">[</span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span><span class=\"syntax-punctuation syntax-section syntax-list syntax-end syntax-python\">]</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span>\n</span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-statement syntax-for syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-for syntax-python\">for</span> <span class=\"syntax-meta syntax-generic-name syntax-python\">hit</span> <span class=\"syntax-meta syntax-statement syntax-for syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-for syntax-in syntax-python\">in</span></span></span><span class=\"syntax-meta syntax-statement syntax-for syntax-python\"> <span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">results</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">0</span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span><span class=\"syntax-punctuation syntax-section syntax-block syntax-for syntax-python\">:</span></span>\n    <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-support syntax-function syntax-builtin syntax-python\">print</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-storage syntax-type syntax-string syntax-python\">f</span><span class=\"syntax-meta syntax-string syntax-interpolated syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-interpolated syntax-python\"><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-begin syntax-python\">{</span><span class=\"syntax-source syntax-python syntax-embedded\"><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">hit</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-single syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&#39;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-single syntax-python\">distance<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&#39;</span></span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span></span><span class=\"syntax-meta syntax-format-spec syntax-python\"><span class=\"syntax-constant syntax-other syntax-format-spec syntax-python\">:.3f</span></span></span><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-end syntax-python\">}</span></span><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">  </span><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-begin syntax-python\">{</span><span class=\"syntax-source syntax-python syntax-embedded\"><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">hit</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-single syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&#39;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-single syntax-python\">entity<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&#39;</span></span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-single syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&#39;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-single syntax-python\">text<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&#39;</span></span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span></span></span><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-end syntax-python\">}</span></span><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> 0.961  Mount Fuji is Japan&#39;s highest peak.\n</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> 0.913  富士山は日本最高峰の独立峰です。\n</span></span></span></code></pre>\n<p>Both models also ship with pre-converted <strong>ONNX</strong> and <strong>OpenVINO</strong> weights for optimized CPU/accelerator inference, work as embedding endpoints via <strong><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://docs.vllm.ai/\">vLLM</a></strong> (<code>vllm serve ... --task embed</code>), and can be converted to GGUF for <strong><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ollama.com/\">Ollama</a></strong> using <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/ggerganov/llama.cpp\">llama.cpp</a>. See the model cards for full deployment examples.</p>\n<h2>For Framework Integrators</h2>\n<p>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:</p>\n<ul>\n<li><strong>License</strong>: Apache 2.0, trained without MS-MARCO</li>\n<li><strong>Drop-in behavior</strong>: No task-specific instruction prefix required — behaves like <code>all-MiniLM-L6-v2</code> at the API level. Existing code that calls <code>.encode()</code> works unchanged.</li>\n<li><strong>Dimensionality</strong>: 384-dimensional output (97M) and 768-dimensional output (311M), matching the most common existing defaults. No index migration required.</li>\n<li><strong>Model size</strong>: The 97M model's weights are 195 MB (safetensors) — less than half the size of <code>paraphrase-multilingual-MiniLM-L12-v2</code> (471 MB), the most common multilingual default. The quantized ONNX weights are just 98 MB, comparable to <code>all-MiniLM-L6-v2</code> (91 MB) while covering 200+ languages.</li>\n<li><strong>CPU-friendly</strong>: Ships with ONNX and OpenVINO weights for optimized CPU inference. No GPU dependency for a getting-started tutorial.</li>\n<li><strong>Multilingual by default</strong>: 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.</li>\n<li><strong>Stable identifier</strong>: <code>ibm-granite/granite-embedding-97m-multilingual-r2</code> on Hugging Face, maintained by IBM under the Granite model family.</li>\n</ul>\n<p>To discuss adopting these models as a default in your project, open an issue at <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/ibm-granite/granite-embedding-models\">ibm-granite/granite-embedding-models</a>.</p>\n<h2>Which Model Should You Use?</h2>\n<p>These two multilingual models are part of the broader <strong>Granite Embedding R2</strong> family, which also includes two high-performing English-focused models: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ibm-granite/granite-embedding-english-r2\">granite-embedding-english-r2</a> (149M parameters) and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ibm-granite/granite-embedding-small-english-r2\">granite-embedding-small-english-r2</a> (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.</p>\n<table>\n<thead>\n<tr>\n<th>If you need...</th>\n<th>Use</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Best multilingual retrieval quality</td>\n<td><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ibm-granite/granite-embedding-311m-multilingual-r2\">granite-embedding-311m-multilingual-r2</a></td>\n</tr>\n<tr>\n<td>Flexible embedding dimensions (storage/speed tradeoff)</td>\n<td>granite-embedding-311m-multilingual-r2 (Matryoshka)</td>\n</tr>\n<tr>\n<td>Maximum throughput / edge deployment / low latency</td>\n<td><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ibm-granite/granite-embedding-97m-multilingual-r2\">granite-embedding-97m-multilingual-r2</a></td>\n</tr>\n<tr>\n<td>Best cross-lingual transfer across many language pairs</td>\n<td>granite-embedding-311m-multilingual-r2</td>\n</tr>\n<tr>\n<td>Predominantly English data</td>\n<td><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ibm-granite/granite-embedding-english-r2\">granite-embedding-english-r2</a> or <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ibm-granite/granite-embedding-small-english-r2\">granite-embedding-small-english-r2</a></td>\n</tr>\n</tbody>\n</table>\n<h2>Try The Models</h2>\n<p>Both models are available now on Hugging Face under the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/collections/ibm-granite/granite-embedding-models\">IBM Granite Embedding collection</a>:</p>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ibm-granite/granite-embedding-311m-multilingual-r2\">granite-embedding-311m-multilingual-r2</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ibm-granite/granite-embedding-97m-multilingual-r2\">granite-embedding-97m-multilingual-r2</a></li>\n</ul>\n<p>You can try the small models interactively (on CPU) via a Granite Embedding demo <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/spaces/ibm-granite/granite-embedding\">here</a> on Hugging Face Spaces, or run the full examples notebook in Google Colab:</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://colab.research.google.com/github/ibm-granite/granite-embedding-models/blob/main/code/multilingual_r2_examples.ipynb\"><picture class=\"article-picture article-badge\" style=\"--image-width:160px;--image-ratio:160 / 24\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" width=\"160\" height=\"24\" alt=\"Open In Colab\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<p>You can access our detailed technical report covering the full training methodology, per-language evaluations, and pruning ablations here <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://arxiv.org/abs/2605.13521\">Granite Multilingual Embedding R2 report</a>. For questions, feedback, or issues, visit <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/ibm-granite/granite-embedding-models\">ibm-granite/granite-embedding-models</a> on GitHub.</p>\n<p><strong>Framework maintainers:</strong> If you'd like to adopt these models as a default in your project, open an issue at <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/ibm-granite/granite-embedding-models\">ibm-granite/granite-embedding-models</a> — we're happy to help with integration, testing, and any questions about licensing or deployment.</p>\n<p>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.</p>\n",
  "content_markdown": "> **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.\n\n[![Granite Embedding Multilingual R2](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/LrZQDi73p2iIqRJTd25f7.png \"Granite Multilingual Embedding Intro Picture\")](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/LrZQDi73p2iIqRJTd25f7.png)\n\n**In this post:** [Enterprise-Ready by Design](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#enterprise-ready-by-design) · [A Strong Sub-100M Multilingual Model](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#a-strong-sub-100m-multilingual-model) · [What Changed from R1](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#what-changed-from-r1) · [Training the Full-Size 311M Model](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#training-the-full-size-311m-model) · [Building the compact 97M Multilingual Model](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#building-the-compact-97m-multilingual-model) · [Benchmark Results](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#benchmark-results) · [Matryoshka Embeddings](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#matryoshka-embeddings-311m) · [Deployment Options](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#deployment-options) · [For Framework Integrators](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#for-framework-integrators) · [Which Model Should You Use?](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#which-model-should-you-use) · [Try The Models](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#try-the-models)\n\nMultilingual 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.\n\nThe Granite Embedding Multilingual R2 release narrows that gap considerably. We're releasing two new multilingual embedding models:\n\n- [**granite-embedding-311m-multilingual-r2**](https://huggingface.co/ibm-granite/granite-embedding-311m-multilingual-r2) — A 311M-parameter full-size model with 768-dimensional embeddings, Matryoshka dimension support, and top-tier multilingual retrieval quality.\n- [**granite-embedding-97m-multilingual-r2**](https://huggingface.co/ibm-granite/granite-embedding-97m-multilingual-r2) — A 97M-parameter compact model with 384-dimensional embeddings that delivers strong retrieval quality for its size.\n\nBoth 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.\n\n**52 enhanced-support languages** (click to expand)\n\nThe 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:\n\nAlbanian (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).\n\nAdditionally, the models are trained on **programming code** (Python, Go, Java, JavaScript, PHP, Ruby, SQL, C, C++) and support cross-lingual code retrieval.\n\n## Enterprise-Ready by Design\n\nBoth 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](https://huggingface.co/datasets/ibm-granite/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.\n\n## A Strong Sub-100M Multilingual Model\n\nThe 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.\n\nAt 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.\n\n## What Changed from R1\n\nThe 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:\n\n[![Granite Embedding R2 Architecture](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/jhz201_Ud5zUWfA3k4ITA.png)](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/jhz201_Ud5zUWfA3k4ITA.png)\n\n[ModernBERT](https://huggingface.co/blog/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.\n\nThe 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.\n\n## Training the Full-Size 311M Model\n\nThe 311M model is a 22-layer ModernBERT encoder with a 262K-token multilingual vocabulary, trained through a multi-stage pipeline:\n\n1. **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.\n2. **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.\n3. **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.\n4. **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](https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2#matryoshka-embeddings-311m) below).\n\nThe 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.\n\n## Building the compact 97M Multilingual model\n\nThe 97M model is trained through a combination of **vocabulary selection** and **knowledge distillation**:\n\n1. **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.\n2. **Knowledge distillation**: The pruned model is then finetuned using knowledge distillation from multiple teacher models (including a [Granite 4.1 8B](https://huggingface.co/ibm-granite/granite-4.1-8b) and Mistral Instruct decoder-based teacher) and contrastive training to improve retrieval quality.\n\nThis 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.\n\n## Benchmark Results\n\n### Multilingual Retrieval\n\nPerformance across the main benchmark suite sorted by model size. Scores are averages across tasks within each benchmark (higher is better):\n\n| Model                                      | Params   | Active Params | Embed Dim | MTEB Multilingual Retrieval (18) | Code (12)     | English Retrieval (10) | LongEmbed (6) | RaR-b (17)    |\n| ------------------------------------------ | -------- | ------------- | --------- | -------------------------------- | ------------- | ---------------------- | ------------- | ------------- |\n| F2LLM-v2-80M                               | 80M      | 32M           | 320       | 50.1                             | 68.0          | 47.5                   | 31.7          | 17.9          |\n| multilingual-e5-small                      | 118M     | 22M           | 384       | 50.9                             | 53.5          | 46.5                   | 38.8          | 20.3          |\n| granite-embedding-107m-multilingual (R1)   | 107M     | 11M           | 384       | 48.1                             | 40.7          | 47.9                   | 34.3          | 17.1          |\n| paraphrase-multilingual-MiniLM-L12-v2      | 118M     | 22M           | 384       | 36.6                             | 23.5          | 35.9                   | 20.9          | 10.9          |\n| jina-embeddings-v5-text-nano               | 212M     | 113M          | 768       | 63.3                             | 71.2          | 58.8                   | 63.6          | 25.2          |\n| harrier-oss-v1-270m                        | 268M     | 100M          | 640       | 66.4                             | 62.4          | 52.1                   | 64.9          | 32.9          |\n| multilingual-e5-base                       | 278M     | 86M           | 768       | 52.7                             | 52.6          | 49.0                   | 40.5          | 23.4          |\n| granite-embedding-278m-multilingual (R1)   | 278M     | 86M           | 768       | 52.2                             | 48.5          | 51.5                   | 37.7          | 18.9          |\n| embeddinggemma-300m                        | 308M     | 106M          | 768       | 62.5                             | 68.7          | 54.6                   | 55.4          | 26.1          |\n| gte-multilingual-base                      | 305M     | 113M          | 768       | 57.2                             | 57.5          | 50.8                   | 62.1          | 19.0          |\n| snowflake-arctic-embed-m-v2.0              | 305M     | 113M          | 768       | 54.8                             | 55.2          | 58.4                   | 55.4          | 23.3          |\n| multilingual-e5-large                      | 560M     | 304M          | 1024      | 53.7                             | 55.8          | 51.5                   | 40.4          | 25.4          |\n| text-embedding-3-small (OpenAI, API only)  | —        | —             | 1536      | 50.7                             | —             | 53.8                   | 53.6          | 23.2          |\n|                                            |          |               |           |                                  |               |                        |               |               |\n| **granite-embedding-97m-multilingual-r2**  | **97M**  | **28M**       | **384**   | **60.3**                         | **60.4**      | **50.1**               | **65.6**      | **24.9**      |\n| **granite-embedding-311m-multilingual-r2** | **311M** | **110M**      | **768**   | **65.2 (#2)**                    | **63.8 (#3)** | **52.6 (#5)**          | **71.7 (#1)** | **28.0 (#2)** |\n\nA few things stand out:\n\n- **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.\n- **`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.\n- **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.\n- **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.\n- **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).\n\n### Speed and Throughput\n\nEncoding 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:\n\n[![Speed vs. Quality: 97M model matches 300M-class quality at 3x the parameter efficiency](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/1ltJtX2knfzUA5BekMQsh.png \"Speed vs Throughput For Top Multilingual Embedding Models under 500M params\")](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/1ltJtX2knfzUA5BekMQsh.png)\n\nThe 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.\n\n## Matryoshka Embeddings (311M)\n\nThe 311M model supports [Matryoshka Representation Learning](https://arxiv.org/abs/2205.13147), 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.\n\nHere's how retrieval quality holds up across embedding dimensions:\n\n[![Matryoshka embeddings: graceful quality degradation across truncated dimensions](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/myYhY1YHLY9Vs3l0gyMJB.png \"Performance Change While Prunning the Embeddings to Fewer Entries\")](https://cdn-uploads.huggingface.co/production/uploads/642ae74b25442667e9bd72ed/myYhY1YHLY9Vs3l0gyMJB.png)\n\nThe 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).\n\nFor 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.\n\n```python\nfrom sentence_transformers import SentenceTransformer\n\nmodel = SentenceTransformer(\"ibm-granite/granite-embedding-311m-multilingual-r2\")\n\n# Full 768-dimensional embeddings\nfull = model.encode([\"example text\"])\nprint(full.shape)  # (1, 768)\n\n# Truncated to 384 dimensions\nsmall = model.encode([\"example text\"], truncate_dim=384)\nprint(small.shape)  # (1, 384)\n```\n\nThe 97M model does not support Matryoshka — 384 dimensions is already compact.\n\n### Cross-lingual Retrieval\n\nAverage performance on cross-lingual tasks within MTEB Retrieval. [Belebele](https://huggingface.co/datasets/facebook/belebele) measures cross-lingual passage matching across 122 languages; MLQA measures extractive cross-lingual question answering retrieval across 7 languages.\n\n| Model                                      | Belebele Retrieval | MLQA Retrieval |\n| ------------------------------------------ | ------------------ | -------------- |\n| granite-embedding-107m-multilingual (R1)   | 55.1               | 60.5           |\n| granite-embedding-278m-multilingual (R1)   | 62.2               | 63.0           |\n| granite-embedding-97m-multilingual-r2      | 52.9               | 60.5           |\n| **granite-embedding-311m-multilingual-r2** | **66.5**           | **67.1**       |\n\nThe 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.\n\nThe 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.\n\n## Deployment Options\n\nBoth models ship with multiple deployment paths for production use. Install the core library with:\n\n```bash\npip install sentence-transformers\n```\n\n**Sentence Transformers** (recommended for most users):\n\n```python\nfrom sentence_transformers import SentenceTransformer, util\n\nmodel = SentenceTransformer(\"ibm-granite/granite-embedding-97m-multilingual-r2\")\n\nqueries = [\n    \"What is the tallest mountain in Japan?\",          # English\n    \"Wer hat das Lied Achy Breaky Heart geschrieben?\", # German\n    \"ドイツの首都はどこですか？\",                            # Japanese\n]\n\npassages = [\n    \"富士山は、静岡県と山梨県にまたがる活火山で、標高3776.12 mで日本最高峰の独立峰である。\",  # Japanese\n    \"Achy Breaky Heart is a country song written by Don Von Tress.\",                        # English\n    \"Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.\",                # German\n]\n\nq_emb = model.encode(queries)\np_emb = model.encode(passages)\nprint(util.cos_sim(q_emb, p_emb))\n# Each query scores highest against its matching passage — across languages\n```\n\n**LangChain** (`pip install langchain-huggingface`):\n\n```python\nfrom langchain_huggingface import HuggingFaceEmbeddings\n\nembeddings = HuggingFaceEmbeddings(\n    model_name=\"ibm-granite/granite-embedding-97m-multilingual-r2\"\n)\n\ndocs = embeddings.embed_documents([\n    \"富士山は日本最高峰の独立峰です。\",\n    \"Mount Fuji is Japan's highest peak.\",\n])\nquery = embeddings.embed_query(\"What is Japan's tallest mountain?\")\n# Drop-in replacement anywhere LangChain accepts an Embeddings object\n```\n\n**LlamaIndex** (`pip install llama-index-embeddings-huggingface`):\n\n```python\nfrom llama_index.embeddings.huggingface import HuggingFaceEmbedding\nfrom llama_index.core import Settings\n\nembed_model = HuggingFaceEmbedding(\n    model_name=\"ibm-granite/granite-embedding-97m-multilingual-r2\"\n)\nSettings.embed_model = embed_model  # applies globally to any index or pipeline\n```\n\n**Haystack** (`pip install sentence-transformers haystack-ai`)\n\n```python\nfrom haystack.components.embedders import (\n    SentenceTransformersDocumentEmbedder,\n    SentenceTransformersTextEmbedder,\n)\nfrom haystack.components.retrievers.in_memory import InMemoryEmbeddingRetriever\nfrom haystack.dataclasses import Document\nfrom haystack.document_stores.in_memory import InMemoryDocumentStore\n\ndoc_embedder = SentenceTransformersDocumentEmbedder(\n    model=\"ibm-granite/granite-embedding-97m-multilingual-r2\"\n)\nquery_embedder = SentenceTransformersTextEmbedder(\n    model=\"ibm-granite/granite-embedding-97m-multilingual-r2\"\n)\ndoc_embedder.warm_up()\nquery_embedder.warm_up()\n\n# Embed and index documents\ndocument_store = InMemoryDocumentStore()\nresult_docs = doc_embedder.run(documents=[\n    Document(content=\"富士山は日本最高峰の独立峰です。\"),\n    Document(content=\"Mount Fuji is Japan's highest peak.\"),\n    Document(content=\"Achy Breaky Heart is a country song written by Don Von Tress.\"),\n    Document(content=\"Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.\"),\n])\ndocument_store.write_documents(result_docs[\"documents\"])\n\n# Embed query and retrieve\nresult_query = query_embedder.run(text=\"What is Japan's tallest mountain?\")\nretriever = InMemoryEmbeddingRetriever(document_store=document_store)\nresults = retriever.run(query_embedding=result_query[\"embedding\"], top_k=2)\nfor doc in results[\"documents\"]:\n    print(f\"{doc.score:.3f}  {doc.content}\")\n# 0.961  Mount Fuji is Japan's highest peak.\n# 0.913  富士山は日本最高峰の独立峰です。\n```\n\n**Milvus** (`pip install pymilvus sentence-transformers`)\n\n```python\nfrom pymilvus import MilvusClient\nfrom sentence_transformers import SentenceTransformer\n\nmodel = SentenceTransformer(\"ibm-granite/granite-embedding-97m-multilingual-r2\")\n\n# Use \"./milvus.db\" for local persistence or a server URI for production\nclient = MilvusClient(\":memory:\")\nclient.create_collection(collection_name=\"multilingual_docs\", dimension=384)\n\ndocs = [\n    \"富士山は日本最高峰の独立峰です。\",\n    \"Mount Fuji is Japan's highest peak.\",\n    \"Achy Breaky Heart is a country song written by Don Von Tress.\",\n    \"Berlin ist die Hauptstadt und ein Land der Bundesrepublik Deutschland.\",\n]\nembeddings = model.encode(docs).tolist()\nclient.insert(\n    collection_name=\"multilingual_docs\",\n    data=[{\"id\": i, \"vector\": emb, \"text\": doc} for i, (emb, doc) in enumerate(zip(embeddings, docs))],\n)\n\nquery_emb = model.encode([\"What is Japan's tallest mountain?\"]).tolist()\nresults = client.search(\n    collection_name=\"multilingual_docs\",\n    data=query_emb,\n    limit=2,\n    output_fields=[\"text\"],\n)\nfor hit in results[0]:\n    print(f\"{hit['distance']:.3f}  {hit['entity']['text']}\")\n# 0.961  Mount Fuji is Japan's highest peak.\n# 0.913  富士山は日本最高峰の独立峰です。\n```\n\nBoth models also ship with pre-converted **ONNX** and **OpenVINO** weights for optimized CPU/accelerator inference, work as embedding endpoints via **[vLLM](https://docs.vllm.ai/)** (`vllm serve ... --task embed`), and can be converted to GGUF for **[Ollama](https://ollama.com/)** using [llama.cpp](https://github.com/ggerganov/llama.cpp). See the model cards for full deployment examples.\n\n## For Framework Integrators\n\nIf 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:\n\n- **License**: Apache 2.0, trained without MS-MARCO\n- **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.\n- **Dimensionality**: 384-dimensional output (97M) and 768-dimensional output (311M), matching the most common existing defaults. No index migration required.\n- **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.\n- **CPU-friendly**: Ships with ONNX and OpenVINO weights for optimized CPU inference. No GPU dependency for a getting-started tutorial.\n- **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.\n- **Stable identifier**: `ibm-granite/granite-embedding-97m-multilingual-r2` on Hugging Face, maintained by IBM under the Granite model family.\n\nTo discuss adopting these models as a default in your project, open an issue at [ibm-granite/granite-embedding-models](https://github.com/ibm-granite/granite-embedding-models).\n\n## Which Model Should You Use?\n\nThese 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](https://huggingface.co/ibm-granite/granite-embedding-english-r2) (149M parameters) and [granite-embedding-small-english-r2](https://huggingface.co/ibm-granite/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.\n\n| If you need...                                         | Use                                                                                                                                                                                                              |\n| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Best multilingual retrieval quality                    | [granite-embedding-311m-multilingual-r2](https://huggingface.co/ibm-granite/granite-embedding-311m-multilingual-r2)                                                                                             |\n| Flexible embedding dimensions (storage/speed tradeoff) | granite-embedding-311m-multilingual-r2 (Matryoshka)                                                                                                                                                              |\n| Maximum throughput / edge deployment / low latency     | [granite-embedding-97m-multilingual-r2](https://huggingface.co/ibm-granite/granite-embedding-97m-multilingual-r2)                                                                                               |\n| Best cross-lingual transfer across many language pairs | granite-embedding-311m-multilingual-r2                                                                                                                                                                           |\n| Predominantly English data                             | [granite-embedding-english-r2](https://huggingface.co/ibm-granite/granite-embedding-english-r2) or [granite-embedding-small-english-r2](https://huggingface.co/ibm-granite/granite-embedding-small-english-r2) |\n\n## Try The Models\n\nBoth models are available now on Hugging Face under the [IBM Granite Embedding collection](https://huggingface.co/collections/ibm-granite/granite-embedding-models):\n\n- [granite-embedding-311m-multilingual-r2](https://huggingface.co/ibm-granite/granite-embedding-311m-multilingual-r2)\n- [granite-embedding-97m-multilingual-r2](https://huggingface.co/ibm-granite/granite-embedding-97m-multilingual-r2)\n\nYou can try the small models interactively (on CPU) via a Granite Embedding demo [here](https://huggingface.co/spaces/ibm-granite/granite-embedding) on Hugging Face Spaces, or run the full examples notebook in Google Colab:\n\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/ibm-granite/granite-embedding-models/blob/main/code/multilingual_r2_examples.ipynb)\n\nYou can access our detailed technical report covering the full training methodology, per-language evaluations, and pruning ablations here [Granite Multilingual Embedding R2 report](https://arxiv.org/abs/2605.13521). For questions, feedback, or issues, visit [ibm-granite/granite-embedding-models](https://github.com/ibm-granite/granite-embedding-models) on GitHub.\n\n**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](https://github.com/ibm-granite/granite-embedding-models) — we're happy to help with integration, testing, and any questions about licensing or deployment.\n\nGive 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.\n",
  "dateCreated": "2026-10-19T01:26:53.998049939+00:00",
  "date_created": "2026-05-14T18:55:01+00:00",
  "date_modified": "2026-05-14T18:55:01+00:00",
  "date_published": "2026-05-14T18:55:01+00:00",
  "description": "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…",
  "external_url": "https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/huggingface-co/2026/05/2026-05-14-granite-embedding-multilingual-r2-open-apache-2-0.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/huggingface-co/2026/05/2026-05-14-granite-embedding-multilingual-r2-open-apache-2-0.md"
  },
  "id": "urn:aggr:item:2fb9fbfd9680379addd4925bc9f3f7ad9a012825",
  "isBasedOn": {
    "@id": "https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2"
  },
  "mainEntity": {
    "@id": "https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-05-14-granite-embedding-multilingual-r2-open-apache-2-0/#webpage"
    },
    "dateModified": "2026-05-14T18:55:01+00:00",
    "datePublished": "2026-05-14T18:55:01+00:00",
    "headline": "Granite Embedding Multilingual R2: Open Apache 2.0 Multilingual Embeddings with 32K Context — Best Sub-100M Retrieval Quality",
    "image": {
      "@type": "ImageObject",
      "caption": null,
      "height": 90,
      "url": "https://cdn-thumbnails.huggingface.co/social-thumbnails/blog/ibm-granite/granite-embedding-multilingual-r2.png",
      "width": 160
    },
    "timeRequired": "PT16M",
    "url": "https://huggingface.co/blog/ibm-granite/granite-embedding-multilingual-r2",
    "wordCount": 3526
  },
  "name": "Archived snapshot: Granite Embedding Multilingual R2: Open Apache 2.0 Multilingual Embeddings with 32K Context — Best Sub-100M Retrieval Quality",
  "preview": {
    "alt": null,
    "color": null,
    "height": 90,
    "placeholder": {
      "data_url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNk+A8AAQUBAScY42YAAAAASUVORK5CYII=",
      "hash": ""
    },
    "url": "https://cdn-thumbnails.huggingface.co/social-thumbnails/blog/ibm-granite/granite-embedding-multilingual-r2.png",
    "width": 160
  },
  "reading_minutes": 16,
  "replicated_at": null,
  "source": "huggingface-co",
  "source_name": "Hugging Face - Blog",
  "summary": null,
  "tags": [],
  "temporalCoverage": "2026-10-19T01:26:53.998049939+00:00",
  "title": "Granite Embedding Multilingual R2: Open Apache 2.0 Multilingual Embeddings with 32K Context — Best Sub-100M Retrieval Quality",
  "url": "https://aggr.aymericbeaumet.com/items/huggingface-co/2026-05-14-granite-embedding-multilingual-r2-open-apache-2-0/",
  "word_count": 3526
}