Реалізація AI-аналізу тональності у мобільному додатку
Sentiment analysis у мобільному контексті вирішує конкретні завдання: автоматична модерація користувацьких відзивів, аналіз тональності чатів та коментарів у реальному часі, моніторинг фідбеку всередину додатка. Вибір між on-device моделлю та хмарним API визначає все — latency, приватність, вартість, точність.
On-device vs Cloud API
Cloud API (OpenAI, Google Cloud Natural Language, AWS Comprehend) — точність вище, особливо на неструктурованому тексті, але кожний запит коштує грошей та вимагає сети. Для продуктової аналітики (відзиви, опитування) — нормально. Для realtime аналізу кожного вводимого символу — ні.
On-device (CoreML + BERT / TensorFlow Lite + MobileBERT) — приватно, працює offline, нулева latency по сети. Мінус: модель важить 40–80 МБ, точність нижча на неоднозначних випадках, складніше підтримувати (переобучення = оновлення додатка або OTA-модель).
На iOS: CoreML з моделлю DistilBERT-sentiment (конвертується через coremltools з Hugging Face checkpoint). Inference < 50 мс на iPhone 12+. Інціалізувати MLModel при старті додатка, не при першому виклику — иначе отримаєш 300 мс затримку при першому аналізі.
На Android: TensorFlow Lite з MobileBERT — аналогічний підхід. Interpreter інціалізуємо в Application.onCreate() у фоновому потоці.
Гранулярність тональності
Базовий positive/negative/neutral — занадто груб для більшості завдань. Fine-grained sentiment дають більше:
- Aspect-based sentiment: «доставка відмінна, але упаковка погана» — не один sentiment, а два по різних аспектах.
- Emotion classification: joy, anger, sadness, fear, surprise — для продуктового аналізу цінніше, ніж просто +/−.
- Intensity: дуже негативний vs трохи негативний — впливає на пріоритет реакції.
На практиці: якщо потрібен aspect-based — беремо серверну модель (flair, spaCy з kastомними NER + sentiment pipeline) або GPT зі structured output. On-device дотягне тільки до 3-классового класифікатора без аспектів.
Конкретний кейс: аналіз in-app відзивів
Екран зворотного зв'язку: користувач пише текст → по мері набору або при submit аналізуємо тональність on-device → якщо negative score > 0.7, перед відправкою показуємо «Нам жаль, що у вас виникли труднощі. Хочете одразу зв'язатися з підтримкою?» → переводимо в чат замість публічного відзиву. Це стандартний паттерн зниження негативних публічних відзивів.
Технічна реалізація: CoreMLSentimentAnalyzer.analyze(text) повертає SentimentResult(label:score:). Debounce на 500 мс, щоб не запускати inference при кожному символі. Результат храним у ReviewDraft — при submit передаємо серверу разом з текстом.
Мультиязичність
Окрема модель під кожен мову — найкраща точність, але великий розмір бандлу. XLM-RoBERTa — мультиязична модель, одна на всі мови, гірше на кожній окремій мові, але значно краще, ніж ніяк. Для російськомовних текстів: DeepPavlov rubert-base-cased-sentiment — хорошу точність на CIS-даних, конвертується в CoreML/TFLite.
Процес роботи
Визначаємо сценарій використання (realtime vs batch, on-device vs cloud), мову текстів, потрібну гранулярність. Вибираємо модель, інтегруємо, налаштовуємо пороги для бізнес-логіки, тестуємо на репрезентативних даних з продакшену.
Орієнтири за термінами
Інтеграція готової моделі (Cloud API або pre-trained CoreML/TFLite) з базовим positive/negative/neutral — 3–5 днів. Kastomна модель з fine-tuning на своїх даних, aspect-based аналіз, мультиязична підтримка — 3–5 тижнів. Вартість розраховується індивідуально.







