feat(assistant): RAG по учебникам, кэш+счётчик, режим учителя

- RAG: индексатор scripts/index-textbooks.js → textbook_chunks (миграция 063);
  ask() подмешивает релевантные куски учебников (LIKE-скоринг). Покрывает
  учебники со статическим текстом; JS-рендеримые — через контекст страницы.
  Админка: тумблер RAG + кнопка «Переиндексировать» + число фрагментов.
- Кэш ответов (assistant_cache, 7 дней, только «чистые» вопросы без контекста/
  истории) + суточный счётчик (assistant_usage: ИИ/кэш/FAQ) в админке.
- Режим учителя: роль в /context, системный промпт для учителей (задания,
  план урока, учительские инструменты), подсказки-чипы для учителей.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-04 18:16:53 +03:00
parent dc073e2114
commit 2252bbd666
8 changed files with 216 additions and 15 deletions
@@ -0,0 +1,30 @@
-- ═══════════════════════════════════════════════════════════════
-- 063: Ассистент — RAG по учебникам, кэш ответов, счётчик использования
--
-- textbook_chunks — куски текста учебников (по параграфам) для грунтовки
-- ответов «Спроси Квантика». Наполняется индексатором scripts/index-textbooks.js.
-- assistant_cache — кэш ответов модели по нормализованному вопросу (экономия квоты).
-- assistant_usage — суточный счётчик: вызовы модели / попадания в кэш / FAQ-ответы.
-- ═══════════════════════════════════════════════════════════════
CREATE TABLE textbook_chunks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
slug TEXT NOT NULL,
textbook_title TEXT NOT NULL DEFAULT '',
section_title TEXT NOT NULL DEFAULT '',
text TEXT NOT NULL
);
CREATE INDEX idx_textbook_chunks_slug ON textbook_chunks(slug);
CREATE TABLE assistant_cache (
qhash TEXT PRIMARY KEY,
answer TEXT NOT NULL,
created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE TABLE assistant_usage (
day TEXT PRIMARY KEY,
model_calls INTEGER NOT NULL DEFAULT 0,
cache_hits INTEGER NOT NULL DEFAULT 0,
faq INTEGER NOT NULL DEFAULT 0
);