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







