An embedding model does one thing: it turns text into a list of numbers so that similar meaning ends up close together in that number space. Every product in this post is a variation on that idea, and 2026 rearranged the lineup more than any year since embeddings went mainstream. Voyage AI shipped a 4-series after MongoDB's acquisition closed, Google shipped both a multimodal Gemini Embedding 2 and a 308-million-parameter on-device model, and open weights stopped being the budget option and started beating the paid APIs on public benchmarks.
I wrote a longer version of this comparison on DevToolLab, Best Embedding Models and APIs in 2026, with the full pricing table and every source linked. Here is the short version, including the one experiment worth running yourself before you trust any of it.
Two Shapes, Not Ten Products
Every option here is one of two things: a hosted API you call over HTTP and pay per token, or open weights you download and run yourself for free. Three properties separate the options inside each shape: dimension count (which drives your storage and search cost), context window (how much text one call can see), and whether Matryoshka Representation Learning is baked in.
A Matryoshka-trained model packs the most useful signal into the first dimensions of its output, so truncating a 3,072-dimension vector down to 256 keeps most of the retrieval quality while cutting storage 12x. OpenAI's text-embedding-3 models, Voyage's 4-series, and Qwen3-Embedding all do this natively through a dimensions parameter. A model that was not trained this way degrades faster when you truncate it, which the experiment near the end of this post shows directly.
The Hosted APIs
OpenAI's text-embedding-3-small and text-embedding-3-large have not moved in price since January 2024: $0.02 and $0.13 per million tokens, batch pricing cutting both in half. It remains the safe default: cheapest at the small tier, an 8,191-token context that covers most chunking strategies, and the widest library ecosystem.
Voyage AI became part of MongoDB in a $220 million deal in February 2025 and kept shipping independently. voyage-4-large is $0.12 per million tokens with a 32,000-token context, four times OpenAI's window, and every model in the 4-series shares the same Matryoshka range (1,024 default, up to 2,048), so the cheaper voyage-4-lite is a price cut rather than a smaller vector.
Cohere's Embed v4 is the long-context, multimodal specialist: 128,000 tokens of context against OpenAI's 8,191, at $0.12 per million text tokens and $0.47 per million image tokens, handling text, images, and mixed documents like PDFs in one model. Gemini Embedding 2 goes further still, natively embedding text, image, audio, video, and PDF into the same vector space, priced per modality from $0.20 per million text tokens up to $12.00 per million video tokens. Text-only it is the most expensive API here; its case is that nothing else lets you compare a video frame against a text query at all.
Open Weights Stopped Being the Compromise
Qwen3-Embedding is genuinely Apache 2.0, not the more restrictive license some aggregator sites report, and its model card states it ranked first on the MTEB multilingual leaderboard as of June 2025. It ships in 0.6B, 4B, and 8B sizes with a 32,000-token context and Matryoshka output from 32 to 4,096 dimensions; the 0.6B variant runs on CPU and is still competitive, which makes it the model to try first if you want to self-host.
BGE-M3, MIT licensed, does something none of the hosted APIs do: dense, sparse, and multi-vector ColBERT-style output from one pass, so hybrid semantic-plus-keyword search does not need two separate models. Most self-hosted production RAG stacks default to it for exactly that reason.
The model most people miss is Google's EmbeddingGemma, released in September 2025, built on Gemma 3, and aimed at a use case none of the above cover: running entirely offline on a phone or laptop with no API call and no GPU. Google's own numbers: under 200MB of RAM with quantization, embeddings generated in under 22 milliseconds on an EdgeTPU, a 2,048-token context, and Matryoshka output from 768 down to 128. The one thing to get right is the license: it ships under Google's Gemma Terms of Use, not Apache or MIT, so it permits commercial use but is not the drop-in dependency the other three are. Nomic Embed v2 sits next to it as the more permissively licensed alternative at a similar size, trading context length (512 tokens) for Apache 2.0 with no usage restrictions at all.
What Cosine Similarity Actually Measures, Run Locally
Every model above outputs vectors compared the same way. Here is the whole thing, run with sentence-transformers on a laptop CPU, no API key required:
from sentence_transformers import SentenceTransformer
import numpy as np
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
sentences = [
"The cat sat on the mat.",
"A feline rested on the rug.",
"The stock market fell sharply today.",
]
emb = model.encode(sentences, normalize_embeddings=True)
def cos(a, b):
return float(np.dot(a, b))
print(f"sim(cat/feline) = {cos(emb[0], emb[1]):.4f}")
print(f"sim(cat/stock) = {cos(emb[0], emb[2]):.4f}")
sim(cat/feline) = 0.5560
sim(cat/stock) = 0.0747
Two sentences about a cat sitting somewhere score seven times higher on similarity than one about a cat and one about the stock market, despite sharing no words beyond "The". That gap over a plain keyword match is the entire value of everything in this post; a tool like DevToolLab's Word Frequency Counter would find these two cat sentences almost entirely dissimilar by word overlap, while the embedding correctly reads them as close in meaning.
Truncating that same 384-dimension output down to 128 and 64 dimensions and re-normalizing shows what an untrained-for-Matryoshka model does under pressure: cat/feline stays clearly higher than cat/stock at every size, but the gap narrows fast, from 0.556 versus 0.075 at full size to 0.601 versus 0.229 at 64 dimensions. A model actually trained for Matryoshka degrades far more gracefully, which is the entire point of training for it rather than truncating an arbitrary model and hoping. The full writeup has the complete truncation table and the reasoning behind every pricing figure in this post.
How to Pick, Briefly
No strong constraints: text-embedding-3-small. Need more than 8,191 tokens of context: Cohere Embed v4 at 128,000, or Voyage at 32,000 for less money. Corpus includes real images or video: Cohere for text-plus-image, Gemini Embedding 2 if audio or video need to share the same vector space. Self-hosting with the fewest restrictions: Qwen3-Embedding. Hybrid dense-plus-keyword from one model: BGE-M3. Running on-device with no server at all: EmbeddingGemma, with Nomic Embed v2 as the fallback if the Gemma license is a problem.
References
- Best Embedding Models and APIs in 2026 - the original, with the full comparison table and every price verified
- OpenAI embeddings guide, Voyage AI pricing, Cohere Embed v4 docs
- Gemini API pricing, EmbeddingGemma overview
- Qwen3-Embedding-8B model card, BGE-M3 model card
- Best Vector Databases in 2026 - where these embeddings actually get stored and searched


Top comments (0)