ПОД КАПОТОМ

Почему проверять русский на устройстве сложно, и как это всё-таки построено

Грамоту построил один человек: Андрей Троегубов, продакт-менеджер без инженерного образования, который пишет код вместе с AI-агентами. Идея появилась, когда в конце 2024-го Apple Intelligence вышла без русского языка; основная работа шла в течение 2026-го, и летом приложение вышло в App Store. Ниже инженерная часть истории, с настоящими цифрами, включая неловкие.

~130×
ускорение после разворота архитектуры
99,7%
операций модели выполняется на Apple Neural Engine
17 мс
на проверку одного предложения
2,1 млн
синтетических обучающих пар, собранных на одном Mac

Что делает задачу сложной

Язык спорит со слухом

Русская орфография сознательно игнорирует произношение. Безударное «о» звучит как «а» («молоко» на слух «малако»), звонкие согласные глохнут в конце слова, а «-тся» и «-ться» звучат одинаково и различаются только грамматикой. Корректор должен восстановить написание из того, что автор услышал, а это ровно то направление, которое слух проверить не может.

Одна буква ломает модели зрение

Нейросети читают текст кусочками-subword, а не словами. Поменяйте одну букву на слух, и слово нарежется на другие кусочки: модель видит не то же слово с ошибкой, а незнакомое слово. Русский усугубляет это: смысл сидит в окончаниях, ровно там, где сжатие и маленькие модели теряют точность первыми.

Правильных ответов несколько

На реальных текстах даже профессиональные разметчики не согласны друг с другом близко к 99%: у многих предложений несколько допустимых исправлений. Цель выше уровня шума метрики не амбициозная, она неопределённая. К 99% может и должна стремиться другая метрика: не портить текст, который уже был правильным.

И всё это должно уместиться в телефон

Без серверов модель живёт в памяти и тепловом пакете телефона. Первая попытка, модель на 8 миллиардов параметров, запускалась, но из RAM не уходила: iPadOS просто не освобождала память. Все архитектурные решения дальше принимались об эту стену.

Понадобилось четыре модели

Модель на 8 миллиардов умерла об память. Адаптированная под русский на 3 миллиарда об качество. Спроектированная с нуля на 82 миллиона об потолок ёмкости: работала до предела, а дальше выдумывала редкие формы слов. Самым трудным решением стало поставить на готовую предобученную модель на 820 миллионов, которая из коробки набрала 0% на задаче исправления. Звучит как приговор, пока не понимаешь причину: её учили восстанавливать замаскированный текст, чинить предложения её никто не просил. Правильный русский под этим шумом был виден. После дообучения она стала первым рабочим движком: 85% на продуктовом benchmark. С одной оговоркой.

От 2 160 миллисекунд к 17

Оговорка: движок тратил около 2 160 мс на предложение, потому что генерация текста означает полный проход decoder на каждый выходной токен. Решение оказалось архитектурным: вместо переписывания предложения модель классифицирует каждое слово (оставить, удалить, поменять падеж, исправить букву), а правки применяет детерминированный код. Такую форму сети Apple Neural Engine исполняет нативно: 246 миллионов параметров, 99,7% операций на ANE, около 17 мс на предложение, примерно в 130 раз быстрее.

И такая модель структурно не умеет пересказывать: правки берутся из фиксированного меню, а переписывания в этом меню нет. На benchmark новый движок уже был впереди; финальной проверкой стало сравнение на свежем тексте из 212 слов, которого не видел ни один из движков. Новый сделал 13 исправлений, и все 13 верные. Генеративный сделал 21, из них 3 плохих, включая одно с изменением смысла предложения. Это подтвердило выбор, и старый движок на 800 МБ покинул приложение.

Оценка врала, и всё началось с её починки

Самое ценное исправление проекта не касалось модели. Оценочный набор, по которому наводилось обучение, пересобирался из тех же данных, на которых модель училась, поэтому оценки измеряли память, а не умение: одна категория показывала 22,6% при честных 4,4%. Лечение скучное: замороженный benchmark, который никогда не попадает в обучение, плюс карантинный срез свежих данных каждого раунда.

Та же дисциплина окупалась дальше. Расчёт теоретического потолка (46,2% для той архитектуры) вскрыл баг, который никто не подозревал: 38,9% правильных ответов не мог воспроизвести сам код сборки текста из правок. А перемножение вероятностей вдоль «самоулучшающегося» цикла показало, что из 1 400 прицельных примеров за раунд модель видела около 16. Цикл был декоративным, просто никто не умножал. Теперь всё это автоматические проверки после каждого раунда обучения, потому что однажды две регрессии прожили 49 раундов, пока я смотрел на дашборд.

Не портить правильный текст

Первая честная цифра была обидной: модель правила 41% предложений, в которых ошибок не было. В каждом обучающем примере сидели ошибки, и модель выучила, что текст всегда сломан. Примерно треть обучения стала парами «чистое → чистое»: если модель должна уметь ничего не делать, этому тоже нужно учить.

Дальше всё строится вокруг точности, потому что неверная правка портит текст, а пропущенная просто оставляет его как есть. Словарный слой срабатывает только при трёх условиях сразу: слово неизвестно словарю на 422 тысячи форм, замена похожа на механику реальной опечатки (подмена «на слух» или соседняя клавиша), и исправление минимум в 10 раз частотнее ближайшего конкурента. Ложные срабатывания на живом неформальном тексте: с 16,7% до 0,5%.

Я продакт-менеджер. Код писал AI.

У меня нет инженерного диплома и не было инженерной должности. Код написан вместе с AI-агентами, и мне проще сказать это прямо, чем позволить странице намекать на обратное. Интересен другой вопрос: что остаётся человеку, когда набор кода бесплатен.

Агенты выдают настоящие исправления и убедительную чепуху с одинаковой скоростью и одинаковой уверенностью. Однажды сгенерированный AI отчёт о тестировании пришёл с таблицами, количествами и конкретными «пропущенными исправлениями»: при проверке на реальном конвейере части этих исправлений не оказалось ни в одной версии тестового текста. Так что работа человека выглядела так: выбрать планку качества, построить оценки, которые нельзя обмануть, пропустить перенос на Swift через побайтовые эталонные проверки (tokenizer 199/199, весь конвейер 149/150) и принимать решения: развернуть архитектуру, закрыть три модели, удалить запасной движок, отказаться от 99%. Это работа продакт-менеджера, выполненная на инженерной глубине.

Куда это движется

План честный по отношению к платформам: каждая получает то, что реально поддерживают её железо и привычки, а не копию соседнего приложения.

Движок-классификатор остаётся: на телефоне 17 мс и почти нулевые ложные срабатывания важнее любой дополнительной мощности. Поверх него придёт Репетитор: приложение уже знает, какие правила вы нарушаете, и может превращать ваши же исправленные предложения в упражнения, повторяя их ровно до того момента, когда правило закрепится. Движок готов и проверен (1 120 из 1 120 сгенерированных упражнений сходятся с корректором), остались продуктовые детали.

Правило приватности то же: Репетитор учится на том, когда вы принимаете или отменяете правки, а не на отправке вашего текста куда-либо.

Репетиторскоро
Найдите ошибку:
Он хочет научится плавать.
научится научиться ✓

Mac-версии приложений, выросших из iOS, обычно делаются по остаточному принципу: те же экраны на большом мониторе. Так теряется главное, что есть у Mac: запас. У него в разы больше памяти, чем у телефона, и никакой тревоги за батарею у розетки, поэтому он может держать класс моделей, который телефону не светит.

Это и есть текущее исследовательское направление: заметно более крупная модель для Mac, по-прежнему работающая на устройстве, но выходящая за пределы фиксированного меню правок, в сторону объяснения исправлений и переписывания под нужный тон. Классификатор при этом остаётся на точной работе, где он структурно сильнее. Правило то же, что и в первый день: всё работает на машине, и ничего её не покидает.

Грамота для Macисследование
Он хочет научится плавать.
Он хочет научиться плавать.
Тон: Нейтральный Дружелюбный Официальный
Почему

«Научиться» отвечает на вопрос «что сделать?» и пишется с мягким знаком.

Если этот раздел похож на портфолио, так и задумано. Обо мне, других проектах и как со мной связаться: troegubov.co.