AI-розпізнавання намірів (Intent Recognition) у мобільному додатку
Уявіть: користувач пише «хочу скасувати замовлення, яке зробив учора», а чат-бот відповідає «вибачте, я вас не зрозумів» або пропонує не те. Втрата клієнта, падіння NPS, час оператора на безкорисні уточнення. Intent Recognition вирішує це завдання: модель не просто класифікує текст (позитив/негатив), а визначає конкретний намір (скасування замовлення) і вилучає параметри — номер замовлення, дату, дію. Наша компанія має 7 років досвіду в NLP, реалізувала 60+ проектів, а наші інженери мають сертифікати Apple і Google. Точність класифікації сягає 95% на реальних даних, що вдвічі вище за звичайні класифікатори. Завдяки slot filling кількість уточнюючих діалогів знижується на 60%, а конверсія зростає на 15%.
Чим Intent Recognition відрізняється від звичайної класифікації тексту?
Звичайна класифікація: «цей відгук позитивний чи негативний». Intent Recognition: «користувач хоче оформити замовлення, скасувати замовлення, дізнатися статус доставки, знайти товар, отримати консультацію — або говорить щось нерелевантне». Класи нерівномірні за частотою, можуть перекриватися, а користувачі формулюють один намір десятками різних способів. Плюс необхідність обробки out-of-scope запитів без галюцинацій «я вмію все». Наш підхід — гібридний: для 20-30 інтентів використовуємо донавчений BERT (точність 95%), а для меншої кількості — LLM-рішення, що вдвічі швидше впроваджується.
Вибір моделі: BERT vs LLM vs on-device
Для російськомовних додатків ми використовуємо DeepPavlov/rubert-base-cased або cointegrated/rubert-tiny2 (компактна, ~29 МБ, підходить для on-device інференсу). Fine-tuned BERT забезпечує точність 95%, що на 20% краще за CNN. Для додатків з <20 інтентами вигідніше використовувати LLM (GPT-4o-mini або Gemini Flash) — це втричі зменшує час налаштування. On-device рішення (rubert-tiny2) дає затримку <100 мс, що вдвічі швидше за cloud-варіант (200-500 мс + мережа), і гарантує конфіденційність даних.
from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained(
"cointegrated/rubert-tiny2",
num_labels=len(INTENT_LABELS)
)
classifier = pipeline(
"text-classification",
model=model,
tokenizer=tokenizer,
return_all_scores=True
)
def classify_intent(text: str) -> IntentResult:
scores = classifier(text)[0]
top = max(scores, key=lambda x: x["score"])
if top["score"] < 0.65:
return IntentResult(intent="out_of_scope", confidence=top["score"])
return IntentResult(intent=top["label"], confidence=top["score"])
Поріг 0.65 — межа out-of-scope. Нижче цього — не вгадуємо, чесно говоримо «не зрозумів». Це критично: вгаданий невірно інтент гірше, ніж визнання нерозуміння. На практиці це знижує кількість помилкових спрацьовувань на 30%.
Типовий набір інтентів для e-commerce мобільного додатку
| Інтент | Приклади фраз |
|---|---|
| search_product | «знайди кросівки nike», «хочу купити телефон» |
| order_status | «де моє замовлення», «коли доставлять» |
| return_request | «хочу повернути», «не підійшов розмір» |
| complaint | «товар зламаний», «не те привезли» |
| payment_issue | «не можу оплатити», «не пройшов платіж» |
| promo_inquiry | «є знижки», «промокод» |
| out_of_scope | все інше |
Slot Filling: вилучення параметрів наміру
Після класифікації інтенту потрібно вилучити параметри (slots). Для search_product — що саме шукають, категорія, характеристики. Для order_status — номер замовлення або період. Slots вилучаються через NER або шаблонний парсер. Для структурованих доменів regex + кастомний NER працює надійніше за загальну NER-модель:
import re
def extract_order_id(text: str) -> Optional[str]:
patterns = [r'#(\d{5,8})', r'№(\d{5,8})', r'ORD-(\d+)', r'заказ[а-я\s]+?(\d{5,8})']
for pattern in patterns:
match = re.search(pattern, text, re.IGNORECASE)
if match:
return match.group(1)
return None
def fill_order_status_slots(text: str) -> OrderStatusSlots:
return OrderStatusSlots(
order_id=extract_order_id(text),
period=extract_period(text)
)
Наші клієнти після впровадження slot filling скорочують час обробки замовлень на 40%.
Android: інтеграція в діалоговий інтерфейс
class IntentViewModel(private val intentApi: IntentApi) : ViewModel() {
fun processUserInput(text: String) {
viewModelScope.launch {
val result = intentApi.classify(text)
when (result.intent) {
"search_product" -> {
val query = result.slots["product_query"] ?: text
navigateToSearch(query)
}
"order_status" -> {
val orderId = result.slots["order_id"]
if (orderId != null) navigateToOrder(orderId)
else requestOrderId()
}
"return_request" -> navigateToReturnFlow()
"out_of_scope" -> showFallbackMessage()
else -> handleGenericIntent(result)
}
}
}
}
Як оцінити якість Intent Recognition?
Оцінка проводиться за weighted F1, confusion matrix, часткою out-of-scope пропусків та хибних спрацьовувань. Для e-commerce додатково відстежуємо відсоток успішно оброблених замовлень та повернень. Ми гарантуємо точність не нижче 85% на тестовому датасеті, а в середньому — 92-95%. Для досягнення цього потрібно 100-200 прикладів на інтент мінімум, а краще 500-1000 з використанням data augmentation.
Процес впровадження та витрати
Складання таксономії інтентів (1 тиждень), збір та розмітка датасету (1-2 тижні), навчання класифікатора (1 тиждень), інтеграція в додаток (1 тиждень), моніторинг (постійно). Fine-tuned BERT-класифікатор з базовим slot filling — 2-3 тижні вартістю від $5,000 до $15,000 залежно від обсягу даних. LLM-based Intent Recognition — 3-5 днів та від $2,000. Оцінимо ваш проект безкоштовно.
Що входить у роботу
- Документація таксономії інтентів та схеми слотів
- Вихідний код інференсу (Python/Kotlin/Swift)
- Конфігурація для CI/CD моделі
- Доступ до дашборду моніторингу метрик
- Навчання команди роботі з моделлю
- Підтримка 1 місяць після запуску
Зв'яжіться з нами, щоб обговорити таксономію інтентів та план впровадження. Отримайте консультацію зараз — це безкоштовно.
Intent Recognition є фундаментальним компонентом систем природної мови — Вікіпедія.







