Объяснимость — «почему именно эта задача»
Зачем объяснимость
Заголовок раздела «Зачем объяснимость»Главное правило учительского доверия:
Если я не понимаю, почему система предлагает Ивану задачу 147 — я ей не доверюсь.
То же верно для внешней аудитории: без понятного «почему именно эта задача» остаётся общий шум про «ещё одну модель». Поэтому объяснимость — не nice-to-have, а ключевой критерий.
Что мы НЕ делаем
Заголовок раздела «Что мы НЕ делаем»Не используем LLM (Claude / GPT) для объяснения числовых фактов. Причина — модели иногда галлюцинируют:
- называют не те микро-навыки;
- путают с ;
- придумывают «причины», которые не следуют из данных.
В контексте, где объяснение должно быть точным, это неприемлемо. Поэтому факты собираем детерминированно, шаблонами.
Что мы делаем
Заголовок раздела «Что мы делаем»Шаблон-объяснение собирается из BKT-состояния по простым правилам:
- Найти самый слабый навык задачи — он причина рекомендации.
- Найти самый сильный навык задачи — он гарантирует, что ученик не утонет.
- Сообщить как ZPD-индикатор.
- Если есть
rareSkillBonus— упомянуть, что задача затрагивает неосвоенный навык.
Пример объяснения (эстонский)
Заголовок раздела «Пример объяснения (эстонский)»Ülesanne T-147 Ivanile
Põhjus: kõige nõrgem mikrooskus on "sulgude avamine" (P=0.41). Tugevaim — "aritmeetika märkidega" (P=0.82). Ülesanne treenib just nõrka kohta, kuid ei jää aritmeetika peale kinni. Lahenduse tõenäosus ≈ 0.55 — see on parajalt keeruline.Перевод:
«Самый слабый микро-навык — раскрытие скобок (). Самый сильный — арифметика со знаками (). Задача тренирует именно слабое место, но не застрянет на арифметике. — в самый раз сложно.»
Реализация
Заголовок раздела «Реализация»В web/lib/explain.ts (стрётчно — пока стаб):
export function explainRecommendation( scored: ScoredTask, microskills: Record<MicroSkillId, MicroSkill>, lang: 'et' | 'ru' | 'en' = 'et'): string { const sorted = Object.entries(scored.perSkillPL) .sort(([, a], [, b]) => a - b); const [weakest, weakP] = sorted[0]; const [strongest, strongP] = sorted[sorted.length - 1]; const targetSkill = microskills[weakest].title_et; const supportSkill = microskills[strongest].title_et; return T[lang]({ targetSkill, weakP: weakP.toFixed(2), supportSkill, strongP: strongP.toFixed(2), pSolve: scored.pSolve.toFixed(2), });}
const T = { et: ({ targetSkill, weakP, supportSkill, strongP, pSolve }) => `Põhjus: nõrgim — "${targetSkill}" (P=${weakP}). Tugevaim — ` + `"${supportSkill}" (P=${strongP}). Lahenduse tõenäosus ≈ ${pSolve}.`, ru: ..., en: ...,};Опционально: Claude как «стилист»
Заголовок раздела «Опционально: Claude как «стилист»»Готовый шаблон можно прогонять через Claude только для стилистики — чтобы текст звучал не как из роботического справочника, а как от коллеги:
Sa oled MATx assistent. Kirjuta järgnev õpetajale 1-2 lauseks, sõbralikult,eesti keeles. Ära muuda numbreid ega oskuste nimesid.
[шаблон]При этом:
- Числа и навыки — закрыты в шаблоне (Claude может их прочитать, но не должен менять);
- Risk «галлюцинации» — низкий, потому что Claude получает все факты;
- Tone — natural, не «database output».
Это безопасный гибрид: факты от нас, причёска от Claude.
Что показывать учителю в UI
Заголовок раздела «Что показывать учителю в UI»| Поле | Откуда | Зачем |
|---|---|---|
| Имя задачи | task.id | идентификация |
| Топ-2 микро-навыка с P | mastery vector | целевой и поддерживающий |
| ученика | scoreTaskForStudent | ZPD-индикатор |
| 1-2 предложения текста | explainRecommendation | человеческое объяснение |
| Альтернативы (top-3) | recommend()[1..2] | «или вот ещё варианты» |
Edge cases
Заголовок раздела «Edge cases»- У задачи 1 навык → нет «самого сильного» как контраста. Шаблон: «Целевой навык — X (P=Y). .»
- Все навыки сильные () → почему вообще рекомендуем? Шаблон признаётся: «Закрепление, все навыки уже усвоены».
- Все навыки слабые () → задача fits frustration zone. Шаблон предупреждает: «Возможна фрустрация, рассмотри лёгкую альтернативу».
Шаблоны и LLM: что сказать вслух
Заголовок раздела «Шаблоны и LLM: что сказать вслух»«Объяснения генерируются детерминированно из состояния BKT. Это гарантирует, что цифры точные — никакого риска LLM-галлюцинации в математическом контексте. Опционально для естественности можно прогнать готовый шаблон через Claude, оставляя факты неизменными.»