Factagora
Back to Blog
Guide

Why LLMs Cite Sources That Don't Exist

Factagora··6 min read
Cover image for Why LLMs Cite Sources That Don't Exist

A Familiar Failure

Ask an LLM for a citation and it will often give you one: a paper title, a URL, a quote attributed to a real publication. It reads convincingly. It's also, with some regularity, entirely made up — the paper doesn't exist, the URL 404s, the quote never appears in the source. This isn't a bug that better prompting fixes. It's a structural consequence of how these models produce text.

Why It Happens

An LLM generates text one token at a time by predicting what's plausible given everything before it, not by looking anything up. Asked for a citation, it produces the most statistically likely-looking one — formatted correctly, referencing a plausible author or venue — with no mechanism confirming the underlying source exists or says what the model claims. Fluency and factuality are optimized separately, so a fabricated citation and a real one can look identical in the model's own output.

Why 'Just Add a Source List' Doesn't Fully Fix It

Retrieval-augmented generation helps by handing the model real documents to draw from, but it doesn't close the gap on its own — RAG reduces hallucinations, it doesn't cure them. Two failure modes survive: misattribution, where a model cites a real document for a claim that document doesn't actually support, and paraphrase drift, where a 'quote' is a plausible-sounding rewrite rather than what the source says. Retrieval controls what documents the model sees, not whether the sentence it eventually writes about them is accurate.

Checking the Claim, Not the Retrieval

This is the gap DeepVerify targets. Instead of trusting that a cited source backs a claim, DeepVerify performs word-by-word verification against trusted sources, instantly checking whether each statement is verifiable, so a fabricated or misattributed citation gets flagged rather than passed through. The same check is available programmatically: the Fact Checker endpoint takes a claim and returns a TRUE / FALSE / UNCERTAIN verdict together with the actual sources it checked against and a credibility score per source, so instead of trusting a citation because it's formatted well, you get evidence you can inspect.

"According to [Source], X happened."NO VERIFICATIONDEEPVERIFYPassed through as-isFabricated citation reaches the userChecked against real sourcesTRUE / FALSE / UNCERTAIN
Formatting a citation correctly says nothing about whether the source exists or supports the claim. Verification checks the claim itself.

How to Catch Fabricated Citations in Your Own Product

  • Extract the factual claims and citations your model produces before showing them to users.
  • Run each claim through Fact Checker and check the returned `sources` field against what the model actually cited.
  • Use Evidence Finder to pull credibility-scored, stance-labeled evidence, so contradicting sources surface instead of staying hidden.
  • Treat a `confidence` below 0.5 as UNCERTAIN, not as a soft TRUE — per the Fact Checker docs, that's the threshold below which a verdict shouldn't be trusted at face value.

FAQ

Add fact-checking to your AI with one API call.

Try API for free