Apply to my task
arXiv:2610.20417 ★ 73 Oct 14, 2026

The Consistency Filter: How to Tell a Model's "Confidence" from the Truth in Entity Extraction

Key result

Finding: almost none of the extra entities in a model's output are made up. Fabrications account for about 1%, while two thirds of the excess are real strings from the text, just from the background ("for comparison: JPMorgan, Citi…"). The method tells you which of the companies, people and IDs it found a human should check first. The trick: don't ask the model for a confidence percentage — run the same request 5 times and count how often each entity repeats. A self-reported "95 confidence" is useless, because almost all answers land in the 80–100 range. But the share of repeats across runs genuinely splits entities into reliable and questionable.

01

TL;DR

This study shows where extraction of names, IDs and terms from long documents breaks down. The main failure isn't fabrication, it's background entities: the string really is in the text, it just has nothing to do with the main event. To prioritize review, the authors compared two signals: the model's self-reported "confidence" and the share of repeats across 5 independent runs. Repeat share works. Self-reports don't.

A familiar pain: you ask a model to pull the deal participants out of a 40-page report and get 15 companies instead of two. The model writes "95% confidence" for nearly all of them. Fabrications made up only about 1% of the extra candidates. Roughly two thirds were background mentions ("for comparison: JPMorgan, Citi…"), and another fifth were entities genuinely tied to the event but not on the "core" list. The model confuses "mentioned" with "involved." A stronger model doesn't fix this.

The practical takeaway: don't trust "confidence 0–100"; rank the questionable items by how often an entity shows up across 5 runs (combined with how often it's mentioned in the text). That tells a human what to check first. It does not confirm truth: a single planted sentence flips almost any "confident" answer.

Want this for your own case? Apply this study to your task: AI adapts its method to what you are working on and writes the prompt.

02

Method Blueprint

STEP 1: Extract with roles → list of entities + role (core / background) + quote
STEP 2: Repeat 5 times (separate requests/chats) → 5 lists
STEP 3: For each entity, compute the share of runs where it appeared (0.2 … 1.0)
STEP 4: Add how often it's mentioned in the text (except for "techniques"/descriptive terms)
STEP 5: Sort → the "top" items per entity type go to review first
STEP 6: A human checks the context; confidence = priority, not truth

Steps 1–2 are model requests. Steps 3–5 are a manual tally or a simple spreadsheet.

03

Example in Practice

Task: An analyst at an investment firm gets a 60-page report on the Warner Bros. Discovery split. They need a list of the companies that are actually party to the deal. The text has dozens of mentions: JPMorgan, Citi, Revolut, Amazon, Meta — as background, for comparison and in footnotes.

Prompt:

You are extracting entities from a report. Read the document below.

Task: find the companies that are PARTICIPANTS in the deal splitting up
Warner Bros. Discovery (buyers, sellers, vehicles the deal runs through).

Rules:
1. For each company, give its role: "participant" or "background"
   (mentioned for comparison, as a competitor, in footnotes, in history).
2. For each company, give a verbatim quote from the document
   that shows its role.
3. If you're not sure whether it's a participant or background, mark it "background" and explain.
4. Do not give a confidence percentage.

Format: table | Company | Role | Quote |

Document:
{report_text}

Run this prompt 5 times in fresh chats. Then merge the tables: how many times did each company get the "participant" role?

Result: The model returns a table of companies, roles and quotes. After 5 runs a picture emerges: some companies are consistently "participants" (5 out of 5), some flicker between "participant" and "background," and some are "background" every time. Check the flickering ones first. Don't blindly trust the 5-out-of-5 ones either: if one false statement made it into the report, they may be resting on it.

04

Why It Works

The weakness. The model pulls out strings; it doesn't decide whether they belong to this event. A self-reported "95 confidence" is just a habitual answer: nearly all scores bunch up in the 80–100 range. So there's nothing to rank by.

The strength. The model is good at finding mentions (80–99% recall). And if an entity is shaky, it shows up as spread across runs. When the text is ambiguous, the model's "core or background" call varies from run to run, and that disagreement is measurable.

How the method uses this. It doesn't ask the model to grade itself. It looks at how reproducible the answer is. Strong repetition means "stable given the text," not "correct." The authors tested this: they added one sentence with a false claim of involvement to a report, and in 95–100% of cases the models "confidently" tied the false entity to the event. Stability measures consistency, not fact.

Control knobs: - Number of runs (5) — fewer gives coarse steps; more sharpens the ranking but costs more. - Entity type — for group and organization names, mention frequency in the text is a strong signal; for descriptive terms ("techniques") it hurts. - Review budget — for identifiers like ID numbers, checking the top ~20% of the list is enough; for organizations you need to check everything in the top group. - No self-assessment — drop "confidence in %" from the prompt; it doesn't help and creates a false sense of reliability.

05

Prompt Template

You are extracting entities from a document.

Document: {document_type}
Main event / subject of the document: {event}
What to extract: {entity_type}

Rules:
1. Extract only entities that relate to the main event.
2. For each entity, give its role:
   - "core" — directly involved in the event;
   - "related" — connected to the event, but not central;
   - "background" — mentioned for comparison, history, as an example or in a footnote.
3. For each entity, give a verbatim quote from the document.
4. If you're torn between "core" and "background," choose "background" and explain why.
5. Do not rate your confidence with a number.

Format: | Entity | Role | Quote |

Document:
{text}

Run it 5 times in separate chats. Then ask:

Here are 5 tables. For each entity, count in how many runs
it got the role "core", "related", "background". Output a table
sorted by the number of runs with the role "core".

What to fill in: {event} — the document's subject in one sentence; {entity_type} — companies, people, ID numbers, terms; {text} — the full document.

Caveat: the paper doesn't include the authors' actual prompt text. The template above is a practical implementation of their findings: separate core from background, don't ask for self-assessment, count repeats over 5 runs.

🚀 Quick start — paste into the chat:

Here's an entity-extraction template that separates "core / background" and uses five runs.
Adapt it to my task: {your task}.
Ask me questions to fill in the fields.

[paste the template above]

The LLM will ask about the document type, the event and the entities — because the line between "core" and "background" depends on what counts as the center of the document. Without that definition, the model will dump everything into one list again.

06

Limitations

⚠️ Confidence is not truth: a single false sentence in a document makes the model "confidently" accept it almost every time, and even a sentence explicitly flagged as "unrelated to the case" still got a false entity attached in a noticeable share of cases. Repeatability doesn't protect you from bad input.

⚠️ The top of the organization list is unreliable: for groups/organizations, the top of the ranking turned out to be packed with errors (11 of the first 13 were wrong attributions). You have to manually check the whole top, not just the middle.

⚠️ One domain: tested on cybersecurity reports and three entity types. For contracts, news or résumés, you'll have to find a useful threshold all over again.

⚠️ Thresholds don't transfer: on another corpus the ranking stayed useful, but fixed cutoffs ("≥0.8 — trust it") didn't. They have to be recalculated for each document set.

⚠️ The fix isn't universal: adding retrieval and step-by-step reasoning helped only for organizations and didn't help for identifiers; on descriptive terms the effect flipped sign between models.

⚠️ Error analysis was partly done by LLMs: the error causes were labeled by two annotator models, not humans. The authors disclose this openly; agreement is good but not perfect. The counterfactual test wasn't run on the flagship model.

⚠️ You need a manual tally or a script: counting repeats across 5 runs by hand in a chat is doable, but across hundreds of documents you'll need automation.

07

How They Tested It

The researchers took a public set of 354 campaigns (315 reports) on cyberattacks. The task was to pull out threat group names, vulnerability IDs and attack techniques. They tested two cheap new-generation models plus one flagship model as a control, 630 runs in total. The scoring rules and thresholds were locked in in advance, before the experiments, so the results couldn't be massaged.

First, it turned out that precision was low (3–34%) with recall at 81–99%: the model finds almost everything it should but drowns in extras (on average 15 IDs per report versus at most two in the gold standard). The flagship did no better. Then 360 erroneous candidates were analyzed by hand (more precisely, by two annotator models from other companies). The result was a surprise: nearly two thirds of the extras were background mentions, a fifth were "event" entities outside the gold standard, and only 1.2% were fabrications. So the thing to fix isn't "hallucinations" — it's understanding context.

Next they compared confidence signals: a 0–100 self-report, the share of repeats across 5 runs, and how often the word appears in the text. Repeats cleared the pre-set threshold in all six "model × type" combinations. The self-report added almost no information on top of them. Finally, they inserted one false sentence into each of 45 reports: an attribution, a denial, "unrelated" background. Confidence didn't budge, hence the conclusion: it ranks, but it doesn't verify.

08

Adaptations and Extrapolations

🔧 Technique: "background" as a separate role → cuts off the main source of errors

Add a third role to the prompt and the rule "when in doubt, mark it background." This hits the main cause of excess output head-on (65.6% of errors). Without that role, the model dumps everything it sees into the answer.

🔧 Technique: drop self-assessment, add a quote → review gets fast

Instead of "confidence 0–100," require a verbatim quote. The reviewer only has to read one line of context. In the paper, the link between the quote and the value also turned out to be weak (quote overlap with the source mostly below 0.5), so still eyeball the quote.

Extrapolation (the authors didn't test this, it's an idea):

Ask a second model not to "confirm" the extraction, but to answer just one question about each "flickering" entity: "Does it relate to the main event, or is it mentioned as background? Give a quote." The authors showed that generic self-checking ("is this correct?") often confuses "mentioned" with "involved," so a narrow question about role rather than truth is closer to what worked for them.

09

Resources

  • Paper: From Unreliable to Usable: Decomposing Failure Modes and Confidence Signals in LLM Entity Extraction — Evidence from Cyber Threat Intelligence
  • Author: Jiahong Qian, Shanghai Jian Qiao University, Shanghai
  • Built on: the Di Tizio et al. (2022) corpus and the critical audit by Mezzi et al. (2025a), whose data splits were used for comparability
  • Related: Xiong et al. (2024), Guo et al. (2017) on poor calibration of verbalized confidence; Wang et al. (2023) on self-consistency

Research digest

Key result

Finding: almost none of the extra entities in a model's output are made up. Fabrications account for about 1%, while two thirds of the excess are real strings from the text, just from the background ("for comparison: JPMorgan, Citi…"). The method tells you which of the companies, people and IDs it found a human should check first. The trick: don't ask the model for a confidence percentage — run the same request 5 times and count how often each entity repeats. A self-reported "95 confidence" is useless, because almost all answers land in the 80–100 range. But the share of repeats across runs genuinely splits entities into reliable and questionable.

Principle

A three-step process. First, the model extracts entities and immediately assigns each a role: "core," "related" or "background." It must attach a verbatim quote to each role. Then you run this 5 times in fresh chats and count in how many runs an entity got the "core" role. An entity at 5 out of 5 is stable. An entity that flickers between "core" and "background" is the prime candidate for review. The model confuses "mentioned" with "involved," so make it explicitly tell those two states apart. It's like interviewing five witnesses separately. Whoever names the same person every time is probably consistent. Where the stories diverge, that's where you dig. But agreeing in unison still doesn't prove the truth.

Why it works

The model is great at finding mentions: 80–99% recall. But it pulls out strings rather than deciding whether they belong to the event. When the text is ambiguous, the "core or background" role changes from run to run. That spread can be measured. The self-report doesn't show it: the model just spits out its habitual "90–95." A stronger model doesn't cure the background mix-up. About a fifth of the extra entities are actually real, they're just not on the core list. Repeatability measures how reproducible an answer is, not how correct it is. The kicker: the authors inserted one false sentence about involvement into a report. In 95–100% of cases, the models "confidently" tied the false entity to the event. So 5 out of 5 only means "stable," not "verified."

When to apply

Entity extraction from long documents (reports, contracts, investigations, deal reviews) → especially when you need two event participants out of 40 pages and the model hands you fifteen companies. The method sorts the manual-review queue. For organizations, check the whole top group: in testing, 11 of the first 13 positions were wrong attributions. For IDs and identifiers, the top ~20% of the list is enough. NOT suitable as proof of truth: if the document contains a false statement, the method won't catch it. Don't trust ready-made thresholds like "≥0.8 — trust it" either. They don't transfer between document sets. Tested only on cybersecurity reports; for other document types you'll have to tune the threshold from scratch.

Mini recipe

1. Define the center of the document: in one sentence, what the main event is. For example, the Warner Bros. Discovery split. 2. Pick what to look for: companies, people, IDs or terms. One entity type per request. 3. Give three roles: "core," "related," "background." If it's unsure, it marks "background" and explains. 4. Require a quote: no verbatim line from the text, no credit for the entity. 5. Ban self-assessment: no "95% confidence." It doesn't help and breeds false calm. 6. Run it 5 times: each time in a fresh chat, no history. 7. Merge the tables: ask the model to count in how many runs each entity was "core" and sort by that number. 8. Check by eye: the "flickering" ones first, then the top of the list. Don't relax on the 5-out-of-5 ones either: they may hinge on a single false sentence.

Examples

[BAD]: `Pull all the deal participants out of the report and tell me how confident you are in each, from 0 to 100` [GOOD]: `You are extracting entities from a report. Main event: the Warner Bros. Discovery split. Find the companies. For each, give its role: "participant" or "background" (comparison, competitor, footnote, history). Give a verbatim quote that shows the role. If unsure, mark it "background" and explain. Do not give a confidence percentage. Format: | Company | Role | Quote |` Then run it in 5 fresh chats and ask: `Here are 5 tables. For each company, count in how many runs it has the role "participant". Sort in descending order.` Result: some companies are 5 out of 5, some flicker between "participant" and "background," some are "background" everywhere. The human starts reviewing with the flickering ones.

In plain words

Large language models screw up on long documents, and it's not because they hallucinate. Their real problem is background entities. The model mindlessly yanks out familiar names and terms without getting the point of what's going on. To it, a bank mentioned in a footnote counts the same as the main party to the deal, so what you get back isn't facts — it's a soup of contextual noise.

It's like sending an intern to find out who caused a car crash, and they come back with a list of thirty random pedestrians and the numbers of every bus that drove past. Technically they didn't lie — all of them were on the street. But instead of an answer, you spend hours scrubbing out that information junk by hand, because the algorithm can't see the storyline.

Trying to fix this by asking "how confident are you?" is pointless: the model's self-report just piles up in its comfort zone of 80–100% for any nonsense at all. The only filter signal that works is the share of repeats across 5 runs. Run the task five times independently: if an entity surfaces in all five answers, it's rock solid; if it pops up once or twice, toss it.

The method was road-tested on cyber threats, but the principle is universal. Whether you're digging through a 60-page merger report where outside giants keep cameoing in the background, or combing through lawsuits — same logic. Anywhere you need to pull out the key players from a wall of text, a default prompt will choke on secondary mentions.

Bottom line: never take a model's word for it when it swears it's absolutely sure. Remember, LLM self-assessment is garbage; only reproducibility works. Push the document through 5 independent attempts, collect the overlaps — and you get clean data without endless hours of mind-numbing manual fact-checking.

AI lab assistant

Apply this study to your task

Describe what you're working on. AI takes the method and the measured results from this paper and adapts them to your case, or writes a ready prompt built on them.

Based on The Consistency Filter: How to Tell a Model's "Confidence" from the Truth in Entity Extraction arXiv:2610.20417

Sign in to apply this study New accounts get 50 free credits.