Files
notes-qpid-pro/AI_TODO.md
T

164 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🧠 AI Roadmap & TODO: Локальный ИИ-учитель и генератор тестов
> **Архитектурный манифест**: Zero Daemon, On-Demand CPU-инференс, строгий бюджет RAM (< 4 ГБ), Dual-Model маршрутизация (Fast 3B & Deep 7B), 0 постоянных фоновых демонов.
---
## 🏛️ 1. Архитектурная концепция: Двухмодельная стратегия (Dual-Model)
Так как на диске свободно более **100 ГБ**, а оперативная память ограничена **10 ГБ** (доступно ~7.8 ГБ), хранение двух моделей на накопителе занимает всего **~6 ГБ (< 6% диска)**. При этом модели **никогда не загружаются в ОЗУ одновременно**.
```
[ Задача от пользователя ]
│
┌─────────────────────────┴─────────────────────────┐
▼ ▼
┌───────────────────────────────┐ ┌───────────────────────────────┐
│ FAST TIER (3B Model) │ │ DEEP TIER (7B Model) │
│ Llama-3.2-3B-Instruct (GGUF) │ │ Qwen-2.5-7B-Instruct (GGUF) │
├───────────────────────────────┤ ├───────────────────────────────┤
│ • RAM: ~2.2 ГБ │ │ • RAM: ~3.6 ГБ │
│ • Диск: ~2.2 ГБ │ │ • Диск: ~3.8 ГБ │
│ • Время на CPU: 15–40 сек │ │ • Время на CPU: 1.5–3.5 мин │
│ • Назначение: │ │ • Назначение: │
│ - Тесты по главам (MCQ) │ │ - Грамматический разбор │
│ - Вопросы на понимание │ │ - Оценка эссе и пересказа │
│ - Материалы для аудирования │ │ - Объяснение правил на рус. │
│ - True / False / Not Given │ │ - Разбор "обратного перевода"│
└───────────────────────────────┘ └───────────────────────────────┘
│ │
└─────────────────────────┬─────────────────────────┘
▼
[ Выгрузка из ОЗУ сразу после ответа ]
(В памяти остается только веб-сервер)
```
### Ключевые правила надежности (Ponytail AI Rules):
1. **Zero Daemon (Нулевой оверхед в покое)**: Никаких висящих в памяти демонов Ollama/vLLM. Инференс вызывается по требованию (`on-demand`) через оптимизированный бинарник `llama.cpp` (`llama-cli`).
2. **Изоляция CPU (`nice -n 19`)**: Фоновый процесс работает с самым низким системным приоритетом Linux. Читалка, веб-интерфейс и база данных отвечают без задержек даже при 100% нагрузке на ядра процессора.
3. **Ограничение контекста (`-c 4096`)**: Контекст строго ограничен 4096 токенами. KV-кэш занимает не более 200 МБ ОЗУ, полностью исключая риск аварийной нехватки памяти (OOM Killer).
4. **Строгий JSON-контракт**: Модель всегда отвечает валидным JSON (через GGUF grammar/schema sampling или строгий системный промпт) для мгновенного парсинга сервером.
---
## 🗄️ 2. Схема данных в SQLite (`data/notes.db`)
```sql
-- Квизы и тесты на понимание по главам
CREATE TABLE IF NOT EXISTS chapter_quizzes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
book_id INTEGER NOT NULL,
chapter_index INTEGER NOT NULL,
model_used TEXT NOT NULL, -- 'llama-3.2-3b'
status TEXT DEFAULT 'pending', -- 'pending', 'processing', 'ready', 'failed'
questions_json TEXT DEFAULT '[]', -- Массив вопросов, вариантов, цитат и объяснений
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (book_id) REFERENCES books(id) ON DELETE CASCADE
);
-- Проверки письменных работ, пересказов и обратного перевода
CREATE TABLE IF NOT EXISTS grammar_reviews (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
task_type TEXT NOT NULL, -- 'reverse_translation', 'retell', 'free_writing'
book_id INTEGER,
chapter_index INTEGER,
prompt_text TEXT NOT NULL, -- Исходный вопрос или русский текст для перевода
original_reference TEXT, -- Оригинал из книги (для обратного перевода)
user_submission TEXT NOT NULL, -- Текст, введенный студентом
score INTEGER, -- Оценка от 1 до 5 (или CEFR A1-C2)
corrected_text TEXT, -- Исправленный идеальный вариант
feedback_json TEXT DEFAULT '{}', -- Ошибки, правила, похвала, зоны роста
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
-- Индивидуальный радар грамматических слабостей
CREATE TABLE IF NOT EXISTS user_grammar_weaknesses (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
tag TEXT NOT NULL, -- 'articles', 'past-tenses', 'prepositions', etc.
rule_name TEXT NOT NULL,
mistakes_count INTEGER DEFAULT 1,
last_mistake_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(user_id, tag, rule_name),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
```
---
## 📋 3. Пошаговый план внедрения (Roadmap)
### Этап 1: Инфраструктура легковесного инференса
- [ ] Скомпилировать или установить легковесный бинарник `llama-cli` (без лишних зависимостей, с поддержкой AVX2 процессора).
- [ ] Создать изолированную директорию `models/` для GGUF-файлов:
- `models/llama-3.2-3b-instruct-q4_k_m.gguf` (~2.2 ГБ).
- `models/qwen-2.5-7b-instruct-q3_k_m.gguf` (~3.8 ГБ).
- [ ] Написать pure-Python обёртку `app/ai/runner.py`:
- Функция `run_model(model_tier: str, prompt: str, schema: dict = None)`.
- Запуск через `subprocess.Popen` с аргументами `nice -n 19`, `-c 4096`, `-t <cpu_threads>`.
- Автоматическая выгрузка процесса из ОЗУ сразу после завершения инференса.
- [ ] Написать асинхронный воркер фоновых задач (`app/ai/worker.py`) на базе SQLite-очереди задач.
---
### Этап 2: 🌐 Контекстный перевод предложений в читалке (In-Context Sentence Translator)
- [ ] Кнопка `🌐 Перевести предложение` в попапе слова читалки (рядом с контекстной цитатой).
- [ ] Модель (Llama 3.2 3B) за 1–1.5 сек переводит фразу целиком с учётом смысла книги (устраняя ловушки оторванных слов: *draft*, *address*, *run*).
- [ ] Подсветка точного значения кликнутого слова именно в контексте этого предложения.
- [ ] Прямой перевод любого предложения по клику/выделению в тексте без лишних окон.
- [ ] Мгновенный кэш переводов предложений в SQLite (`sentence_translations`) за 0.01 мс.
- [ ] Возможность сохранить правильный контекстный перевод прямо в карточку словаря.
---
### Этап 3: 🔗 Детектор фразовых глаголов и идиом (Multi-Word / Phrasal Verb Detector)
- [ ] База частых английских фразовых глаголов и коллокаций (A2–B2: *take off, run out of, look forward to, figure out, set up, carry out*).
- [ ] При клике на слово в читалке — автоматический анализ контекстного окна (1–2 слова до и после).
- [ ] При обнаружении устойчивой связки — выделение и перевод всей конструкции целиком вместо оторванного значения отдельного глагола (*took off* $\rightarrow$ «взлетел», а не «взял»).
- [ ] Сохранение готовой устойчивой связки в личный словарь в один клик.
---
### Этап 4: 🎯 Уровневые тесты CEFR (A1, A2, B1, B2) с Gap Ingestion в активный словарь
- [ ] Эталонные списки лексики по шкале CEFR (на базе Oxford 3000/5000: A1 ~800, A2 ~1200, B1 ~1500, B2 ~2000).
- [ ] Быстрый и удобный для мобильных формат: **1-тап выбор ключевого узла (Cloze Tap)** без перетаскивания и долгой печати.
- [ ] **Автоматический захват пробелов (Gap Ingestion)**:
- Если ответ верный $\rightarrow$ слово помечается как освоенное.
- Если пользователь **ошибся или засомневался** $\rightarrow$ слово/оборот **автоматически создаётся как карточка со статусом `learning`** в личном словаре SRS с тегом уровня (`#level-a2`, `#level-b1`).
- [ ] Проблемные слова начинают чаще мелькать в ежедневных утренних повторениях SRS, пока не закрепятся в долговременной памяти.
- [ ] Наглядный прогресс-трекер: процент закрытия каждого уровня (*«Уровень A2: 95% закрыто, 12 слов в тренировке»*).
---
### Этап 5: 📖 Оффлайн-модуль грамматики Мерфи и бумажная тетрадь (Murphy Engine & Handwritten Journaling)
- [ ] Индексация юнитов *Essential Grammar in Use* (A1–A2) и *English Grammar in Use* (B1–B2) в SQLite (`grammar_units`).
- [ ] Поддержка «Вечернего вайба глубокого погружения» (Deep Work Mode): 5–7 минутные микро-уроки.
- [ ] Компактная выжимка правил на контрастах жизненных ситуаций (*I do* vs *I am doing*).
- [ ] 5 интерактивных упражнений с удобным 1-тап выбором на телефоне (Cloze Tap) и мгновенным разбором логики ошибок.
- [ ] **Интервальное повторение грамматики в SRS**: ошибки из упражнений Мерфи автоматически улетают в карточки утреннего повторения SRS!
- [ ] **Блок работы с бумажной тетрадью (мышечная и зрительная память)**:
- Золотая формула правила для записи цветной ручкой/маркером.
- Обязательное составление **2–3 личных примеров от руки из своей реальной жизни**.
- Интерактивный чекбокс: `[✓] Записал от руки в тетрадь`.
---
### Этап 6: 📊 Персональный грамматический профиль и подсказки в читалке
- [ ] Таблица слабых мест пользователя в SQLite (`user_grammar_weaknesses`):
- Автоматическая фиксация категорий ошибок (`#articles`, `#past-tenses`, `#prepositions`, `#passive-voice`, `#conditionals`).
- [ ] Виджет в личном кабинете: **«Радар грамматики»** (топ-3 тем, в которых чаще всего допускаются ошибки).
- [ ] Умная подсказка в читалке:
- Если в тексте книги встречается грамматическая конструкция из «зоны роста» пользователя, читалку можно настроить деликатно подсвечивать её с ненавязчивой подсказкой.
---
### Этап 7: 🎧 Автономная нейро-озвучка Piper TTS и аудирование (Низкий приоритет, в конце)
- [ ] Подключение локального C++ движка Piper TTS (VITS, 100% оффлайн, ~150 МБ RAM, CPU RTF 0.2).
- [ ] Компактные модели дикторов (EN `en_US-lessac` + RU `ru_RU-dmitri`).
- [ ] Регулировка скорости воспроизведения (0.75x для разбора сложных звуков, 1.0x, 1.25x для тренировки беглой речи).
- [ ] Оффлайн-кэширование аудио предложений в `data/audio_cache/` со сжатием в Opus и автоочисткой по TTL 7 дней (Zero Bloat).
- [ ] Фоновый экспорт главы в аудиокнигу для дороги и прогулок.
- [ ] Интерактивный Shadowing (прослушивание $\rightarrow$ повтор в микрофон $\rightarrow$ клиентская проверка).