**1. System prompt:** include the schema + the 'prefer no_source over inventing' instruction.
**2. Tool/structured-output forcing:** use the model's structured-output feature (tool use, JSON mode) to require schema-compliant output. Don't rely on prose instructions alone — they fail at scale.
**3. Validator stage:** after generation, programmatically check each citation. For each 'directly_stated' citation, search the source for the exact_quote (allow ~10% character drift for whitespace/punctuation). Quotes that don't match — drop the claim or flag for review.
**4. Output filtering:** depending on use case, either drop no_source claims (strict mode) or surface them with explicit uncertainty markers ('We weren't able to verify the following: ...').
**5. Logging:** log citation pass rates, no_source rates, and validator-rejection rates per query category. These are the metrics that tell you whether the pattern is working in your specific deployment.
Deployment effort: roughly 1–2 days for a competent engineer to implement on an existing LLM integration. Quality lift: 40–60% hallucination reduction. The ROI is among the strongest available for LLM production work.
Single-shot prompts without citation forcing: 23–31% hallucination rate, no signal on which claims are reliable, can't validate downstream, can't run in high-stakes production without expensive human review.
Cite-sources pattern with validator: 9–17% hallucination rate (60% reduction), per-claim verification signal, downstream validation possible, production-deployable for many use cases without human review.