C.W.K.
Stream
Lesson 04 of 06 · published

Picking an Embedding Model in 2026

~26 min · models, selection

Level 0Scout
0 XP0/41 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

The shortlist

The 2026 landscape collapses to four practical buckets. Pick from the bucket that matches your privacy, latency, and budget constraints — never pick by leaderboard score alone.

1. Hosted, top-tier (closed)

  • OpenAI text-embedding-3-large — 3072 dim, strong on English and code, good multilingual
  • Voyage AI voyage-3-large — 1024 dim default, frequently the best on niche-domain MTEB tasks
  • Cohere embed-english-v3 / embed-multilingual-v3 — 1024 dim, supports input-type hint (query vs document)

2. Local, top-quality

  • BGE-M3 — 1024 dim, multilingual, supports dense + sparse + multi-vector outputs in one model. cwkPippa runs this via Ollama.
  • BGE-large-en-v1.5 — 1024 dim, English-only, very strong
  • Nomic Embed Text v2 — 768 dim, Apache-licensed, runs on CPU

3. Local, small/fast

  • BGE-small-en-v1.5 — 384 dim, ~30 MB, edge-friendly
  • all-MiniLM-L6-v2 — 384 dim, the classic sentence-transformer baseline

4. Specialized

  • jina-embeddings-v3 — long-context (8K tokens) for document-level embedding
  • VoyageCode-2 / Jina-code-v2 — fine-tuned on code

Decision rules that beat MTEB scores

  1. Privacy or air-gapped → local only. No API call, no decision needed.
  2. Multilingual users → BGE-M3 or Voyage multilingual. English-only models drop hard on Korean / Japanese / Arabic.
  3. Long documents (over 1k tokens) → Jina v3 or chunking strategy. Otherwise the front of the document dominates.
  4. Code search → use a code-fine-tuned model. General-purpose models miss API-shaped queries.

Code

Try OpenAI's largest embedding·python
from openai import OpenAI
client = OpenAI()

resp = client.embeddings.create(
    model='text-embedding-3-large',
    input=['How do I cancel my subscription?'],
)
vec = resp.data[0].embedding
print(len(vec))   # 3072
Run BGE-M3 locally with Ollama·python
import requests

resp = requests.post(
    'http://localhost:11434/api/embeddings',
    json={'model': 'bge-m3', 'prompt': 'How do I cancel my subscription?'},
)
vec = resp.json()['embedding']
print(len(vec))   # 1024

External links

Exercise

Pick one hosted model and one local model. Embed the same 50 chunks with both. Run the same 10 queries against each store. Track top-5 overlap and average latency. Decide which one you would ship — and write the one-paragraph reason.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.