Designing a chatbot that won't invent your pricing
The scariest chatbot failure is not "I don't know." It is a confident, well-formatted, completely wrong price - the kind a customer screenshots and holds you to. A language model will always fill a gap with something plausible unless you design the gap out. Here is how to ground a chatbot in your real numbers and teach it to say "let me check" instead of guessing.
The scariest thing a support chatbot can do is not say "I don't know." It is to state a wrong price with total confidence - correctly formatted, plausibly worded, and completely made up. A customer screenshots that answer and holds you to it. The failure is not that the model is broken; it is that a language model, asked a question it has no grounding for, will always produce something that reads like an answer. If you want it to stop inventing your pricing, you have to design the gap out.
Why it makes things up
A language model predicts likely text. Ask it "what does the Pro plan cost?" and, with nothing real in front of it, it will generate the most probable-sounding price - a number shaped like your other numbers, delivered in the same confident tone as a correct answer. It is not lying and it is not guessing in the human sense; it is completing a pattern. The tone is identical whether the fact is right or fabricated, which is exactly what makes the mistake dangerous. You cannot prompt this tendency away with "please be accurate." You have to remove the situation where it has to guess.
Ground every answer in real data
The fix is retrieval: instead of asking the model to know your prices, you look them up from a real source and hand them to the model as part of the question. Now its task shifts from "recall the Pro price" - which it cannot do reliably - to "phrase the price you were just given," which it does well. Four design choices turn that principle into a chatbot you can trust in front of customers.
Retrieve the number, do not recall it
Never let the model answer a price or policy question from memory. Look the current value up from your real source - the pricing table, the policy doc, the account record - and put it in the prompt at answer time. The model's job is to phrase what it was handed, not to remember what it once saw in training.
Constrain the answer to the context
Instruct the model to answer only from the retrieved material and to treat anything outside it as unknown. This is the difference between "here is what our docs say" and "here is what sounds right." A grounded model quotes; an ungrounded one improvises.
Give it a way to say "I don't know"
A model with no refusal path will always invent an answer, because that is what completing text does. Design an explicit escape: when retrieval returns nothing relevant, the model should say it will check and hand off - to a human, a search, or a support ticket. "Let me confirm that" is a feature, not a failure.
Measure it on the questions that hurt
Build an eval set of the exact questions a wrong answer would cost you - edge-case prices, expired promotions, region-specific policies - with the correct answers attached. Re-run it on every prompt and model change. Without it you are shipping on vibes, and hallucinations reappear the moment you stop looking.
A refusal beats a confident guess
The instinct is to make the bot answer everything, but the opposite is what earns trust. A chatbot that says "I want to get this exactly right - let me pull up your account" and hands off is doing its job. One that confidently quotes a discount that ended last quarter is a liability, even though it feels more helpful in the moment. Grounding and a clean refusal path are two sides of the same design: answer from real data when you have it, and say so plainly when you do not.
The short version
A chatbot invents pricing because you asked it to recall a fact instead of handing it one. Retrieve the real numbers at answer time, constrain the model to what it was given, build an explicit path for "I'm not sure," and measure the whole thing on the questions a wrong answer would actually cost you. Do that and the confident-but-wrong price - the one that ends up in a screenshot - stops being a thing your bot can produce.