How to Keep an AI Chatbot on Topic

Off-topic chatbot replies are usually a missing constraint, not a broken model. Here's how to scope, ground, and reset a conversation so it stays useful.

Steve Jefferson
Steve Jefferson
Developer Advocate
12 August 20261 min read

A chatbot stays on topic when three things are true: it has an explicit statement of what it is for and not for, it can refuse or redirect without sounding broken, and its answers are grounded in your content instead of whatever the model recalls from training. Most off-topic replies are not a model failure, they are a missing constraint. How to keep an AI chatbot on topic comes down to architecture: a scope statement, refusal patterns, retrieval grounding, and reset triggers for long conversations.

Why chatbots drift off topic

Language models are trained to be helpful by default. Ask a support bot about the weather, a recipe, or a competitor's pricing, and most will just answer, because refusing is not the default behavior. That is the root of chatbot scope drift: without an explicit boundary, "helpful" quietly expands to cover anything the user brings up.

Long conversations make it worse. The system prompt sits at the start of the context window while new turns keep arriving, and models weight recent tokens heavily, so early instructions can lose ground by turn twenty. A widget that answers fine for a few exchanges and then wanders is the same failure mode covered in why an AI chatbot forgets earlier instructions.

A customer facing chatbot that goes off topic is not just embarrassing, it is a liability. A bot that speculates about a refund policy it was never given, or offers legal or medical opinions because a user asked nicely, generates support tickets and, occasionally, real exposure.

Write a system prompt that keeps AI on topic

The highest-leverage fix is a scope statement: a sentence or two on what the assistant is for, then a sentence or two on what it will not do. Anthropic's own prompting guidance recommends giving the model a role and a boundary in the system prompt, since it anchors tone and scope for the whole conversation (Anthropic, prompting best practices).

A scope statement works best when it names categories, not just "stay on topic," which is too vague to act on. "Only answer questions about billing, account setup, and product features" is something the model can check its own output against.

Here is a worked example for a SaaS billing and support assistant:

You are Riley, the support assistant for Acme Analytics, a web
analytics tool for small e-commerce stores.

SCOPE: Answer questions about:
- Acme Analytics features, setup, and integrations
- Billing, plans, and account changes
- Troubleshooting dashboard or tracking-script issues

OUT OF SCOPE: Do not answer questions about:
- Competitor products or comparisons
- Legal, tax, or financial advice
- Topics unrelated to Acme Analytics, even if the user insists

If a question is out of scope, say so plainly and offer to help
with something you can answer. Do not guess at policies you were
not given, say you don't know and offer a human instead.

Ground every factual claim in the reference material provided.
Do not rely on general knowledge for anything specific to Acme
Analytics.

That is what a working keep-AI-on-topic prompt looks like: it does three things beyond naming topics, it tells the model how to respond at a boundary, it forbids guessing, and it points the model at retrieval instead of its own memory.

Build refusal patterns that redirect instead of stonewall

A flat refusal, "I can't help with that," reads as broken to a user who does not know why. A better refusal names the boundary and offers a next step:

Off-topic input

Weak response

Redirect that keeps it useful

"What's your take on our competitor's pricing?"

"I'm not able to discuss that."

"I can't compare us to other products, but I can walk you through our plans."

"Can you write my company's terms of service?"

Attempts a generic draft

"That needs legal review, outside what I can help with. I can point you to your account settings instead."

"My cat is sick, what should I do?"

Gives pet care advice

"That's outside what I'm built for. Is there something with your account I can help with?"

That pattern is worth writing into the system prompt as a template rather than trusting the model to improvise a consistent tone. Anthropic's guardrail documentation describes the same idea: give the model example scenarios and expected responses in the prompt itself, rather than one abstract rule (Anthropic, keep Claude in character).

Ground responses in retrieval, not memory

Scope statements stop the model wandering into unrelated subjects. Retrieval grounding stops it confidently making things up about subjects that are in scope. An assistant answering billing questions from training data instead of your pricing page will eventually state a plan that is wrong, and that is harder to catch than an off-topic reply.

The fix: feed the model your knowledge base or policy text at query time and instruct it to answer only from that material. This is part of how to give AI context about your business, and it pairs directly with how to write a system prompt for a custom AI assistant that needs to speak with authority about your business rather than the general internet.

OpenAI's own guardrails tooling treats off-topic drift as worth detecting automatically: its check compares incoming messages against a business-scope description and flags anything that drifts outside it, across up to ten turns of history (OpenAI Guardrails, off-topic prompts). You do not need that exact tooling, the underlying idea, defining scope and checking against it, is what matters.

Set conversation reset triggers

Even a well-scoped assistant drifts in sessions that run long. A chat that starts on billing can meander through five tangents over forty messages, and by then the system prompt is competing with a lot of accumulated context. Two reset triggers help:

  1. Turn-count reset. After a fixed number of exchanges, many teams use 15 to 25, summarize the conversation and re-inject the system prompt fresh with the summary. This keeps the scope statement close to the model's attention instead of buried under old messages.

  2. Topic-change reset. If a message has no relation to the assistant's declared scope or the prior thread, treat it as a new session. This matters most in embedded widgets, where a single real-time chat interface built into an app might otherwise carry one sprawling, unfocused thread for an entire user session.

If your assistant can take actions, scope drift gets riskier: an off-topic detour can turn into an off-topic action. That is one more reason to sandbox an AI agent so a wandering conversation cannot reach tools or data outside its intended job.

Before and after: watching drift happen

A shortened transcript from a bot with only a generic "be helpful" system prompt, followed by the same conversation with a scoped, retrieval-grounded one:

DRIFTING (system prompt: "You are a helpful assistant for Acme Analytics.")

User: Do you integrate with Shopify?
Bot: Yes, a native Shopify integration, enabled from
Settings > Integrations.

User: Nice. Speaking of Shopify, is dropshipping still
profitable in 2026?
Bot: Dropshipping can still work, though margins have
tightened. Popular niches right now include...
[bot continues for three paragraphs on e-commerce strategy]

User: What plan for a store doing $50k/month?
Bot: I'd guess our Growth plan, though you might also
consider diversifying beyond a single platform...
CORRECTED (scoped prompt with retrieval grounding)

User: Do you integrate with Shopify?
Bot: Yes, a native Shopify integration, enabled from Settings >
Integrations. [Source: Integrations guide]

User: Nice. Speaking of Shopify, is dropshipping still
profitable in 2026?
Bot: That's outside what I can help with here, I'm focused
on Acme Analytics. I can help you pick a plan instead.

User: What plan for a store doing $50k/month?
Bot: Stores at that volume are typically on the Growth plan
(up to 500k tracked events/month). Want me to check your usage?

The second version does not just avoid the tangent, it answers the in-scope question with a source, not a guess.

A quick reference for how to keep an AI chatbot on topic

Technique

Where it lives

What it fixes

Scope statement

System prompt

Model answering anything, not just intended topics

Refusal and redirect pattern

System prompt

Refusals that feel broken or rude

Retrieval grounding

Architecture (RAG / knowledge base)

Confident wrong answers on in-scope topics

Conversation reset triggers

Application logic

Drift that builds up over long sessions

Agent sandboxing

Architecture / permissions

Off-topic detours turning into off-scope actions

If you are still deciding how to structure the assistant, this fits into the broader question of how to build an app with AI: scope and grounding are design-time decisions, not patches to bolt on after users start complaining.

Frequently asked questions

What causes an AI chatbot to go off topic?

Mostly the absence of an explicit boundary. Models default to being helpful about whatever is asked, so without a scope statement they follow a user into unrelated subjects. Long conversations compound this as earlier instructions get diluted by accumulating context.

How do you write a system prompt that keeps AI on topic?

State what the assistant covers and what it does not, tell it how to respond outside that scope, and instruct it to ground factual answers in provided reference material rather than its own general knowledge. A one-line "stay on topic" instruction is too vague to be enforceable.

Should a chatbot refuse off-topic questions or redirect them?

Redirect. A flat refusal without an alternative reads as broken. Naming the boundary and offering something the assistant can help with keeps the interaction useful and cuts the chance a frustrated user just repeats the question differently.

How often should a chatbot's conversation context be reset?

There is no universal number, but many teams reset context somewhere between 15 and 25 exchanges, or whenever a message has no clear relation to the assistant's declared scope. The goal is keeping the system prompt's instructions close enough to recent context that they still carry weight.

How did this land?

About the author

Steve Jefferson
Steve Jefferson

Developer Advocate

Steve builds something with Swarmz every week and writes up what worked, what broke, and what he'd do differently. Tutorials and hands-on guides are his lane.

Share

Get the next post in your inbox

One email a month. Product updates, engineering posts, and the best of Built with Swarmz.

I agree to receive emails about AI building tips and Swarmz product news. Unsubscribe any time.