Files
notes-qpid-pro/AI_TODO.md
T

16 KiB
Raw Blame History

🧠 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)

-- Квизы и тесты на понимание по главам
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.