Реалізація AI-розпізнавання намірів користувача (Intent Recognition) у мобільному додатку

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1735 послуг
Реалізація AI-розпізнавання намірів користувача (Intent Recognition) у мобільному додатку
Середній
~5 днів
Часті запитання

Наші компетенції:

Етапи розробки

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

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Реалізація AI-розпізнавання намірів користувача (Intent Recognition) в мобільному додатку

Intent Recognition — це класифікація того, що користувач хоче зробити, на основі його текстового або голосового введення. У контексті мобільного додатка це фундамент діалогових інтерфейсів, розумного пошуку, голосових команд та чат-ботів. Без точної класифікації намірів будь-яка NLU-логіка перетворюється на набір крихких регулярних виразів.

Чим Intent Recognition відрізняється від звичайної класифікації тексту

Звичайна класифікація: «цей відгук позитивний чи негативний». Intent Recognition: «користувач хоче оформити замовлення, скасувати замовлення, дізнатися статус доставки, знайти товар, отримати консультацію, чи говорить щось нерелевантне».

Класи нерівномірні по частоті, можуть перекриватися («хочу повернути товар» = return_request чи complaint?), а користувачі формулюють один намір десятками різних способів. Плюс необхідність обробки out-of-scope запитів без галюцинацій «я вмію все».

Технічні підходи

Fine-tuned BERT/RoBERTa для production

Дообучення мовної моделі на розміченому датасеті інтентів — стандарт індустрії. Для англомовних додатків: distilbert-base-uncased або roberta-base. Для інших мов використовуйте еквівалентні моделі.

from transformers import pipeline, AutoTokenizer, AutoModelForSequenceClassification

# Fine-tuning на кастомних інтентах
model = AutoModelForSequenceClassification.from_pretrained(
    "distilbert-base-uncased",
    num_labels=len(INTENT_LABELS)
)

# Inference
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. Нижче цього — не вгадуємо, чесно говоримо «не зрозумів». Це критично: неправильно вгаданий намір гірше, ніж визнання незрозуміння.

Типовий набір інтентів для 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 (Named Entity Recognition) або шаблонний парсер. Для структурованих доменів regex + кастомний NER працює надійніше за загальну NER-модель:

import re

def extract_order_id(text: str) -> Optional[str]:
    # формати: #123456, №123456, ORD-123456, замовлення 123456
    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)  # «за минулу неділю», «в листопаді»
    )

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)
            }
        }
    }
}

LLM як альтернатива

Для додатків з невеликою кількістю інтентів (< 20) та гнучкими формулюваннями — structured output через GPT-4o-mini або Gemini Flash дешевше та точніше за дообучену модель. Промпт з JSON schema та few-shot прикладами:

INTENT_SYSTEM_PROMPT = """
Classify user intent. Return JSON: {"intent": "...", "confidence": 0.0-1.0, "slots": {...}}
Valid intents: search_product, order_status, return_request, complaint, out_of_scope
If unclear, use out_of_scope with low confidence.
"""

LLM-підхід простіший у оновленні (змінюємо промпт, не переобучаємо модель), але дорожче при високому трафіку.

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

Складання таксономії інтентів спільно з продуктовою командою.

Збір та розмітка навчального датасету (мінімум 100–200 прикладів на намір).

Навчання класифікатора та baseline-оцінка по accuracy/F1.

Інтеграція в мобільний діалоговий інтерфейс з обробкою out-of-scope.

Моніторинг: доля out-of-scope запитів, confusion matrix по інтентам.

Орієнтири за часом

Fine-tuned BERT-класифікатор з базовим slot filling — 2–3 тижні. LLM-based Intent Recognition зі structured output — 3–5 днів на реалізацію.