Designing UX for AI Uncertainty: Confidence, Citations, and Undo Patterns for PMs
Your model will be wrong some of the time. The product decision is what the user sees when it is. Here are the UX patterns that turn model uncertainty into trust instead of churn.
Every AI feature ships with an error rate. Your eval suite tells you what it is; your UX decides what it costs. Two teams can ship the same model at 90% accuracy. One gets angry support tickets and churn. The other gets users who say "it's like a fast junior colleague." The difference is almost never the model. It is how the product behaves in the 10% of cases where the model is wrong, and in the larger share where it is merely unsure.
This post is a practical toolkit for PMs and the engineers who work with them: how to decide how much uncertainty to show, which patterns fit which risk level, and a small implementation you can adapt.
The core principle: match friction to cost of error
Users do not need to see uncertainty everywhere. They need friction proportional to what a mistake costs. A wrong song recommendation costs nothing. A wrong refund approval costs money. A wrong medication note costs far more.
Start by classifying each AI action on two axes:
- Reversibility: can the user undo it in seconds, or is it permanent (an email sent, a payment made)?
- Blast radius: does it affect only the user, or other people, customers, or records?
Low on both axes: act automatically and make undo easy. High on either: ask first, show evidence, and require a deliberate confirm.
| Risk tier | Example | Default pattern | Friction |
|---|---|---|---|
| Low | Autocomplete, tag suggestions | Act, show undo | Near zero |
| Medium | Drafted reply, summarised ticket | Suggest, user edits and accepts | One click |
| High | Sending email, changing records | Preview + explicit confirm | Deliberate |
| Critical | Payments, deletes, compliance outputs | Human approval with evidence | Gated |
If you do one thing after reading this, tag every AI action in your product with a tier. Most teams discover they applied the same flow to everything.
Pattern 1: Calibrated confidence, not raw scores
The tempting move is to display "87% confident." Resist it unless that number is calibrated. Raw model probabilities and self-reported confidence ("I'm 90% sure") are often poorly calibrated: when the model says 90%, it may be right 70% of the time. Showing a precise-looking number that is wrong teaches users to distrust all your numbers.
Better options:
- Bucket, don't quantify. Show two or three states ("Looks good", "Check this", "Needs review") derived from thresholds you validated against labelled data.
- Calibrate against outcomes. Take a few hundred labelled examples, bin predictions by score, and check that each bin's actual accuracy matches its label. Re-run when you change the model or prompt.
- Use signals beyond the model's opinion. Agreement across multiple samples, retrieval score, whether a citation verifies, or whether output passed schema validation are often better predictors than the model's own confidence.
A minimal TypeScript gate that maps validated signals to a UI state:
type Signals = {
retrievalScore: number; // 0..1 from your reranker
citationsVerified: boolean; // every claim traced to a source span
sampleAgreement: number; // 0..1 agreement across N samples
};
type UiState = "auto" | "review" | "escalate";
// Thresholds must come from your own labelled data, not from this example.
const THRESHOLDS = { auto: 0.85, review: 0.6 };
export function decideUiState(s: Signals): UiState {
if (!s.citationsVerified) return "escalate";
const score = 0.5 * s.sampleAgreement + 0.5 * s.retrievalScore;
if (score >= THRESHOLDS.auto) return "auto";
if (score >= THRESHOLDS.review) return "review";
return "escalate";
}
The weights above are placeholders. The point is the structure: the UI state is a function of verifiable signals, and the thresholds are tuned against real outcomes.
Pattern 2: Citations that users can actually check
Citations are the highest-leverage trust pattern for anything grounded in documents. But a footnote that says "Source: Policy Handbook" is decoration. A useful citation:
- Links to the exact passage, highlighted, not just the document.
- Appears next to the claim it supports, not in a list at the bottom.
- Is verified on the backend: the cited span must actually support the claim, otherwise the claim is dropped or flagged.
That last point matters. Models can attach plausible-looking citations to unsupported statements. If you only render what the model returned, you have built a more convincing way to be wrong. Run a claim-level check (an entailment or judge pass against the cited span) before display. We cover that approach in the RAG citation verification post on this blog.
Design rule: when a claim has no verifiable source, say so visibly ("No source found") rather than hiding the claim or presenting it as equally solid.
Pattern 3: Undo beats confirmation dialogs
Confirmation dialogs are a tax on every correct action to catch a few wrong ones. Users click through them by the third time. For reversible actions, prefer act then offer undo: Gmail's "Undo send" is the canonical example.
Implementation notes for engineers:
- Make AI actions soft by default: stage a change, apply it after a short window (5 to 30 seconds) or on the next user action, and keep a revert path afterwards.
- Store the pre-change state so undo is exact, not best effort.
- Log undo events. An undo is the cheapest, most honest label you will ever get that the model was wrong. Feed those into your eval dataset.
Reserve hard confirmation dialogs for irreversible actions, and make the dialog specific: "Send this email to 214 customers?" rather than "Are you sure?"
Pattern 4: Show the work in proportion
For agents and multi-step features, users trust what they can inspect. But dumping a full reasoning trace overwhelms them. Use progressive disclosure:
- Default: the result plus a one-line summary of what was done ("Checked 3 sources, updated 2 fields").
- On click: the steps, sources, and tool calls.
- For admins: full traces and replay.
Keep the summary honest. If the agent skipped a step or hit an error and recovered, the one-liner should say so.
Pattern 5: Make correction cheap and visible
When users edit or reject AI output, that is signal. Design for it:
- Inline editing of the output, not "regenerate" as the only option.
- Quick reasons on rejection (wrong, outdated, tone, unsafe) as one-tap chips.
- Show the user that corrections matter, even if it is just "Thanks, we'll use this to improve." Only say that if it is true.
Be careful with implicit signals. A user ignoring a suggestion is not necessarily a thumbs-down; they may not have seen it. Treat accept, edit, and explicit reject as stronger signals than silence.
Pattern 6: Graceful abstention
Sometimes the right answer is "I don't know." A feature that abstains on 8% of queries but is right on the rest usually earns more trust than one that answers everything. Design the abstention state as a first-class screen:
- Say what is missing ("I couldn't find this in your uploaded documents").
- Offer a next step: search manually, ask a human, rephrase.
- Never dead-end the user.
Comparison: which pattern for which problem
| Problem | Best pattern | Watch out for |
|---|---|---|
| Users over-trust output | Confidence buckets, visible sources | Fake precision |
| Users ignore output entirely | Show work, inline evidence | Too much detail |
| Costly irreversible actions | Preview and specific confirm | Dialog fatigue |
| Frequent small mistakes | Undo and soft actions | Missing pre-change state |
| Need better training data | Cheap correction, reason chips | Treating silence as a label |
| Out-of-scope queries | Abstention with next step | Over-abstaining |
Common pitfalls
- Uniform disclaimers. A footer reading "AI can make mistakes" on every screen becomes invisible. Put warnings where the risk is.
- Uncalibrated percentages. Precise numbers imply precision you do not have.
- Unverified citations. Rendering model-supplied sources without checking them.
- Confirm-everything flows. Training users to click "Yes" blindly.
- No instrumentation. Without tracking accept, edit, reject, and undo rates per tier, you cannot tell whether your UX is working.
- Designing only the happy path. Test empty, low-confidence, and error states with the same care as the success state.
A checklist before you ship
- Every AI action has a risk tier (reversibility and blast radius).
- Confidence states are derived from signals validated on labelled data.
- Citations link to exact spans and are verified server-side.
- Reversible actions have undo; irreversible ones have specific previews.
- Abstention and error states are designed, not default.
- Accept, edit, reject, and undo events are logged and reviewed weekly.
- You have a target for each (for example, undo rate below X% per tier) and an owner.
Next steps
This week, take your most-used AI feature and run a 30-minute audit: list every action it performs, assign a risk tier, and compare the current UX friction to the tier. You will likely find one high-risk action with no friction and one low-risk action with too much. Fix those two first, add instrumentation for undo and edit rates, and review the numbers after a week of traffic. Check your own product analytics and user research before choosing thresholds; the values here are illustrative.
If you are a PM who wants to practise this on real AI product problems, from defining error budgets to designing the human-in-the-loop experience, take a look at Joinloop's PM cohort.
Want to build this yourself?
Join a live cohort and go from reading about AI to shipping it, with practitioners who do it daily.