Citation and Source Attribution Pipelines for LLM Responses
Averaging citation scores hides failures, so score each rubric separately.

Building an LLM system people can actually trust takes more than one model call and a hope that nothing goes wrong. It takes a pipeline: retrieve, rank, extract, attribute, verify. Shipping something whose answers hold up under scrutiny, rather than something that merely sounds convincing, means knowing exactly where each of those stages tends to break.
Start with a distinction most teams blur without meaning to: an answer can fit the evidence it retrieved perfectly well and still be impossible to trace back to any specific passage, document, or URL. That gap, between sounding grounded and actually being verifiable, is where a lot of production incidents live. Groundedness asks whether the answer matches the evidence somewhere in the context. Verifiability asks the harder question: can someone point, right now, to the exact sentence in the exact document backing this specific claim?
A legal RAG bot returns a paragraph citing Smith v. Johnson, 412 F. Supp. The formatting is clean. It reads like a real case. It isn't. The case does not exist. Groundedness scoring on that response still came back at 0.94. The structured-output check passed too, since the citation had the right fields in the right shape. So the bot shipped, and a sanctions motion followed.
Call this what it actually is: not a hallucination in the loose, popular sense. The answer wasn't nonsensical or obviously off-base. It was a traceability failure, an answer that looked plausible, cited something that looked real, and left nobody in the pipeline able to prove which piece of evidence backed which claim. That's a different failure than "the model made something up," and it needs a different kind of check to catch it.
What source attribution measures and how it differs from related metrics
Source attribution, as an eval metric, checks whether the claims a model generates cite the exact source passages, documents, or URLs that actually support them. Not "is there some evidence in the context that agrees with this," but "does the citation attached to this specific sentence point at the right place."
Engineers checking evidence at the level of one claim rather than one whole response encounter this in RAG eval pipelines, agent answer spans, and production traces. CitationPresence is the lighter check: does the answer include citations at all. SourceAttribution goes further and asks whether those citations point at the correct supporting passage for each claim made. Presence catches omission. Attribution catches the harder problem: citations that exist but point at the wrong thing, or at nothing.
It splits from groundedness in a way that matters. Groundedness confirms a claim is backed by something, anything, in the retrieved context. Attribution adds a stricter condition on top: the evidence has to support the claim, and it has to be the specific evidence that got cited. A response can pass groundedness cleanly and still fail attribution, if the model says something true that the context happens to support, but tags the wrong paragraph as its source. That's the exact seam the fabricated case law slipped through above.
The three-rubric framework: structural, resolvability, and semantic checks
Citation quality doesn't reduce to one trust score, and treating it that way is precisely how failures like the fabricated case law get past review. Citation eval runs on three separate rubrics, and averaging them into one composite number hides the exact failure that causes the real damage.
Running the arithmetic makes the danger concrete fast. A pipeline scores 0.98 on structural checks, 0.84 on resolvability, and 0.63 on semantic accuracy. Averaged together, that's a composite of 0.82, comfortably clear of most launch thresholds, so the team ships. If it is split into three separate numbers instead, the picture flips: one rubric is visibly on fire, and the team holds the release. Same underlying data. A different decision, purely because of how the number got presented.
Rubric one is structural: did the model emit a citation token in the right schema? This runs on every call, free and sub-millisecond, using something like Pydantic in structured-output mode with explicit fields for source_id, quoted_span, page, and URL. Layer in a regex check for citation format, Bluebook, Vancouver, inline link, whatever the domain calls for, plus a scanner for invisible characters that might signal a zero-width injection hiding inside a citation string. None of that verifies anything true. What it buys is structure: source_id and quoted_span as explicit, addressable fields become the data contract that makes the next two rubrics possible to run at all. Necessary, but nowhere close to sufficient, since a fake-but-well-formed citation sails through every time. The shape is fine. The substance underneath it is rotten.
Rubric two is resolvability: does the citation point at something real and fetchable? Two of the three citation dimensions require semantic judgment; the third, URL accessibility, is purely deterministic. First comes a retrieval-log join, checking that every source_id the model cites actually shows up somewhere in the upstream retriever's document set. Second, a URL or registry resolve, hitting Westlaw, PubMed, a DOI registry, or just a live URL to confirm the thing exists. This layer runs cheap, sub-100ms, inline as a guardrail before a response ever reaches a user. It's exactly the check that would have caught Smith v. Johnson before it went out the door, because a case that doesn't exist has no retrieval log to join against.
The single most consequential omission in this entire framework, which most teams skip, is the retrieval-log join. If it is skipped, a third failure mode walks straight through untouched, a document the agent never actually retrieved, cited anyway, because nobody thought to check the citation against what was actually pulled from the index.
How the retrieve-rank-extract-attribute pipeline creates failure points before eval ever runs
Eval catches what eval catches, nothing more. By the time a response reaches evaluation, a long chain of upstream handoffs has already run: retrieval from the search index, relevance ranking, content extraction, fact attribution, citation emission. Each handoff is a place a citation can go wrong before any rubric ever touches it.
Start with retrieval, since it's the stage most people misjudge. Language models are frozen at their training cutoff and have no built-in awareness of anything that happened after that date. Retrieval isn't optional plumbing bolted on for convenience, it's the only mechanism by which the model gets fresh evidence. If it is skipped, or allowed to fail silently, the model falls back on parametric memory, the vague, compressed knowledge baked into its weights, then cites that as if it came from a document it actually read. Without grounding, hallucination rates on factual queries can be substantial, while web-grounded models show meaningful improvements in factual accuracy on benchmarks like SimpleQA and FRAMES, a gap that separates a system that ships from one that doesn't. That's not marginal tuning. That distinction separates a system that ships from one that doesn't.
Retrieval itself usually runs as a two-step handoff: a search-style API surfaces relevant links, then a reader or contents API extracts clean, LLM-ready text from those links. Fail at either step and the result is a citation pointing at a page whose actual content the model never processed. The citation looks fine. The link resolves. But the connection between claim and source is fiction, because the model reasoned over something else entirely: maybe a snippet, maybe noise, maybe nothing.
Ranking has its own failure mode, and it's sneaky precisely because it doesn't look like a bug. It looks like a routine update. Swapping in a new reranker version can cause passages that used to sit above the relevance cutoff to quietly drop below it. A reranker update can quietly shift which passages rank above the relevance cutoff, so the model ends up citing the wrong section entirely because the ranking layer handed it the wrong evidence to begin with. Pages built with direct answers, structured data, clean tables, and clear headings get cited more often simply because they're easier to extract from and easier to attribute with confidence. Content structure shapes citation behavior long before any eval framework ever touches the output.
Fed noisy, unstructured HTML, a model cannot reliably identify the specific span of text that supports a claim. A Markdown AST parser extracts citation-claim pairs straight from document structure, without needing a separate LLM call to do the matching, which makes sentence-level checking possible instead of settling for a blunter, document-level shrug. That's a meaningfully finer grain of accountability: catching one wrong citation on one sentence, instead of waving through a document because it's "mostly right."
What academic benchmarks reveal about factual accuracy and the depth-versus-quality tradeoff
Stripping away the marketing language reveals how bad the baseline really is. In academic citation contexts, LLMs asked to identify the correct paper to cite are just 4 to 18% accurate. That's a substantial gap, not a rounding error. That's a system doing worse than a coin flip landing heads twice in a row. A retrieval-aware verification method called CiteGuard pushed that number up to 68%, a real gain, and also a blunt reminder of how low the floor sits without that kind of intervention.
A benchmark published on arxiv, testing frontier models across three separate citation dimensions, makes the tension between depth and quality impossible to wave away. The strongest frontier models keep link validity, does the citation actually resolve, above 94%. Content relevance, does the cited source actually relate to the claim, also looks solid, above 80% for frontier models. But factual accuracy, does the source actually support the specific claim being made, is just 39 to 77%. The surface of the citation is clean. The substance underneath is shaky in nearly half the cases at the low end.
That gap should look familiar by now. It's almost exactly the same three-rubric structure from the section above, just measured instead of theorized. Structural and resolvability checks pass at high rates across the board. The semantic check, the one that actually asks whether this evidence supports this claim, is where everything falls apart. Surface metrics pass, the deep check fails, and any composite score would have buried that split.
One might expect that giving a model more room to search, more tool calls, more retrieval passes, would fix this problem. It does the opposite. Fact-check accuracy drops by roughly 42% on average across two frontier models as tool calls scale from 2 up to 150. More retrieval produces more citations. It does not produce more accurate ones. That raises an uncomfortable design question for anyone building these pipelines: is the system optimizing for citation volume, or citation correctness? Past a certain point, chasing the first actively erodes the second, and teams that widen retrieval breadth without adding a semantic verification layer are trading quantity for quality whether they mean to or not.
Which LLM judge you use for citation verification matters less than how you calibrate it
Two of the three citation dimensions, source relevance and factual support, are semantic judgments, and semantic judgments generally need an LLM to render them. The third, URL accessibility, is purely deterministic: a fetch either succeeds or it doesn't.
The PwC benchmark tested this head-on, running 8 off-the-shelf LLM judges from 3 different model families against gold-standard human labels across 1,248 rubric decisions, with 378 flagged as hard cases specifically because the judges disagreed with each other. The roster spanned Claude Sonnet 4.6, Claude Opus 4.6, Gemini 3.1 Flash Lite, Gemini 3.1 Pro, GPT-5-mini, GPT-5.4-mini, and GPT-OSS-120B, a wide net covering both frontier-tier and cheaper, lighter models.
The results cut against the assumption that bigger automatically means better, and that assumption deserves to die here. On source relevance, GPT-5-mini posted the strongest pass-class F1 score in the entire lineup, 0.908, with a kappa of 0.636, beating out larger, more expensive siblings on this specific dimension. Scale didn't buy accuracy here. Calibration to the specific rubric did.
On factual support, the picture flattens out. Confidence intervals across the tested judges overlap enough that no single model statistically dominates the field. That points to a conclusion that matters more than any single leaderboard entry: which judge model gets picked matters less than how carefully it gets calibrated against the specific rubric and domain it's being asked to evaluate. A judge tuned loosely underperforms a cheaper judge tuned well, on either dimension.
Real-time web retrieval as the upstream dependency that determines what can be cited
Every rubric covered so far, structural, resolvability, semantic, only ever evaluates what got retrieved. That's the whole dependency in one sentence: no eval framework, however carefully calibrated, can verify a citation against evidence that was never fetched.
Which loops back to the frozen cutoff raised earlier. A model with no live retrieval path is reasoning entirely from parametric memory, and any citation it produces under those conditions is structurally unfalsifiable inside the pipeline, since there's no retrieval log to join it against and no upstream document to resolve it to. Without grounding, hallucination rates on factual queries can be substantial, while web-grounded LLMs show meaningful gains in factual accuracy on tests like SimpleQA and FRAMES. That gap is a direct measure of how much weight the retrieval stage carries for the entire chain of trust built on top of it.
Real-time retrieval sits in an odd spot because of this. It's rarely where the eval conversation starts, since eval frameworks are built to score outputs, not inputs. But every failure traced through this piece, the fabricated case law, the demoted contract clause, the citation to a page whose content the model never actually read, traces back to something that happened, or failed to happen, before generation even started. Structural checks, resolvability joins, semantic judges: all of it is downstream accounting for an upstream decision about what evidence the model was allowed to see. Get that decision wrong, and no rubric downstream fully recovers from it.
Sources
- Do You Need a Frontier Model as a Citation Verifier? Benchmarking Rubric LLMs for Deep-Research Source Attribution
- Cited but Not Verified: Parsing and Evaluating Source Attribution in LLM Deep Research Agents
- Cited but Not Verified: Parsing and Evaluating Source Attribution in LLM Deep Research Agents
- arxiv.org
- arxiv.org
- arxiv.org


