Проактивні AI-повідомлення: запобігаємо зверненням у підтримку

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
Проактивні AI-повідомлення: запобігаємо зверненням у підтримку
Середній
~2-4 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

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

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1357
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    956
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1188
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929

Клієнт чекає замовлення, але доставка затримується. Замість того щоб телефонувати в підтримку, він отримує SMS з новим ETA і посиланням на трекер. Це і є проактивне AI-повідомлення — система сама знаходить проблему і вирішує її до того, як клієнт помітить. Ми впроваджуємо такі рішення, і тікети в контакт-центр падають на 20–35%.

Автоматична детекція та генерація повідомлень

Система аналізує тисячі подій у реальному часі: статуси замовлень, логістичні дані, підписки, поведінкові патерни. Щойно детектор знаходить аномалію — затримку, ризик відмови платежу, наближення ліміту, — Large language model (наприклад, Claude 3.5 Sonnet) генерує персоналізоване повідомлення та надсилає його через відповідний канал: SMS, push, email або месенджер. Усе відбувається за секунди, без участі людини. Результат: клієнт отримує рішення, а підтримка — менше дзвінків.

Чому проактивні повідомлення вигідніші за реактивну підтримку?

Порівняємо прямі витрати на контакт-центр і на систему повідомлень. Типовий дзвінок у контакт-центр обходиться компанії у 200–400 рублів, а одне повідомлення — у 1–2 рублі. При вартості дзвінка у 100–300 разів вищій за повідомлення достатньо запобігти менш ніж 1% звернень, щоб система окупилася. На практиці вона відсікає 20–35% тікетів.

Стаття Реактивна підтримка Проактивні повідомлення
Вартість одного контакту висока (дзвінок) низька (повідомлення)
Час реакції від хвилин до годин миттєво
Вплив на NPS нейтральний/негативний позитивний
Ефект на відтік не впливає знижує на 15–25%

Які канали повідомлень ефективніші?

Вибір каналу впливає на швидкість реакції та вартість. Ось порівняння основних варіантів:

Канал Швидкість Відкриваність Вартість за 1000 повідомлень
SMS 1–2 сек 90–95% середня
Push 1–5 сек 60–70% низька
Email 1–10 хв 20–30% дуже низька
Telegram 1–3 сек 80–90% низька

Для критичних подій (затримка доставки, збій сервісу) ми використовуємо SMS+push, для менш термінових — email.

Основні тригери системи

Система покриває п'ять основних сценаріїв, на які припадає 80% звернень у підтримку:

  • Затримки доставки: детекція замовлень, де estimated_delivery перевищено більш ніж на день. Клієнт отримує повідомлення з новим ETA і, якщо потрібно, пропозицію компенсації.
  • Ризик відмови платежу: за 30 днів до закінчення терміну картки — email з проханням оновити дані. Це запобігає 15–20% відмов підписок.
  • Наближення ліміту підписки: коли usage сягає 80%, клієнту пропонують розширити план. Upsell без участі підтримки.
  • Повідомлення про збої: якщо сервіс у регіоні клієнта тимчасово недоступний, повідомлення приходить до того, як користувач спробує зайти та створить тікет.
  • Аномальна активність: вхід з нового пристрою або місцезнаходження — автоматичне повідомлення з підтвердженням.

Архітектура системи: як це працює під капотом

Основні компоненти: детектор подій на Python, LLM для генерації тексту (Claude 3.5 Sonnet), модуль пріоритизації на Pandas. Детектор аналізує логістичні дані, підписки та поведінкові патерни. Нижче — ключові класи (повна реалізація в репозиторії).

Подивитися код детектора
import pandas as pd
import numpy as np
from anthropic import Anthropic
import json

class ProactiveNotificationEngine:
    """Детекція подій, які потребують проактивного повідомлення"""

    NOTIFICATION_TRIGGERS = {
        'delivery_delay': {
            'threshold': 'expected_delivery exceeded by 1 day',
            'channel': 'sms+push',
            'priority': 'high'
        },
        'payment_failure_risk': {
            'threshold': 'card expires within 30 days',
            'channel': 'email',
            'priority': 'medium'
        },
        'service_disruption': {
            'threshold': 'user in affected region',
            'channel': 'push+sms',
            'priority': 'critical'
        },
        'subscription_limit_approaching': {
            'threshold': 'usage > 80% of plan limit',
            'channel': 'in_app+email',
            'priority': 'medium'
        },
        'anomalous_account_activity': {
            'threshold': 'login from new location',
            'channel': 'email+sms',
            'priority': 'high'
        }
    }

    def detect_delivery_issues(self, orders: pd.DataFrame,
                                logistics_data: pd.DataFrame) -> pd.DataFrame:
        """Детекція замовлень з ризиком затримки"""
        merged = orders.merge(logistics_data, on='tracking_id', how='left')
        today = pd.Timestamp.now()

        merged['days_delayed'] = (
            merged['estimated_delivery_updated'] - merged['expected_delivery']
        ).dt.days

        at_risk = merged[
            (merged['days_delayed'] > 0) &
            (~merged['delivered']) &
            (~merged['notification_sent'])
        ].copy()

        at_risk['urgency'] = pd.cut(
            at_risk['days_delayed'],
            bins=[-np.inf, 1, 3, np.inf],
            labels=['minor', 'moderate', 'significant']
        )

        return at_risk

    def detect_usage_limit_alerts(self, subscriptions: pd.DataFrame) -> pd.DataFrame:
        """Клієнти, що наближаються до лімітів підписки"""
        subscriptions = subscriptions.copy()
        subscriptions['usage_pct'] = subscriptions['current_usage'] / subscriptions['plan_limit']

        return subscriptions[
            (subscriptions['usage_pct'] > 0.80) &
            (subscriptions['usage_pct'] < 1.0) &
            (~subscriptions['upsell_shown'])
        ].sort_values('usage_pct', ascending=False)

    def generate_notification(self, trigger_type: str,
                               customer: dict,
                               event_data: dict) -> dict:
        """Персоналізований текст повідомлення"""
        llm = Anthropic()

        trigger_config = self.NOTIFICATION_TRIGGERS.get(trigger_type, {})

        response = llm.messages.create(
            model="claude-3-5-sonnet-20241022",
            max_tokens=150,
            messages=[{
                "role": "user",
                "content": f"""Write a proactive customer notification in Russian.

Trigger: {trigger_type}
Customer: {customer.get('first_name', 'Клієнт')}
Event details: {json.dumps(event_data, ensure_ascii=False)[:200]}

Write:
1. Short subject/title (push notification style, max 50 chars)
2. Body (2-3 sentences: what happened, what we're doing, what customer should do if anything)

Be empathetic and solution-focused. No corporate speak.
Return JSON: {{"title": "...", "body": "..."}}"""
            }]
        )

        try:
            content = json.loads(response.content[0].text)
        except Exception:
            content = {'title': 'Важлива інформація про ваше замовлення', 'body': ''}

        return {
            'customer_id': customer.get('id'),
            'channel': trigger_config.get('channel', 'email'),
            'priority': trigger_config.get('priority', 'normal'),
            'title': content.get('title'),
            'body': content.get('body'),
            'trigger_type': trigger_type
        }

    def prioritize_notifications(self, pending_notifications: pd.DataFrame) -> pd.DataFrame:
        """Пріоритизація з урахуванням втоми від повідомлень"""
        priority_order = {'critical': 0, 'high': 1, 'medium': 2, 'low': 3}
        pending_notifications['priority_num'] = pending_notifications['priority'].map(priority_order)

        sorted_notifs = pending_notifications.sort_values(
            ['customer_id', 'priority_num']
        )

        result = sorted_notifs.groupby('customer_id').head(2)
        return result

Як ми впроваджуємо систему: процес роботи

  1. Аналіз даних: досліджуємо історію звернень і логів, виявляємо основні тригери незадоволення.
  2. Проектування тригерів: визначаємо 5–10 типів подій, які мають викликати повідомлення.
  3. Інтеграція з API: підключаємося до CRM, OMS, логістичної платформи.
  4. Реалізація детекторів: пишемо код для виявлення подій у реальному часі.
  5. Налаштування LLM: калібруємо промпти для генерації людяного та емпатичного тексту.
  6. A/B-тестування: запускаємо пілот на 10% аудиторії, порівнюємо метрики (NPS, тікети, повідомлення).
  7. Деплой та моніторинг: розгортаємо на Kubernetes (Triton Inference Server) з дашбордом у Grafana.

Що входить у роботу

  • Вихідний код детекторів та інтеграцій (ваш форк репозиторію).
  • Документація з архітектури та API.
  • Налаштовані шаблони повідомлень для 5+ сценаріїв.
  • Інструкція з експлуатації та додавання нових тригерів.
  • Підтримка на етапі пілоту (2 тижні після деплою).
  • Навчання команди (2–4 години воркшопу).

Строки та як почати

Пілот з одним тригером і 1000 клієнтів — від 14 днів. Повноцінне впровадження з 10 тригерами та масштабуванням — 1–2 місяці. Вартість розраховується індивідуально під ваш обсяг даних і кількість сценаріїв. Зв'яжіться з нами — оцінимо проєкт за один робочий день і запропонуємо план впровадження. Наш досвід у AI-комунікаціях — 5+ років, ми реалізували понад 50 проєктів у рітейлі, фінтеху та телекомі. Гарантуємо зниження звернень у підтримку мінімум на 15% після першого етапу. Отримайте консультацію — дізнайтеся, як проактивні повідомлення вплинуть на ваші метрики.

Дослідження Gartner показує, що компанії, які використовують проактивні повідомлення, знижують кількість звернень у підтримку на 20–35%.

Розробка рекомендаційних систем: від collaborative filtering до real-time serving

На одному проєкті для e-commerce з каталогом 300k SKU ми підняли CTR з 1,8% до 4,4% — у 2,4 рази. Перший ривок дала колаборативна фільтрація замість «популярне за останні 7 днів», другий — додавання контентних ознак та re-ranking. Різниця між «показуємо популярне» і «показуємо персоналізоване» — вимірна та суттєва. Нижче — інженерний досвід, який допоміг це зробити, і архітектури, які реально працюють у продакшені.

Collaborative Filtering: матрична факторизація та нейронні підходи

Matrix Factorization — класика для implicit feedback (кліки, перегляди, покупки без явного рейтингу). ALS (Alternating Least Squares) у бібліотеці Implicit обробляє матриці user×item із сотнями мільйонів ненульових значень за хвилини на GPU. Latent factors 64–256, регуляризація λ=0.01–0.1 — стартові параметри. Проблема cold start: для нового користувача або товару немає історії — класичний CF безпорадний, потрібні контентні ознаки або гібрид.

Neural Collaborative Filtering (NCF) замінює скалярний добуток на нейромережу. На практиці виграш над добре налаштованим ALS помірний, але NCF простіше розширювати додатковими ознаками (вік, категорія, час доби). Sequence-aware моделі (SASRec, BERT4Rec) враховують порядок взаємодій — state-of-the-art для сесійних рекомендацій.

Як вибрати архітектуру рекомендаційної системи?

Відповідь залежить від даних, навантаження та вимог до холодного старту. Нижче — три основні підходи з критеріями вибору.

Критерій Collaborative Filtering Content-Based Filtering Гібридний (two-stage)
Дані для старту Історія взаємодій Ознаки об'єктів та користувачів І те, і інше
Cold start Провальний Працює для нових items Частково вирішено
Diversity (long-tail) Низький, popularity bias Високий Середній–високий
Latency serving <5 ms (precomputed) <10 ms (FAISS) 20–50 ms
Складність впровадження Низька Середня Висока

Гібридна архітектура на 20–40% ефективніша за чистий CF за покриттям long-tail — перевірено на каталогах від 100k SKU.

Content-Based Filtering: коли історії взаємодій мало

Content-based рекомендує на основі характеристик товарів, а не поведінки інших користувачів — вирішує cold start для нових items. Текстові ембединги через sentence-transformers (multilingual-e5-base, BGE-M3) → пошук схожих через FAISS IndexFlatIP — запит за <5 ms на 100k товарів. Item2Vec (Word2Vec на послідовностях переглядів) дає інтерпретовані «схожі товари» за пару годин навчання.

Структуровані ознаки (категорія, бренд, ціна) подаються через embedding layers або в gradient boosting — CatBoost працює з категоріями без ручного кодування.

Чому гібридні моделі працюють краще?

Production-системи майже завжди дворівневі. Stage 1 (Retrieval) — швидкий відбір 100–500 кандидатів із 300k товарів через ALS або Two-Tower модель з векторним пошуком (FAISS, Qdrant). Stage 2 (Ranking) — важкий ранжувальник на LightGBM або нейромережі з cross-features, часом, пристроєм та контекстом сесії. LightFM — хороша відправна точка для середнього масштабу без важкої інфраструктури. Наша практика показує: перехід від single-stage до two-stage дає приріст точності на 15–25% при зростанні latency всього на 20–30 мс.

Real-Time Serving: архітектура під навантаження

Latency SLA — 50–100 ms при тисячах запитів на секунду. Base-рекомендації precompute (batch job раз на годину) → Redis по user_id → <5 ms. Real-time re-ranking через Kafka для подій (кліки, додавання в кошик) → оновлення контекстних ознак. Feature serving — Redis з TTL (кількість переглядів за 24 години, останній клікнутий item). При навантаженні 10k req/s ставимо Redis Cluster з реплікацією.

A/B тестування — єдиний достовірний спосіб оцінити покращення. Офлайн-метрики корелюють з онлайн не завжди. Kohavi et al., «Online Controlled Experiments at Large Scale» (KDD 2013) — обов'язкове читання для команди. Тест з 5–10% трафіку, моніторинг CTR, конверсії, revenue per session. Одна з наших клієнтських систем після гібридизації збільшила виручку на 18% за місяць A/B.

Терміни розробки рекомендаційної системи

Етапи та типові часові витрати — у таблиці нижче. Вартість розраховується індивідуально під масштаб каталогу та вимоги до latency.

Етап Тривалість Результат
Аудит даних та baseline 1–2 тижні Звіт із щільністю матриці, cold start-зонами, метриками «популярного»
Прототип (offline validation) 2–3 тижні Працююча модель з офлайн-метриками (Recall@k, NDCG)
Production-система (two-stage, A/B) 1.5–2.5 місяця Low-latency сервіс з моніторингом та A/B-інфраструктурою
Навчання команди та документація 1–2 тижні Model card, runbook з деплою, сесія з донавчання

Що входить у розробку під ключ

  1. Аудит даних — щільність матриці user×item (зазвичай <0,1%), розподіл активності, temporal паттерни, cold start статистика.
  2. Baseline — «популярне» як простий поріг, який часто важко перевершити.
  3. Ітеративне покращення — ALS → контентні ознаки → two-stage → sequence-aware. Кожен крок з A/B.
  4. Інфраструктура serving — batch precomputation, Redis, real-time re-ranking, моніторинг у Grafana.
  5. Документація — model card з метриками, інструкція з деплою, опис ознак.
  6. Навчання команди — сесія з інтерпретації результатів та донавчання моделі.
  7. Підтримка — 1 місяць після запуску (фікс інцидентів, доналаштування pipeline).

Ми — команда з 7+ роками досвіду в рекомендаційних системах, реалізували понад 30 проєктів для e-commerce та медіа. Гарантуємо прозоре A/B-тестування та фіксацію покращення метрик.

Хочете оцінити потенціал зростання вашого каталогу? Зв'яжіться з нами для безкоштовного аудиту даних. Замовте розробку рекомендаційної системи — перший прототип протягом двох тижнів.

Приклад конфігу ALS для implicit feedback
from implicit.als import AlternatingLeastSquares

model = AlternatingLeastSquares(
    factors=64,
    regularization=0.05,
    iterations=15,
    use_gpu=True
)
model.fit(user_item_matrix)

Більше про математику рекомендаційних систем — у Wikipedia.