Building a tutor that impresses in a demo takes about two days. Connect a model to your course content, add a chat panel, ask it a question, watch it explain something clearly.
Building one that improves learning outcomes is a different project, and the gap between them is three specific constraints. Without all three, what you have shipped is a chatbot that helps learners avoid learning.
Constraint 1 — Grounding
The obvious one, and the one most teams do implement.
The tutor must answer from your content, not from whatever the model absorbed during training. Two reasons beyond the obvious accuracy concern.
First, curricula make choices. Your course teaches a specific method, uses specific terminology, and takes positions on contested points. A tutor drawing on general knowledge will contradict the material, and the learner has no way to know which to trust.
Second, retrieval gives you citation. A tutor that says "this is covered in section 3.2, here is the relevant passage" is verifiable. One that asserts things is not.
Implementation is standard retrieval over chunked course content, with one domain-specific addition worth making: filter retrieval by the learner's position in the curriculum. A tutor that helpfully explains a concept from module nine to a learner in module three has just destroyed the sequencing you carefully designed.
retrieve(query, learner) ->
chunks WHERE concept_id IN reachable_concepts(learner)
where reachable_concepts is concepts the learner has unlocked, plus their immediate frontier.
Constraint 2 — Pedagogical policy
This is the one that separates a tutor from an assistant, and the one most implementations skip entirely.
An unconstrained tutor optimises for the learner's immediate request. The learner asks for the answer. Giving it is helpful and destroys the productive struggle that produces learning.
The policy needs to be explicit, and the shape that works looks roughly like this:
def response_mode(learner, concept, attempt_history):
if attempt_history.count == 0:
return SOCRATIC # counter-question, no content
if attempt_history.count == 1:
return HINT # point at the relevant principle
if attempt_history.count == 2:
return SCAFFOLD # worked partial, learner completes
if mastery(learner, prerequisites(concept)) < THRESHOLD:
return REMEDIATE # drop to the prerequisite gap
return EXPLAIN # full explanation, then re-test
Two things worth noting.
The REMEDIATE branch is the highest-value one and it is only possible with a learner model. When someone is stuck on a concept because a prerequisite is weak, explaining the concept harder does not help. Detecting the actual gap and dropping to it does.
And the policy must be enforced structurally, not by instruction. A system prompt asking the model to be Socratic will be overridden by a learner who insists. Implement the mode as a gate that determines which retrieval and which response template runs, so the escalation path is code rather than persuasion.
Constraint 3 — Write-back
The most commonly missed, and arguably the most valuable.
A tutoring exchange is the highest-quality assessment evidence your platform can collect. A learner explaining their reasoning badly tells you precisely where their understanding breaks — far more precisely than a wrong answer on a multiple choice item.
Most implementations discard this. The conversation happens, the learner leaves, and nothing changed in the system's belief about them.
The pattern that works: after each exchange, a separate extraction pass classifies what the conversation revealed.
tutor_exchange_evidence(
exchange_id, learner_id, concept_id,
signal, -- misconception | partial | mastery
confidence,
extracted_at,
rationale -- for audit and for human review
)
Feed that into the learner model as evidence with a lower weight than a formal assessment response, since it is noisier. But feed it in. A tutor that does not update the model is throwing away the best data in the platform.
The safety layer
Separate from the pedagogy, and non-optional.
Content boundaries on what the tutor will discuss. Escalation paths when a conversation suggests distress — a learner mentioning self-harm in the middle of a statistics module is rare and needs a defined route. Complete logging sufficient to investigate a complaint weeks later. Clear disclosure that the learner is talking to software.
For platforms serving minors, this expands considerably — data retention limits, parental access questions, jurisdiction-specific consent rules. Specify it with counsel before writing code, not after a launch.
Cost, because it determines the tier
A tutor is the largest inference line in a learning platform and it scales with engagement, which is the thing you are otherwise trying to maximise.
Three levers that matter:
-
Route by mode.
SOCRATICandHINTresponses are short and can run on a smaller model.REMEDIATEandEXPLAINjustify the larger one. -
Cache retrieval aggressively. The same concept generates similar queries across learners; the retrieved context is highly cacheable even when the response is not.
-
Cap generously but cap. An unbounded tutor in an unlimited tier has no ceiling on cost per learner.
Model cost per engaged learner per month before launch and decide explicitly whether tutoring is in the base tier. Discovering that the feature is unprofitable after customers are on annual contracts is an unpleasant conversation.
Full architecture guide including the learner model, sequencing policy, assessment design and build costs: LMS Development in 2026: Architecting a Learning Platform Around AI . Related: LLM integration and AI development services .
Frequently Asked Questions
Why does an AI tutor need retrieval rather than model knowledge?
Because curricula make choices — specific methods, terminology and positions on contested points. A tutor drawing on general knowledge contradicts the material with no way for the learner to know which is right. Retrieval also enables citation, which makes answers verifiable.
Should tutor retrieval be filtered by learner progress?
Yes. A tutor that explains a module nine concept to a learner in module three destroys the sequencing. Filter retrievable content to concepts the learner has unlocked plus their immediate frontier.
How do you stop a tutor from just giving the answer?
Enforce response mode structurally rather than by instruction. A system prompt asking for Socratic behaviour is overridden by an insistent learner. Gate which retrieval and response template runs based on attempt history and prerequisite mastery, so escalation is code.
What is tutor write-back and why does it matter?
Extracting what a conversation revealed — misconception, partial understanding, mastery — and feeding it into the learner model as weighted evidence. A tutoring dialogue is the most precise diagnostic signal a platform collects, and most implementations discard it entirely.
What safety measures does a learner-facing tutor need?
Content boundaries, defined escalation paths when a conversation suggests distress, logging sufficient to investigate complaints later, and clear disclosure that the learner is talking to software. Platforms serving minors need considerably more, specified with counsel before build.
How do you control tutor inference costs?
Route by response mode so short Socratic and hint responses run on smaller models, cache retrieval aggressively since concept queries are similar across learners, and cap usage. Model cost per engaged learner per month before launch, not after contracts are signed.