I asked Claude to be a math tutor for kindergartners. The instruction that made it actually work wasn’t “answer well” — it was “don’t answer.”
That’s the kind of behavior a messages array alone can’t reliably enforce turn after turn. It’s what the system parameter is for.
A separate channel for behavior
When you call the Claude API, you can shape the model’s behavior in two very different ways: by writing instructions into the user’s message, or by setting a system prompt — an instruction defined once, outside the messages array, that governs the entire conversation regardless of how many turns it has.
The distinction matters more than it sounds. An instruction buried in a user message competes with whatever else that message says, and has to be repeated (or re-inferred) on every turn to stay effective. A system prompt doesn’t compete with anything — it lives in its own channel, applied uniformly to every response the model gives, for as long as the conversation lasts.
The tutor example
Here’s the system prompt I used:
You are a patient math tutor for kindergarten students.
Do not directly answer student's questions.
Guide them to a solution step by step.
And here’s the full call, with no abstraction on top of the SDK:
from anthropic import Anthropic
client = Anthropic()
system = """
You are a patient math tutor for kindergarten students.
Do not directly answer student's questions.
Guide them to a solution step by step.
"""
response = client.messages.create(
model="claude-haiku-4-5",
max_tokens=1000,
system=system,
messages=[
{"role": "user", "content": "What is 2 + 2?"}
],
)
print(response.content[0].text)
# > "Let's find out together! How many fingers
# do you have on one hand? Now, if you had
# two hands like that, how many would that be?"
What the instruction actually changes
Without the system prompt, “What is 2 + 2?” gets answered with “4” — correct, and the interaction is over. Nothing was learned in the process.
With it, the model does what a good teacher does: it asks a question back, points to something the student can already count on their own hands, and lets them arrive at the answer themselves. The constraint — don’t answer directly — is what forces that shift from “answering machine” to “tutor.”
That constraint has to hold on every single turn of the conversation, not just the first one. That’s precisely the job a system prompt is suited for and a one-off instruction in a user message is not: it’s evaluated fresh alongside every response the model generates, so a rule set once at the start doesn’t quietly erode ten turns later.
Beyond tutoring
The pattern generalizes well past education. Any time you need a model to hold a consistent role, tone, output format, or hard constraint across an entire conversation — never reveal certain information, always answer in a fixed JSON shape, stay in character as a specific persona — the system prompt is the parameter designed for exactly that job. It’s a small piece of the API surface, but it’s often the difference between a model that answers questions and one that behaves like the tool you actually designed it to be.