You cannot know the boundaries are right by reading the splitter. You need a small query set with known-answer checks. Build 20 to 50 real questions your users ask, and for each one record the exact strings the answer must contain: the number, the date range, the condition. Then run retrieval and check the text, not the model's answer.
A validation set in that shape looks like this. The must_contain list is the automated check; the must_not_lead_with list catches fragments:
cases = [
{
"query": "Can an enterprise customer cancel after renewal and get money back?",
"must_contain": ["30 days", "prorated", "annual plans"],
"must_not_lead_with": ["percent", "days of"],
},
{
"query": "How long does a refund take once approved?",
"must_contain": ["5 to 10 business days"],
"must_not_lead_with": ["business"],
},
]
Score each case on three counts. Hit rate: did any retrieved chunk contain all required strings? Intactness: did the top-ranked chunk contain them without the answer being split across that chunk and its neighbor? Grounding: does the generated answer cite a chunk that actually holds the fact? This mirrors the evaluation dimensions used in legal QA chunking research, which measured answer correctness, answer groundedness and quality of retrieved chunks against a constructed question-answer set per the IEEE conference paper. The paper also compared naive token-level, hierarchical sentence-level and recursive chunking on the same corpus, which is the right experimental shape: hold the model constant and change only the boundaries.
A worked example with numbers helps set expectations. Suppose you have 4,000 FAQ units averaging 600 characters, and a fixed-size splitter at 1,800 characters produces roughly 1,700 chunks. If 15 percent of boundaries land inside a unit, that is about 255 chunks with a cut fact. At a top-5 retrieval budget, a query hitting a damaged unit has a real chance of pulling the truncated half, because truncated chunks often score well on the question terms. Moving to question boundaries removes those 255 splits at the cost of some chunks being shorter or longer than target, which is a good trade for a fact-bearing corpus.
Fix failures at the unit, not the chunk. If a case fails intactness, the answer is almost always a multi-part answer that should have been one unit, or a condition that was written two paragraphs below its rule. You can also raise the retrieval count, but a larger candidate pool does not repair a split fact. It just gives the model more fragments to reconcile, and the arXiv work on question decomposition shows why: when the needed evidence is distributed, retrieval improves only if each piece is self-contained and then reranked, not if the pieces are halves of the same statement per the question decomposition paper.