Evidence

For Both Executive and Technical Readers

Natural language is hedged. Forcing it into a binary throws away exactly the information that matters. Soft evidence lets the model take the LLM’s confidence as confidence.

A hedge forced into a fact is a lie.

The LLM reads “the patient appears mildly febrile.” What should it tell the model?

Fever = Yes // overstates a hedge as a certainty, the model reasons from a fact the clinician never asserted
Fever = No // worse: discards a real signal because it was not certain
P(Fever) = 0.7 // keeps the hedge intact, the model receives the observation and the confidence in it

Every upstream source has this shape. A medical device, a sensor-fusion stack, a security alert, an LLM, all of them produce uncertain observations. Forcing each one to commit to a binary before it reaches the model destroys information the model could have used.

A hedge forced into a fact is a lie. The binarisation problem is not a technical inconvenience. It is a category error that corrupts every inference downstream of it.

How observations enter the model, uncertain, typed, and calibrated.

Evidence is the Domain Models, Construction layer component that defines how observations enter the model at query time. It sits between the LLM’s Parse stage and the inference engine’s Execute stage, it is the seam between language and probability. Its artifact is the EvidenceBinding: a typed object that carries not just a value but a kind (hard, soft, or virtual) and the observer’s calibrated confidence.

Evidence Binding the typed artifact that carries uncertainty into the model
FieldWhat it holds
VariableWhich node in the model this evidence attaches to
KindHard (certain), soft (a probability over states), or virtual (a likelihood, not a state)
ValueA certain state, a distribution over states, or a likelihood weight, matching the kind above
SourceSensor, device, LLM, or analyst, who or what observed this
ConfidenceThe observer's calibrated belief, carried into the model rather than rounded off

The confidence field is never discarded or rounded. The model receives the observer’s uncertainty and propagates it. That is what makes the bounded LLM honest: it is uncertain out loud, and the domain model is where uncertainty is reconciled.

Two-column comparison. Left: hard evidence sets P(Fever)=1.0, node clamped, propagates as fact. Right: soft evidence sets P(Fever)=0.72, node updated, uncertainty preserved downstream.

Hard evidence sets a node to a definite value. Soft evidence updates a node proportionally to the observer’s confidence. Rounding a 72% confidence to “yes” overstates certainty; rounding to “no” discards the signal entirely.

The model doesn’t require hard facts. It takes uncertainty directly.

A Bayesian network does not require hard evidence. Two related mechanisms let it take uncertainty directly.

Soft evidence sets a distribution over a variable, “treat Fever as 70% likely”, rather than fixing a state. The LLM emits P(SepticAppearance) = 0.76 instead of SepticAppearance = Yes.

Virtual evidence attaches a likelihood, a strength of belief from an imperfect observer, to a variable, expressing how much that observer’s report should move the posterior. Useful when the observer is calibrated but not omniscient: a security alert, a radiologist’s read, a sensor with known error rates.

Fusion. The LLM’s soft readings join hard measurements, a lactate value, a white-cell count, and the model fuses all of them into one calibrated posterior. The language model’s uncertainty and the instruments’ certainty enter the same model on equal footing. Nothing upstream is forced to round to a yes or no; the fusion happens inside the explicit model that can weigh it.

Each piece of evidence, hard or soft, propagates through the network and shifts every connected variable’s posterior. That propagation is Bayesian updating: the belief state of the domain model changes, and the new posterior is where the reasoning processes take over.

The seam that makes the LLM/model division of labour work.

Evidence is the boundary that makes this division of labour work. Without soft evidence, the LLM either fabricates certainty or discards signal. With it, the LLM contributes calibrated confidence and the explicit model performs the combination. The boundary only holds because the LLM is uncertain out loud.

There is no .bayes file for Evidence, Evidence defines how observations enter any domain model, not a specific one. The artifact is the EvidenceBinding, which flows into the Execute stage of the Pipeline and becomes the evidence set recorded in the AuditRecord.

# The LLM reads the clinician’s note and emits EvidenceBindings, not facts
bindings = [
  SoftEvidence("SepticAppearance", p=0.76), # LLM confidence, preserved
  HardEvidence("Lactate", "gt_4"), # instrument certainty
  HardEvidence("WBC", "elevated"), # lab result
]

# Model fuses hard + soft natively, no upstream system forced to binarise
result = Inference(net).query(CausalQuery(evidence=bindings, target="Sepsis", rung=2))
result.posterior["Sepsis"] # 0.83

What the LLM hands to the model at every query.

Evidence is what the LLM hands to the model at every query. Here is what that handoff looks like.

The patient looks septic. Lactate came back at 4.1, WBC is 14.2. What’s the probability of sepsis if we start empirical treatment now?
AnyChatEvidence binding · soft + hard
“Looks septic” enters as SoftEvidence(SepticAppearance, p=0.76), I’m not asserting it as fact. Lactate and WBC enter as hard evidence. The model fuses all three. P(Sepsis | do(Treatment = empirical)) = 0.83.
Why 0.76 for the appearance? Why not just say yes or no?
AnyChatWhy soft evidence
Because the clinician said “looks septic”, not “is septic.” If I force that to Yes, I’m asserting a certainty that was never claimed. If I force it to No, I’m discarding a real signal. 0.76 is my calibrated read of the hedge. The model can use that. A binary cannot carry it.
How do you know the 0.83 is right?
AnyChatProvenance
I don’t, the model does. The 0.83 came from exact inference over sepsis.bayes given those three EvidenceBindings. The evidence set is recorded in the AuditRecord. The confidence values I assigned are there too, auditable, contestable. I estimated the soft confidence. The model computed the posterior.
Couldn't our clinical informaticists just write rules, if lactate > 4, flag sepsis?
AnyChatRung 2 · evidence fusion
A threshold rule fires on one variable. It cannot combine a borderline lactate, a suggestive clinical appearance, and a negative temperature reading into a single posterior, weighted by what each tells you about sepsis. It also cannot answer what the probability is if the treatment starts now and the lactate comes down: that requires propagating the intervention through a causal graph. Rules give you a binary. The model gives you a calibrated distribution that updates continuously as evidence arrives, with each piece weighted by its precision.

The audit trail is the EvidenceBinding set in the AuditRecord, not the clinician’s note.

Between the Language Interface and the inference engine.

Evidence is the seam between the Language Interface and the inference engine. It sits between the Parse stage of 01 Pipeline: where the LLM extracts observations from natural language, and the Execute stage, where the model receives them as typed EvidenceBinding objects.

Upstream: the LLM’s constrained-decode Parse stage, plus sensors, devices, and analysts. Downstream: the Execute stage, the AuditRecord (which records the evidence set), and every Cognitive Primitive that reasons over observations. Evidence feeds all of them identically, the same EvidenceBinding schema regardless of which primitive receives it.

For Pearl, this is evidence entered on a causal model, uncertain observations conditioning an explicit structure. For Marcus, it keeps the inputs explicit and calibrated rather than collapsed into opaque tokens, the system records how sure it was. For LeCun, it is the perception-to-domain-model interface done honestly: the language layer reports graded belief, and the domain model integrates it.