A retrieval system that answers “what is our refund window?” correctly and fails on “does the refund window differ for enterprise customers?” usually does not have a model problem. It has a chunk that contains the general policy and a different chunk, retrieved never, that contains the exception. Chunking decides what a single retrievable unit is . Get it wrong and no amount of reranking, prompt engineering or model upgrading recovers the information you split apart. Fixed-size splitting is a baseline, not a strategy The default everyone starts with — split every N characters with M overlap — is worth understanding precisely, because it is the thing you will be comparing against. def fixed_chunks (text, size = 1000 , overlap = 200 ): chunks, start = [], 0 while start < len (text): chunks.append(text[start:start + size]) start += size - overlap return chunks What it gets right: uniform chunks, predictable cost, no assumptions about docum...