1# Real-time («T9») автозамена — дизайн 2 3> 2026-06-03. Ответ на вопрос: SAGE отлично правит ВЕСЬ текст, но что делать с **посимвольной** коррекцией во время набора — с учётом склонения, предыдущего/следующего слова, «что вероятнее сейчас» и клавиатурных ошибок. Это другая задача с жёсткими ограничениями. 4 5## 1. Почему per-keystroke ≠ batch 6| | Batch (Ctrl+Shift+Space) | Real-time (во время набора) | 7|---|---|---| 8| Бюджет времени | ~0.3–0.5с на предложение — ок | **<20–30мс на нажатие/слово** (иначе лаг ощущается) | 9| Контекст | весь текст, **двусторонний** | только **левый** (будущего слова ещё нет) | 10| Цена ошибки | низкая (можно отменить, видишь весь текст) | **высокая** — неверная правка рвёт поток ввода | 11| Инструмент | SAGE (трансформер) | эвристика / **крошечная** быстрая модель | 12 13SAGE = 0.28с (GPU) / 0.5с (CPU) на предложение → **в 10–50× больше** бюджета на нажатие. Гонять трансформер на каждое слово нельзя. Нужна другая архитектура. 14 15## 2. Рекомендуемая архитектура — двухуровневый гибрид 16**Tier 1 — мгновенно, на границе слова (<1мс):** текущая эвристика (`SpellScore` noisy-channel + биграмма левого контекста + precision-гейт). Чинит очевидные опечатки прямо при наборе, консервативно (precision-first → «безотказно»). Уже сделано (31→62%). 17 18**Tier 2 — в фоне, на конце предложения (`. ? !` / новая строка) или после паузы ~700мс:** прогнать **SAGE** по только что законченному предложению → исправить то, что tier-1 не смог (склонение, контекст, пунктуация). 0.28с GPU / 0.5с CPU — **незаметно**, т.к. пользователь уже печатает дальше. Получаем «мгновенно + со временем качество SAGE» с двусторонним контекстом. 19 20Это прямо отвечает на все факторы из вопроса (см. §3). 21 22## 3. Каждый фактор → каким механизмом закрывается 23- **Клавиатурные проблемы** (ЙЦУКЕН-соседство, транспозиции, сдвоенные/пропущенные клавиши, EN↔RU раскладка): `SpellScore` уже моделирует это как стоимость правки P(typed|intended). **Tier 1, готово.** 24- **Какое слово было до** (левый контекст): биграмма `P(cand | prevWord)` — уже подмешивается в ранжирование. **Tier 1, готово.** Усилить: **отложенная коррекция** (править слово N−1, когда начат N) даёт дешёвый ПРАВЫЙ контекст без модели. 25- **Какое пойдёт / вероятнее сейчас** (следующее слово): (а) **Tier 2 SAGE** видит реальное следующее слово (двусторонне); (б) отдельная фича — **предсказание следующего слова** (word-LM: биграмма + опц. крошечный RNN) → подсказки в стиле T9. 26- **Склонение / согласование** (род/падеж/число): честно — текущий `morph.bin` хранит **только POS** (сущ/прил/глаг…), не граммемы. POS помогает грубо (кандидат-глагол после местоимения и т.п.). **Полное согласование** (красивый/красивая, падежные окончания) даёт: **Tier 2 SAGE** (выучено, двусторонне) — лучший вариант сейчас; либо обучить tiny-NN; либо пересобрать morph с полными граммемами OpenCorpora и добавить правило-проверку согласования прил.↔сущ. 27 28## 4. Идеальный Tier 1 в будущем — крошечная контекст-модель (<5M, <10мс) 29Та самая «инновационная» сеть из `NEURAL_RESEARCH_AND_DESIGN.md`: один общий char-контекст-энкодер (инкрементально по мере набора) + две головы — **LM** `P(word|левый контекст)` и **error** `P(typed|cand)` с клавиатурой+фонетикой; кандидаты **только из словаря** (не генерит → не галлюцинирует); калиброванный **precision-гейт**; персонализация по отменам. Учит склонение/контекст/клавиатуру совместно, заменяет ручной `forcedFix`, без Python-зависимости. Обучается на синт-парах (Augmentex) — этап 2. 30 31## 5. Реалистичные цифры 32- Tier 1 (эвристика): **<1мс** — незаметно на каждом слове. 33- Tier 2 (SAGE на конце предложения, фоном): **0.28с GPU / 0.5с CPU** — незаметно (пользователь уже дальше). 34- Tiny-NN tier-1 (будущее): цель **<10мс** на CPU. 35 36## 6. Ограничения и риски 37- **Tier 2 «вклейка» исправленного предложения во время набора** — самое тонкое: курсор уже уехал вперёд, надо аккуратно выделить/заменить именно завершённое предложение, не задев то, что печатается сейчас. Реализуемо (есть механизм `QueueReplaceRaw` + clipboard-paste), но **требует живого теста** (а computer-use сейчас отключён) — делать опционально/за флагом и проверять руками. 38- **GPU в приложении**: системный python 3.14 → только CPU-torch (CUDA-колёс под 3.14 нет). Для GPU указать `WC_PYTHON` на python 3.12 venv (см. замеры). 39- **Полное склонение** требует граммемного morph или обученной модели — POS-only сейчас недостаточно для агрессивной агрементной правки (а агрессия в real-time опасна → лучше Tier 2). 40 41## 7. Что предлагаю сделать (по приоритету) 421. **Tier 2: фоновый SAGE-свип на конце предложения / по паузе** — даёт качество SAGE «вживую». За флагом (Settings), нужен живой тест вклейки. 432. **Отложенная коррекция (1 слово)** в Tier 1 — дешёвый правый контекст, помогает НО/НЕ и грубому согласованию. 443. **Предсказание следующего слова** (word-LM) → T9-подсказки. 454. **Tiny-NN tier-1** (этап 2) — главный «безотказный» движок, обучить на Augmentex. 465. **Граммемный morph** (полные теги OpenCorpora) → правило согласования прил.↔сущ. в Tier 1. 47 48## Реализовано (2026-06-03) 49- **Tier-2 live SAGE-подсказка** (suggestion-режим, безопасно): флаг `Settings.SentenceAiSuggest` (по умолчанию ВЫКЛ; тумблер в трее автозамены «SAGE-подсказка предложения (live)»). Независимый трекер сырого текста предложения (`sentenceRaw` в `TextProcessor.OnKeyDown`) → на `. ? !` / Enter в фоне через тёплый SAGE-сервер (~0.3с) → показывает исправленный вариант **тултипом** у курсора. **Недеструктивно** (не трогает набранный текст) → нулевой риск порчи. Это Tier-2 с полным двусторонним контекстом/склонением «вживую», но в виде подсказки. 50- **Авто-вклейка во время набора (Tier-2 mode-2)** — сознательно НЕ реализована вслепую: надёжная замена уже набранного предложения в произвольном приложении требует аккуратной работы с курсором/выделением + **живого теста** (computer-use отключён, иначе риск порчи чужого текста). Правильный путь — выделение строки + проверенный copy-correct-paste с guard «пользователь не печатал во время вызова». Включается, когда будет возможность тестировать руками. 51- **Отложенная правка слова (#2)** — отложена: ре-инъекция уже не-смежного слова через backspace рискует портить текст; правильнее в рамках tiny-NN (этап 2) или accessibility-API замены текста. 52- Как проверить подсказку: запустить `MediaCore.exe` (модуль «Автозамена» в трее), в трее включить «SAGE-подсказка предложения (live)», печатать с опечатками — в конце предложения всплывёт исправленный вариант (нужен установленный Python+SAGE).