Перейти к содержанию
Публикация AiManual

Как собрать EdTech-сервис для изучения английского без лишнего LLM

Практический разбор архитектуры тренажёра английского на YouTube-субтитрах: очистка, лемматизация, частотные списки, IndexedDB, PWA и интервальные повторения. У

Коротко

Что будет в материале

  1. 01

    Почему для изучения английского не нужно отправлять весь текст в LLM

  2. 02

    От YouTube-субтитров к учебному материалу: воронка обработки текста

  3. 03

    Английский по частотным спискам слов: почему частотность важнее «умной» обёртки

  4. 04

    Тест на входе: как определить уровень через адаптивность и слова-ловушки

Для тренажёра английского LLM не нужна на каждом этапе. Извлечение слов, подсчёт частот, нормализацию словоформ, фильтрацию дублей и расписание повторений надёжнее поручить коду и локальной базе. Модель стоит подключать там, где требуется языковой контекст или вариативная генерация: например, для подсказки к конкретной фразе или разбора неоднозначного значения.

Базовый пайплайн выглядит так: YouTube-субтитры, очистка и нормализация, лемматизация, сопоставление с частотным списком, запись в локальный словарь, адаптивный отбор материала и интервальные повторения. Такой подход снижает стоимость обработки, упрощает отладку и позволяет хранить значительную часть данных в браузере через IndexedDB в офлайн-ориентированном PWA.

Полный прогон транскрипта через LLM не гарантирует более полезный набор слов. Модель может предложить убедительное объяснение, но ошибиться в приоритетах, непоследовательно обработать одинаковые словоформы или изменить результат после повторного запуска. Частотные списки и собственный словарь дают продукту фиксируемые правила, которые можно проверить на конкретном примере.

Почему для изучения английского не нужно отправлять весь текст в LLM

Какие задачи лучше решать кодом и локальными данными

Большая часть обработки учебного текста относится к детерминированным операциям. Приложение может разделить субтитры на реплики, убрать временные метки, нормализовать регистр, выделить токены, посчитать повторения и сопоставить формы слов с локальным словарём. Для этих действий не требуется генеративная модель.

Локальный алгоритм даёт четыре практических преимущества:

  • Воспроизводимость. Одинаковый вход проходит одинаковые правила и возвращает сопоставимый результат.
  • Контроль стоимости. Массовая обработка текста не создаёт отдельный запрос для каждой реплики или леммы.
  • Прозрачная отладка. Разработчик видит, на каком этапе потерялось слово: при очистке, лемматизации или поиске в словаре.
  • Работа без сети. Частотные данные, прогресс и расписание повторений можно держать на устройстве.

Список операций удобно разделить по ответственности. Парсер отвечает за структуру субтитров. Нормализатор готовит текст. NLP-инструмент определяет леммы. Словарь хранит проверяемые значения и учебные параметры. Планировщик повторений меняет состояние карточки после ответа пользователя. Такая декомпозиция полезнее универсального вызова модели, который пытается решить все задачи одним ответом.

Где LLM добавляет ценность, а где только усложняет систему

LLM оправдана там, где правила сталкиваются с неоднозначностью или где нужен новый текст. Например, приложение может передать модели конкретное слово, короткую фразу и предложение из субтитров, чтобы получить подсказку. Другой сценарий, точечный разбор фразового глагола или значения омонима в конкретной реплике.

Узкий контекст уменьшает число токенов, ограничивает пространство ошибок и упрощает проверку ответа. Базовый перевод при этом должен поступать из локального словаря или проверенного набора данных. Модель может дополнить учебный материал, но ей не стоит поручать роль единственного источника истины.

Подход к LLM зависит от требований продукта и доступной модели. В одном сервисе хватит локального инференса для коротких подсказок, в другом потребуется серверный вызов с кэшем. Общий критерий один: модель нужна, когда результат трудно получить правилами и он действительно улучшает упражнение.

От YouTube-субтитров к учебному материалу: воронка обработки текста

Источник текста: автоматические субтитры, SRT и VTT

YouTube хранит субтитры отдельной дорожкой. Платформа может автоматически создать её по аудио, а автор ролика способен загрузить собственный файл в формате SRT или VTT и синхронизировать транскрипт с видео. Автоматические субтитры поддерживаются для длинных видео и Shorts на 67 языках, но наличие такой функции не означает гарантированное качество текста.

Автосубтитры могут не появиться, если язык не поддерживается, звук записан плохо, в начале есть длинная тишина, несколько говорящих перебивают друг друга, в ролике одновременно звучат разные языки или видео слишком длинное. В приложении это нужно считать штатным состоянием входных данных. Пользователь должен получить понятный сценарий для ручного SRT/VTT или другого допустимого текста, а не скрытую попытку исправить весь транскрипт дорогим вызовом LLM.

Для каждого материала полезно хранить тип источника и статус обработки. Это позволяет отличать корректно разобранную дорожку от текста с неполным распознаванием и не смешивать ошибки источника с ошибками словаря.

Очистка и нормализация транскрипта

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

Слой очистки должен подготовить текст к анализу, сохранив исходную реплику для учебного контекста. Обычно разделяют два представления:

  • Исходный текст. Нужен, чтобы показать ученику фразу, временную привязку и окружение слова.
  • Нормализованный текст. Используется для токенизации, лемматизации, подсчёта частоты и поиска в словаре.

Конкретные правила зависят от формата и выбранного NLP-инструмента. Нельзя без проверки удалять апострофы, сокращения или дефисы: в английском они могут менять смысл и форму слова. Каждый этап стоит делать повторяемым и логировать его результат на небольшом наборе примеров.

Лемматизация: как связать словоформы с одной записью словаря

Лемматизация сводит разные формы к лемме. Формы study, studies и studied могут быть связаны с одной словарной записью, если инструмент правильно определил часть речи и контекст. Без такой нормализации сервис посчитает их отдельными элементами и завысит объём новой лексики.

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

Лемматизация не безошибочна. Омонимы, редкие формы, имена собственные и короткие слова часто требуют контекстной проверки. Если NLP-инструмент выбрал неправильную лемму, автоматическая цепочка распространит ошибку на частотный подсчёт и карточку. Спорные случаи лучше маркировать и направлять на отдельную обработку.

Английский по частотным спискам слов: почему частотность важнее «умной» обёртки

Сопоставление транскрипта с локальным словарём

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

После лемматизации сервис ищет каждую единицу в локальной базе. Найденные слова получают связь с исходными репликами и контекстами. Неизвестные леммы попадают в очередь на проверку, а не сразу отправляются в модель. Это отделяет проблему отсутствия записи от проблемы неоднозначного значения.

Словарь должен оставаться источником проверяемых данных. Если для слова нет надёжного перевода, интерфейс может показать его как требующий проверки или предложить контекстный разбор. Генеративная модель не должна бесконтрольно записывать придуманный перевод в основную базу.

Как отбирать слова под уровень пользователя

Частотность полезна как базовый фильтр, но персонализация требует дополнительных признаков. Сервис может убрать леммы, которые пользователь уже устойчиво знает, повысить приоритет незнакомых слов и ограничить объём нового материала за одну сессию. Точная граница зависит от дизайна продукта и результата входного теста.

Простой алгоритм может выглядеть так:

  1. Собрать леммы из транскрипта и убрать дубли.
  2. Исключить слова, которые пользователь уверенно прошёл в предыдущих повторениях.
  3. Отсортировать оставшиеся записи по частотному рангу и пригодности для текущего уровня.
  4. Добавить тематические слова, если они нужны для понимания конкретного видео.
  5. Ограничить число новых карточек и сохранить остальные в очереди.

Так частотный список превращается в механизм управления нагрузкой. Пользователь получает материал, который чаще встречается в языке, уже связан с выбранным видео и соответствует его текущему состоянию, а не случайную выборку из полного транскрипта.

Что частотные списки не решают

Частотность зависит от корпуса. Список, построенный на разговорной речи, будет отличаться от списка новостей, технических текстов или художественной литературы. Высокий ранг не гарантирует, что слово нужно именно в выбранном ролике.

Частотный подход плохо описывает идиомы, фразовые глаголы, многозначность и грамматическую сложность. Редкая тематическая лемма может быть необходима для понимания лекции, а распространённое слово может иметь непривычное значение в конкретной реплике.

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

Тест на входе: как определить уровень через адаптивность и слова-ловушки

Почему обычной проверки знакомых слов недостаточно

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

Ошибка быстро распространяется на весь продукт. Если приложение считает слово известным после одного уверенного клика, оно убирает его из очереди и неверно рассчитывает будущие интервалы. Адаптивный тест должен учитывать качество ответа, повторяемость результата и случаи, где пользователь сомневался.

Как использовать слова-ловушки без манипуляции результатом

Слова-ловушки проверяют различение значения, формы или контекста. Это могут быть похожие по написанию слова, знакомая лемма с другим значением или форма, которую легко спутать с другой частью речи. Цель теста, проверить реальное понимание, а не специально запутать пользователя.

Сложность задания меняется после ответа. Уверенные правильные ответы переводят тест к более сложным словам, ошибки возвращают его к проверке базовой лексики. Спорные записи можно показать повторно или попросить указать уверенность ответа, если такая механика предусмотрена продуктом.

Число вопросов, шкала уровней и пороги перехода должны появиться после сбора данных. Их нельзя выводить из одной частотной границы. Языковой уровень включает словарь, понимание контекста, грамматику и устойчивость навыка, поэтому лексический тест даёт полезную оценку для персонализации, но не описывает владение языком целиком.

IndexedDB и PWA: зачем тренажёру английского офлайн-режим

Что хранить в IndexedDB

IndexedDB подходит для структурированных данных, которые должны переживать перезагрузку страницы и быть доступны без постоянного запроса к серверу. В тренажёре в браузере можно хранить:

  • записи локального словаря, леммы и связанные словоформы;
  • известные и изучаемые слова;
  • интервалы повторений и историю ответов;
  • результаты адаптивного теста;
  • очередь упражнений;
  • обработанные материалы и связи слов с репликами;
  • кэш коротких подсказок, если продукт разрешает их сохранять.

Сущности лучше разделить по назначению. Словарная запись не должна смешиваться с пользовательским состоянием, иначе обновление базы может затронуть прогресс. Версию локальных данных нужно хранить отдельно, чтобы миграции проходили предсказуемо.

Интервальные повторения как локальный механизм обучения

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

Разделение повторений и генерации контента упрощает архитектуру. Планировщик продолжает работать без сети, а модель подключается только при необходимости создать подсказку или пояснить конкретную фразу. При следующем запуске PWA читает локальную очередь и показывает слова, для которых наступил срок повторения.

Офлайн-ограничения и синхронизация

Локальное хранение не равно вечному резерву. Пользователь может очистить данные сайта, сменить устройство или потерять браузерный профиль. Поэтому продукту нужны экспорт прогресса, резервная копия или синхронизация, если между устройствами требуется единое состояние.

Без сервера обычно доступны словарь, уже обработанные материалы и расписание повторений. Импорт нового текста, обновление общей базы и серверные вызовы LLM могут требовать соединения. Интерфейс должен явно разделять готовые офлайн-действия и операции, которые временно недоступны.

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

Две узкие задачи для LLM в архитектуре сервиса

Генерация подсказки для конкретного слова или фразы

Модель можно вызвать после того, как код уже выбрал учебную единицу. В запрос передаются слово или фраза, предложение из субтитров, известный перевод и требования к формату. Ожидаемый результат, короткая подсказка, которая помогает понять значение, но не раскрывает ответ без необходимости.

Контекст стоит ограничивать. Для карточки редко нужен весь ролик: обычно достаточно предложения и соседней реплики, если она влияет на смысл. Ответ нужно проверить по схеме, ограничить по длине и отделить от основного словаря. Ошибка генерации не должна ломать очередь повторений.

Точечный разбор неоднозначного контекста

Локальные правила могут не различить значения фразового глагола, омонима или короткой формы. В таком случае приложение передаёт модели конкретный спорный фрагмент и просит выбрать значение из ограниченного набора либо вернуть объяснение с указанием неопределённости.

Вызов должен происходить после лемматизации и поиска в словаре. Если отправлять в LLM каждый токен, продукт потеряет преимущества локальной архитектуры. Если передавать только кандидатов с реальной неоднозначностью, разработчик сможет измерить частоту таких случаев и понять, оправдывает ли модель расходы.

Как контролировать стоимость и качество вызовов

Для узких LLM-функций нужны отдельные правила эксплуатации:

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

Для общих принципов локальных AI-сценариев полезен отдельный разбор практического применения локальных LLM. А вопросы проверки и фильтрации сгенерированных данных можно сопоставить с подходами из материала о построении пайплайна с верификацией.

Что в итоге: минимальная архитектура, которую можно развивать

Порядок реализации MVP

Первую версию разумно строить вокруг полезного учебного цикла:

  1. Импортировать текст из субтитров или пользовательского файла.
  2. Очистить и нормализовать материал.
  3. Лемматизировать словоформы и связать их с исходными репликами.
  4. Сопоставить леммы с локальным словарём и частотным списком.
  5. Провести адаптивный тест с корректно подобранными словами-ловушками.
  6. Отобрать новые слова с учётом уровня и уже изученной лексики.
  7. Запланировать интервальные повторения.
  8. Сохранить словарь, прогресс и очередь в IndexedDB.
  9. Добавить офлайн-ориентированную PWA-оболочку.
  10. Проверить, какие спорные случаи действительно требуют LLM.

Такой порядок даёт работающий продуктовый каркас до подключения генерации. LLM появляется после измерения проблем, а не в качестве предположения, что любая языковая задача требует большой модели. Для надёжности полезно держать этапы независимыми: источник текста не должен определять алгоритм повторений, а ошибка подсказки не должна удалять карточку.

Какие метрики проверять после запуска

После первых пользовательских сессий нужно собирать данные о качестве каждого этапа:

  • доля материалов, которые удалось обработать;
  • частота ошибок сопоставления слов;
  • количество лемм, требующих ручной проверки;
  • завершение входного теста;
  • регулярность интервальных повторений;
  • число ручных исправлений переводов и контекстов;
  • доля вызовов LLM среди всех обработанных учебных единиц;
  • частота пустых, невалидных или отклонённых ответов модели;
  • число случаев потери или рассинхронизации локального прогресса.

Конкретные пороги качества появятся после накопления реальных данных. На старте достаточно видеть, где цепочка чаще всего ломается и какие ошибки влияют на обучение. Если пользователи регулярно исправляют автоматические значения, проблема может находиться в словаре или лемматизации, а не решаться увеличением размера модели.

Минимальная схема сервиса выглядит так: источник субтитров, нормализация, лемматизация, частотное сопоставление, локальный словарь, адаптивный отбор, интервальные повторения, IndexedDB и PWA, затем точечные вызовы LLM для подсказок и неоднозначных фрагментов.

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

Подписаться на канал