★ Reading this for free? Get 20 structured AI courses + per-chapter AI tutor — the first chapter of every course free, no card.Start free in 30 seconds

Nomic AI · Embedding Model · Apache 2.0

Nomic Embed Text: The Most-Pulled Ollama Embedding Model, Explained

nomic-embed-text outputs 768-dimension vectors, handles up to 8,192 tokens of input, downloads as a 274MB file, and runs on any CPU — install it with ollama pull nomic-embed-text. At 81.2M pulls (ollama.com, August 2026) it is the third most-pulled model in the entire Ollama library — ahead of llama3.2, behind only llama3.1 and deepseek-r1 — which makes it the de facto default embedding model for local RAG. This page covers the specs people actually search for, the prefix mistake that silently degrades almost every first-time setup, and why the newer v2 MoE is not automatically the better choice.

📅 Published: August 2026🔄 Last Updated: August 2026✓ Manually Reviewed

Quick answer: specs and install

137M parameters, 768 dimensions, 8,192-token max input, 274MB download, Apache 2.0. No GPU required — it is smaller than most quantized 1B chat models. Specs below are from the Ollama library and Nomic's model card.

SpecValue
Ollama tagnomic-embed-text (latest = v1.5)
Download size274MB (F16)
Parameters137M (nomic-bert encoder)
Output dimensions768 (truncatable to 512/256/128/64)
Max input8,192 tokens
RequiresOllama 0.1.26+ · embedding-only (no chat)
ollama pull nomic-embed-text

curl http://localhost:11434/api/embed -d '{
  "model": "nomic-embed-text",
  "input": "search_document: Ollama is a local inference server."
}'

Note the search_document: prefix — it is not decoration. Skipping it degrades retrieval quality, and Ollama will not add it for you. Building a full pipeline? Our Ollama + ChromaDB RAG guide uses this exact model end to end.

Key takeaways

  • #3 model on Ollama by pulls — 81.2M, and it can't even chat. Every local RAG tutorial standardized on it.
  • Hardware is a non-issue — 274MB, CPU-friendly, coexists with any chat model you already run.
  • Beats ada-002 on MTEB (62.39 vs 60.99) and crushes it on LoCo long-context (85.53 vs 52.7) — Nomic's published numbers, not a clean sweep on every benchmark.
  • The prefix gotcha is realsearch_document: / search_query: are required by training; most broken setups skipped them.
  • v2 MoE is multilingual, not better — its 512-token max input is 16× shorter than v1.5's. English long-doc RAG should stay on v1.5.

Specs at a glance

A 137M-parameter BERT-style encoder that reads up to 8,192 tokens and outputs one 768-float vector per input. Sources: Ollama library tag metadata and the nomic-ai/nomic-embed-text-v1.5 model card.

VendorNomic AI
Architecturenomic-bert encoder (trained at 2,048 ctx, extended to 8,192 via dynamic RoPE scaling)
Parameters137M
Output768-dim vector (Matryoshka: 512/256/128/64 supported)
Max sequence8,192 tokens
MTEB (v1.5, 768d)62.28 (Nomic model card)
LicenseApache 2.0
Ollama size274MB F16 · tags: latest, v1.5, 137m-v1.5-fp16
Hugging Facenomic-ai/nomic-embed-text-v1.5

One quirk worth knowing: this is an embedding-only model. ollama run nomic-embed-text is not a thing — it only answers on the embeddings endpoints.

v1 vs v1.5 vs v2 MoE — which tag to pull

Pull the default. nomic-embed-text resolves to v1.5, which is the right choice for English documents. Only reach for nomic-embed-text-v2-moe if you need multilingual retrieval — and accept its 512-token input limit.

VersionParamsMax inputSizeBest for
v1 (Feb 2024)137M8,192 tok274MBSuperseded — use v1.5
v1.5 (Ollama default)137M8,192 tok274MBEnglish RAG, long chunks, Matryoshka dims
v2 MoE (Feb 2025)475M total / 305M active512 tok958MBMultilingual retrieval (~100 languages)

v1.5's upgrade over v1 was Matryoshka training — the ability to truncate vectors below 768 dims with graceful quality loss (details in the Matryoshka section). v2 MoE is a different animal entirely: a mixture-of-experts model (8 experts, top-2 routing) trained on ~1.6B pairs across roughly 100 languages. On multilingual benchmarks it earns its keep — 65.8 on MIRACL vs 62.3 for mE5-Base per Nomic's model card — though BGE-M3 still leads that particular benchmark at 69.2.

The spec almost nobody reads before upgrading: v2 MoE's max sequence length is 512 tokens, against v1.5's 8,192. If your chunker produces 1,000-character chunks you're fine either way, but long-chunk or whole-section embedding strategies break silently on v2. For English content there is no retrieval-quality reason to move — v2's pull count (642K vs 81.2M) says most of Ollama agrees.

Nomic Embed vs OpenAI embeddings

Nomic's published comparison has v1 beating both ada-002 and text-embedding-3-small on MTEB and LoCo, while both OpenAI models win on the Jina Long Context benchmark. Numbers below are from the nomic-embed-text-v1 model card — Nomic's own evaluation, so read it as a vendor benchmark, though MTEB scores are independently reproducible.

Benchmarknomic-embed-text-v1ada-002text-embedding-3-small
MTEB62.3960.9962.26
LoCo (long context)85.5352.782.40
Jina Long Context54.1655.2558.20

Benchmarks aside, the structural differences decide it for most local-first builders: your documents never leave the machine, embedding a million chunks costs electricity instead of API credits, and no provider can deprecate the model your entire vector store depends on — re-embedding a corpus because an API model was sunset is a real migration people have had to do. We break down the cost math and privacy trade-offs in local vs OpenAI embeddings.

Setup: Ollama, Python, LangChain, ChromaDB

One pull, one endpoint. Current Ollama versions expose /api/embed (batched); the older /api/embeddings endpoint still works but is officially superseded (Ollama API docs). The examples below are the exact wiring we use in our production RAG pipeline guide.

Raw API — batch embedding

import requests

r = requests.post("http://localhost:11434/api/embed", json={
    "model": "nomic-embed-text",
    "input": [
        "search_document: Chunk one of your document...",
        "search_document: Chunk two of your document...",
    ],
})
vectors = r.json()["embeddings"]
print(len(vectors), len(vectors[0]))   # 2 768

Batching through input as a list is dramatically faster than one request per chunk when indexing. Watch out: truncate defaults to true, so input longer than the active context gets clipped silently — if you rely on long chunks, set "options": {"num_ctx": 8192} explicitly rather than trusting defaults.

LangChain

# pip install langchain-ollama
from langchain_ollama import OllamaEmbeddings

emb = OllamaEmbeddings(model="nomic-embed-text")

doc_vecs = emb.embed_documents([
    "search_document: Rotate API keys from the dashboard settings page.",
])
query_vec = emb.embed_query("search_query: how do I rotate an API key?")

Note that we prepend the prefixes ourselves — LangChain doesn't know this model wants them. Full LangChain wiring (retrievers, chains, streaming) is covered in our Ollama + LangChain integration guide.

ChromaDB

import chromadb
from chromadb.utils.embedding_functions import OllamaEmbeddingFunction

client = chromadb.PersistentClient(path="./chroma_db")

embed_fn = OllamaEmbeddingFunction(
    url="http://localhost:11434/api/embeddings",
    model_name="nomic-embed-text",
)

collection = client.get_or_create_collection(
    name="kb",
    embedding_function=embed_fn,
    metadata={"hnsw:space": "cosine"},
)

Once a collection is created at 768 dims, every future write and query must use the same model at the same dimensionality. Changing embedding models means re-indexing from scratch — there's no shortcut. If you'd rather start from a working end-to-end template than assemble pieces, our local RAG setup guide is the from-zero version.

Measure your own throughput

Embedding speed varies so much across CPUs, batch sizes, and chunk lengths that any single tok/s claim would mislead you. It takes 30 seconds to get the number that actually matters — yours:

import requests, time

chunks = [f"search_document: test paragraph {i} " + "lorem ipsum " * 80
          for i in range(256)]

t0 = time.time()
requests.post("http://localhost:11434/api/embed",
              json={"model": "nomic-embed-text", "input": chunks})
dt = time.time() - t0
print(f"{len(chunks)/dt:.0f} chunks/sec")

Run it twice and keep the second number — the first request includes model load time.

The prefix gotcha: search_document and search_query

Nomic Embed was trained with task prefixes, and the model card lists them as required: prepend search_document: to text you store and search_query: to questions you search with. Ollama hands your input to the model exactly as you send it — no template, no automatic prefix — so if you didn't add them, you've been running the model outside its training distribution this whole time.

This is the single most common nomic-embed-text mistake we see, and it's invisible: everything still returns vectors, cosine similarity still produces rankings, and retrieval quality is just quietly worse than it should be. The asymmetry is the point — queries and documents are phrased differently ("how do I rotate a key" vs "keys can be rotated from settings"), and the prefixes tell the model which side of that gap it's embedding.

Two more prefixes exist for non-search tasks: clustering: for grouping similar texts and classification: for feature extraction (nomic-ai model card). If you're building semantic search specifically, our Ollama semantic search guide shows prefixed indexing and querying in a complete working example.

Matryoshka: paying storage only for the quality you need

v1.5 lets you truncate 768-dim vectors down to 512, 256, 128, or 64 dims and re-normalize, trading a measured amount of quality for a proportional storage cut. Nomic's model card publishes the trade-off:

DimensionsMTEBStorage per 1M vectors (float32)
768 (full)62.28~3.1 GB
51261.96~2.0 GB
25661.04~1.0 GB
12859.34~0.5 GB
6456.10~0.26 GB

MTEB scores: nomic-ai/nomic-embed-text-v1.5 model card. Storage column is our arithmetic (dims × 4 bytes × 1M).

The 512-dim cut costs 0.32 MTEB points for a third less storage — close to free. 256 dims costs about 1.2 points for a 3× reduction, which Nomic themselves highlight as the sweet spot. Below that, quality falls off fast. For a typical personal knowledge base (tens of thousands of chunks) storage is a rounding error and you should just use 768; Matryoshka starts mattering at millions of vectors or on memory-constrained devices. Recent Ollama versions expose a dimensions parameter on /api/embed (Ollama API docs), so you can request truncated vectors without post-processing.

Honest limitations

  • It no longer tops leaderboards. An MTEB of ~62 was frontier in early 2024; plenty of newer, larger embedding models score meaningfully higher today. nomic-embed-text wins on size, speed, and ecosystem defaults — not raw retrieval ceiling. If maximum quality matters more than a 274MB footprint, benchmark alternatives on your own corpus.
  • English-first. v1.5 was not built for multilingual retrieval. Non-English corpora should use v2 MoE or BGE-M3 — and note BGE-M3 still beats v2 MoE on MIRACL (69.2 vs 65.8, Nomic's own table).
  • Long-context wins are benchmark-dependent. The LoCo blowout (85.53 vs ada's 52.7) is real, but on Jina Long Context both OpenAI models score higher. 8,192 tokens of input capacity does not mean 8,192 tokens embed as well as focused 500-token chunks — good chunking still beats long-context embedding for most RAG.
  • The prefix requirement is a footgun. No error, no warning, just silently degraded retrieval. Frameworks won't add prefixes for you.
  • Embedding-only. It cannot generate, rerank, or chat. A full RAG stack still needs a generator — on an 8GB GPU it pairs cleanly with a small chat model; see the best Ollama models for 8GB VRAM for what fits alongside it.

Frequently asked questions

How many dimensions does nomic-embed-text output?
768 by default. Because v1.5 was trained with Matryoshka representation learning, you can truncate vectors to 512, 256, 128, or 64 dimensions and re-normalize — Nomic’s model card puts the cost at roughly 0.3 MTEB points at 512 dims (61.96 vs 62.28) and about 1.2 points at 256 (61.04). At 64 dims quality drops harder (56.10). Whatever you choose, every vector in a collection must use the same dimensionality — mixed or mismatched dims is the most common cause of “my RAG returns nothing” bugs.
Does nomic-embed-text need a GPU?
No. The Ollama build is a 274MB F16 download of a 137M-parameter encoder — smaller than most quantized 1B chat models. It embeds comfortably on laptop CPUs, and on any machine that already runs an Ollama chat model the marginal cost of adding it is close to zero. This is why it ships as the default embedding model in most local RAG tutorials: hardware is simply not a constraint.
Is nomic-embed-text better than OpenAI embeddings?
On Nomic’s published comparison, nomic-embed-text-v1 scores 62.39 MTEB vs 60.99 for text-embedding-ada-002 and 62.26 for text-embedding-3-small, and it wins big on the LoCo long-context benchmark (85.53 vs 52.7 and 82.40). It is not a clean sweep: on the Jina Long Context benchmark both OpenAI models score higher (55.25 and 58.20 vs 54.16). The practical argument is different anyway — local embeddings cost $0 per token forever, never leave your machine, and never get deprecated out from under your vector store.
Should I use nomic-embed-text v1.5 or v2 MoE?
English documents: stay on v1.5 (the default `nomic-embed-text` tag) — it has an 8,192-token max sequence length and a 274MB footprint. Multilingual retrieval: `nomic-embed-text-v2-moe` (958MB on Ollama, 475M total / 305M active params, ~100 languages) scores 65.8 on MIRACL vs mE5-Base’s 62.3. The catch most people miss: v2 MoE’s max sequence length is 512 tokens — sixteen times shorter than v1.5 — so for long-chunk English RAG it is a downgrade, not an upgrade.
Why are my search results bad with nomic-embed-text?
Three usual suspects, in order. First: missing task prefixes — the model was trained expecting `search_document: ` in front of stored text and `search_query: ` in front of queries, and Ollama passes your input through as-is, so you must add them yourself. Second: dimension mismatch — you created the vector collection with a different embedding model (or a different Matryoshka size) than you query with. Third: silent truncation — Ollama’s /api/embed truncates input to the active context by default, so oversized chunks get clipped without an error. Fix all three before blaming the model.

Go from one embedding call to a working RAG system

The Local AI Master courses walk through the full local stack — embeddings, vector stores, retrieval quality, and serving — on hardware you already own.

Browse the courses →

Related guides

🎯
AI Learning Path

Go from reading about AI to building with AI

20 structured courses. Hands-on projects. Runs on your machine. Start free.

Or own it for life — Lifetime $149 $599, pay once
LM

Written by the Local AI Master Team

The team behind Local AI Master

We build Local AI Master around practical, testable local AI workflows: model selection, hardware planning, RAG systems, agents, and MLOps. The goal is to turn scattered tutorials into a structured learning path you can follow on your own hardware.

✓ Local AI Curriculum✓ Hands-On Projects✓ Open Source Contributor
More on Ollama
See the full Best Ollama Models 2026 guide.
📚
Free · no account required

Grab the AI Starter Kit — career roadmap, cheat sheet, setup guide

No spam. Unsubscribe with one click.

🎯
AI Learning Path

Found your model? Now build something with it.

25 hands-on courses — RAG, agents, fine-tuning — all running locally. First chapter free, no card.

Or own it for life — Lifetime $149 $599, pay once
Free Tools & Calculators