You asked for a rate, and the model answered with a specific number as if reading it off a current table. The number turned out to be months out of date, because nothing about the question told the model otherwise.
A model's knowledge comes from training, which has a cutoff date like any photograph has a date it was taken. Once a rate changes or a price moves, the model has no way to know, and it answers in exactly the same confident tone whether the number is current or long since replaced. Wording the prompt more carefully doesn't reach backward and update what the model learned. The fix is putting a current number in front of the model at the moment it answers, not asking it to already know one.
Every model has a point where its training stopped, and anything that changed after that point never entered it. That cutoff applies across the board, so a rate that updated last month comes back exactly as it stood before the update, with nothing flagging that it's stale.
A newer version of a model pushes the cutoff forward, but it's still a fixed date in the past by the time you're using it. There's always some gap between training and now, and this is one of the few things in this space that can't be prompted away even partly.
The fix is mechanical: fetch the current number from wherever it actually lives, a rate table or an API, and hand that number to the model as part of the prompt. The model's job becomes writing around a fact you already know, not supplying one from memory.
The model never supplies the number. It only explains the one it was handed.
function quoteRate(product) {
const currentRate = fetchCurrentRate(product); // live lookup, not the model
const prompt = buildPrompt({ product, currentRate });
return callModel(prompt); // writes around a known fact
}Some chat apps can fetch a live page when asked, which looks like it solves this, and it often helps. But it depends on the model deciding to browse at all and picking a trustworthy source once it does, neither of which is guaranteed on every run the way a direct lookup in your own code is. If the number matters enough to act on, treat anything a browsing feature returns as a claim to verify against the source, the same discipline the playbook on not inventing facts covers for a document you already have.
Fetching the live number on every single call is often unnecessary and sometimes slow or rate-limited. Caching it for a while, however long makes sense for how fast that number actually changes, is fine. What matters is that the cache carries an expiry the code actually checks, rather than a number fetched once and quietly reused forever.