Stop Hallucinations: Null-Honesty and Evidence on Every Field

Why Fieldry returns null instead of guessing — and how confidence plus bounding-box evidence makes every value checkable.

The most expensive word in document AI is a confident guess

A language model would rather invent an IBAN than admit the scan is blurry. In a demo that looks like magic; in lending, onboarding or payouts it is a landmine. A single hallucinated income figure poisons a whole scorecard, and nobody finds out until the audit — or the default.

Fieldry is built on the opposite rule: missing means null, never invented. This post explains the three mechanisms that enforce it and how to work with them.

Mechanism 1: Grammar-constrained generation

The interpreter doesn't free-write JSON. Generation is constrained to your schema — types, required fields, enums — so structurally invalid output can't happen in the first place. Across our fixture suite this holds schema-validity at or above 99%.

That covers shape. Values are the harder problem, which is why constraints alone aren't the story.

Mechanism 2: Null-honesty with status

Every field resolves to one of three outcomes:

Outcome Meaning Your move
value + high confidence Found and trusted Use it
value + low confidence Found but uncertain Review threshold routes it to a human
null + status: missing Not on the document Treat as absent, request resubmission, or skip

The third row is the one most parsers get wrong. They backfill, interpolate, or copy a nearby number. We return null. Downstream code can branch on status instead of sniffing for suspicious values.

Never treat null as zero. A missing total and a zero total are different business facts — your schema consumers must handle missing as its own case.

Mechanism 3: Evidence you can click

Each value carries confidence, page number, source text and a normalized bounding box. An auditor — or your own QA script — samples values and lands on the exact source line. Evidence turns "trust the model" into "verify in one click."

Set review thresholds per field, not per document. A 0.99 invoice number and a 0.62 smudged date deserve different fates, and the API gives you the numbers to split them.

Putting it together

A robust pipeline looks like this: extract with a described schema, auto-accept high-confidence values, queue low-confidence ones with their evidence attached, and branch on missing explicitly. No repair loops, no silent defaults, no surprises at audit time.

Common questions

Slightly — and that's the point. A null routes to a fast human check; a hallucination routes to a loss. Measure automation on correct decisions, not on untouched documents.

Start at 0.85 per field (our review_required default), then tune from your own correction logs. High-stakes fields like amounts deserve higher bars than names.

Yes — the evidence snippet and bbox show exactly what the model read. Blurry source, cropped edge, or genuinely ambiguous handwriting: you'll see which.

No. Confidence, page, text and bbox ship on every value, free. Competitors charge for citations or confidence — we consider them the product, not the upsell.

  • evidence
  • accuracy
  • llm
  • validation
Share this article