Розробка AI-системи аналізу запитів на нові функції
Feature request backlog зростає експоненційно: в компаніях з активною продуктовою розробкою щомісяця надходить від 500 до 5000 тікетів з Jira, GitHub Issues, звернень у підтримку та чатів. Продакт-менеджер вручну групує схожі запити — «хочу темну тему», «додайте dark mode», «чому немає нічного режиму» — а це одне й те саме. На ручну кластеризацію йде до 20 годин на тиждень, при цьому до 40% дублікатів залишаються непоміченими. Ми автоматизуємо цей процес за допомогою NLP та HDBSCAN, скорочуючи час аналізу на 70%. Економія на ручному аналізі сягає $15 000 на місяць при обсязі 1000 запитів.
Як HDBSCAN допомагає дедуплікувати запити?
Перше завдання — дедуплікація. Замість регулярних виразів та ключових слів використовуємо семантичну кластеризацію: кожен запит перетворюється на 768-вимірний ембеддінг через Sentence Transformer (paraphrase-multilingual-mpnet-base-v2), потім HDBSCAN групує їх за косинусною близькістю. Шум (запити без найближчих сусідів) позначаються міткою -1 і не потрапляють у кластери.
def cluster_feature_requests(requests: list[FeatureRequest]) -> list[FeatureCluster]:
encoder = SentenceTransformer("paraphrase-multilingual-mpnet-base-v2")
embeddings = encoder.encode([r.text for r in requests])
clusterer = hdbscan.HDBSCAN(min_cluster_size=3, metric="cosine")
labels = clusterer.fit_predict(embeddings)
clusters = []
for label in set(labels):
if label == -1: # шум — поодинокі запити
continue
cluster_requests = [r for r, l in zip(requests, labels) if l == label]
clusters.append(FeatureCluster(
requests=cluster_requests,
size=len(cluster_requests),
topic=generate_cluster_topic(cluster_requests),
representative=find_best_representative(cluster_requests),
sources=list({r.source for r in cluster_requests})
))
return sorted(clusters, key=lambda c: c.size, reverse=True)
Результат: замість 1000 запитів — 20-30 кластерів з топиками. Кожен кластер містить representative (найтиповіший запит) та список джерел. Wikipedia: HDBSCAN надає додаткову інформацію про алгоритм.
Порівняння HDBSCAN та K-means
| Критерій |
HDBSCAN |
K-means |
| Форма кластерів |
Довільна |
Сферична (передбачає рівні розміри) |
| Кількість кластерів |
Визначається автоматично |
Задається вручну |
| Обробка шуму |
Відносить до -1 |
Вимушено включає в найближчий кластер |
| Масштабованість |
Хороша (до 100k точок) |
Відмінна (до мільйонів) |
HDBSCAN виявляється в середньому в 2 рази точніше за K-means при виділенні семантичних груп (F1-score 0.82 проти 0.41 на нашому тестовому датасеті).
Що таке скоринг пріоритетів?
Розмір кластера важливий, але не достатній. Ми використовуємо скоринг, де враховуються:
- Сегмент користувача: enterprise-клієнти мають вагу ×2, безкоштовні користувачі ×0.5.
- Емоційне забарвлення: тональний аналіз через
cardiffnlp/twitter-roberta-base-sentiment-latest — запити з negative (критичність, блокування) отримують +30% до скорингу.
- Churn-кореляція: якщо користувачі, що запитували фічу, згодом відписалися — це сигнал high priority.
- Бізнес-потенціал: оцінка на основі історичних продажів та NPS-даних.
| Критерій |
Вага в скорингу |
Метод отримання |
| Розмір кластера |
0.4 |
Кількість запитів |
| Сегмент користувача |
0.25 |
Мапінг джерела (Jira-група) |
| Емоційне забарвлення |
0.2 |
NLP-аналіз тональності |
| Churn-зв'язок |
0.1 |
Зіставлення з відписками |
| Бізнес-потенціал |
0.05 |
ML-модель на історичних даних |
Приклад: кластер з 50 запитів від enterprise-клієнтів з негативною тональністю (слова «блокує роботу») отримує скоринг 0.4×50 + 0.25×2 + 0.2×1.3 + 0.1×1 = 22.1, тоді як кластер з 200 запитів від безкоштовних користувачів з нейтральною тональністю — 0.4×200 + 0.25×0.5 + 0.2×1 + 0.1×1 = 80.25. Однак при врахуванні бізнес-потенціалу enterprise-кластер може виявитися пріоритетнішим.
Детальний приклад розрахунку
Для кластера enterprise-клієнтів з негативною тональністю вага бізнес-потенціалу може підняти підсумковий скоринг до 30, якщо історичні дані показують високу конверсію таких запитів. Це дозволяє виявляти приховані пріоритети, не очевидні лише за розміром кластера.
Генерація user stories та трендів
З кластера система автоматично формує чернетку user story: «Як [тип користувача], я хочу [функція], щоб [цінність]». Тип користувача визначається за найчастішим джерелом з кластера (наприклад, якщо 80% запитів з розділу «Admin panel» — роль «адміністратор»). Цінність витягується з тональних маркерів (слова «щоб», «для», «з метою»). Чернетка потребує редагування продакта, але стартовий час скорочується з 40 хвилин до 2.
Відстежуємо динаміку: якщо за останній тиждень у кластер додалося >20% нових запитів — флаг «зростаючий тренд». Якщо запит існує >6 місяців без зростання — низький пріоритет (deprioritize). Зростання після конкретного релізу — сповіщення про можливу регресію. Використовуємо Wikipedia: HDBSCAN як основу алгоритму.
Склад послуги
- Аудит поточного потоку запитів — оцінка обсягу, джерел, частоти.
- Інтеграція тікет-систем — конектори до Jira, GitHub, HubSpot, Zendesk.
- Налаштування NLP-пайплайна — калібрування ембеддінгів на вашій специфіці (доменні терміни, сленг).
- Дашборд пріоритетів — веб-інтерфейс з кластерами, трендами, скорингом.
- Експорт user stories — вивантаження у форматі CSV/JSON для імпорту в product management tools.
- Документація та навчання команди — як інтерпретувати тренди та приймати рішення.
Строки та як почати
Оцінка проекту — від 40 до 80 годин залежно від складності інтеграції та обсягу даних. Перший прототип з базовою кластеризацією готовий через 2 тижні після старту. Для точного розрахунку отримайте консультацію: просто напишіть нам з коротким описом поточного процесу та кількості запитів на місяць. Гарантуємо, що після впровадження ви будете витрачати на аналіз фіч не більше 2 годин на тиждень. Вартість визначається після аналізу вашого проекту.
Досвід нашої команди — 5 років в NLP та MLOps, понад 30 успішних впроваджень у продуктових компаніях. Використовуємо лише open-source компоненти без vendor lock-in.
Пишіть — оцінимо ваш проект безкоштовно і запропонуємо рішення під ключ.
NLP розробка: чому accuracy не підходить для рідкісних класів?
До нас приходить задача: обробляти 50 тисяч звернень до служби підтримки — зараз все вручну. Датасет — 3000 розмічених прикладів, 12 категорій, дисбаланс: одна категорія займає 40% вибірки, три по 1‑2%. Baseline accuracy — 78%. Звучить непогано, поки не дивишся на recall по рідкісних класах: 0.31, 0.44, 0.28. Саме ці класи — скарги та загрози відтоку — найважливіші для бізнесу.
Це типовий проект NLP розробки. Проблема не в алгоритмі, а в тому, що accuracy — не та метрика. Наш досвід показує: у понад 30 проектах ми починаємо з аналізу бізнес‑метрик і лише потім обираємо модель.
Чому accuracy — не та метрика для рідкісних класів?
Accuracy ігнорує дисбаланс. Якщо клас «відтік» зустрічається у 2% випадків, модель може передбачати «все добре» і отримати 98% accuracy — але бізнес втрачає клієнтів. Рішення: F1 macro (усереднення за всіма класами) або weighted F1. Для NER — strict entity F1 (лише точні збіги). Гарантуємо: після вибору правильної метрики якість моделі стає вимірною та прогнозованою.
Класифікація тексту: від BERT до дистиляції
BERT-подібні моделі — стандарт для класифікації. ruBERT-base або ruBERT-large від DeepPavlov для російської мови. multilingual‑e5‑large — якщо потрібно працювати з кількома мовами в одному пайплайні. XLM‑RoBERTa‑large — сильний multilingual backbone.
Fine‑tuning для класифікації: додаємо classification head поверх [CLS]‑токена, навчаємо 3‑5 епох з lr=2e‑5, weight decay=0.01. При дисбалансі — weighted CrossEntropyLoss або focal loss з gamma=2.0. Пишіть — покажемо code snippet.
Кейс з дисбалансом. Датасет — 3000 прикладів, дисбаланс 1:20. Рішення: class_weight через sklearn + CrossEntropyLoss. Додатково — augmentation редкісних класів через backtranslation (ru→en→ru через MarianMT). Recall по рідкісних класах виріс з 0.31 до 0.67 при незначному падінні accuracy (76%→74%). Повна NLP розробка під ключ зайняла 3 тижні.
Дистиляція для production. BERT‑large дає F1 0.89, але inference на CPU — 180ms. Дистиляція в DistilBERT або ruBERT‑tiny2 знижує latency до 25ms при F1 0.84. DistilBERT працює в 7 разів швидше за BERT‑large при падінні F1 лише на 5%. Експорт в ONNX Runtime з int8 quantization дає додатковий 1.5‑2x. Оцінимо проект — розрахуємо економію на інфраструктурі.
| Модель |
F1 macro |
Latency (CPU) |
Розмір |
| BERT-large |
0.89 |
180 ms |
1.3 GB |
| DistilBERT |
0.84 |
25 ms |
250 MB |
| ruBERT-tiny2 |
0.81 |
12 ms |
120 MB |
| DistilBERT + ONNX |
0.84 |
14 ms |
150 MB |
Як вибрати модель класифікації під ваш датасет?
Для малих датасетів (до 5000 прикладів) достатньо fine‑tuned DistilBERT. Якщо потрібна багатомовність — XLM‑RoBERTa. При жорстких обмеженнях latency — дистильована модель з ONNX Runtime. Ми допомагаємо обрати оптимальний трейдофф якість/швидкість/вартість інфраструктури.
NER: розпізнавання іменованих сутностей
NER — вилучення персон, організацій, локацій, дат, сум, номерів документів. Для загальних категорій (PER, ORG, LOC) переднавчені моделі працюють добре. Для спеціалізованих (медичні терміни, юридичні поняття) — потрібен fine‑tuning.
Розмітка даних. Основна вартість NER‑проекту. Для якісної моделі — 500‑2000 розмічених речень на кожен тип сутності. Інструменти: Label Studio (open source) або Prodigy (від творців spaCy). Формат IOB2 — стандарт.
Архітектура. Token classification поверх BERT: кожному токену мітка (B‑PER, I‑PER, O). spaCy 3.x з transformer pipeline — зручний production‑вибір.
Вкладені сутності. Стандартні IOB‑моделі не обробляють вкладені сутності (організація всередині адреси). Для таких задач — span‑based NER: SpanBERT або SpERT. Складніше, але правильно.
Постобробка обов’язкова. Модель передбачає токени — потрібні нормалізовані сутності. Дата — dateparser. Суми — regex + валідація. Імена — дедуплікація через rapidfuzz. Входить у нашу стандартну поставку.
Sentiment Analysis та opinion mining
Бінарна класифікація positive/negative працює з BERT з коробки. Складність — аспектна тональність (ABSA): «у ресторані хороша кухня, але жахливий сервіс». Для ABSA: aspect extraction (NER) + sentiment за кожним аспектом. Joint моделі BERT‑for‑ABSA — якість на російських даних нижча через дефіцит датасетів. RuSentiment, SentiRuEval — основні ресурси.
Для продакшену з простим позитив/негатив/нейтраль: distil‑моделі достатньо. Три класи, balanced датасет, 2000+ прикладів — F1 macro 0.82‑0.87 за 1‑2 дні.
Сумарізація тексту
Екстрактивна сумарізація (обираємо речення) — TextRank або BM25 без навчання. Швидко, не галюцинує. Добре для довгих документів.
Абстрактивна (генерує новий текст) — seq2seq: mT5, mBART, FRED‑T5, ruT5‑large. Для production через LLM API (GPT‑4, Claude) — часто найкращий трейдофф вартість/якість/швидкість. Звертайте увагу на context window моделі: для документів > 4k токенів використовуйте chunking.
Ембеддинги: векторні представлення тексту
Ембеддинги — основа семантичного пошуку, дедуплікації, кластеризації, RAG. Якість критично впливає на downstream задачі.
Моделі. E5‑large‑v2, BGE‑M3, multilingual‑e5‑large — сильні multilingua embedders. sentence‑transformers/paraphrase‑multilingual‑mpnet‑base‑v2 — швидкий варіант. Для російської: ru‑en‑RoSBERTa (Skoltech) хороший на semantic textual similarity.
Як оцінити якість ембеддингів? MTEB benchmark — стандарт. Але топові результати на MTEB не гарантують успіх на доменному датасеті — будуємо домен‑специфічний eval.
Fine‑tuning ембеддингів. Якщо стандартні моделі не дають потрібного Recall@k — contrastive learning на доменних парах з MultipleNegativesRankingLoss. 500‑2000 пар, 1‑3 епохи — 5‑15% приріст Recall@k.
Розмірність та зберігання. E5‑large: 1024 dim, float32 — 4KB на вектор. При 10M документів — 40GB. INT8 quantization знижує до 10GB. FAISS IVF_PQ — ще компактніше, але з втратами. Входить у наші рекомендації по деплою.
Вилучення інформації
Структуроване вилучення — одна з частих задач. Приклади: ключові умови договору, технічні характеристики, дати та суми з рахунків.
-
Regex + rule-based. Для ІПН, ЄДРПОУ, сум, дат — надійніше нейромережі. Не потребує даних.
-
NER + постобробка. Для варіативних форматів.
-
LLM з structured output. GPT‑4 / Claude з JSON schema — для складних документів. Вартість: залежить від обсягу документів. Для 10k+ документів/день — рахуємо економіку.
Гарантуємо гібрид: regex/NER для типових полів + LLM для edge cases. Сертифікат довіри: 5 років на ринку, >30 проектів.
Етапи роботи
| Етап |
Тривалість |
Що входить |
| Аналіз даних і метрик |
3‑5 днів |
Розподіл класів, довжина текстів, baseline |
| Baseline (TF‑IDF + LogReg) |
1 день |
Швидка оцінка розриву з глибокими моделями |
| Навчання та валідація |
1‑2 тижні |
k‑fold, early stopping, аналіз помилок |
| Деплой (ONNX + FastAPI) |
1‑2 тижні |
REST API, батчинг, моніторинг |
| Документація та навчання |
2‑3 дні |
Model card, API docs, навчання команди |
Прототип на існуючих даних — 1‑3 тижні. Production‑система з CI/CD — 1.5‑2.5 місяця. Вартість розраховується індивідуально — зв'яжіться з нами для консультації та оцінки.
Що входить у роботу
- Документація з архітектури моделі та пайплайну
- Доступи до моделі через REST API (FastAPI + ONNX)
- Навчання команди замовника (2 години вебінару + Q&A)
- Гарантія на точність моделі на обумовленій тестовій вибірці
- Підтримка 3 місяці після здачі (багфікс, адаптація під нові дані)
Наш досвід
Понад 5 років у NLP, 30+ проектів від класифікації до RAG‑систем. Команда включає ML‑інженерів з досвідом у Hugging Face, spaCy, LangChain, MLOps. Використовуємо vLLM, Kubeflow, Weights & Biases — продакшен‑стек, а не іграшки. Замовте консультацію — оцінимо проект за 2 дні.