Telecom Enterprise
GenAI · Agentic AI
2,000+ Daily Users
Production, Not Pilot
The Problem: Agents Were the Search Engine
At a large telecom enterprise, customer service agents relied on a basic chatbot interface that could respond, but couldn't resolve. For most real customer questions, the chatbot returned partial or surface-level information — enough to start, never enough to finish. Agents still had to manually check 4–5 separate knowledge bases and internal tools mid-conversation to piece together a complete answer.
This created a dual pain point that hit both sides of the conversation at once. Agents lost time navigating between systems while a customer waited on the line. Customers experienced the friction directly — repeated "let me check that for you" moments, growing impatience, and visible frustration on calls that should have taken a fraction of the time.
It wasn't framed internally as just a customer experience problem, or just an agent efficiency problem. It was both — which is part of why it gained the urgency and traction to get built.
The Approach: One Resolution Layer, Not Another Chatbot
Rather than building a better chatbot, the team built a cognitive layer that sits between the existing chat interface and the underlying knowledge bases. It queries multiple internal sources in parallel, collates what comes back, and returns one plain-language, complete answer — directly inside the conversation the agent was already having.
Internally, this was deliberately framed not as "we added AI" but as "we removed a manual step that never needed to exist." The agent's job changed from searching to confirming — read the resolution layer's answer, validate it against the customer's actual need, and move on.
The Hard Decisions: Knowing When Not to Answer
The system needed a way to know its own limits — not through a confidence score, but through two deliberate, rule-based escalation paths built directly into the design:
Path 1 — Genuinely Unknown
When no matching information exists across the connected knowledge bases, the system escalates the query to a human with a tracked ticket — rather than guessing or returning a partial answer dressed up as complete.
Path 2 — Not the System's Decision to Make
Certain categories of requests always route to a human, regardless of whether the system has an answer — plan changes, plan reversals, discount requests, and negotiated trade offers. These are financial and commercial decisions, not informational ones, and the system was scoped deliberately to stay out of them.
This distinction mattered more than it might first appear. It separates "the system doesn't know" from "this isn't the system's call" — a designed scope boundary, not a limitation papered over after the fact.
A Real Tradeoff: Speed vs. Cleanliness, Under Pressure
A new product launch surfaced a data-readiness gap — product details from upstream knowledge bases didn't sync in time for a new offering to be fully represented in the system. The choice was between two paths: wait for a fully engineered, properly tested fix, or ship a fast, pragmatic patch to close the immediate gap.
The call was made to ship the quick fix — closing the customer-facing gap immediately rather than letting it sit through a longer, more thorough engineering cycle. That decision meant navigating real disagreement with engineering, who reasonably preferred the more careful approach.
It wasn't a clean win. It was a genuine tradeoff, made with incomplete time and two valid perspectives in the room — exactly the kind of judgment call that doesn't show up in a feature spec but shapes how a platform actually gets built.
The Outcome: What Actually Changed
First-Contact Resolution
~50–60%
↓
95%
Response Time (95th percentile)
10–15 sec
↓
<3 sec
Response time held under 3 seconds even during peak business hours — when load on the system was highest and the old experience was at its slowest.
Measured in live production conditions — real users, real edge cases, real operational constraints. Not a controlled test environment.
What This Taught Me
The most durable lesson from this project wasn't about model performance — it was about scope. Knowing when a system shouldn't answer is as important as making it answer well. The two escalation paths weren't a safety net bolted on at the end; they were a design decision made early, and they're the reason the resolution rate could climb to 95% without the system ever overstepping into decisions that genuinely required a human.
It's a principle I now apply to every AI product decision I make: scope the system's authority before scoping its intelligence. The next platform I build will start with the same question — not "what can this answer?" but "what should this never decide alone?"