A model that answers when it does not know is not a feature. It is a liability with a pleasant tone. On the systems I run, a question is allowed to come back empty. The useful behaviour is a citation when the passage is in the library, and a refusal when it is not.
Retrieval first, words second
The pattern is dull on purpose. Take the question. Find the passages that might hold the answer. Score them. If none of them actually supports a claim, stop. If one does, show the passage next to the sentence that used it. The sentence is not the source. The passage is the source. A reader who cannot open the passage cannot trust the sentence, and should not be asked to.
This is how I built the training system I run: materials in, a plan aimed at a date, answers scored against the source, the review arriving before the material is forgotten. It is also how a document question should behave. Grounded, or silent. Guessing feels helpful in a demo and expensive the first week a customer acts on it.
| What came back | What the system may say |
|---|---|
| A passage that supports the claim | The answer, with that passage attached. |
| Passages that are only nearby | Nothing firm. Say what is missing. |
| No passage | Refuse. Do not fill the gap with a likely sentence. |
| A low-confidence extract | Pause for a person. Do not pay the model again to retry blindly. |
The bill and the log are part of the design
A cloud model sees data. Before it does, the data flow is written down: which service, whose key, what the monthly cap is. Opt-in is explicit. Anything that touches a customer, a price or an order waits for a person. The call is logged, because “the assistant said so” is not an audit trail.
I do not promise that this will place a site inside someone else’s answer box. Ranking is a different machine, with incentives I do not control. What I can control is whether my own system invents.
Fluency is cheap. A passage you can open is the product.
The threshold is a product decision
Someone has to pick the point where “nearby” becomes “not good enough”. I do not leave that to the model’s mood. A passage either clears a bar I can explain, or the answer is withheld. I would rather explain a refusal to a user than explain a fabricated step in a procedure they followed. The bar can be tuned after you have seen real questions. It should not start at zero, which is where a demo likes to live, because a demo is graded on how often it says something.
When a run is uncertain in a different way, a low-confidence extract rather than an empty library, I pause it for a person instead of paying for another attempt that will sound smoother. Smoother is not truer. The log keeps the first attempt, so the person can see what was retrieved and what was discarded.
Models are trained to be helpful, which means they would rather complete the paragraph. The application has to be ruder than the model. A threshold, a missing citation, an empty retrieval: each of those is a branch that returns no answer and records why. If that branch does not exist, the system will eventually answer a question the library cannot support, and it will sound sure.
The first time you watch it refuse, it feels like a bug. It is the opposite. The bug is the confident paragraph with nowhere to click.
