All Posts
AI Infrastructure September 10, 2026

Qdrant vs Chroma: Production Vector Databases for AI Retrieval in 2026

Both stores return good results on a laptop with ten thousand vectors. The differences only appear under filtered queries, live updates, and the memory pressure of a real corpus, which is exactly when switching is expensive.

Almost every retrieval system starts with Chroma. Three lines of Python, an embedding function, a collection, and a working prototype before lunch. That is a genuine achievement and it is why the library is everywhere.

The trouble is that the prototype becomes the architecture. Six months later the corpus has grown two orders of magnitude, someone added metadata filtering to every query, the index needs to accept updates while serving traffic, and the thing that took three lines to stand up now takes a quarter to replace.

Qdrant vs Chroma is not really a benchmark question. Both do approximate nearest neighbour search with HNSW and both return sensible results. The question is which set of production characteristics you need, and whether you need them soon enough that starting with the heavier option is cheaper than migrating to it later.

Qdrant vs Chroma Is a Question About When Production Pressure Arrives

Vector search looks deceptively uniform from the outside. Embed a query, find the nearest neighbours, return the payloads. Every store does this and on small collections they all do it well.

The differences appear at three specific pressure points, and they arrive in a predictable order.

The first is filtering. A pure similarity search over a whole collection is the easy case. Real retrieval almost always constrains: this tenant, this document type, published after this date, in stock, in this region. How a store combines the filter with the vector index determines whether filtered queries stay fast or fall off a cliff, and it is the single most common cause of retrieval systems that were fine in testing and are not fine in production.

The second is write behaviour. Prototypes build the index once. Production systems ingest continuously, and the question becomes whether writes degrade read latency, whether updates are visible immediately, and what happens to recall while a segment is being rebuilt.

The third is memory. Vectors are large. A few million at typical embedding dimensions is tens of gigabytes before payloads, and the difference between a store that can keep quantized vectors resident with originals on disk and one that expects everything in memory is the difference between one node and a cluster.

Chroma is designed around the developer experience of the first phase. Qdrant is designed around the operational characteristics of the second and third. That is the whole comparison, and everything below is detail.

Chroma: The Fastest Path From Idea to Working Retrieval

Chroma's value is that it removes decisions. Embedding function, collection, add, query. No index tuning, no schema, no deployment topology to reason about. For evaluating whether retrieval helps your product at all, that is exactly right, and choosing anything heavier at that stage is a mistake in the opposite direction.

It runs embedded in the application process, which means a notebook, a test suite, or a CI pipeline can spin up a real vector store with no infrastructure. That property is underrated. Being able to run integration tests against the actual store rather than a mock removes a class of bugs that only appear when the fake and the real diverge.

The Python ergonomics are the best in the category, and the library integrates cleanly with the orchestration layer most teams are already using, whether that is the LangChain or LlamaIndex side of the stack.

Where it stops being the right tool is fairly specific. Embedded mode means the store lives inside one process, so horizontal scale requires the client server deployment and the operational thinking that comes with it. Filtering performance on large collections with selective predicates is the most common complaint, and the pattern is familiar: acceptable at a hundred thousand vectors, noticeably worse at ten million with a filter that matches one percent of them.

Resource behaviour under a large resident corpus is the other constraint. Chroma has improved substantially here, but the design centre is still a collection that comfortably fits in the memory of a single machine, and the honest scaling answer beyond that involves work you were trying to avoid by choosing Chroma.

Qdrant: Built for Filtered Queries and Continuous Writes

Qdrant is a Rust service designed from the start as a database rather than a library, and the difference shows in the places production systems actually hurt.

Filtering is the headline. Qdrant builds payload indexes alongside the vector index and applies filters during graph traversal rather than as a post processing step over results. The practical consequence is that a highly selective filter does not force the engine to over fetch candidates and hope enough survive. For multi tenant retrieval, where every query carries a tenant predicate, this is not an optimization detail. It is the difference between a system that works and one that returns empty result sets under load.

Quantization is the second structural advantage. Scalar and binary quantization with original vectors kept on disk lets a node hold far more vectors than raw memory would suggest, at a recall cost you can measure and tune rather than guess at. On a few million vectors this is frequently the difference between one machine and three, which changes the cost conversation entirely.

Writes are designed to be continuous. Upserts are immediately visible, segment optimization happens in the background, and read latency stays stable while ingestion runs. Snapshots, replication, and sharding exist and behave the way someone who has operated a database expects them to behave.

The cost is that it is a service. Something has to run it, monitor it, back it up, and upgrade it. Managed cloud removes most of that at a price, and self hosting on Kubernetes is straightforward if your team already runs stateful services, but neither is the zero infrastructure story Chroma offers. The Python client is good and the API is clean, but you are operating a database now, and the honest comparison includes that.

The Decision Framework: How to Choose

Dimension Qdrant Chroma
Time to first working prototype Container plus client, under an hour Three lines, minutes
Filtered query performance at scale Strong, filters applied during traversal Degrades with selectivity and size
Practical single node corpus Tens of millions with quantization Low millions, memory bound
Continuous ingestion Designed for it, reads stay stable Workable, best with batch rebuilds
Multi tenancy Native patterns, payload indexed Collection per tenant, gets awkward
Operational burden A database to run or a bill to pay Effectively none in embedded mode
Horizontal scale Sharding and replication built in Requires client server plus planning
Best fit Production retrieval with real constraints Prototypes, tests, small stable corpora

Three questions decide it.

Does every query carry a filter? If retrieval is scoped by tenant, permission, category, or freshness on essentially every request, that pushes hard toward Qdrant regardless of current corpus size. Filtering behaviour is the hardest thing to retrofit and the most likely thing to surprise you in production.

Is the corpus growing or stable? A documentation site with fifty thousand chunks that changes weekly is a Chroma workload indefinitely, and adding a database to that architecture buys nothing. A product catalogue with millions of items and continuous updates is a Qdrant workload from the beginning, which is the shape most commerce retrieval takes and why catalogue RAG architecture tends to start with the heavier store.

Who operates it at 3am? If the answer is nobody, either use Chroma embedded and accept its ceiling, or use managed Qdrant and pay for someone else to answer. Self hosting a stateful service without an owner is the worst of the three options.

The Migration Cost Nobody Prices

The reason this decision matters more than it looks is that the switching cost is not the data movement. Re embedding and reloading a corpus is a script and some compute time.

The cost is everything built on top. Retrieval logic, filter semantics, hybrid search behaviour, chunking assumptions tuned against one engine's ranking, and the evaluation set that proved the current system works. Different stores return subtly different neighbours for the same query, and every prompt downstream was tuned against the old ones.

That is a quarter of work on a mature system, and it is why teams stay on stores they have outgrown.

The defence is an abstraction boundary, written on day one, that keeps retrieval behind an interface with your own filter vocabulary rather than the store's. It costs a day. It also lets you run both engines against the same evaluation set and decide with data instead of argument, which is the only version of this comparison that ends well.

What This Means for Your Business

Match the store to the phase, and be honest about which phase you are in.

If you are still proving retrieval improves the product, use Chroma, ship in a week, and do not spend a sprint on infrastructure for a feature that might not survive the experiment. Premature vector database architecture is a real and common waste.

If retrieval is already load bearing, filtered, and growing, the migration you are deferring is more expensive every month. The corpus grows, the downstream prompt tuning accumulates, and the evaluation debt compounds.

The middle case is the interesting one, and it is where most commerce teams sit. Retrieval works, it is in front of customers, the corpus is in the low millions, and every query filters by something. That is the moment to move, before the rewrite gets more expensive rather than after someone notices latency in a board meeting.

Whichever direction you go, put the abstraction layer in first and build the evaluation set before you need it. The evaluation set is what turns this from a preference into a measurement.

How Contra Collective Bridges the Gap

We build production retrieval systems for enterprise commerce, which means we have shipped both of these stores and migrated between them when the first choice stopped fitting. Our engagements usually start with an evaluation harness against your real corpus and real filter patterns, because a benchmark on someone else's data predicts nothing about yours. The outcome is a retrieval layer with measured recall, known cost per query, and a store you can swap without touching the application.

Ready to make the right call for your stack? Book a free technical audit and get clarity, not a sales pitch.

Final Thoughts

Chroma is the better tool for finding out whether retrieval helps. Qdrant is the better tool for running retrieval that people depend on. Those are different jobs and the industry's habit of ranking them against each other obscures that.

The mistake is not choosing wrong at the start. Starting with Chroma is almost always correct. The mistake is letting the prototype harden into the production architecture without anyone deciding that it should, which is how most of these migrations end up urgent instead of planned.

Pick the light option early, build the boundary that makes changing your mind cheap, and set the threshold that triggers the conversation before you cross it. Corpus size, filter selectivity, and p95 latency under a real workload are enough. When two of the three move against you, move.

FAQ

Can Chroma handle production traffic, or is it strictly a prototyping tool?

It handles production traffic well within its design centre: a corpus that fits comfortably in one machine's memory, modest filter selectivity, and read heavy access patterns. Plenty of documentation search and internal knowledge tools run on it happily and should not be migrated. The failure cases are large corpora, highly selective filters, and continuous ingestion, and they tend to arrive together.

How much recall do you lose to quantization in Qdrant?

Scalar quantization typically costs low single digit percentage points of recall and can be largely recovered by over sampling candidates and rescoring against the original vectors on disk. Binary quantization is far more aggressive and only suits high dimensional embeddings where the geometry tolerates it. Measure it on your own corpus with your own evaluation set, because the loss varies substantially with the embedding model.

Should I use a dedicated vector store at all instead of pgvector?

If your corpus is small, your team already runs Postgres well, and retrieval is a feature rather than the product, pgvector is often the correct answer and avoids a new operational surface entirely. Dedicated stores earn their place when filtered query performance at scale, quantization economics, or horizontal sharding become the constraint. That crossover usually arrives somewhere in the low millions of vectors, though the filter pattern matters more than the raw count.

How long does migrating from Chroma to Qdrant actually take?

Moving the data is a day or two of scripting and compute. The real work is re tuning retrieval against slightly different neighbour rankings, rebuilding filter logic against a different query model, and revalidating every downstream prompt, which on a mature system runs four to eight weeks. Teams that wrote an abstraction boundary early cut that substantially, because the application never spoke the store's dialect in the first place.

[ 02 ] — Keep Reading

More from the lab.

Nov 7, 2026 AI Infrastructure

Gap and Christie's Are Running Production AI on Mac Minis: What Apple's Q4 Call Actually Revealed About Enterprise Local Inference

On its fiscal Q4 earnings call on November 2, 2026, Apple named two enterprise customers doing something more specific than the usual AI PC talking point: Gap runs AI loss prevention models across hundreds of stores entirely on Mac minis, which CFO Kevan Parekh described specifically as eliminating cloud token costs, and Christie's runs pricing estimate models on Mac Studio. Apple's pitch is that a few thousand dollar Mac can produce inference value worth tens of thousands over its life. That math is directionally right for a narrow set of workloads, and it is not a general argument against cloud inference, even though the earnings call framing invites you to read it that way.

Nov 6, 2026 AI Infrastructure

Kimi K3.1 Pro: Moonshot's Open Weight Model and What a 1M Token Context Actually Changes

Kimi K3.1 Pro went live in Moonshot's API on October 23, 2026, priced at 2 dollars per million input tokens and 10 dollars per million output tokens, with a 1 million token context window. Moonshot promised open weights by November 4. The model inherits Kimi K3's reported 2.8 trillion total parameters and 104 billion active parameters per token, which means the real question for most teams is not whether it is open but whether anything they own can actually run it.

Oct 29, 2026 AI Infrastructure

oMLX on Apple Silicon: What the SSD KV Cache Actually Buys Coding Agents

oMLX search interest has climbed fast this year, and the pull is a specific engineering claim: a coding agent's time to first token dropping from 90 seconds to as little as 3 once a long prompt's key value cache is already sitting on SSD instead of being recomputed from scratch. The architecture is real and the restore speed is measurable. The claim is also softer than the headline number suggests, and this post works through both halves.

Ready when you are

Want to discuss this topic?

Start a Conversation