How Clara Handles the "I Don't Know" Problem

Everyone talks about voice latency. Nobody talks about the actual hard part of building an AI phone agent: what happens when it doesn't know the answer.

Here's what I mean. A caller asks "Do you have parking?" Your AI agent has two options. Option A: guess. Option B: say "I don't know." Both are wrong in different ways.

Guess wrong and you've lied to a customer. They show up expecting a garage and there's street parking only. They leave angry. They leave a one-star review.

Say "I don't know" to everything and your AI agent is useless. A receptionist that can't answer basic questions isn't a receptionist — it's an obstacle.

This is the problem I spent the most time on when building Clara. Not the voice. Not the latency. The boundary between "I can answer this" and "I need to escalate this."

The Hallucination Problem

The first version of Clara was a basic pipeline: caller speaks, Whisper transcribes, LLM generates a response, TTS speaks it back. No grounding context. No knowledge base. Just "answer the question."

That went about as well as you'd expect.

Someone asked if we take insurance. Clara said "Yes, we accept most major insurance plans including Aetna, Blue Cross, and United Healthcare." None of that was true. We don't take insurance. We're not even in a regulated industry where that question makes sense.

The LLM wasn't broken. It was doing what LLMs do — generating plausible-sounding answers from patterns in its training data. Ask a question about insurance and you'll get an answer about insurance. It just won't be your answer.

Why Confidence Thresholds Don't Work

The obvious fix is a confidence threshold. If the LLM's confidence is below X, say "I don't know." If it's above X, give the answer.

That doesn't work either. LLM confidence scores are unreliable. The model will give you a high-confidence answer that's completely fabricated. It'll also sometimes give a low-confidence answer that's actually correct.

I tried tuning the threshold. At 0.7, Clara still hallucinated about once every 15 calls. At 0.9, she refused to answer questions she actually knew — "What are your hours?" got "I don't have that information." That's worse than hallucinating. At least a hallucination gives the caller something to work with.

The threshold approach treats the symptom, not the disease. The disease is: the LLM doesn't know what it doesn't know. Asking it to grade its own confidence is asking a confident liar to tell you when it's lying.

What Actually Works: Grounding + Scope Detection

The fix took two pieces working together.

1. Grounding context. Every call, Clara gets a knowledge base — hours, services, pricing, FAQs, policies. The prompt is explicit: "Answer only from this context. If the answer is not in this context, say you don't know."

This alone cuts hallucinations by maybe 80%. The LLM has something to anchor to. It's not generating from the void — it's extracting from a document.

But grounding alone isn't enough. The LLM will still sometimes extrapolate beyond the context. "We're open 9-5" becomes "We're open 9-5 but we have extended hours on weekends" because the model saw weekend patterns in training data.

2. Scope detection. Before answering, Clara classifies the question: is this in-scope (answerable from the knowledge base) or out-of-scope (anything else)? Out-of-scope questions get a fallback response, not an LLM-generated one.

The scope check is a separate, smaller LLM call with a simple prompt: "Given this knowledge base and this question, can the question be answered from the knowledge base? Answer yes or no."

Two LLM calls per turn instead of one. Slightly more latency. But the false positive rate on hallucinations dropped from ~7% to under 1%.

The Fallback Response

When Clara doesn't know something, the response matters almost as much as when she does.

Bad fallback: "I don't know." (Dead end. Caller hangs up.)

Okay fallback: "I don't have that information. Can I take a message?" (Polite but passive.)

What actually works: "I don't have that information right now, but I can have someone call you back. What's the best number?" (Honest, proactive, captures the lead.)

The key is: never leave the caller stranded. "I don't know" is fine as long as it comes with a next step. Clara takes a message, texts me, and I call them back within the hour. The caller gets their answer — just not from the AI.

The Trade-off I Accepted

This approach makes Clara more conservative. She'll refuse to answer questions that are technically answerable but phrased in a way the scope check doesn't catch. "Do you guys do weekend appointments?" might get a fallback if the knowledge base says "by appointment only" without mentioning weekends specifically.

I'm okay with that trade. A conservative agent that escalates too much is annoying. A confident agent that lies is dangerous. Annoying I can fix by expanding the knowledge base. Dangerous I can't fix at all.

The knowledge base is the product. Every week I add the questions Clara couldn't answer. Over time, the scope of "I don't know" shrinks. The scope of "I can help with that" grows. It's iterative, not magical.

What I'd Tell Someone Building This

Spend more time on your knowledge base than your voice model. A natural-sounding agent that hallucinates is worse than a robotic one that's always right. Callers will tolerate a slight delay or a slightly unnatural voice. They won't tolerate being lied to.

Also: log every "I don't know." Those are your roadmap. Every fallback response is a gap in your knowledge base. Fill it and the agent gets better. Ignore it and you're stuck at the same accuracy forever.

And honestly — accept that you'll never get to 100%. Some questions genuinely require a human. The goal isn't to answer everything. It's to answer the 70% that can be answered, and gracefully escalate the 30% that can't. Before Clara, 0% of after-hours calls got answered. Now 70% do. That's the win.

← Back to blog