A high score does not mean the chunk belongs to the right client. I check the client id and the source file on each chunk before the model sees it, and I drop what does not match. That check after retrieval is useful, but on its own it has two gaps. First, if the top five results all belong to the wrong client, dropping them leaves you answering from whatever scored sixth. The wrong text has already passed through the pipeline and its logs by then. Second, a chunk can belong to the right client and the right version, and still be the wrong paragraph, because the answer uses a sentence from somewhere else in the document. So I use two layers, in this order. Filter at the query. Ask only for chunks with the right client id, so the other client's chunks never come back at all. Verify after retrieval. Check the client id, the source file and the version on each chunk that comes back, before the model sees it. Check the sentence, not just the chunk. Make the model return the exact sentence it used, then check in code that the sentence sits inside the chunk it was given. Set a minimum score. If nothing clears it, the answer is I cannot find that in your documents, not the sixth best chunk dressed up as an answer. Log every drop, with the reason: wrong client, stale, low score. A rising count of wrong client drops means the indexing is mixing clients, and that is fixed at the source. The filter does the main work, the check after retrieval is the backup, and the minimum score stops a weak chunk from becoming an answer. What do you check on a retrieved chunk before you trust it?