Skip to content
AI/ML

Best Embedding Models in 2026: My Production RAG Shortlist

Embedding models now differ on modalities, deployment, and benchmark coverage; I explain how I'd shortlist and test them for production retrieval.

Topic
AI/ML
Reading time
6 min
Length
1,310 words
Published
Nov 6, 2026
11:07 am IST
In this article
  1. What changed in the embedding-model decision
  2. Can I compare these MTEB scores directly?
  3. My embedding-model shortlist for production
  4. Text retrieval without another inference service to operate
  5. Multimodal retrieval with a real requirement
  6. Self-hosting with an explicit operational reason
  7. Testing an embedding model against my own corpus
  8. What a better embedding model does not solve

OpenAI's embedding lineup remains on text-embedding-3, while the alternatives now include multimodal retrieval, compatible embedding families, and permissively licensed self-hosted models. My takeaway from Cognee's comparison of the best embedding models in 2026 is that there is no defensible single ranking: several published scores measure different things. I'd choose a shortlist around the application, then test retrieval against its actual documents.

I'm using Cognee's September 2026 comparison as the source for the specifications and prices below. I'd recheck provider documentation before committing a budget or changing an index. This is a selection guide, not a claim that every listed price will remain unchanged.

What changed in the embedding-model decision

I wouldn't frame this as OpenAI versus a single open-source replacement. The choices solve different problems. OpenAI offers text-only managed embeddings. Gemini Embedding 2 accepts text, images, audio, video, and PDFs in one embedding space. Cohere Embed 4 supports text, images, and mixed text-image documents.

Voyage 4 takes another direction: its family members produce compatible embeddings. A corpus can be indexed with one member and queried with another. I'd investigate that if indexing quality and query-serving cost needed different budgets, rather than assuming the same model must do both jobs.

For self-hosting, Cognee lists Qwen3-Embedding under Apache 2.0, and BGE-M3 and Microsoft Harrier OSS v1 under MIT. Those options move the decision from buying API calls toward provisioning inference capacity and owning its operation. I would treat that as an infrastructure choice, not just a model substitution.

Can I compare these MTEB scores directly?

Only within compatible evaluation setups. This is the most important qualification in the source, and the easiest one to lose while making a comparison spreadsheet.

Qwen3-Embedding-8B reports 75.22 Mean(Task) on MTEB English v2, with a retrieval result of 69.44. Qwen's 4B model reports 74.60 overall and 68.46 for retrieval under the same setup. I can compare those results. I cannot fairly place Harrier's Multilingual MTEB v2 result alongside them as another position in the same league table.

OpenAI's published averages of 64.6 for text-embedding-3-large and 62.3 for text-embedding-3-small come from its 2024 evaluation. I'd compare those two against each other, not interpret their distance from Qwen's newer benchmark numbers as the expected improvement in my application.

Cognee also distinguishes Mean(Task), which averages task results, from Mean(TaskType), which groups by task category first. Language coverage, partial task coverage, and available zero-shot metadata complicate comparisons further. For a RAG system, I'd prioritize retrieval results over an aggregate that also includes classification or clustering.

My embedding-model shortlist for production

Text retrieval without another inference service to operate

I'd start a managed, text-only evaluation with text-embedding-3-small. Cognee lists $0.02 per million input tokens and up to 1,536 dimensions, versus $0.13 and up to 3,072 dimensions for text-embedding-3-large. Both support shorter vectors through the dimensions parameter. My preference is a starting hypothesis about cost, not a declaration that small is good enough.

I'd bring in the large model if the smaller one missed important evidence. I'd also consider Voyage 4 where its compatible family offers a useful indexing/query split. I wouldn't migrate an already satisfactory search system merely because another model has a more attractive headline score.

Multimodal retrieval with a real requirement

For newsroom search that genuinely needs to retrieve media, I'd test Gemini Embedding 2 rather than assume text-only retrieval covers the requirement. For pages combining prose, screenshots, diagrams, or tables, I'd also examine Cohere Embed 4's mixed text-image inputs.

I'd first write down the retrieval task: finding an article about an image is not necessarily the same requirement as finding the image itself. I would keep those acceptance tests separate instead of letting a broad multimodal feature list decide the architecture.

Self-hosting with an explicit operational reason

I'd shortlist Qwen3-Embedding when infrastructure control matters and compare its sizes on the same corpus. Its published retrieval gap between 4B and 8B is narrower than the gap between 0.6B and 4B. That makes the middle model interesting to me, but doesn't establish its production value.

I'd consider BGE-M3 if I wanted dense, sparse, and multi-vector retrieval from one model. I'd include Harrier when evaluating multilingual dense retrieval. I wouldn't start with the largest available model unless a smaller candidate failed a requirement I could demonstrate.

Testing an embedding model against my own corpus

This is where I'd spend most of the evaluation effort. In an AI-assisted editorial workflow, I want to know whether the retrieved passages contain the evidence needed for the answer. A nicer generated summary would not convince me that retrieval improved.

  1. Define the eligible models. I'd filter on modality, languages, deployment constraints, license, and input limits before comparing benchmark scores. There is little value testing a model I cannot ship.
  2. Label representative queries. I'd collect realistic searches and identify the passages that should count as relevant. For my plain-English and Hinglish marketplace search, I'd include both forms explicitly rather than infer local usefulness from multilingual coverage alone.
  3. Freeze the retrieval setup. I'd keep corpus content, chunk boundaries, metadata filters, and retrieval settings unchanged for the first comparison. I'd record model configuration and dimensions with each run.
  4. Measure retrieval before generation. I'd inspect Recall@k, then ranking-sensitive measures such as MRR or nDCG. I'd also read failures: missing evidence and poorly ranked evidence deserve different follow-up tests.
  5. Test dimensions independently. I'd compare reduced vectors where supported. Larger vectors increase index footprint, but the retrieval loss from shortening them depends on the model and corpus.
  6. Check the complete workflow. I'd measure downstream answer quality, embedding throughput, query latency, storage, and API or inference cost. I'd approve a change only against an explicit quality and operating-budget target.

For a small local evaluation harness, I'd use a dependency-free helper like this. It calculates recall for one query using unique passage IDs; it does not measure ranking quality or call an embedding provider.

function recallAtK(retrievedIds, relevantIds, k) {
  if (!Number.isInteger(k) || k < 1) {
    throw new Error('k must be a positive integer');
  }

  const relevant = new Set(relevantIds);
  if (relevant.size === 0) return null;

  const retrieved = new Set(retrievedIds.slice(0, k));
  let hits = 0;

  for (const id of retrieved) {
    if (relevant.has(id)) hits += 1;
  }

  return hits / relevant.size;
}

I'd pass the ranked retrieval results and human-labelled relevant passage IDs into this function. Queries without relevance labels return null; I'd report those separately rather than quietly count them as retrieval failures. I'd inspect per-query results before trusting an average.

What a better embedding model does not solve

I wouldn't expect a longer context limit to fix chunking. Cognee explicitly cautions that a large input window does not mean an entire document should receive one embedding. I'd test chunk granularity separately after establishing the model baseline, so I could tell which change helped.

I also wouldn't equate self-hosted with free. The source distinguishes per-token API charges from hardware and operating costs. I'd include capacity planning and ownership in my decision, rather than compare an API invoice against model weights that happen to be downloadable.

Migration deserves its own check. Cognee states that moving an Ada index to either OpenAI v3 model requires re-embedding because their vector spaces are incompatible. I'd verify compatibility for any proposed switch instead of assuming that matching vector dimensions makes existing document embeddings reusable. Voyage's documented family compatibility is a specific capability, not permission to mix arbitrary models.

I'd ignore this comparison for now if my existing system meets its relevance, latency, and budget targets and I have no new modality or deployment requirement. I'd also avoid a model replacement while changing chunking and filters simultaneously; that experiment would not tell me which decision earned the result.

My next step would be a controlled retrieval evaluation, not a production migration. I'd keep the current model as the baseline, choose a challenger for a concrete reason, and require useful evidence from my own queries before accepting the operational work.

Deepak Kumar

Written by

Deepak Kumar

Sr Software Engineer at India Today Group | Aaj Tak · MERN Stack · Generative AI

I build RAG systems in production, on MongoDB Atlas Vector Search over a working editorial archive. I write here about what those systems actually do once real traffic hits them. Hiring an LLM engineer in India? Here is how I work.

More on ByteMuni

ByteMuni is a developer publication: tutorials and source-checked tech news, published daily.

Read more on ByteMuni →
Message me