Розробка NLP-систем: пайплайни, моделі та деплой

Розробка NLP-систем: пайплайни, моделі та деплой

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    997
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1264
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1002

Розробка NLP-систем: пайплайни, моделі та деплой

Проект NLP-системи часто починається з омани: «візьмемо BERT і все запрацює». Через місяць з'ясовується, що latency не проходить у прод, модель важить 1.5 ГБ, а F1 на російському тексті — 0.6. Ми бачили десятки таких проектів. Проблема не в моделі — у відсутності системного підходу до пайплайну. Ми будуємо production-ready NLP-системи для російської мови, які працюють у production: з контролем data drift, моніторингом метрик і вибором архітектури під задачу, а не під тренд. Обробка природної мови в російськомовному контексті потребує врахування морфології, вибору правильного пайплайну та MLOps-практик.

Проблеми, які вирішуємо

  • Морфологія російської мови. Слово «розробка» має 12 форм. Без лематизації TF-IDF втрачає 40% сенсу. Використовуємо pymorphy3 або natasha — вони дають леми з точністю >95% для технічних текстів. pymorphy3 documentation підтверджує точність 97% для літературного тексту.
  • Data drift. Через місяць після деплою розподіл токенів змінюється. Ми автоматично детектуємо зміщення і перезапускаємо цикл донавчання. Без цього F1 падає на 10–15% за квартал.
  • Вибір архітектури. 80% задач класифікації вирішуються Logistic Regression + TF-IDF з F1 0.92–0.95. Fine-tuning BERT потрібен лише коли даних мало (<5k прикладів) або висока семантична складність (сарказм, контекстна залежність).

Як ми це робимо: кейс з нашої практики

Наш клієнт — фінтех-стартап. Задача: класифікація звернень клієнтів за 12 категоріями (претензія, повернення, консультація). Даних — 50k розмічених повідомлень. Наш підхід:

  • Аналіз: дисбаланс класів (3 класи — 70% вибірки).
  • Прототип: FastText + TF-IDF. F1 = 0.91. Час інференсу — 2 мс на CPU.
  • Порівняли з BERT-base (fine-tune): F1 = 0.93, але latency 150 мс на GPU + вартість інференсу в 20 разів вища. FastText краще BERT за швидкістю в 75 разів при порівнянній якості.
  • Підсумок: взяли FastText, додали rule-based корекцію для рідкісних класів. F1 = 0.93, деплой на 2 CPU, економія витрат на інфраструктуру в 10 разів.

Висновок: легке рішення + розумні правила часто б'ють важкий трансформер.

Як вибрати модель під задачу?

Задача Легке рішення Важке рішення Коли вибрати важке
Класифікація (<20 класів) Logistic Regression + TF-IDF Fine-tune BERT Даних <5k, потрібна семантика
Класифікація (багато класів) FastText DeBERTa >50 класів, сильні перетинання
Вилучення сутностей Natasha/spaCy BERT+CRF Складні сутності, вкладеність
Генерація тексту GPT-4o-mini (API) Fine-tuned LLaMA Специфічний домен, приватність

Чому морфологія — головний біль російського NLP?

В англійській токенізація тривіальна: split по пробілах. У російській «розроблений» і «розроблена» — різні токени, не схожі один на одного. Без лематизації модель не узагальнить. Ми використовуємо pymorphy3 — він дає лему з точністю 97% для літературного тексту, 93% для технічного. Для NER — natasha, вона враховує контекст і видає розмітку у форматі BIO. Морфологічний аналіз російської мови — обов'язковий етап у будь-якому NLP пайплайні.

Порівняння фреймворків для російської мови

Фреймворк Швидкість (токенів/с) Точність NER (F1) Розмір моделі Підтримка GPU
spaCy (ru_core_news_lg) 50k 0.85 500 МБ Ні
natasha 10k 0.88 200 МБ Ні
DeBERTa-v3 (HuggingFace) 1k 0.94 1.2 ГБ Так

Для production найчастіше вистачає spaCy. DeBERTa — тільки якщо потрібна максимальна якість.

Процес роботи

  1. Аналітика — збір вимог, аудит даних, вибір метрик (F1, latency, cost).
  2. Прототип — MVP за 1–2 тижні: пайплайн на легких моделях, оцінка baseline.
  3. Навчання — якщо потрібно: fine-tuning трансформерів, аугментація даних, дистиляція.
  4. Деплой — Docker, FastAPI, тритон-сервер (якщо GPU). CI/CD з тестами на data drift.
  5. Моніторинг — логування метрик, алерти при падінні F1 > 5%.

Що входить в роботу

  • Репозиторій з кодом пайплайну (Python, PyTorch/TensorFlow)
  • Документація архітектури та API (OpenAPI)
  • Налаштований CI/CD (GitHub Actions / GitLab CI)
  • Моніторинг (Prometheus + Grafana дашборд)
  • Навчання команди замовника (2–3 воркшопи)
  • Гарантія на деплой — 3 місяці супроводу

Строки орієнтовно

  • Прототип (базовий пайплайн): від 1 до 2 тижнів
  • Production-рішення з однією задачею: від 3 до 5 тижнів
  • Комплексна NLP-платформа (кілька задач): від 2 до 4 місяців

Вартість розраховується індивідуально — напишіть нам для оцінки вашого проекту.

Чому обирають нас

  • Понад 5 років на ринку AI-рішень
  • 30+ реалізованих NLP-проектів (фінтех, e-commerce, медицина)
  • Досвід роботи з OpenAI, Yandex GPT, Hugging Face
  • Сертифіковані спеціалісти з MLOps (Kubeflow, MLflow)

Зв'яжіться з нами, щоб обговорити ваш проект. Отримайте консультацію безкоштовно.

Приклад пайплайну для класифікації (код)
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from pymorphy3 import MorphAnalyzer
import re

morph = MorphAnalyzer()

def preprocess(text):
    tokens = re.findall(r'[а-яё]+', text.lower())
    lemmas = [morph.parse(tok)[0].normal_form for tok in tokens]
    return ' '.join(lemmas)

# Приклад використання
vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform([preprocess(t) for t in train_texts])
model = LogisticRegression().fit(X_train, train_labels)