179 lines
16 KiB
Markdown
179 lines
16 KiB
Markdown
# 🧠 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$ клиентская проверка).
|
||
|
||
---
|
||
|
||
### Этап 8: 🧠 Специализированная микро-модель перевода (Qwen2.5-0.5B + CTranslate2)
|
||
- [ ] Полная архитектурная спецификация: `docs/architecture/specialized-translation-model.md`
|
||
- [ ] **Цель**: Разгрузить сервер, снизить задержку читалки до 100–150 мс и избавиться от сетевого оверхеда Ollama при чтении.
|
||
- [ ] **Разделение ролей**:
|
||
- Читалка (контекстный перевод предложений + целевое слово в JSON): `Qwen2.5-0.5B-Instruct` через CTranslate2 (in-process в Python, ~350 МБ RAM).
|
||
- Итоги урока (Debrief): `Qwen2.5-3B` on-demand (Ollama `keep_alive: 5m`) или детерминированный движок Мерфи.
|
||
- [ ] **Пайплайн реализации**:
|
||
- [ ] Сборка синтетического датасета `train.jsonl` (1500–3000 пар `(sentence, word, context, hints) -> JSON`).
|
||
- [ ] LoRA-дообучение на CPU VPS (AMD Ryzen 9 5950X, ~25–45 мин).
|
||
- [ ] Слияние и конвертация в CTranslate2 `int8` (`ct2-transformers-converter`).
|
||
- [ ] Прямая интеграция `ctranslate2.Generator` в `app/ai.py` с сохранением кэша SQLite.
|
||
|