Database / Qdrant Vector DB Interview questions
How do you implement multi-vector (late interaction / ColBERT-style) search in Qdrant?
Multi-vector search stores several vectors per point — for instance, one embedding per token in a ColBERT-style late-interaction model, rather than a single pooled embedding for the whole document — and scores a query against all of them together using a specialized comparison, typically a MaxSim-style aggregation.
client.create_collection( collection_name="documents", vectors_config=models.VectorParams( size=128, distance=models.Distance.COSINE, multivector_config=models.MultiVectorConfig( comparator=models.MultiVectorComparator.MAX_SIM ), ), ) client.upsert( collection_name="documents", points=[models.PointStruct(id=1, vector=[[0.1, 0.2, ...], [0.3, 0.4, ...], ...])], )
Instead of a single flat vector, each point's vector field holds a list of vectors (one per token, in the ColBERT case), and Qdrant's MAX_SIM comparator scores a query (also a list of vectors, one per query token) against a stored point by finding, for each query token vector, its best match among the point's token vectors, then summing those best matches into a final relevance score.
This late-interaction approach generally captures finer-grained relevance than a single pooled embedding, since it can recognize that specific parts of a query strongly match specific parts of a document even when the documents' overall pooled representations wouldn't rank as closely; the trade-off is higher storage and compute cost, since a document with many tokens now stores and compares many vectors instead of just one, which is why multi-vector search is often used specifically as a reranking stage over a smaller candidate set from an initial, cheaper dense retrieval pass, rather than as the primary search method over an entire large collection.
More Related questions...