16 KiB
16 KiB
🧠 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):
- Zero Daemon (Нулевой оверхед в покое): Никаких висящих в памяти демонов Ollama/vLLM. Инференс вызывается по требованию (
on-demand) через оптимизированный бинарникllama.cpp(llama-cli). - Изоляция CPU (
nice -n 19): Фоновый процесс работает с самым низким системным приоритетом Linux. Читалка, веб-интерфейс и база данных отвечают без задержек даже при 100% нагрузке на ядра процессора. - Ограничение контекста (
-c 4096): Контекст строго ограничен 4096 токенами. KV-кэш занимает не более 200 МБ ОЗУ, полностью исключая риск аварийной нехватки памяти (OOM Killer). - Строгий 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+ RUru_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-3Bon-demand (Ollamakeep_alive: 5m) или детерминированный движок Мерфи.
- Читалка (контекстный перевод предложений + целевое слово в JSON):
- Пайплайн реализации:
- Сборка синтетического датасета
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.
- Сборка синтетического датасета