Embedding Generation Pipeline
Embed Billions of Chunks for Semantic Search
Design a pipeline that turns a billion text chunks into vectors, keeps the vector index fresh as documents change, embeds search queries in real time, and swaps in a new embedding model without downtime.
Overview
Semantic search and retrieval-augmented generation (RAG) look up text by meaning. An embedding model turns each piece of text into a vector (a list of a few hundred to a few thousand numbers) so that texts with similar meaning get nearby vectors. A search embeds the query with the same model and asks a vector index for the nearest vectors.
The model call is the easy part. The system around it has three hard jobs: embed a very large corpus without wasting GPU time; keep the index in step as documents are added, edited and deleted; and change the model, which makes every stored vector incompatible, without taking search down.
Questions to ask first
- How big is the corpus? — 1 billion chunks of about 256 tokens each
- Our own model or an API? — A self-hosted encoder with 768 dimensions; an API is compared in the estimate
- How fresh must search be? — A changed document is searchable within 5 minutes (our target)
- How many searches? — 100 million a day, each needing a query embedding
- How often does the model change? — A few times a year; each change re-embeds everything
- Are deletes important? — Yes: a deleted document must stop appearing in results
What you will be able to do
- Size the job: GPU hours, storage for a billion vectors, and the API alternative's cost.
- Chunk documents and use a content hash so unchanged text is never embedded twice.
- Keep GPUs busy with batching, length bucketing and resumable shards.
- Keep the index fresh under updates and deletes, and explain what HNSW and IVF-PQ cost.
- Migrate to a new embedding model with a parallel index and an atomic switch.
Key concepts
- Chunking
- Content hash
- Batch inference
- Padding and length bucketing
- L2 normalization
- HNSW
- Product quantization
- Upserts and tombstones
- Model versioning
- Alias switch
Functional requirements
- Split documents into chunks and embed each chunk with the current model
- Skip chunks whose text and model are unchanged (content hash)
- Backfill the whole corpus with a new model while the old index keeps serving
- Embed new and changed chunks, and remove deleted ones, within minutes
- Embed search queries in real time with the same model as the index being searched
- Record the model version on every vector; never mix versions in one index
Non-functional requirements
- A changed document is searchable within 5 minutes (a target we chose)
- Query embedding adds under 30 ms at p99 (our target)
- A backfill survives worker failures and resumes without redoing finished shards
- GPUs stay busy during backfill: large batches, little padding, no waiting on input
- Model switches and rollbacks happen with no failed queries
Interview questions
- How long does embedding a billion chunks take, and what does it cost?
- How do you avoid re-embedding the whole corpus every night?
- How do you migrate to a new embedding model with no downtime?
- How do you keep GPUs busy during the backfill?
- How are deletes handled in a vector index?
- HNSW or IVF-PQ for a billion vectors?
- How do you know the embeddings are still good?
Sign up free to read the full topic
More System Design topics
Start free on Cariara · Coding problems · System design studio