Eduardo-27B
Eduardo-27B is a math tutor trained with multi-turn reinforcement learning. It was fine-tuned from Qwen/Qwen3.8-27B to teach a student how to solve a problem rather than solve it for them. It was introduced in The Assistance Dilemma: Learning to Teach via Multi-Turn Reinforcement Learning.
📄 Paper (arXiv:2610.06446) · 💻 Code · 📊 Near-transfer dataset
Overview
Eduardo is trained in a simulated classroom: it holds full multi-turn dialogs (up to 22 turns) with a frozen student (Llama-3.1-8B-Instruct) on math problems from Big-Math. The student gets no persona prompt, so its errors are its own, not role-play. No human annotations are used.
The reward is the student's normalized learning gain on a masked near-transfer post-test. After the
dialog, the student attempts an unseen variant of the tutored problem. During this test the student
sees only its own turns, because every tutor turn is replaced by (hidden). So the reward can rise
only through what the student wrote in its own turns, not through what the tutor said. Two binary
gates, judged by Qwen3.6-27B, guard the reward:
- Factual correctness: everything the tutor states must be mathematically correct.
- No solution handover: the tutor must not give the solution, either verbatim or by reducing the remaining work to a triviality.
The reward names no pedagogical move. Compared with its base model, Eduardo-27B explains and supplies answers far less (explaining 18.5% → 3.9% of moves, supplying answers 15.5% → 2.2%). It asks more guiding questions (23.2% → 41.4%) and more than doubles prompting for justification (9.0% → 21.8%).
Key details
| Base model | Qwen/Qwen3.8-27B |
| Parameters | 27B (bf16) |
| Training | Multi-turn RL with DPPO (veRL), 75 steps |
| Student (training) | Llama-3.1-8B-Instruct (frozen) |
| Reward judge (training) | Qwen3.6-27B |
| Training data | 10,000 Big-Math problems, 9,876 with a validated near-transfer variant |
| Paper | arXiv:2610.06446 |
| License | CC BY 4.0 |
Results
All judgments below come from models that are not used in training: the MathTutorBench pedagogical reward model (Ped-RM), a Gemini-3.1-Pro judge, and a Gemini-3.7-Flash student on TutorMoments.
Next-turn generation on MathDial and Eedi (n=500 each). Win is the win rate against the human teacher's turn. Think is thinking tokens per turn.
| Model | MathDial Ped-RM ↑ | MathDial Win ↑ | MathDial Think ↓ | Eedi Ped-RM ↑ | Eedi Win ↑ | Eedi Think ↓ |
|---|---|---|---|---|---|---|
| Qwen3.8-27B (base) | 8.34 | 82.4% | 501 | 9.99 | 84.3% | 258 |
| Gemini 3.1 Pro | 7.63 | 74.6% | 517 | 9.30 | 78.7% | 400 |
| TutorRL-7B | 6.78 | 67.4% | 0 | 8.68 | 70.4% | 0 |
| Eduardo-27B | 9.04 | 89.2% | 289 | 9.70 | 82.3% | 127 |
TutorMoments (plain prompt, n=100). Scores are in [0, 1].
| Model | Scaffolding ↑ | Rigour ↑ | Avoids over-help ↑ | Think/turn ↓ |
|---|---|---|---|---|
| Qwen3.8-27B (base) | 0.60 | 0.31 | 0.52 | ~970 |
| Claude Opus 4.8 | 0.83 | 0.48 | 0.67 | ~369 |
| Gemini 3.5 Flash | 0.94 | 0.31 | 0.75 | 886 |
| Eduardo-27B | 0.96 | 0.44 | 0.76 | ~155 |
- MathDial: Eduardo-27B has the highest Ped-RM score and win rate over human teachers of all tested tutors, including frontier models.
- MathTutorBench: it scores 0.79, close to Gemini 3.1 Pro (0.80), and its problem-solving accuracy is unchanged from the base model.
- Thinking tokens: it uses 2.4–6.2× fewer thinking tokens per turn than the frontier models on TutorMoments.
- Training environment (494 held-out problems): the near-transfer gain rises from +0.22 (base) to +0.29.
See the paper for all baselines, the evaluation-aware prompt setting and confidence intervals.
Intended uses
- Interactive, step-by-step math tutoring
- Socratic and scaffolded dialog systems
- Research on pedagogical alignment of LLMs
The model is a research artifact. Do not deploy it to real students without human oversight.
Usage
The tutor expects the problem in the system prompt. The student's messages are the user turns.
Training used this system prompt:
You are tutoring a student through a math problem. Your goal is that they
understand deeply enough to solve a similar problem on their own afterwards.
The student should always show you their attempt first.
Never state the final answer before the student has reached it themselves.
Do not name the method or key formula before the student has made an attempt
(proposed a method, wrote a step, stated a guess, or described a dead end —
"how do I do this?" is not an attempt). If the student cannot produce any
attempt after genuinely trying, you may demonstrate the key idea on a
different example and have them apply it to this one.
The student should do the cognitive work — the decisions, not just the
calculations: let them choose the method and the next step. Students remember what they choose,
work out, and put into their own words far better than what they are told.
Everything you say must be mathematically correct.
Even if the student is already able to solve the problem, help them deepen
and improve their solution so they gain the strongest possible conceptual
and transfer understanding.
Use your private thinking (the student never sees it) to reason about
where the student's mistake is and which pedagogical move suits the situation.
When the student has demonstrated understanding and no question of yours is
left unanswered, end your final message with <end_of_conversation> on its own line.
Problem: {problem}
vLLM
vllm serve eth-nlped/Eduardo-27b --served-model-name eduardo-27b --tensor-parallel-size 2
from openai import OpenAI
SYSTEM_PROMPT = "..." # the prompt above
problem = "A rectangle has a perimeter of 30 cm and its length is twice its width. What is its area?"
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
response = client.chat.completions.create(
model="eduardo-27b",
messages=[
{"role": "system", "content": SYSTEM_PROMPT.format(problem=problem)},
{"role": "user", "content": "I don't get how to start this one."},
],
temperature=1.0,
top_p=0.95,
)
print(response.choices[0].message.content)
Transformers
from transformers import AutoModelForImageTextToText, AutoProcessor
model_id = "eth-nlped/Eduardo-27b"
processor = AutoProcessor.from_pretrained(model_id)
model = AutoModelForImageTextToText.from_pretrained(model_id, dtype="auto", device_map="auto")
messages = [
{"role": "system", "content": SYSTEM_PROMPT.format(problem=problem)},
{"role": "user", "content": "I don't get how to start this one."},
]
inputs = processor.apply_chat_template(
messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt"
).to(model.device)
outputs = model.generate(**inputs, max_new_tokens=2048, do_sample=True, temperature=1.0, top_p=0.95)
print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True))
The model thinks before it answers. The student should see only the final response, not the thinking.
Limitations
- Math only. The model was trained and evaluated on English math problems.
- One simulated student. The training student is a single frozen LLM. It lacks the working memory, affect and misconceptions of human learners, and the tutor may overfit to its failure modes.
- Solution handover is held, not reduced. Eduardo-27B still hands over the solution in 9% of training-environment dialogs, the same rate as its base model.
- Weaker on Eedi. Its Eedi win rate is slightly below the base model's (82.3% vs. 84.3%).
- Few affective moves. The reward ignores rapport and encouragement, so affirmations stay rare (about 2% of moves).
- No support fading. The model never assigns independent work, because that only pays off beyond a single problem.
- Mistakes are still possible. It can still make mathematical errors.
Citation
@article{macina2026assistance,
title = {The Assistance Dilemma: Learning to Teach via Multi-Turn Reinforcement Learning},
author = {Macina, Jakub and Kapur, Manu and Sachan, Mrinmaya},
journal = {arXiv preprint arXiv:2610.06446},
year = {2026},
url = {https://arxiv.org/abs/2610.06446}
}