A 50-page PDF embedded as one vector is a soup — the retrieval finds the document but loses fine-grained locality. Chunks split the document into semantically coherent slices (sentence-based, recursive by paragraph, code-aware by delimiter). Each chunk becomes one row with its own vector; retrieval returns K focused rows instead of one fuzzy blob.
Fixed window 512 tokens, overlap 64 — default for prose.
RecursiveCharacterTextSplitter respects paragraph + sentence boundaries first.
Code-aware splitter keeps def/class bodies intact — different chunk_size, different language.
PDF -> page -> recursive splitter -> chunk (512 tok, overlap 64)
embed(chunk) -> chunk.embedding -> chunks table
retrieve top-K -> context
Chunk shape decides retrieval quality more than the model does. Re-tune chunk size before re-embedding.