Citations that point somewhere real

Adding “cite your sources as [1], [2]” to a prompt reliably produces citation markers. It does not reliably produce correct citations. Models will attach a plausible source number to a claim the way they do everything else — by producing the likely continuation — and the result looks rigorous whether or not source 3 says what the answer says it says.

That’s a worse position than having no citations, because citations increase trust. Getting them right is mostly about design decisions made before generation.

What can go wrong

Off-by-one and drift. The claim came from source 2 and is cited as [3]. Common when many sources are in the prompt, and completely invisible to the reader.

Citing a topically related source. Source 4 is about the right subject and doesn’t contain the specific claim. The most common error and the hardest to spot without checking.

Uncited claims. The answer has three claims and one citation. Usually the uncited claims came from the model’s training.

Merged claims. A sentence combines a fact from one source with a fact from another, cited to one of them. The sentence as written appears in neither source.

Citing everything. Every sentence tagged [1][2][3][4], which is technically defensible and carries no information.

Invented sources. [7] when six were provided. Rarer, and at least detectable mechanically.

Design that helps

Label sources unambiguously in the prompt. Sequential integers, formatted identically, one per chunk, in an obvious place. If your labels are inconsistent, drift is guaranteed.

Include fewer sources. Attribution accuracy falls as the number of candidates rises. Five sources produce better citations than twenty, and this is another reason the chunk count decision matters.

Make sources distinguishable. Near-duplicate chunks from the same document are a trap — the model genuinely can’t tell which one supports the claim, because either could. Deduplicate before assembling.

Ask for the quote. The strongest technique available:

For each claim, quote the exact sentence from the source that
supports it, then give the source number.

A quote is checkable by string matching. This converts citation accuracy from something you have to trust into something you can verify mechanically, which is a categorical improvement.

Require sentence-level citation. “Cite the source at the end of every sentence containing a factual claim” produces more precise attribution than a citation list at the end of a paragraph, because it forces the mapping to be made per claim rather than in bulk.

Instruct on merged claims explicitly:

Do not combine information from multiple sources into a single
claim. If two sources each contribute, state them separately.

Granularity

You have a choice about what a citation points at, and it’s worth making deliberately.

Document level — “from the employee handbook”. Easy, robust, and not very useful on a two-hundred-page document.

Chunk level — the retrieved passage. The natural unit, since chunks are what’s in the prompt. Good default.

Sentence or offset level — the exact supporting text within the chunk. Most useful for the reader, because you can highlight it. Requires either the quote technique or a post-generation matching step.

Chunk level with a quote gets you most of the way to sentence level for little extra work: you have the chunk from retrieval, and the quote lets you locate the span inside it.

What the user should see

Citations are only valuable if the reader can act on them.

Make them resolvable. A number in brackets with no way to see the source is decoration. Link to the document, and to the location within it if you have one.

Show the supporting passage. A hover or expander revealing the actual quoted text is the single most useful presentation choice. It lets a reader verify a claim in a second rather than opening a PDF and searching.

Keep source identity visible. “[1] employee-handbook.pdf, §4.2” is more informative than “[1]”, and readers weight sources differently once they know what they are.

Include the date. Readers are good at noticing that a cited policy is three years old — better than the model is.

Say when a claim is uncited. If your validation finds unsupported assertions, marking them is more honest than silently presenting them alongside supported ones.

Verify, don’t trust

The important shift: treat citations as claims to be checked rather than metadata to be displayed.

With the quote technique, verification is mostly mechanical — does the quoted text appear in the cited chunk? String matching answers that, allowing for whitespace differences. Citations whose quotes don’t match are flagged before the user sees them.

Without quotes, you need something fuzzier — an entailment check, or a second model call asking whether the chunk supports the claim. Both work; both cost more than a string comparison, which is a good reason to ask for quotes in the first place.

That verification step is its own subject, and it’s what turns a citation from a gesture toward rigour into an actual guarantee. But the groundwork is here: few sources, clearly labelled, distinguishable, with quotes requested and sentence-level attribution required.

Get those right and most citation errors never happen. Check the rest.