Skip to content

Probabilistic Architecture

This is the structural heart of the section. Almost everything else in it follows from one property.

A traditional component is deterministic: same input, same output, every time. You test it by asserting the answer. When it’s wrong, it’s wrong the same way twice, and you can debug it.

A language model is probabilistic: the same input can produce different output on different runs. Usually not wildly different — but not identical, and occasionally wrong in a way it was right about a moment ago.

That single property is the whole topic.

Deterministic — short, and you can assert the answer:

graph LR
  D1["Request"] --> D2["Logic"] --> D3["Response"] --> D4["Assert:<br/>is it correct?"]

  classDef det fill:#7D9A4E,stroke:#5F7A38,stroke-width:2px,color:#ffffff
  class D1,D2,D3,D4 det

Probabilistic — the same request, with everything that has to surround it:

graph LR
  P1["Request"] --> P2["Input<br/>check"] --> P3["Model"] --> P4["Output<br/>check"] --> P5{"Confident<br/>enough?"}
  P5 -->|yes| P6["Response"] --> P8["Measure:<br/>correct often<br/>enough?"]
  P5 -->|no| P7["Fall back, or<br/>hand to a human"]

  classDef prob fill:#D9695B,stroke:#B4483A,stroke-width:2px,color:#ffffff
  classDef gate fill:#E8A33D,stroke:#C4832A,stroke-width:2px,color:#ffffff
  classDef exit fill:#7C7C7C,stroke:#5E5E5E,stroke-width:2px,color:#ffffff
  class P1,P3,P6 prob
  class P2,P4,P5 gate
  class P7,P8 exit

The same request path, both ways. The amber boxes are the checks and the decision — they are the design work, and they have no counterpart above.

Testing becomes measuring. You can’t assert the answer equals an expected string, because there isn’t one expected string. You measure quality across many examples and set a threshold. “Correct” becomes “correct often enough” — which means somebody has to decide what enough is.

That’s not a QA detail. It’s an architectural decision with a business owner. Is 90% accuracy acceptable when the other 10% reaches a human anyway? Probably. Is it acceptable when the action moves money? Different question entirely, and whoever owns that financial exposure belongs in the room for it.

Cost becomes variable and structural. A traditional service costs roughly the same per request. A model call costs in proportion to how much text goes in and comes out. Cost becomes a design parameter — how much context you include, which model handles which request, what you cache.

Where there’s a hard cost-per-interaction target, this isn’t an optimisation for later. It constrains the structure from the beginning, exactly as the chain in Why the job exists predicts a hard driver should.

Failure gets quiet. This is the dangerous one.

A deterministic system fails loudly — an exception, a 500, an alert fires. A probabilistic one degrades. It returns confident, plausible, wrong answers, and nothing in your monitoring notices, because nothing crashed.

Three moves follow directly.

Decide the failure path first. What does a user see when the model is unavailable, or unsure? If you design the happy path first, the failure path becomes whatever’s left over.

Make confidence a control-flow decision. “Answer if confident, otherwise hand to a human” is a structural choice about where the boundary sits — and it needs a number attached, not a vibe.

Measure continuously, not once. Quality at launch tells you nothing about quality in six months. The model provider updates. The documentation drifts. Customer questions change. Without ongoing measurement you get the quiet failure above, again.

The cost: all three add latency, expense, and work that produces no visible feature. Skipping them is the cheaper option right up until it isn’t.

Worth stating plainly, because the discourse implies otherwise.

Business drivers still come first. Quality requirements still shape structure. Trade-offs are still trade-offs. Everything you know about distributed systems, failure modes, data consistency and security still applies — a system with a model in it is still a distributed system, with all the usual problems plus new ones.

The genuinely new parts are: output varies, cost scales with usage in a new way, failure is quiet, and the thing can act on its own. That’s a shorter list than the hype suggests, but each item has structural consequences.

Your business-value brief must name at least one concrete consequence of unpredictable output. “The model might be wrong” isn’t enough — say what it would cost and what the system does about it.


→ If you can’t fully trust the output, what can you trust? Your own understanding of the domain — which is now worth more, not less. — Domain Authority