ФронтендData и ИИJavaScriptHTML / CSS

Локальный ИИ в браузере: определяем настроение текста через Transformers.js

Запускаем анализ тональности текста локально в браузере через Transformers.js: загрузка модели, pipeline, индикатор прогресса и проверка результата.

Кодик

Автор

6 мин чтения

Transformers.js можно освоить на одном небольшом проекте, если сразу видеть вход, действие и результат. Transformers.js загружает модель и выполняет pipeline анализа тональности в браузере без собственного Python-сервера. Ниже вы соберёте работающий пример и проверите обычный и граничный сценарии.

Кнопка «анализировать» кажется простой, но первый запуск загружает веса, результат зависит от модели, а label нельзя показывать как абсолютную истину. Поэтому отделим настройку, входные данные, основное действие и проверку. В этой статье вы соберёте страницу с текстовым полем, индикатором загрузки и локальной классификацией positive/negative со score. Проверка: после первой загрузки две тестовые фразы получают разные метки, кнопка не запускает параллельные запросы, а пустой ввод отклоняется.

1Соберите минимум

создать textarea, кнопку, статус и результат. Не расширяйте проект до первого успешного запуска.

2Увидьте данные

первая загрузка показывает ожидание. Проверяйте значение, а не отсутствие ошибки.

3Измените правило

После успеха добавьте выбор из двух тестовых фраз и время первого и повторного inference. Так копирование станет практикой.

Как устроен учебный проект Transformers.js

UI собирает текст, singleton-функция один раз создаёт pipeline, модель токенизирует строку и возвращает список категорий со score. Держите ввод, логику и отображение раздельно: тогда каждый этап можно проверить отдельно.

ЭтапДействиеПроверяемый результат
Интерфейссоздать textarea, кнопку, статус и результатпустой ввод не запускает модель
Модельлениво создать pipeline sentiment-analysisпервая загрузка показывает ожидание
Inferenceпередать очищенный текст и дождаться Promiseрезультат содержит label и score
Проверкасравнить две контрастные фразыметки различаются, а UI разблокируется после ошибки

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

Путь данных в проекте Transformers.js
От входных данных до видимого результата. Сначала проверяется вход, затем действие и только потом интерфейс.

Зафиксируйте первый успех До красивого интерфейса выведите полный объект результата в console. Названия labels зависят от выбранной модели. Сохраните команду запуска и ожидаемый вывод.

Собираем рабочий пример шаг за шагом

Пример сверялся с актуальной документацией официальной документации Transformers.js на 19 октября 2026 года. Создайте Vite-проект и установите @huggingface/transformers. Запускайте через локальный сервер, чтобы модули и файлы модели загружались корректно. Проверьте текущую папку через pwd или Get-Location. Вставьте пример целиком, выполните один раз, затем разбирайте по частям.

import { pipeline } from '@huggingface/transformers'

const input = document.querySelector('#text')
const button = document.querySelector('#analyze')
const output = document.querySelector('#result')
let classifierPromise

function getClassifier() {
  classifierPromise ??= pipeline('sentiment-analysis')
  return classifierPromise
}

button.addEventListener('click', async () => {
  const text = input.value.trim()
  if (!text) {
    output.textContent = 'Введите текст'
    return
  }

  button.disabled = true
  output.textContent = 'Модель загружается или считает…'
  try {
    const classifier = await getClassifier()
    const [result] = await classifier(text)
    output.textContent = result.label + ': ' + (result.score * 100).toFixed(1) + '%'
  } catch (error) {
    console.error(error)
    output.textContent = 'Не удалось загрузить модель'
  } finally {
    button.disabled = false
  }
})
Что должно произойти после запуска
  • Первый клик дольше из-за загрузки модели, следующие используют уже созданный pipeline.
  • Результат содержит метку и score, отформатированный как процент, но не выдаётся за психологический диагноз.
  • Повторный запуск даёт тот же предсказуемый результат.
  • Пустой ввод получает понятное сообщение вместо падения.

Кешируется Promise создания pipeline, поэтому параллельные вызовы не создают несколько тяжёлых экземпляров модели. Найдите в примере вход, проверку и место формирования результата.

Хрупкий и проверяемый вариант Transformers.js
Что отличает устойчивый проект от случайного запуска. Явные границы делают ошибку локальной и понятной.

Что происходит внутри и почему это работает

Pipeline объединяет токенизатор, модель и постобработку для выбранной задачи. В браузере вычисления обычно идут через ONNX Runtime; доступный backend и производительность зависят от устройства. Логику держите отдельно от вывода: функция получает аргумент и возвращает значение, а интерфейс показывает его. После первой загрузки файлы могут попасть в браузерный кеш, но это не гарантирует полный офлайн на любом хостинге. Если нужен офлайн, контролируйте размещение модели, кеш и политику приложения.

ЧастьЗа что отвечаетЧто проверить
Tokenizerпревращает строку в последовательность токеновдлинный текст обрезается по правилам модели
Modelвычисляет вероятности категорий на устройствепервый запуск учитывает время загрузки
UIпоказывает статус, результат и ошибкукнопка блокируется на время inference

Score показывает уверенность модели внутри её набора категорий, а не истинность утверждения. Модель может быть обучена на английском и плохо понимать русский. Перед продуктовым использованием читайте model card, язык, датасет, лицензию и ограничения. Не прячьте поток в одном обработчике: сохраните вход, проверьте его, вызовите операцию и только затем обновите интерфейс.

Проверьте границу Запустите английские фразы «I love this lesson» и «This is painfully confusing», затем русские аналоги. Сравните поведение, не меняя UI. Меняйте одно условие за прогон, чтобы видеть причину.

Проверяем проект и добавляем свою функцию

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

Проверка своими руками
  1. Сохраните ожидаемый результат: после первой загрузки две тестовые фразы получают разные метки, кнопка не запускает параллельные запросы, а пустой ввод отклоняется.
  2. Измените правило: добавьте выбор из двух тестовых фраз и время первого и повторного inference. Сначала предскажите итог.
  3. Передайте граничное значение и убедитесь, что приложение не падает.
  4. Верните корректные данные и объясните роли трёх основных частей.
Готово, если выполняются все пункты
  • пустой ввод не запускает модель
  • первая загрузка показывает ожидание
  • результат содержит label и score
  • метки различаются, а UI разблокируется после ошибки

В локальном AI-проекте важно показывать не только label, но и стоимость загрузки, язык модели и ограничение результата. Полезная правка проходит от нового ввода до видимого результата.

Четыре контрольные точки Transformers.js
Четыре проверки перед следующим шагом. Каждый следующий этап начинается после наблюдаемого результата.

Что запомнить и куда двигаться дальше

Следующий шаг - выбрать модель под русский язык, изучить model card и вынести inference в Worker, если интерфейс заметно блокируется. Для закрепления откройте в локальном чат-боте WebLLM, в AI-расширении Chrome и в управлении жестами MediaPipe.

Как изучить тему в Кодике

Повторите Promise, async/await и модули, затем изучите токены, pipeline и model card. Сначала восстановите главную функцию и проверьте её на трёх значениях.

ШагЧто разобратьМини-проверка
1. ОсноваСобытия, async/await и состояния кнопкиОбъясните вход и выход функции.
2. Инструментpipeline, задача sentiment-analysis и кеширование моделиПовторите команду по памяти.
3. ПроектДве контрольные фразы и обработку ошибкиПроверьте два сценария.
4. РефакторингВыбор модели, Worker и приватность текстаРазделите ввод, логику и вывод.

Сравните результат с простым словарным правилом и объясните, где модель даёт ценность, а где добавляет вес и неопределённость. Базовый синтаксис закрепите через курс по генеративному ИИ.

Pipeline создаётся каждый клик

Модель загружается повторно и расходует память. Кешируйте Promise или экземпляр.

Нет состояния загрузки

Пользователь нажимает кнопку несколько раз. Блокируйте действие и показывайте прогресс.

Неверный язык модели

Высокий score не спасает неподходящие данные. Читайте model card.

Score называют точностью

Это уверенность конкретного предсказания, а не измеренная accuracy продукта.

Сверяйтесь с первичной документацией. Команды и ограничения примера проверены по официальной документации Transformers.js. Если версия инструмента изменилась, официальный источник важнее старого скриншота.

Что получится в итоге

Готовый результат проекта: Локальный ИИ в браузере: определяем настроение текста через Transformers.js
Так выглядит законченный учебный проект: есть понятный вход, видимый результат, защита от неверных данных и место для следующего улучшения.

Короткие ответы
Что делает pipeline?

Собирает токенизацию, выполнение модели и преобразование сырых выходов для выбранной задачи.

Почему первый запуск медленнее?

Браузеру нужно загрузить файлы модели и подготовить runtime перед inference.

Что проверять первым, если Transformers.js не запускается?

Версию среды, текущую папку, команду запуска и первую строку ошибки.

Как понять, что проект Transformers.js работает?

Проверьте основной сценарий, неверный ввод, повторный запуск и один граничный случай.

Можно ли начать с готового кода?

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

Сделайте один осознанный шаг дальше

Выберите одно улучшение и проведите его от ввода до результата.

Если не хватает основы, перейдите курс по генеративному ИИ, затем восстановите ключевую функцию без подсказки.