![](https://habrastorage.org/getpro/habr/upload_files/b68/172/87a/b6817287a4c42141e679e4ece066cbe8.png)
Сегодня мы выпускаем большое обновление для Браузера с рекордным числом изменений, в основе которых лежат нейросети или другие методы машинного обучения. Теперь Браузер исправит ошибки в тексте, сократит или улучшит его, перескажет видео с японского или корейского, распознает QR-код в трансляции и предложит перейти по ссылке в один клик, а также защитит от фишинг-страниц и не только.
В этой статье расскажем, как мы обучали нейросеть с помощью учебника Розенталя, как модель, отвечающая за субтитры, понимает, что начал говорить другой человек, почему не каждый QR-код легко распознать и за счёт чего мы научились ловить фишинговые сайты, которые появились буквально 5 минут назад. Обо всём этом — под катом.
Помощь с текстом: исправление ошибок, улучшение и сокращение
Одна из главных новых нейросетевых функций в Браузере — «Помощь с текстом» на основе YandexGPT. Она проверит орфографию и расставит знаки препинания. А если, например, не получается уложиться в формат по количеству знаков, сократит написанный текст и сделает его более понятным и структурированным.
За каждое действие отвечают разные модели. Почему они разные? Потому что в режиме редактирования нам нужно, чтобы модель исправила ошибки в тексте, а в режимах сокращения и улучшения — переформулировала его. Поговорим о каждой по порядку.
Исправить ошибки
Многие люди, которые используют языковые модели для работы с текстами, сталкиваются с одной и той же проблемой. Допустим, в тексте есть десять ошибок, вы отдаёте его модели, а в итоге получаете практически полностью переписанный текст. Модель отработала по принципу «нет слова — нет ошибки». Но это явно не то, чего вы хотели.
Для начала мы проверили самую важную гипотезу: может ли эта модель вообще не переписывать текст. Это была наша первая ключевая проверка. Мы взяли тексты, удалили из них все знаки препинания и заглавные буквы — это то, что мы подавали модели на вход. На выходе мы поставили оригиналы текстов. На этом мы обучили модель. Потом дали ей 100 текстов нашего валидационного датасета и попросили расставить знаки препинания. Она прекрасно справилась с заданием и ничего не дописала (diff по Левенштейну был нулевым), а это — победа.
![](https://habrastorage.org/getpro/habr/upload_files/51d/e6e/228/51de6e2285832cf2e50b9bf95b4da665.png)
Для обучения нейросети мы составили датасет: взяли 5000 текстов из публичного доступа в интернете. Нам было важно, чтобы это были живые тексты: где-то был сленг, мат, специальные символы. В общем, любой шум, который мог усложнить задачу.
После этого мы с редактором взяли учебник Розенталя — пожалуй, главный учебник русского языка — и прошлись по всем примерам. Но мы не вычищали эти тексты до идеала: мы исправляли пунктуацию и орфографию — условно, хардкорные ошибки. Мы хотели сохранить стилистические штуки типа англицизмов и плеоназмов (когда слова полностью или частично дублируют смысл друг друга — например, «коллега с работы» или «краткое резюме»). Нам было важно, чтобы модель научилась отличать орфографическую или пунктуационную ошибку от разговорной речи. Затем мы составили инструкции и попросили редакторов-асессоров по ним исправить тексты.
На этом этапе у нас был готов датасет, и мы загрузили его в модель побольше, чтобы повысить качество. Чтобы проверить работу модели, мы прогнали через неё валидационный датасет и получили хорошие результаты. Сейчас наша модель исправляет 97% ошибок — пропускает одну ошибку в тексте на 5000 знаков. Мы планируем улучшить этот показатель до 99% — смотрим, какие ошибки даются модели труднее всего, и дособираем датасет по ним.
Сократить и улучшить
Теперь поговорим про модели, которые отвечают за сокращение и улучшение текста. При сокращении мы следим за тем, чтобы текст на выходе не терял важные факты, сохранял тон и стилистику, а нейросеть не придумывала ничего лишнего. Как и в случае с исправлением ошибок, мы обучили модель на датасете, который разметили редакторы.
![](https://habrastorage.org/getpro/habr/upload_files/811/194/99f/81119499faf3b2d805b2b6cde7e4c4dd.png)
Работу модели мы оцениваем по нескольким критериям: сократился ли текст, дописала ли модель что-то новое, сохранила ли она важные факты, а также тон и стиль автора. В 95% случаев модели удаётся добиться заметного сокращения текста.
Улучшить — значит привести текст к нормам русского языка, структурировать его и сделать понятнее. Здесь мы получили модель на основе нашей большой модели YandexGPT 2 и специально подобранного промта. Мы прогнали собранные в интернете тексты через большую модель и получили датасет, на котором уже обучили маленькую модель улучшения текста.
Оценить работу модели достаточно сложно, потому что понятие хорошего текста весьма субъективно. Мы определили такие критерии: сохранение важных фактов, тона и стиля автора, а также стал ли текст приятнее и понятнее. На первых порах модель работала с фактами не очень хорошо: она их периодически теряла. Нам помогло дообучение на датасете, который мы разметили вручную.
Все три модели улучшения текста работают в любом текстовом поле любого сайта. Например, в браузерных версиях мессенджеров Telegram и WhatsApp, в полях комментариев и постов в VK, ОК и других соцсетях, а также в электронной почте. Сейчас мы работаем над тем, чтобы модель начала работать в текстовых редакторах, например, в Google Docs.
Улучшение текста пока работает только для русского языка, но мы планируем заточить их и под работу с английским. Кроме того, мы хотим попробовать добавить функцию перевода или изменения стилистики (например, сделать текст более весёлым или, наоборот, серьёзным). Если у вас есть идеи, какие ещё инструменты для работы с текстом были бы полезны, пишите их в комментариях.
Видео: новые языки, спикеры в субтитрах, распознавание QR-кодов
Японский + Корейский
За всё время Браузер накопил хороший набор встроенных нейросетевых инструментов для видео: он может переводить их с разных языков и даже озвучивать, а ещё делать краткий пересказ и генерировать субтитры. Придумать здесь что-то новое — довольно сложно, поэтому мы сосредоточились на улучшении того, что у нас есть.
Мы добавили новые языки, с которых можно перевести видео — японский и корейский. Почему именно они? Во-первых, это одни из самых распространённых и популярных азиатских языков наряду с китайским. Во-вторых, нам пришло много запросов на добавление именно этих языков. Вы просили — мы сделали.
В целом, когда мы работали над переводом с китайского, то мы рассчитывали добавить и другие азиатские языки. Тогда нам удалось собрать фреймворк, который можно без проблем масштабировать. Для сравнения: над китайским мы работали около семи месяцев, а корейский и японский нам удалось раскатать примерно в два раза быстрее. Мы уже знали, как собирать и обрабатывать датасет, как организовать процесс перевода, чтобы в итоге не потерять контекст.
Перевод с японского и корейского работает на YouTube. Но если вам нужен перевод на других платформах, напишите в комментариях, на каких и почему.
Спикеры в субтитрах
Также мы добавили полезную функцию в нейросетевые субтитры. Дело в том, что чаще всего субтитры на разных платформах не предполагают разбивку на спикеров: когда говорят несколько человек, то отображается сплошной текст, который в лучшем случае разделён точками. Мы научили Браузер определять смену говорящего: речь нового спикера будет начинаться с новой строки и с тире. Это ощутимо повышает читаемость и удобство — не нужно следить, кто сейчас говорит какую фразу. К тому же это плюс к теме доступности: людям с нарушениями слуха гораздо комфортнее смотреть видео и воспринимать происходящее.
У нас уже были модели, которые поддерживают смену спикера. Например, в озвучке применялся Multi-Voice: модель выбирает разные голоса для разных спикеров и озвучивает видео. Отображать смену спикера в субтитрах проще: пайплайн присылает нам явный тег, что говорят разные люди, и Браузер понимает, что нужно визуально обработать смену спикера.
Суммаризация с восьми иностранных языков
Ещё одна приятная новость — мы обновили суммаризацию видео. Теперь Браузер может пересказывать видео с английского, немецкого, французского, итальянского, испанского, китайского, японского и корейского языков. Сам пересказ будет на русском языке. А ещё мы добавили новые площадки: кроме видео на YouTube, Браузер может пересказать видео в VK, Дзене и Рутубе. Так что посмотреть несколько научных конференций на разных языках за один вечер стало вполне реально.
![](https://habrastorage.org/getpro/habr/upload_files/743/c36/bf4/743c36bf4028075120c1c9218ec1fbad.png)
Как работает суммаризация видео, мы скоро расскажем в отдельной статье. К действующей модели мы добавили распознавание входного языка. Если это русскоязычное видео, то весь процесс идёт по обычной схеме: перевод видео в текст, ASR, биометрия (тут мы тоже следим за сменой спикера), чаптеринг, расстановка пунктуации. Если нам нужна суммаризация видео на иностранном языке, то мы начинаем с подобной обработки оригинальной звуковой дорожки, а потом отдаём результат модели, которая переведёт его на русский.
Распознавание QR-кодов
В видео довольно часто встречаются QR-коды. Например, по нашей статистике около 20% пользователей, которые пользуются видеоплатформами, ежедневно встречают их в роликах. На десктопе работать с QR сложно: нужно тянуться за телефоном или делать скриншот, чтобы расшифровать код в стороннем сервисе. Поэтому мы решили облегчить пользователям жизнь и научили Браузер распознавать QR-коды на видео.
Весь процесс происходит локально. При воспроизведении видео Браузер раз в секунду делает его скриншот. Затем снимки обрабатываются: например, если пользователь смотрит видео 4K или 8K, то скриншоты получатся большим и в итоге сильно нагрузят систему, поэтому мы ужимаем их до FullHD. А если видео не самого высокого качества — улучшаем и детализируем изображение. Скриншоты нигде не сохраняются, а сразу отправляются во встроенную библиотеку, которая понимает, есть ли на полученной картинке QR-код.
В качестве инструмента для самого распознавания мы взяли опенсорс-библиотеку ZXing с небольшими, но важными доработками с нашей стороны. Она возвращает распознанный текст и координаты QR-кода. По координатам Браузер отрисовывает кнопку и рамку вокруг QR. Сценарий использования кнопки зависит от распознанного текста: если это ссылка, то по ней можно перейти, а если это текст, то скопировать.
![](https://habrastorage.org/getpro/habr/upload_files/1b1/c01/576/1b1c015762294786ce43a74193c05127.png)
В целом алгоритм выглядит простым, но реализовать его было сложно. Основная загвоздка была в качестве распознавания. Когда мы использовали чистую ZXing, то она распознавала только 70% «правильных» QR-кодов, то есть тех, которые сделаны по стандарту. Мы разобрались, как устроена библиотека, и придумали три доработки, которые сильно повысили качество распознавания и помогли справиться даже с самыми сложными и необычными QR.
Первое улучшение — апскейлинг изображения. Сначала мы пытаемся распознать QR-код с исходной картинки, а если не получается, то масштабируем её и пытаемся распознать заново. Это улучшило точность с 70% до 76%.
Второе — мы починили баг в библиотеке. Суть в том, что если она распознавала QR-код, то потом пыталась распознать его ещё несколько раз, но с другими параметрами. Мы добавили в логику работы условие: если библиотека хотя бы один раз с каким-то набором параметров распознала QR-код, то мы считаем, что распознали его, и больше к нему не возвращаемся. Это дало очень хороший буст — с 76% до 90%.
Третье — улучшенный алгоритм распознавания якорей (поисковых маркеров). Это большие квадраты по углам, с которых и начинается чтение кода. Но иногда QR не соответствуют стандартам: якоря превращаются в кружочки, сердечки и другие фигуры, что усложняет задачу. Мы убрали жёсткую привязку, что якоря должны быть квадратными, и теперь библиотека просто ищет три похожих фигуры в углах. Это улучшение позволило нам приблизиться к 100% распознаванию.
Для тестирования мы собрали два офлайн-датасета. Первый был из «правильных» QR-кодов, которые появлялись в трансляциях наших внутренних мероприятий. Мы стремились, чтобы там было 100% распознаваний (что у нас и получилось). Ещё у нас был «плохой» датасет. Мы попросили асессоров посмотреть разные видео и поискать там QR-коды в плохом качестве или нестандартной формы. Там мы распознавали меньше 30%, а после всех наших улучшений — порядка 60%. В этом плане эталоном для нас служил iPhone 15: он тоже распознал не все нестандартные QR, а около 60%. Причём в нём за это отвечает большая и сложная нейросеть, а наш метод работает даже на слабом железе.
Кстати, о вопросе производительности и применении нейросетей. В процессе разработки мы поняли, что для распознавания QR-кодов потребуется сложная ML-модель, для работы которой может не хватить ресурсов пользовательских устройств. Она бы работала очень долго и тормозила работу Браузера. Распознавание с помощью библиотеки работает быстрее: в среднем один код распознаётся за 10 миллисекунд, а в самых сложных случаях — за 25 миллисекунд.
Задача с распознаванием QR-кодов — хороший пример того, что всегда нужно думать о пользователе и не стоит пытаться отдать на откуп ИИ всё подряд. Здесь нам было важно выбрать наиболее оптимальный инструмент, чтобы решить задачу, и нейросети не подошли. Хотя в основе нашего решения всё равно лежат методы, используемые в ML.
Распознавание QR-кодов работает на всех десктопных платформах. Его можно включать и отключать в настройках инструментов для видео — там же, где живут перевод, краткий пересказ и субтитры.
Защита от фишинга
До обновления Браузера мы искали фишинговые сайты с помощью робота. Он несколько раз в сутки заходил на сомнительные страницы и оценивал их. В этом ему помогали ML-модели на сервере. Если сайт всё же оказывался фишинговым, то мы добавляли его в соответствующую базу. И когда пользователь заходил на новый сайт, Браузер быстро сверялся с базой: если адрес там уже есть, появлялось предупреждение.
Основная проблема была в том, что на весь процесс тратилось довольно много времени и ресурсов: нужно, чтобы робот сходил на сайт, да и вообще как-то узнать о его существовании. Потом — проверка, внесение в базу, её раскатка. Весь этот процесс занимает от нескольких часов до суток — как раз столько в среднем живут все фишинговые сайты. Мошенники делают домен, используют его до тех пор, пока он не попадёт в базу с фишингом, а после берут новый домен и обманывают уже на нём. Были и случаи, когда сайты могли отдавать нашему роботу нормальную страницу вместо фишинговой и пытались таким образом обходить проверку.
Сейчас мы внедрили в Браузер ML-модель, которая умеет проверять на клиенте, фишинговый ли сайт. Таким образом мы смогли сократить цепочку проверок. Пользователь заходит на сайт, ML-модель оценивает его содержимое, даже если на этот сайт никто до этого не заходил. Если сайт выглядит как фишинг, то запускается более сложная модель уже на наших серверах. Чтобы принять решение, она использует результаты работы клиентской ML-модели и учитывает дополнительные факторы: посещаемость сайта, на кого этот сайт зарегистрирован, статистику отказов от этого сайта, насколько давно сайт был создан, как много он показывается в поиске. При этом конфиденциальные данные или какая-то текстовая информация со страницы не передаются. После проверки страницы рассчитывается её скоринг и выносится окончательный вердикт. Если сайт похож на фишинговый, то пользователь видит предупреждение, даже если этот домен был создан буквально 5 минут назад и на него ещё никто не заходил.
Таким образом, мы убираем уязвимость предыдущего способа ловли фишинга, когда из поля нашего зрения выпадали домены-однодневки, которые менялись на другие домены, пока мы их вносили в базу.
Самое сложное в разработке этой штуки — получить датасет. Как уже было сказано выше, фишинг живет очень мало и, кроме того, бывает доступен только для конкретного человека по конкретному IP с конкретного устройства. Важно успеть собрать факторы, пока сайт не умер.
После сбора и фильтрации датасета мы обучили на нём большую BERT-модель,чтобы она умела отличать фишинг от обычного сайта. Но такая модель очень тяжёлая: для серверов она подходит, а вот для работы в real-time — нет. Для нашей цели мы выбрали DSSM: пусть модель, основанная на таком подходе, менее умная, но зато более быстрая. Для обучения ей нужно очень много примеров, поэтому с помощью BERT-модели мы разметили огромный датасет, получили результаты и на них обучили DSSM. В итоге эта модель умеет на лету предсказывать фишинг и весит всего 20 МБ — её мы и встроили в Браузер.
Модель работает очень быстро — в пределах 10 миллисекунд, что не влияет на скорость работы Браузера. Кроме того, мы стали точнее определять фишинг. Да, аудитория Хабра разбирается в технологиях и, как правило, не клюёт на примитивный фишинг, но для многих менее опытных пользователей подобные инструменты защиты особенно востребованы. Месячная аудитория, которая видит наши предупреждения только на десктопной версии, — примерно 1,8 млн человек.
Это не все возможности, которые может предложить обновлённый Браузер. Например, группы вкладок теперь стали облачными и могут синхронизироваться между устройствами. К тому же вы можете сами выбрать, какие именно вкладки и группы нужно синхронизировать. А ещё Алиса научилась генерировать изображения с помощью нейросети YandexART. Чтобы создать свою картинку, зайдите в диалог с Алисой и активируйте навык «Давай нарисуем».
Нейросетевые функции Браузера активируются с помощью компактных меню, которые автоматически появляются рядом с контентом, где их можно применить. Например, кнопка поверх видео или всплывающая плашка при выделении текста. Если функция влияет сразу на всю страницу, меню появится рядом с адресной строкой.
Новые функции доступны в последних версиях Яндекс Браузера для Windows, macOS и Linux, а также для мобильных версий (кроме помощи с текстом и распознавания QR-кодов в видео). Делитесь своим опытом использования новых инструментов Браузера. Это поможет нам улучшить действующие нейросетевые модели, а также придумать и обучить новые.