The Challenge
Support volume scales with customers; support headcount scales with budget. The gap between those two lines is why every support organisation eventually looks at automation, and why most of the automation they bought before 2023 made things worse.
The specific problem is not that questions are hard. Most are not. In a typical SaaS or e-commerce queue, a large share of inbound messages are answerable from documentation that already exists — where is my order, how do I change my plan, why was I charged twice, how do I export my data. The answers are written down. The customer did not find them, or did not trust them, or wanted confirmation from a person.
Three things make this resistant to the obvious fix.
Decision-tree bots failed publicly and customers remember. A generation of "Did you mean?" widgets trained people to type "agent" immediately. Any new system inherits that suspicion, which means a bad first impression is not recoverable — it converts a self-service attempt into a ticket plus a complaint about the bot.
The cost of a wrong answer is asymmetric. A support reply is a statement your company made. If the model invents a refund policy, promises a feature that does not exist, or misstates a cancellation deadline, you may be held to it — and at minimum you have created a second, angrier ticket. Compare that with the routing decision covered in ticket triage, where a mistake costs an internal reassignment.
Your documentation is worse than you think. The moment you ground a model in your help centre, you discover which articles are stale, which contradict each other, and which policies exist only in a senior agent's head. This is genuinely useful information, and it arrives as a problem rather than a report.
How AI Solves It
The mechanism that works is not "an LLM that knows about your product". It is retrieval plus generation with a refusal path, and the refusal path is the part that makes it deployable.
An incoming question is used to retrieve the most relevant passages from your own documentation. Those passages, and nothing else, are given to the model as the source material for an answer. The model writes the answer and states which passage it came from. Before anything reaches the customer, the system checks that the cited passage actually exists and actually supports the claim.
This is Retrieval-Augmented Generation, and the reason it fits support specifically is that support answers are supposed to be unoriginal. You do not want a creative response to "what is your refund window". You want the sentence from the refund policy, phrased for this customer. Constraining the model to source material is not a limitation here — it is the requirement.
The second structural decision is where the human sits. There are two deployments and they carry very different risk:
Agent assist. The model drafts a reply, the agent reads it, edits if needed, and sends. The human is the safety layer. A hallucination costs a few seconds of attention. You can deploy this on your whole question mix on day one.
Self-service. The model answers the customer directly. There is no human. A hallucination goes out under your name. You can only deploy this on question types where you have already measured that the drafts are reliable.
Almost every failed rollout skipped the first and started with the second. The correct order is assist → measure → open a narrow self-service path → widen it slowly.
Recommended Tools & Models
| Option | Best for | Cost signal | Trade-off |
|---|---|---|---|
| Claude Haiku 4.5 | High-volume grounded answers | $1 / $5 per MTok | Cheapest credible tier; weaker on ambiguous multi-part questions |
| Claude Sonnet 5 | Nuanced or sensitive replies | $2 / $10 per MTok (introductory through 31 Aug 2026) | ~2× the cost for better judgement on edge cases |
| GPT-5.6 Luna | High-volume alternative | $1 / $6 per MTok | Same tier as Haiku; pick on eval results, not on price |
| Salesforce Agentforce | Teams already on Salesforce | Per-conversation | Least integration work; least control over retrieval |
| n8n | Wiring retrieval, model and helpdesk | Self-host or cloud | You own the pipeline, including its failures |
| Claude / ChatGPT | Prototyping the prompt | Subscription | Not a deployment path — no audit trail, no data terms |
A two-model split is usually right. Route the bulk of questions to a cheap tier and escalate specific categories — billing disputes, cancellations, anything touching compliance — to a stronger model. The cost difference is small enough that the split is about answer quality on hard cases, not savings.
Do not prototype in a personal chatbot account and call it a deployment. Support messages contain order numbers, addresses, and whatever else customers paste in. That decides your vendor terms before it decides your model.
Step-by-Step Implementation
Step 1: Pull 300 real conversations and read them
Not a sample of tickets — a sample of resolved conversations, including the agent's reply. This is the single highest-value hour in the project, and it produces two things you cannot get any other way: the actual distribution of question types, and the answers your team currently considers correct.
Sort them into categories by hand. You are looking for the categories that are both frequent and boring. Those are your first targets.
Step 2: Build the retrieval corpus, and fix it as you go
Export your help centre articles, policy pages, and any internal macros your agents already use. Macros are gold — they are pre-approved answers in your company's voice.
Chunk the documents. For support content, chunk by heading rather than by character count: a policy section is a semantic unit, and splitting it at 512 characters produces chunks that answer half a question. See chunking for the trade-offs.
You will find contradictions. Fix them now. A retrieval system over contradictory sources will confidently retrieve either one.
Step 3: Start with keyword retrieval, prove it is the bottleneck
Before building a vector database, try keyword search over titles and headings with a reranking pass. For a help centre under a few hundred articles this frequently beats a naive embedding index, and it is debuggable — you can see why a document was returned.
Measure retrieval on its own: for your 300 conversations, does the correct source document appear in the top 5 results? If it does not, no model will fix it. Retrieval failure is the most common root cause of bad answers and the one most often misdiagnosed as a model problem.
Step 4: Write the prompt with a refusal contract
The system prompt has four jobs: state the role, supply the retrieved passages, define the tone, and — most importantly — define what to do when the passages do not contain the answer.
You are a support assistant for [company]. Answer using ONLY the
reference passages below.
If the passages do not contain enough information to answer, respond
with exactly: {"answer": null, "reason": "insufficient_context"}
Never state a policy, price, date, or commitment that does not appear
verbatim in the passages.
Return JSON:
{
"answer": string | null,
"source_id": string | null,
"confidence": "high" | "medium" | "low",
"reason": string | null
}
Reference passages:
{{passages}}
Customer message:
{{message}}
Two details carry most of the safety here. Requiring structured output means you can validate before sending. Requiring source_id means you can check the citation resolves to a real document — and if it does not, the answer is discarded rather than softened.
Step 5: Deploy as agent assist only
Wire the output into your helpdesk as a suggested reply. Nothing sends automatically. Give agents a one-click "used as-is" / "edited" / "discarded" control, because that control is your evaluation dataset and it costs the agent nothing.
Run this for at least two weeks.
Step 6: Open one self-service path
Pick the single category with the highest unedited-acceptance rate from step 5 — usually something like order status or password reset. Open self-service for that category only, with three hard rules:
- Every answer carries a visible "talk to a person" control.
- Any
confidence: "low"oranswer: nullroutes to a human immediately, without showing the customer a partial answer. - A customer who asks twice gets a human, regardless of confidence.
The third rule matters more than it looks. Repeating the question is the clearest signal the answer failed, and it is the moment a mediocre experience becomes a bad one.
Step 7: Widen on evidence, not on schedule
Add a category when its assist-mode acceptance rate justifies it. Never add categories in a batch, and never add billing disputes, cancellations, or anything where a wrong statement creates a legal or financial commitment. Those stay assisted permanently — the economics of automating them do not survive one bad outcome.
Real-World Examples
Before — ungrounded model, no refusal path.
Customer: I cancelled on the 3rd but got charged on the 5th. Can I get a refund?
AI: I'm sorry about that! Our policy allows refunds within 30 days of cancellation, so you're well within the window. I've noted your request and you should see the refund in 5–7 business days.
Three fabrications: the 30-day window, the implication that a refund was approved, and the timeline. Nothing was noted anywhere. The company now has an angrier customer and a written promise.
After — grounded, with citation and refusal.
Customer: I cancelled on the 3rd but got charged on the 5th. Can I get a refund?
AI output:
{"answer": null, "source_id": null, "confidence": "low", "reason": "insufficient_context"}What the customer sees: routed to a human, with the conversation and the retrieved billing-policy passages attached.
This is the system working. Billing disputes require account-specific facts that no document contains, so refusing is correct. The value delivered is that the agent opens the ticket with the policy already pulled up.
After — grounded, answerable.
Customer: how do I export my data before my plan ends?
AI output:
{"answer": "You can export all your data from Settings → Data → Export, which produces a CSV within about 10 minutes. Exports remain available for 30 days after a plan ends.", "source_id": "kb-data-export-v4", "confidence": "high"}
Every claim in that answer appears in kb-data-export-v4. The system verified the document exists before sending. This is the shape of a safe self-service answer.
Best Practices
Make refusal a first-class outcome, not a failure. Teams instinctively tune toward answering more. The metric that matters is not coverage; it is correct coverage. A system that answers 40% of questions correctly and hands over the rest cleanly is better than one that answers 70% with a 10% fabrication rate — and the second one will be switched off within a month.
Cite internally even when you do not show the citation. Customers rarely want to see a document ID. You always want it, because it is what makes an answer auditable after a complaint.
Give agents an override that teaches the system. When an agent discards a draft, ask why in one click: wrong facts, wrong tone, missing context. Three buttons produce a better improvement backlog than any dashboard.
Keep tone rules short and specific. "Be friendly and professional" does nothing. "Never apologise more than once per message; never use exclamation marks; never speculate about causes" produces visibly different output.
Treat the help centre as production infrastructure. Once answers are generated from it, a stale article is a live incident. Assign ownership.
Common Pitfalls
Launching self-service first because it demos better. The demo is the easy part. Assist-mode acceptance data is what tells you whether self-service is safe, and you cannot get it after you have already launched.
Measuring aggregate accuracy. A single number hides everything that matters. Ninety-five percent accuracy with the 5% concentrated in billing is a worse system than 85% spread evenly. Segment by question type, always.
Letting the customer's message select an action. If message text can trigger a refund, a plan change, or a data deletion, you have built a prompt injection target with a payment method attached. Actions must be selected by validated, schema-constrained output, never by free text.
Forgetting that customers paste secrets. Card numbers, passwords, government IDs and health details arrive unasked-for in support messages. Redact before the text reaches the model, and choose a vendor whose data-processing terms you have actually read.
No "talk to a human" escape. The single most reliable way to make people hate a support bot. The control must be visible on every AI-answered message.
Assuming multilingual works because the model is multilingual. Your documentation is probably English-only. A model answering a Spanish question from English sources will translate confidently and drop nuance in exactly the policy language where nuance matters.
Measuring Success
Track five things, all segmented by question category:
- Containment rate — conversations resolved without a human. This is the headline number and the most misleading one on its own.
- Reopen rate on contained conversations — how often a "resolved" conversation comes back. A rising containment rate with a rising reopen rate is not automation; it is deferral.
- Unedited acceptance rate in assist mode — the leading indicator for whether a category is ready for self-service.
- Refusal rate and refusal correctness — how often the system declines, and how often declining was right. Sample these by hand; nothing else catches over-refusal.
- Escalation satisfaction — CSAT on conversations that went AI → human. If this is below your baseline, the handover is losing context.
The one metric to avoid as a target is deflection percentage. It is trivially gamed by making it harder to reach a person, and every organisation that has optimised it directly has done exactly that.
Build the eval set from step 1. Those 300 conversations, with their human answers, are your regression test. Run it against every prompt change. Without it you are shipping on vibes, and prompt changes have non-local effects.
Cost Analysis
Model cost per grounded answer, on Claude Haiku 4.5 at $1 / $5 per million tokens (list pricing, August 2026):
- Retrieved context: 5 passages × ~400 tokens = 2,000
- System prompt and schema: ~500
- Customer message: ~200
- Input total: ~2,700 tokens → $0.0027
- Output: ~300 tokens → $0.0015
- Per answer: ≈ $0.0042, or about $4.20 per 1,000 answers
Against a human baseline of six minutes per ticket at a $25/hour loaded rate — $2.50 per ticket — the model cost is roughly 0.2% of the human cost. Prompt caching on the system prompt reduces it further, and batch processing halves it again where latency permits.
The honest conclusion from that arithmetic is not "this saves 99.8%". It is that model cost is not the variable that decides this project. What decides it is your containment rate, your reopen rate, and the engineering time to build and maintain retrieval. A system containing 20% of volume at 99% correctness returns more than one containing 60% at 90%, and neither number is knowable in advance.
Budget the two-to-four weeks of engineering time honestly, and treat help-centre cleanup as part of the project rather than as a prerequisite someone else will handle.
Related Use Cases
- AI for Support Ticket Triage — classification and routing, the layer beneath this one
- AI for Survey Analysis — the same grounding discipline applied to open-ended feedback
Related Tools
- Claude — prototyping the prompt and reviewing outputs
- ChatGPT — alternative prototyping surface
- n8n — wiring retrieval, model and helpdesk together
- Salesforce Agentforce — packaged option for Salesforce-based teams
Related Models
- Claude Haiku 4.5 — the high-volume default
- Claude Sonnet 5 — escalation tier for sensitive replies
- GPT-5.6 — comparable alternative; choose on your eval set