When retrieval gets incomplete after adding more documents, the problem is almost never in the retriever itself. It’s in what the retriever has to compete against. Adding more documents adds more chunks. Some of those new chunks are good. Many of them aren’t. The vector database doesn’t distinguish — every chunk competes equally for retrieval, and the bad ones drag down the precision of the good ones.
A few things worth checking before tuning the retriever:
Look at the chunks that came back when retrieval was incomplete. Pull the actual chunks the retriever returned for queries where the answer was missing. Read them as a human. In my experience, when “more documents made retrieval worse,” the new chunks are usually fragments — split mid-sentence, mid-table, or contain mostly headers and boilerplate. They match queries on vocabulary but contribute nothing useful.
Check chunk size distribution across your corpus. If you’ve been ingesting different document types with the same chunker, you’ll have a wide distribution. Some chunks at 200 tokens, some at 1500. The small ones lack context. The large ones dilute the embedding signal. Both retrieve at the wrong precision for different reasons.
Look for near-duplicates. Multiple documents on the same topic produce embeddings that compete with each other at retrieval time. The retriever sees five chunks at 0.87 similarity for one query and has no basis to pick the right one. Duplicate detection and deduplication at ingestion time often improves retrieval more than any retriever-side change.
Re-check your chunking strategy as the corpus grew. A chunking strategy tuned on your first 100 documents may not hold on document 5000. Different document formats often need different chunking rules. Forcing one strategy across everything is a common source of degradation.
If you want a quick diagnostic before changing anything: pull 50 random chunks from your vector store and read them. Ask yourself for each one: if this chunk were retrieved for a plausible user query, would it help generate a correct answer? When teams do this for the first time, the gap between “what’s in the vector database” and “what’s actually useful” is usually larger than they expected.
The other lever worth considering: hybrid retrieval. Pure vector similarity has known weaknesses on exact-term matches (names, dates, code, identifiers). Adding BM25 or a keyword index alongside the vector search and combining the results often catches retrievals that pure embeddings miss. LangChain has wrappers for this — EnsembleRetriever is the relevant primitive.