Multivector is one field with many vectors; named vectors are many fields with one vector each
The distinction is structural. A point with several named vectors has multiple independent vector fields, each holding exactly one vector. For example, a document might have a title_vector field (768-dim), a body_vector field (768-dim), and an image_vector field (512-dim). Each field is a separate embedding space with its own distance metric and its own index, and you search them independently or combine them at query time. A multivector point has a single named vector field that holds a list of vectors. The classic example is a ColBERT-style document representation, where the document is encoded as one vector per token - a 200-token document produces a field containing 200 vectors of, say, 128 dimensions each. The field is one logical vector, but its value is a matrix rather than a single row. You do not search it independently; you score it against a query multivector using a late-interaction comparator like MaxSim.
The mechanism difference is what you do at query time. With named vectors, you typically issue separate queries against each field and then fuse the results, or you use a prefetch to retrieve candidates from one field and rerank with another. With a multivector, you cannot do a simple ANN lookup because there is no single vector to look up - the field is a set of vectors. Instead, you use a comparator that defines how to score a query multivector against a stored multivector. Qdrant's MAX_SIM comparator implements the ColBERT scoring: for each query token vector, find the maximum similarity to any document token vector, then sum those maxima across query tokens. This is a fundamentally different operation from a dot product or cosine similarity between two single vectors. It is also why multivector fields are typically configured with m: 0 - there is no meaningful HNSW graph to build over a set of vectors that are scored as a set rather than individually. The exception is when you want to search against individual token vectors, which is a different use case.
Named vectors: N independent fields, each with one vector, each with its own index and distance metric. Searched independently or fused.
Multivector: 1 field with M vectors (e.g. one per token), scored as a set with a comparator like MAX_SIM. Typically not indexed with HNSW.
Storage: named vectors store N vectors per point; a multivector stores M vectors per point, where M varies per point (a long document has more token vectors than a short one).
Query shape: named vectors are queried with one vector per field; a multivector is queried with a multivector (the query's own token vectors).
The trade-off is flexibility and cost. Named vectors give you a clean separation of embedding spaces and let you search each independently, which is useful for multi-modal or multi-aspect retrieval. But each field has its own index, so memory and build cost scale with the number of fields. A multivector gives you a much richer representation of a single document - token-level rather than document-level - which improves retrieval quality on tasks where fine-grained matching matters (e.g. question answering, code search). But the storage cost is M times higher per point than a single vector, and the query cost is O(query_tokens * doc_tokens) per candidate, which is why multivector scoring is typically applied only to a small candidate set from a first-stage retriever. The common mistake is confusing the two: engineers sometimes try to model a ColBERT document as N named vectors (one per token), which is wrong because it loses the set semantics and prevents the MAX_SIM comparator from being applied. The other mistake is trying to build an HNSW index over a multivector field and being surprised that it does not work well - the field is not a single point in a metric space, so graph-based ANN over it is not meaningful. Version note: multivector support and the MAX_SIM comparator were added in recent Qdrant releases; on older versions, you may need to implement late interaction outside the vector store.
Version-dependent: the multivector_config and MultiVectorComparator.MAX_SIM API is part of the qdrant-client 1.10+ surface. On older clients, multivector fields may not be supported or may use a different configuration shape. The ability to set m: 0 per field is also a relatively recent addition. Verify against your client and server versions before designing around these features.
You have a document with a title and a body and you want to search both. Would you use named vectors or a multivector, and why?
A teammate models each token of a document as a separate named vector. Explain why this does not work as a ColBERT representation.
You need to support both semantic search and token-level reranking on the same collection. Design the schema and explain which field gets an index and which gets m: 0.
Your multivector field has an average of 200 token vectors per point. Estimate the storage cost compared to a single 768-dim dense vector and propose ways to reduce it.
Design a schema for a code search system where queries can be natural language or code snippets. Which fields do you use, how do you index them, and how do you combine results?
You need to support multivector reranking on a 100M-document collection. The multivector field is 200 x 128 per document. Estimate the storage and propose a way to keep it under budget without losing reranking quality.
A new model produces variable-length multivectors (10 to 1000 tokens per document) with a heavy tail. Design a storage and indexing strategy that handles the tail without penalizing the median case.
You are asked to support both ColBERT-style late interaction and a single-vector baseline on the same collection, with the ability to A/B test them. Design the schema and query paths to make the comparison clean and reversible.